本次搭建主库和从库不在同一台服务器上,所以需要准备两台服务器。
--home
--mysql
--data //挂载mysql数据存储目录
--conf //挂载mysql配置文件目录
--my.cnf //挂载mysql配置文件
mkdir -p /home/mysql/data
mkdir -p /home/mysql/conf
vi 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 配置文件参数解释
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 :该从库是否写入二进制日志,如果需要成为多主则可启用。只读可以不需要
vi 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/
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;这个命令必须填写,否则上面设置的用户权限失效。
show master status;
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;
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对应)
start slave;
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;