上一篇 【centos 使用 docker 方式安装 mysql】 笔记中,我们在三个虚拟机中使用 docker 方式新建了三个 mysql 容器服务,那么我们这篇文章来记录下,如何在这三台机器中设置 mysql 的主从复制功能。其中111 服务器作为主节点,112 和 113 两个服务器作为两个从节点,复制 111 服务器 mysql 的数据,进行同步。
进入 mysql 的挂载目录 /mnt/mysql/config 文件夹,编辑 my.cnf 文件。vim /mnt/mysql/config/my.cnf,添加如下配置:
# 主从复制配置区 [mysqld] server-id=111 # 主服务器唯一ID log-bin=mysql-bin # 启用二进制日志 binlog-ignore-db=mysql # 设置不要复制的数据库(可设置多个) binlog-ignore-db=information_schema binlog-do-db=iotings-cloud # 设置需要复制的数据库 binlog-do-db=iotings-config # 设置需要复制的数据库 binlog-do-db=iotings-seata # 设置需要复制的数据库 binlog_format=STATEMENT # 设置logbin格式
vim /mnt/mysql/config/my.cnf
分别编辑如下参数:
1、112服务器
# 主从复制配置区 [mysqld] server-id=112 #从服务器唯一ID relay-log=mysql-relay #启用中继日志
2、113服务器
# 主从复制配置区 [mysqld] server-id=113 #从服务器唯一ID relay-log=mysql-relay #启用中继日志
vim /mnt/mysql/data/auto.cnf
除了 my.cnf 中的 server-id 不能重复外,auto.cnf 文件中的 uuid 参数也不能重复,因为112和113 虚拟机是根据 111 进行克隆的,所以后两个服务器的 mysql 容器的 uuid 参数是一样的,那么修改后两个 uuid 参数,注意,不要再新加字符串,只在原来 uuid 的基础之上修改某个字符串即可,否则 mysql 容器重启会失败,异常为 无法找到该 uuid 等信息
vim /mnt/mysql/data/auto.cnf [auto] server-uuid=e777435b-b90d-11ed-90c2-0242ac110002 # 举例:修改0002为0003,不可新增字符串
# 进入 111服务器的主 mysql 容器内 docker exec -it mysql /bin/bash # 开启 mysql 命令模式 mysql -uroot -padmin123 # 创建 slave 访问权限 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'admin123'; Query OK, 0 rows affected, 1 warning (0.00 sec) # 查看主 master 状态 mysql> show master status; +------------------+----------+--------------+--------------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+--------------------------+-------------------+ | mysql-bin.000001 | 438 | nacos_db | mysql,information_schema | | +------------------+----------+--------------+--------------------------+-------------------+ 1 row in set (0.00 sec) 注:记住这里的 File 和 Position 两个参数,在从节点的配置中要用到
# 分别进入 112、113服务器的主 mysql 容器内 docker exec -it mysql /bin/bash # 开启 mysql 命令模式 mysql -uroot -padmin123 # 然后执行如下命令,创建复制的一些配置 CHANGE MASTER TO MASTER_HOST='192.168.0.111', MASTER_USER='slave', MASTER_PASSWORD='admin123', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=438; #启动从服务器复制功能 start slave; #查看从服务器状态 show slave status \G 注意:如果需要停用slave,命令为:stop slave; 如果没有异常的话,那么主从复制就配置好了,在主节点进行表和数据的增删,那么从节点会根据日志信息进行数据的同步!
(1)出现了 【Slave_SQL_Running: No】 的异常信息,那么我们来解决一下
方案一:(已亲测,可行)
1、先停掉 slave
mysql> stop slave;
2、跳过错误步数,后面步数可变
mysql> set global sql_slave_skip_counter=1;
3、再启动 slave
mysql> start slave;
4、查看同步状态
mysql> show slave status\G
解决方法二:(重新做主从,完全同步,未亲测)
1、先进入主库进行锁表,注意窗口不要关闭
mysql> flush table with read lock;
2、把数据进行备份
> mysqldump -uroot -p --opt -R 数据库 > /data/bak.sql
3、再新开个窗口,查看主数据库信息
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000005 | 1158 | | | | +------------------+----------+--------------+------------------+-------------------+
4、在从库上停止slave
mysql> stop slave;
5、导入备份的数据文件
mysql> source /data/bak.sql
6、重置同步
mysql> reset slave;
7、重新设置同步节点
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.111', MASTER_PORT=3306, MASTER_USER='sync', MASTER_PASSWORD='admin123', MASTER_LOG_FILE='mysql-bin.000005', # 按照具体的主节点信息写该配置 MASTER_LOG_POS=1158; # 按照具体的主节点信息写该配置
注:host,port,user,password请根据你的主库设置相应修改,log_file和log_pos根据主库中master status相应修改。
8、开启slave
mysql> start slave;
9、查看slave状态
mysql> show slave status\G;
显示如下信息则表示正常
Slave_IO_Running: Yes Slave_SQL_Running: Yes
10、对主数据库解锁
mysql> unlock tables;
(2)出现了 【Slave_IO_Running: No】 的异常信息,在各个从库中执行如下代码,可恢复(已亲测,可用)
stop slave; reset slave; start slave;
FAQ:
1、F:当看到数据没有同步时,而且查看从库没有任何异常,是怎么回事呢?
A:可能是没有配置该库进行同步,检查下设置同步的表
参考信息:
https://www.cnblogs.com/NIAN2011/p/16637719.htmlhttps://cloud.tencent.com/developer/article/2145753
http://www.codebaoku.com/it-mysql/it-mysql-180748.html
场景就是,在三个服务器正常的运行之下,需要新增一个需要同步的数据库,那么正常的流程是什么呢,如下: