MySQL编译安装及主从配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL编译安装及主从配置相关的知识,希望对你有一定的参考价值。

说明:本实验配置以Cenos6.6和mysql5.6.35为例

一、编译安装MySQL

1、避免在安装过程中出现问题,先安装系统依赖包
yum install apr autoconf automake bison cloog-ppl cpp curl curl-devel fontconfig fontconfig-devel freetype freetype freetype-devel gcc gcc-c++ gtk+-devel gd gettext gettext-devel glibc kernel kernel-headers keyutils keyutils-libs-devel krb5-devel libcom_err-devel libpng libjpeg libsepol-devel libselinux-devel libstdc++-devel libtool libgomp libxml2 libxml2-devel libXpm libtiff libtiff libX libxml make mpfr ncurses ntp openssl openssl-devel patch pcre-devel perl php-common php-gd policycoreutils ppl telnet t1lib t1lib nasm nasm wget zlib-devel

2、下载MySQL源码包
https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.35.tar.gz

3、创建MySQL安装目录以及数据存放目录
mkdir -p /application/mysql/data

4、创建用户、用户组
groupadd mysql
useradd -g mysql mysql -s /sbin/nologin -M

5、解压MySQL源码包,并编译安装
tar -zxvf mysql-5.6.35.tar.gz
cd ./msyql-5.6.35
cmake -DCMAKE_INSTALL_PREFIX=/application/mysql \
-DMYSQL_DATADIR=/application/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/application/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make && make install

6、优化调整,并初始化数据库
cp support-files/my-default.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld
echo "PATH=$PATH:/application/mysql/bin" >> /etc/profile
source /etc/profile
chown -R mysql:mysql /application/mysql
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql

7、启动服务,并设置密码
service mysqld start
mysqladmin -u root password ‘123456‘
mysql -u root -p123456

完成上述步骤,MySQL的安装基本完成

二、MySQL的主从配置
在实际的生成环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性,高可用还是高并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制(Master-Slave)的方式来同步数据,在通过读写分离来提升数据的高并发负载能力这样的方案来进行部署。

MySQL Replication 概述
MySQL Replication 俗称MySQL AB复制(主从,双机热备),从库以一定的频率去读取主库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到同步效果。

MySQL 支持的复制类型
基于语句的复制 在主服务器上执行的SQL语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率比较高
基于行的复制 把改变的内容复制过去,而不是把命令在从服务器上执行一遍
混合类型的复制 默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用行

复制的工作过程
1.在每个事务更新完数据完成之前,Master在二进制日志(Binary log,binlog)记录这些改变,写入二进制日志完成后,Master通知存储引擎提交事务
2.Slave将Master的Binary log复制到其中中继日志,首先Slave开始一个工作线程-I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process,Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会催眠并等待Master产生新的事件,I/O线程将这些事件写入中继日志。
3.SQL Slave Thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会在OS的缓存中,所以中继日志的开销很小。

复制过程的限制
1.即复制在Slave上是串行化的,也就是说Master上的并行更新不能在Slave上并行操作
2.MYSQL的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本

从库以一定的频率去读取主库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到同步效果。
MySQL Master IP: 10.0.1.174
MySQL Slave1 IP: 10.0.1.173
MySQL Slave2 IP: 10.0.1.175

每台机器上的操作
service iptables stop
setenforce 0

在主服务器上安装时间同步服务
yum -y install ntp
vim /etc/ntp.conf #添加两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
service ntpd restart

在从服务器上安装时间同步客户端,并同步时间
yum -y install ntpdate
usr/sbin/ntpdate 10.0.1.174

配置MySQL主服务器(master)
在/etc/my.cnf 中修改或者增加如下内容:
vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-binlog
log-slave-updates=true

重启mysql服务
service mysqld restart

创建Replication用户
mysql -u root -p123456
mysql> grant replication slave on . to ‘myslave‘@‘10.0.1.%‘ identified by ‘123456‘;
mysql> flush privileges;

获得Master DB的相关信息
mysql> show master status;

供Slave DB连接时使用,记录下File和Position的值

备份的方法有很多,可以直接复制数据文件,也可以使用 mysqldump。本文全新的搭建,所以不存在数据同步的问题
mysqldump -u root -p123456 --all-databases > /root/alldbbackup.sql
scp /root/alldbbackup.sql [email protected]:/root/
scp /root/alldbbackup.sql [email protected]:/root/

在 MySQL Slave 上的配置
从库连接主库进行测试,如果连接成功说明主库配置成功
[[email protected] ~]# mysql -u myslave -p123456 -h 10.0.1.174

导入备份脚本
[[email protected] ~]# mysql -u root -p < /root/alldbbackup.sql

修改MySQL配置文件
[[email protected] ~]# vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

配置多个从服务器时依次设置server-id号

修改完后重启数据库
[[email protected] ~]# service mysqld restart

在 Slave服务器授权,启动从库,进行主从库数据同步
[[email protected] ~]# mysql -u root -p123456

mysql> CHANGE MASTER TO
MASTER_HOST=‘10.0.1.174‘,
MASTER_USER=‘myslave‘,
MASTER_PASSWORD=‘123456‘,
MASTER_LOG_FILE=‘mysql-bin.000001‘,
MASTER_LOG_POS=430;

mysql> start slave;
mysql> show slave status\G

参数说明:
mysql> CHANGE MASTER TO
-> MASTER_HOST=‘master_host_name‘, //主服务器的IP地址
-> MASTER_USER=‘replication_user_name‘, //同步数据库的用户
-> MASTER_PASSWORD=‘replication_password‘, //同步数据库的密码
-> MASTER_LOG_FILE=‘recorded_log_file_name‘, //主服务器二进制日志的文件名(前面要求记录的参数)
-> MASTER_LOG_POS=recorded_log_position; //日志文件的开始位置(前面要求记录的参数)

测试主从是否同步成功
可以在Master DB创建一个数据库,或者表,到 Slave DB上看,如果配置成功就可以成功同步的

主库查看当前存在的库
mysql> show databases;

从库查看当前存在库
mysql> show databases;

主库创建库,表:
mysql> create database test2;
mysql> use test2
mysql> create table new(name char(20),phone char(20),age int(8));

打开从库,查看:
mysql> show databases;

报错解决方法:
ERROR 1201(HY000):Could now initialize master info structure; more error messages can be found in the MySQL error log

stop slave;
reset slave;
CHANGE MASTER TO MASTER_HOST=‘192.168.3.254‘, MASTER_USER=‘slave‘, MASTER_PASSWORD=‘123456‘, MASTER_LOG_FILE=‘mysql-binlog.000003‘, MASTER_LOG_POS=246;

start slave;

数据不同步解决办法:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

主从数据库相关命令:
slave stop; slave start; 开始停止从数据库。
show slave status\G 显示从库状态信息
show master status\G 显示主库状态信息
purge master logs to ’binlog.000004’; 此命令非常小心,删除主数据库没用的二进制日志文件。如果误删除,那么从库就没有办法自动更新了。
change master; 从服务器上修改参数使用

另外,如果你当前操作的从库以前曾经与其他服务器建立过主从关系,你可能会发现即使你在my.cnf文件中即便更改了主服务器的位置,但是MSQL仍然
在试图连接就旧的主服务器的现象。发生这种问题的时候,我们可以通过清除master.info这个缓存文件或者在mysql中通过命令来进行设置。方式如下:

删除master.info方法
这个文件位于数据文件存放目录里,可以直接将其删除,然后重新启动服务器。

b、mysql命令方法
如果你不方便重新启动服务器的话,那么就只能使用mysql命令来帮助你做到。

首先登录到主服务器上,查看当前服务器状态:
mysql> show master status\G;

1.FLUSH TABLES WITH READ LOCK
这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行
解锁的语句是unlock tables
2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
这个命令是表级别的锁定,可以定制锁定某一个表。例如: lock tables test read; 不影响其他表的写操作。
解锁语句也是unlock tables。
这两个语句在执行的时候都需要注意个特点,在退出mysql终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话

P.S. MYSQL的read lock和wirte lock
read-lock: 允许其他并发的读请求,但阻塞写请求,即可以同时读,但不允许任何写。也叫共享锁
write-lock: 不允许其他并发的读和写请求,是排他的(exclusive)。也叫独占锁

  1. flush table tablename

多实例配置:
[mysqld]
datadir=/var/lib/mysql3307
socket=/var/lib/mysql/mysql3307.sock
port=3307
[mysqld_safe]
log-error=/var/log/mysqld3307.log
pid-file=/var/run/mysqld/mysqld3307.pid

bin/mysql_safe --defaults-file=/var/lib/mysql3307/my.cnf & #以我们指定的my.cn配置文件为要求,启动mysq实例
netstat -tanp | grep 3307,即可看到mysql已经在监听3307端口了
/bin/mysql -uroot -p -h127.0.0.1 -P3307,连入mysql


生产环境的基本安全优化
1、开启have_openssl
2、限制IP登录
授权用户root使用密码jb51从指定ip为10.0.1.25的主机连接到mysql服务器:
GRANT ALL PRIVILEGES ON . TO ‘root‘@‘10.0.1.25‘ IDENTIFIED BY ‘jb51‘ WITH GRANT OPTION;
flush privileges;
3、限制超时锁定策略,应设置为10分钟
修改配置文件中的“wait_timeout”参数项为600
4、关闭MySQL对本地文件的存取,设置local infile =0
5、分配目录所属组、目录权限分配为755,日志、配置文件、目录分配权限为750
6、需限制连接用户数量(根据业务需求设置)
7、启用历史记录保护,将/etc/my.cnf中配置操作日志存放路径,删除.bash_history、.mysql_history
8、禁止多余用户zipkin等
9、注意安装版本的高危漏洞补丁至最新

以上是关于MySQL编译安装及主从配置的主要内容,如果未能解决你的问题,请参考以下文章

开发人员学Linux:CentOS7编译安装MySQL5.17.8多实例及主从复制

Mysql主从配置+读写分离(转)

ubuntu编译安装postgresql及主从配置

ubuntu编译安装postgresql及主从配置

基于源码编译和yum安装的LNP+MYSQL主从实战

MySQL的编译安装及多实例配置总结