0%

mysql不停机主备复制

简介

之前在网上找到的关于主备节点的同步数据大多是要在主节点停机或者限制写入,然后将数据拷贝到从节点,然后再进行主从节点的日志同步,其实mysql下提供了mysqldump工具可以在不停机下进行主从数据的同步,将主节点的数据复制到从节点,即使这时候主节点仍在写入数据,将数据导入到从节点后,再将从节点的binlog日志节点指向拷贝主节点数据时的binlog日志位置,最后再由系统追上主节点的数据进度。

搭建主备

如何搭建主备参考hive分类下的—hive mysql元数据表单的主从备份这篇文章

导出主库数据

  • single-transaction保证在innodb引擎下导出数据的一致性
  • master-data=2表示在导出的文件中现实binlog的名字和position,后续在从节点中根据这里的参数指向主节点的binlog日志
  • -A表示导出所有数据库,一般导出所有数据库。
    1
    /usr/bin/mysqldump  --single-transaction --master-data=2 -u root -p -A>/mysql/qwe.sql

关于mysqldump的用法参考

https://www.centos.bz/2018/02/mysqldump-%E5%8F%82%E6%95%B0%E5%92%8C%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D/

模拟主从不一致

我们需要手动同步主备数据往往就是因为数据库出现异常,导致主从节点数据不一样,这里我们模型主从数据库不一致的情况,然后将主库数据导入到备库中

  • 停止从库

    1
    stop SLAVE
  • 将主库数据导入到从库,qwe.sql是之前主库中导出的数据

    1
    mysql -u root -p<qwe.sql
  • 导入成功后主从的数据已经一致

  • 我们在主库中随意插入几条数据,由于未开启同步,从库中并没有同步新插入的数据,这里模拟了主从数据不同步的问题,在线数据迁移中往往会出现这个问题,在备份过程中,又有新的数据插入到数据库中

开启从节点同步

  • 首先查看我们之前导出的sql数据的binlog的位置和postion
1
head -n 30 qwe.sql
  • 查看到如下数据
1
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=785;
  • 查看主节点的binlog
1
show master status

发现其binlog位置已经和导出数据时发生了改变

1
mysql-bin.000004     1410
  • 将从节点的binlog指向主节点

注意我们在这里使用的是导出数据时候的binlog,也就是导出sql里显示的binlog

1
2

change master to master_host='192.168.1.10', master_user='slave', master_password='mysql', master_log_file='mysql-bin.000004', master_log_pos=785;
  • 开启从节点同步
1
start slave;

执行以下语句,发现现在主从的binlog已经同步,查询从库数据发现已经存在之前插入的数据

1
show slave status;

问题

  • 最好保证主从数据库版本的一致,至少主库的数据库版本要大于从库的版本