1、MySQL 主从同步

MySQL主从又叫做Replication、Master/Slave复制。简单讲就是A和B两台机器做主从后,其中Master负责写操作的负载,也就是说一切写的操作都在Master上进行,而读的操作则分摊到Slave上进行,两者数据实时同步。

主上有一个log dump线程,用来和从的I/O线程传递binlog

从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句执行一遍

两种情况:一种是做备份用,一种是作为读用

MySQL主从是基于binlog的,主上须开启binlog才能进行主从。 主从过程大致有3个步骤

1)主将更改操作记录到binlog里

2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里

3)从根据relaylog里面的sql语句按顺序执行

2、MySQL 数据库环境

MySQL 数据库版本都是mysql-5.7,两台电脑都在同一个网段之中。

主库所在的操作系统:win7 从库所在的操作系统:windows server 2008

主库的版本:mysql-5.7.20-winx64.zip 从库的版本:mysql-5.7.20-winx64.zip

主库的ip地址:192.168.0.116 从库的ip地址:192.168.0.254

主库的端口:3306 从库的端口:3306

3、MySQL 主从同步配置

1)配置主库,主要是my.ini增加如下选项:

配置完成后需要重启mysql服务,如下图所示:

2)添加主数据库用于同步的账号:

给主数据库授权一个可以进行复制的用户,执行如下命令:

#进入到mysql的bin目录下,执行

#重启主数据库,然后在主数据库中建立一个备份账户

mysql -h localhost -u root -p

输入密码 进入

mysql mysql>show databases;

mysql>grant replication slave on *.* to 'slave_username'@'192.168.1.12' identified by 'slave_password' ;

mysql>flush privileges;

3)显示主数据库的同步信息:

可以看出已经产生了二进制的日志文件信息,mysql的同步就是通过这个二进制日志文件进行同步,主数据库把对数据库的操作的指令都记录到该日志文件下,从数据库通过读取该文件,来对从数据库中的数据进行修改,从而达到主从同步的效果。

#显示主服务器的状态信息,并且找到File 和 Position 的值记录下来;

#此处加\G的意思是格式化输出,否则输出乱七八糟,看不清楚

mysql>show master status \G;

#记下File 和 Position,从库配置要用

4) 配置从库

从数据库的话只需要配置server-id,binlog-do-db,binlog-ignore-db即可。

#从库配置

server_id=2

relay-log-index=slave-relay-bin.index

relay-log=slave-relay-bin

配置完成重启mysql服务

5) 设置从数据库链接到主数据库

#进入到mysql的bin目录下,执行

#重启从数据库,设置登录主数据库的账号和密码等信息,然后启动slave

mysql>change master to master_host='192.168.0.254',master_user='slave_username',master_password='slave_password', master_log_file='.000001',master_log_pos=0;

mysql>start slave;

#此处加\G的意思是格式化输出,否则输出乱七八糟,看不清楚

mysql>show slave status \G;

#如果出现: Slave_IO_Running: Yes Slave_SQL_Running: Yes以上两项都为Yes,那说明没问题了

6)错误问题汇总

在配置MySQL主从复制时,通过show slave status 命令可能发现问题,到MySQL日志文件路径(D:\Program Files\mysql-5.7.20-winx64\data)以计算机名+.err就是错误日志文件

Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件

Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。

a) Slave_IO_Running :No

2018-07-20T02:52:13.894200Z 4 [ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593

解决办法:是由于当初从库数据库是直接从主库复制而来,导致MySQL 主库和从库server-uuid 重复问题,只需要到MySQL 安装目录(D:\Program Files\mysql-5.7.20-winx64\data)下auto.cnf文件打开更改server-uuid即可或者删掉auto.cnf,重新启动;

#可以通过select uuid(); 命令获取uuid

select uuid();

b)Slave_SQL_Running : No

2018-07-20T03:37:14.074200Z 23 [ERROR] Slave SQL for channel '': Error executing row event: 'Table 'ryw-ec.sys_log' doesn't exist', Error_code: 1146

2018-07-20T03:37:22.213200Z 24 [ERROR] Slave SQL for channel '': Error 'Can't drop database 'ryw-ec'; database doesn't exist' on query. Default database: 'ryw-ec'. Query: 'DROP DATABASE `ryw-ec`', Error_code: 1008

解决办法:

在从服务器上设置忽略该错,在my.cnf文件中添加“slave-skip-errors = 1146”,

如果少量的这种错误,直接在mysql client里面设置“set global sql_slave_skip_counter=1”;

mysql> stop slave;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> start slave;

PS:本人多次遇到从数据库的同步进程自动停掉的问题,有时简单通过slave stop,slave start即可解决。有时slave start启动后又会自动停掉,这时使用 change master重设主数据库信息的方式解决了问题。

查看原文 >>
相关文章