说明:
准备了一台centos7服务器,作为master数据库,准备了一台windows服务器,作为slave数据库。
MySQL的版本使用5.7版本。
1.主数据库(master)的配置
(主库采用了docker的安装方式,可以参考:https://www.cnblogs.com/sablier/p/11605606.html)
# 创建mysql的容器镜像
docker run -d -p 3306:3306 --privileged=true -v /usr/local/docker/mysql3306/conf:/etc/mysql -v /usr/local/docker/mysql3306/logs:/var/log/mysql -v /usr/local/docker/mysql3306/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql3306 mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
# 关闭mysql的镜像
docker stop mysql3306
# 启动mysql的镜像
docker start mysql3306
# 进入容器内的命令行
docker exec -it mysql3306 bash
# 查看mysql配置文件位置
mysql --help | grep my.cnf
## 配置文件,通过映射,映射到了centos中,在那里修改就行
- 打开主数据的配置文件,添加以下配置。
(在/usr/local/docker/mysql3306/conf目录下,新建my.cnf文件)
[mysqld]
server_id=1 #主库和从库需要不一致,配一个唯一的ID编号,1至32。 手动设定
log-bin=mysql-bin #二进制文件存放路径,存放在根目录data
binlog-do-db=itools_sample #需要复制的库,多个库用逗号隔开,如果此项不配置所有主库都参与复制
binlog-ignore-db = mysql #不备份的数据库
binlog-ignore-db = information_schema #不备份的数据库
binlog-ignore-db = performation_schema #不备份的数据库
binlog-ignore-db = sys #不备份的数据库
- 重启mysql
docker restart mysql3306
- 通过客户端连入MySQL,查看master状态
show master status
显示如上信息,说明主数据库配置成功。
- 创建从库使用的账户
mysql> grant replication slave on *.* to 'backup'@'%' identified by 'backup2020';
mysql> flush privileges;
在客户端使用该账户,测试能否链接到主库。
2.从数据库(slave)配置
- 同步主库的内容,确保主从数据库的数据一致
- 添加如下配置文件
[mysqld]
server-id = 2
log-bin=mysql-bin
replicate-do-db = demo_db
replicate-ignore-db = mysql,information_schema,performance_schema
- 重启mysql服务
- 进行主从配置
// 停止 slave
mysql> stop slave;
// 根据master中的status,添加以下配置
msyql> change master to master_host='192.168.3.220',master_port=3306,master_user='backup',master_password='backup2020',master_log_file=' mysql-bin.000001 ',master_log_pos=154;
// 启用slave
mysql> start slave;
// 查看slave状态
mysql> show slave status
// 出现下面两个说明配置正确
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主从配置完成。
3.可能遇到的问题
- slave状态:slave_io_running=no
可能是配置的master_log_file以及master_log_pos错误,
主库每次重启,这两个东西都可能有变化,
进入主库,使用 show master status 命令查案主库的log_file 以及 log_pos
然后修改从库的主从配置
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=591;
mysql> start slave;
mysql> show slave status
配完还不生效的话,再试试这个
stop slave;
reset slave;
start slave;
- slave状态:slave_SQL_running=no
原因应该是主从数据不一致导致的错误。
方法1:
忽略错误,继续同步
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;
方法2:
重新做主从同步
# 先进入主库进行锁表
mysql> flush table with read lock;
# 把数据进行备份
mysql> mysqldump -uroot -p --opt -R demo_db > /data/bakup.sql
# 查看主数据库信息
mysql> show master status;
# 进入从库
mysql> stop slave;
# 导入备份的数据
mysql> source /data/bakup.sql
# 重置同步
mysql> reset slave;
# 重新设置主从
mysql> change master to master_host='192.168.0.105',master_user='backup',master_password='Root@123',master_log_file='mysql-bin.000003',master_log_pos=154;
# 启动slave
mysql> start slave;
mysql> show slave status\G;
# 主数据库解锁
mysql> unlock tables;
方法3:
输入 show slave status;查看last_error的说明,根据这个错误的代码,在slave数据库的my.cnf的中加入如下配置:
slave-skip-errors=1062,1060
我这里出现了1062和1060两个错误,所以忽略了这两个
- 都是yes,但是就是不同步
可以试试删除以往的bin_log日志【主库】,然后重新配置主从同步。
PURGE MASTER LOGS BEFORE '2020-08-31 16:00:00'