1、准备
两台数据库服务器,主数据库Master在Linux上部署,从数据库Slave在Windows上部署。使用两种不同操作系统只是为了演示他们的略微差别。
2、准备Master用户
1.任意位置进入mysql控制台,然后输入密码:
mysql -uroot -p
2.创建tantuls用户,密码为123456:
mysql> CREATE USER ‘tantuls’@‘%’ IDENTIFIED BY ‘123456’;
3.给用户tantuls赋予主从复制权限:
mysql> GRANT REPLICATION SLAVE ON . TO ‘tantuls’@‘%’;
4.刷新:
mysql> flush privileges;
5.查看是否开启binlog日志:
mysql> show variables like ‘%log_bin%’;
3、配置Master
1.查找mysql安装配置的位置:
mysql --verbose --help| grep -A 1 “Default options”
Mysql的配置文件,windows中为my.ini,linux中为my.cnf
2.修改或添加配置内容,如果已存在的键值对则尽量不要修改它,注意这个内容一定要在[mysql]和[client]的前面:
vim my.cnf
#--###########################-- Bin-Log设置 开始 --############################################
server-id = 105
#binlog日志的文件名称前缀
log-bin = mysql-bin
binlog-format = Row
#记录日志的数据库 可以配置多个
binlog-do-db = acs
#不记录日志的数据库
binlog-ignore-db = mysql,information_schema,performance_schema
#--###########################-- Bin-Log设置 结束 --##########################################
3.重启Mysql服务(使用docker安装的mysql使用docker restart mysql 重启):
systemctl restart mysqld
4.查看主服务器是否开启binlog日志并订阅数据库:
mysql> show master status;
4、Slave数据准备
1.去Mater中将数据库的数据导成sql文件:
2.去Slave中创建同名数据库,并将刚才的sql文件导入:
mysql -uroot -p
mysql> CREATE DATABASE acs;
mysql> USE acs;
mysql> set names utf8;
mysql> source …/…/acs.sql;
3.注意事项:在导出sql前,一定要保证该数据库只读,可以上只读锁可以停掉数据库或者服务。因为如果导入新数据库后,导致新旧数据库的数据存在任何差异,都会导致后面实施同步失败;同时还会影响后面Slave的配置。
5、配置Slave
1.修改或添加配置内容,如果已存在的键值对则尽量不要修改它,注意这个内容一定要在[mysql]和[client]的前面:
server-id=2
log-bin=mysql-bin
#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可,不配置则默认全部
#replicate-do-db = acs
#不需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db = mysql,information_schema,performance_schema
2.重启Mysql服务:
3.接下来操作从库,进入mysql控制台(Windows可以通过cmd或navicat命令列界面进入):
4.停止slave服务线程(有些版本执行这个命令可能会报错,无法识别,使用stop slave;即可)
mysql> stop slave;
5.清空信息
mysql> reset slave all;
6.接着执行,修改对应的参数,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status;中的信息。:
mysql> change master to
master_host=‘192.168.xxx.xx’,
master_port=3306,
master_user=‘tantuls’,
master_password=‘123456’,
master_log_file=‘mysql-bin.000001’,
master_log_pos=198325;
7.刷新
mysql> flush privileges;
8.启动slave服务线程
mysql> start slave;
9.查看slave的状态看是否配置成功,这俩为YES即成功:
7、验证
综上步骤就已经配置完主从复制了,可以在主数据库中插入一条数据然后在从库中看是否能查到即表示成功失败。
8、谨防踩坑
1.Slave_IO_Running为NO:
这意味着从服务器与主服务器无法建立IO连接,大概是因为主/从库的server-id没有唯一,让它们唯一即可;
也有可能是因为主从库之间没有建立网络连接,ping一下就知道了(也可能是有人粗心把change master to master_host的ip写错了)
2.Position一直变化/Slave_SQL_Running中从YES变为NO:
前面说需要给Master上锁或者停机也是因为如果数据库还在活跃状态,大概率事务也在活跃,Position就会一直变化,这也导致即使在步骤5.7中配置成功,过段时间再看Slave_SQL_Running时就会变成NO。因此在同步数据到新数据库及配置Slave时最好保持数据库处于只读状态。