MySQL主从同步配置
1 修改主库配置文件 /etc/my.cnf
vim /etc/my.cnf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #二进制文件名称
binlog-format=ROW #二进制日志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
server-id=1 #要求各个服务器的id必须不一样
binlog-do-db=test #同步的数据库名称
2.配置从服务器登陆主服务器的账号授权
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on . to ‘root’@‘%’ identified by ‘123456’;
–刷新权限
flush privileges;
3 修改从服务器配置文件 /etc/my.cnf
vim /etc/my.cnf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #二进制文件的名称
binlog-format=ROW #二进制文件的格式
server-id=2 #服务器的id
4 重启主服务器的MySQL服务
service mysqld restart
mysql -uroot -p
#查看master的状态
mysql> show master status;
±------------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±------------------±---------±-------------±-----------------±------------------+
| master-bin.000001 | 154 | test | | |
±------------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)
9342
5 重启从服务器的MySQL服务
service mysqld restart
#连接master主服务器
mysql> change master to master_host=‘192.168.47.47’, #master_host对应主服务器的IP地址。
master_port=3306,master_user=‘root’, #master_port对应主服务器的端口。
master_password=‘Nomatter…123456’,
master_log_file=‘master-bin.000001’,
master_log_pos=154;
slave数据同步
mysql> start slave;
mysql> show slave status\G; #Slave_IO_Running和Slave_SQL_Running都为yes,则表示同步成功,可以测试在主服务器上创建表以及添加数据,查看从服务器上是否同步创建了该表以及添加了对应数据。
可能遇到的错误
若在主从同步的过程中,出现其中一条语句同步失败报错了,则后面的语句也肯定不能同步成功了。例如,主库有一条数据,而从库并没有这一条数据,然而,在主库执行了删除这一条数据的操作,那么从库没有这么一条数据就肯定删除不了,从而报错了。在此时的从数据库的数据同步就失败了,因此后面的同步语句就无法继续执行。
有两种解决方法:
(1)在从数据库中,使用SET全局sql_slave_skip_counter来跳过事件,跳过这一个错误,然后执行从下一个事件组开始。
#在从数据库上操作
mysql > stop slave;
mysql > set global sql_slave_skip_counter=1;
mysql > start slave;
2)在从数据库中,重新连上主数据库。这种操作会直接跳过中间的那些同步语句,可能会导致一些数据未同步过去的问题,但这种操作也是最后的绝招。最好就是令从数据库与主数据库的数据结构和数据都一致了之后,再来恢复主从同步的操作。
#在从数据库上操作
mysql > stop slave;
mysql> change master to master_host=‘192.168.17.130’,master_port=3306,master_user=‘root’,master_password=‘Nomatter…123456’,master_log_file=‘master-bin.000001’,master_log_pos=2050;
mysql > start slave;