mysql主从复制主要是通过binlog实现的

主服务器

配置

1
2
3
4
log-bin=mysql-bin            
binlog-format=ROW
binlog-do-db=demo_ds_master
server-id=1
  • 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
2
3
4
5
6
7
8
//创建用户,@'localhost'代表仅能通过localhost访问(即只能本机访问),如果想去除ip的限制,配置@'%'
CREATE USER 'rep'@'localhost' IDENTIFIED BY '123456';
//授予同步权限,@'localhost'代表仅能通过localhost同步(即只能本机同步),with grant option表示给予rep用户授权当前权限给其他用户的权限,这里当前权限就是同步的权限
grant replication slave on *.* to 'rep'@'localhost' with grant option;
//授予write_read的所有权限给rep用户,以可以让从服务器通过连接此用户同步demo_ds_master
GRANT ALL PRIVILEGES ON `demo_ds_master`.* TO 'rep'@'localhost';
//刷新生效
flush privileges;

获取当前bin-log文件以及偏移量

1
show master status;

这里查询出来当前的bin-log文件名、文件偏移量以及当前会同步的库,bin-log文件名、文件偏移量在后面从服务器需要用到

从服务器

配置

1
2
3
4
log-bin=mysql-bin
binlog-format=ROW
replicate-rewrite-db=demo_ds_master -> demo_ds_slave_0
server-id=2
  • 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
2
3
4
5
6
7
CHANGE MASTER TO
MASTER_HOST='localhost', //主数据库地址,在上面配置的
MASTER_PORT=3306, //主数据库端口
MASTER_USER='rep', //同步的用户,在上面配置的
MASTER_PASSWORD='123456', //同步用户的密码
MASTER_LOG_FILE='mysql-bin.000060', //主服务器的bin-log文件
MASTER_LOG_POS=16090; //主服务器的bin-log的偏移量,不一定需要当前的偏移量

我们要理解命令的字面意思是修改主服务器,所以如果已经设置主服务器并且需要修改其中一项,则只需在命令后加入一项,这里面需要强调的是MASTER_LOG_POS参数,该参数可以设置主数据库当前bin-log文件偏移量之前的偏移量以达到同步主数据库之前的数据的效果,不过需要注意并不一定成功,因为bin-log文件记录的是sql或者数据变化,如果遇到delete或者drop等命令,而未同步到delete之前的insert语句或者drop之前的create语句,则可能报错,mysql主从同步有个明显的问题就是一旦遇到错误,就会停止同步,所以需要非常注意,不过因为偏移量可以往前设置的特性,及时从服务器出现宕机,恢复之后也可以同步之前未同步的数据

1
2
3
4
5
stop slave;         //关闭同步

start slave; //开启同步

show slave status; //查看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目录下,可以查看该文件确定同步情况


本站总访问量:次本站总访问数:人
本站由 Peng Tong 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。