系统环境
- 操作系统:linux centos7
- Docker环境:Docker version 1.13.1, build dded712/1.13.1 (Docker安装参考文档)
- Mysql版本:mysql:5.7.23
环境搭建
本次搭建主库和从库不在同一台服务器上,所以需要准备两台服务器。
- 主库:192.168.xxxx.1
- 从库:192.168.xxxx.2
目录结构:
- 两台服务器挂载目录相同如下所示
--home
--mysql
--data //挂载mysql数据存储目录
--conf //挂载mysql配置文件目录
--my.cnf //挂载mysql配置文件
- 执行命令
mkdir -p /home/mysql/data
mkdir -p /home/mysql/conf
编写master(主库)的my.cnf
- 执行命令
vi my.cnf
- my.cnf文件内容如下
[mysqld]
server_id = 1
log-bin= mysql-bin
read-only=0
binlog-do-db=testing
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
- my.cnf参数说明:
参考文档:my.cnf 配置文件参数解释
log-bin :需要启用二进制日志
server_id : 用于标识不同的数据库服务器,而且唯一
binlog-do-db : 需要记录到二进制日志的数据库
binlog-ignore-db : 忽略记录二进制日志的数据库
replicate-do-db :指定复制的数据库
replicate-ignore-db :不复制的数据库
relay_log :从库的中继日志,主库日志写到中继日志,中继日志再重做到从库 log-slave-updates :该从库是否写入二进制日志,如果需要成为多主则可启用。只读可以不需要
replicate-do-db :指定复制的数据库 replicate-ignore-db :不复制的数据库 relay_log :从库的中继日志,主库日志写到中继日志,中继日志再重做到从库 log-slave-updates :该从库是否写入二进制日志,如果需要成为多主则可启用。只读可以不需要
编写slave的my.cnf
- 执行命令
vi my.cnf
- my.cnf文件内容如下
[mysqld]
server_id = 2
log-bin= mysql-bin
relay_log_recovery=on
read-only=1
binlog-do-db=testing
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
启动master主库
docker run -d -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /etc/localtime:/etc/localtime -p 3306:3306 --name master -e MYSQL_ROOT_PASSWORD=Test@2018 mysql:5.7.23
- 进入容器内部
docker exec -it master /bin/bash
mysql -u root -p
- 用户赋予一定权限
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'Test@2018'; FLUSH PRIVILEGES;
注意: FLUSH PRIVILEGES;这个命令必须填写,否则上面设置的用户权限失效。
- 查看master数据库状态,命令如下:
show master status;
启动slave从库
docker run -d -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /etc/localtime:/etc/localtime -p 3306:3306 --name slave -e MYSQL_ROOT_PASSWORD=Test@2018 mysql:5.7.23
- 进入容器内部
docker exec -it slave /bin/bash
mysql -u root -p
- 用户赋予一定权限
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'Test@2018'; FLUSH PRIVILEGES;
- 在slave数据库中配置主从关系关联:
change master to
master_host='192.168.xxxx.1',
master_port=3306,
master_user='root',
master_password='Test@2018',
master_log_file='mysql-bin.000004',
master_log_pos=345;
- 参数说明
change master to
master_host='192.168.xxxx.1', //Master 服务器Ip地址,也就是上面写的192.168.88.22
master_port=3306, //Master 端口号
master_user='root', //Master 用户名
master_password='Test@2018', //Master 用户密码
master_log_file='mysql-bin.000004', //Master 服务器产生的日志要和Master服务器所配置的相互对应(与上面截图中的file对应)
master_log_pos=345;//要和Master服务器所配置的相互对应(与上面截图中的)Position对应)
- 在salve数据库中启动服务,命令如下:
start slave;
- 在salve数据库中查看启动状态,命令如下:
show slave status\G;
注意:下图中的 Slave_IO_Running 和 Slave_SQL_Running 是Yes才是OK的。
搭建到这里就算搭建完成了,接下来可以尝试改动主库中的数据,看从库是否自动同步。(注意本次搭建指定记录testing数据库的二进制日志,因此只同步testing数据库中的内容)
安装过程遇到的问题
-
如果 Slave_IO_Running 为NO
在slave从库中的配置文件my.cnf加入:relay_log_recovery=on
然后重新启动mysql容器,在容器内部重新启动slave:start slave; -
如果 Slave_SQL_Running 为NO
存在多种情况,可能是你要同步的数据库在从库中不存在,所以要在从库中新建相对应的数据库。其它情况(建议只是尝试):将在slave数据库中配置主从关系关联步骤中的参数:master_log_pos值改为0:master_log_pos=0;
然后在salve数据库中重新启动服务:start slave;
再次查看slave的启动状态:show slave status\G;