MySQL集群搭建——主从同步
1.分别在两台服务器上安装MySQL
2.分别在两台MySQL里创建数据库
create database test;
3.修改主服务器配置文件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 #同步的数据库名称
4.配置从服务器登陆主服务器的账号授权
```powershell
--授权操作
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to 'root'@'%' identified by '123456';
--刷新权限
flush privileges;
5.修改从服务器配置文件my.cnf
#修改配置文件,执行以下命令打开mysql配置文件
vi /etc/my.cnf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #二进制文件的名称
binlog-format=ROW #二进制文件的格式
server-id=2 #服务器的id
6.重启主服务器的MySQL服务
#重启mysql服务
service mysqld restart
#登录mysql数据库
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)
7.重启从服务器的MySQL服务
#重启mysql服务
service mysqld restart
8.登陆从服务器mysql并连接主服务器
#登录mysql数据库
mysql -uroot -p
#连接master主服务器
mysql> change master to master_host='192.168.47.47',master_port=3306,master_user='root',master_password='Nomatter..123456',master_log_file='master-bin.000001',master_log_pos=154;
#master_host对应主服务器的IP地址。
#master_port对应主服务器的端口。
#master_log_file对应show master status显示的File列:master-bin.000001。
#master_log_pos对应show master status显示的Position列:154。
9.启动slave数据同步
#启动slave数据同步
mysql> start slave;
10.查看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;
#master_log_file和master_log_pos可能会不同,需要在主数据库中show master status来查看