
mysql主从复制主要是通过binlog实现的
主服务器
配置
1 | log-bin=mysql-bin |
- log-bin=mysql-bin:开启binlog
- binlog-format=ROW:设置binlog复制模式
- STATEMENT:只会将会修改数据的sql语句会记录到binlog中,不会存储所有sql语句,也不存储数据变化情况
- ROW:不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了
- MIXED:以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog
- binlog-do-db=demo_ds_master:如上图所示,设置需要同步的库
- server-id=1:设置server-id,mysql服务器server-id不能一样
创建同步用户
1 | //创建用户,@'localhost'代表仅能通过localhost访问(即只能本机访问),如果想去除ip的限制,配置@'%' |
获取当前bin-log文件以及偏移量
1 | show master status; |

这里查询出来当前的bin-log文件名、文件偏移量以及当前会同步的库,bin-log文件名、文件偏移量在后面从服务器需要用到
从服务器
配置
1 | log-bin=mysql-bin |
- log-bin=mysql-bin:开启binlog
- binlog-format=ROW:设置binlog复制模式
- replicate-rewrite-db=demo_ds_master -> demo_ds_slave_0 设置同步的库,这样配置有一定的问题,就是在执行带有库名的sql语句时,同步会出错,使用replicate-do-db=demo_ds_master配置可以解决这个问题,这样配置的话就是主从库的库名相同,这里配置的主数据库的库名一定要在主数据库种有配置同步
- server-id=2:设置server-id,和主服务器以及其他从服务器不一样
设置主数据库以及开启同步
1 | CHANGE MASTER TO |
我们要理解命令的字面意思是修改主服务器,所以如果已经设置主服务器并且需要修改其中一项,则只需在命令后加入一项,这里面需要强调的是MASTER_LOG_POS参数,该参数可以设置主数据库当前bin-log文件偏移量之前的偏移量以达到同步主数据库之前的数据的效果,不过需要注意并不一定成功,因为bin-log文件记录的是sql或者数据变化,如果遇到delete或者drop等命令,而未同步到delete之前的insert语句或者drop之前的create语句,则可能报错,mysql主从同步有个明显的问题就是一旦遇到错误,就会停止同步,所以需要非常注意,不过因为偏移量可以往前设置的特性,及时从服务器出现宕机,恢复之后也可以同步之前未同步的数据
1 | stop slave; //关闭同步 |
- Slave_IO_State: 从服务器的 I/O 状态。
- Master_Host: 主服务器的主机名或 IP 地址。
- Master_User: 与主服务器连接的用户名。
- Master_Port: 主服务器的端口号。
- Connect_Retry: 从服务器重试连接主服务器的时间间隔(单位:秒)。
- Master_Log_File: 主服务器当前正在写入的二进制日志文件的名称。
- Read_Master_Log_Pos: 从服务器当前正在读取的二进制日志文件的位置。
- Relay_Log_File: 从服务器正在写入的中继日志文件的名称。
- Relay_Log_Pos: 从服务器正在写入的中继日志文件的位置。
- Relay_Master_Log_File: 从服务器正在复制的最后一个日志文件的名称。
- Slave_IO_Running: 从服务器执行的 I/O 线程是否正在运行。
- Slave_SQL_Running: 从服务器执行的 SQL 线程是否正在运行。
- Replicate_Do_DB: 从服务器要复制的数据库名。
- Replicate_Ignore_DB: 从服务器忽略复制的数据库名。
- Replicate_Do_Table: 从服务器要复制的表名。
- Replicate_Ignore_Table: 从服务器忽略复制的表名。
- Last_Errno: 当 SQL 线程出现错误时,记录错误号。
- Last_Error: 当 SQL 线程出现错误时,记录错误信息。
- Slave_SQL_Running_State: SQL 线程的状态信息。
- Seconds_Behind_Master: 从服务器库落后主服务器库的秒数。如果该值为 NULL,则表示从服务器正在初始化。
其中需要注意的是Slave_IO_Running以及Slave_SQL_Running配置,当这两个配置都为yes的时候,代表正常同步,否则为不正常,需要查看日志
日志查看


可以查看mysql my.ini的该配置,该文件在mysql datadir目录下,可以查看该文件确定同步情况