MySQL 不停机不锁表主从搭建

MySQL 主从搭建分几种场景

无业务数据,初始化搭建
有业务数据,临时扩展
初始化的搭建很简单,不涉及数据业务,所以锁表、停机等都不影响,但是更多时候是业务到一定阶段,才会涉及到横向扩展,需要做主从,读写分离等来提升服务性能

这个时候,数据业务不能中断,又需要快速进行扩展提升性能,只能在不停机、不停服务的情况下扩展,就需要用到下面介绍的这种方法来做数据库主从

当然还是有前提条件,如果你原本 MySQL 连 binlog 及 server_id 都这种基础配置都没做,那也谈不上不停机配置主从

原理
不停机实现主从搭建的关键点就是以下两个参数:

–single-transaction
–master-data
master-data 参数主要用来记录主库的 binlog_file 和 pos,它有两个值,分别是:

1: 在 mysqldump 过程中,将 binlogfile 和 pos 信息记录在 sql 中,并且不是以注释信息的方式记录,这样在执行导入的时候自动执行这部分信息

2: 在 mysqldump 过程中,将 binlogfile 和 pos 信息以注释的方式记录在 sql 中

single-transaction 参数则是通过提交单一事务来确保数据一致性,通过在 FLUSH TABLES WITH READ LOCK 后添加 START TRANSACTION 语句,开启单一事务,此时加锁,仅仅是为了获取准确的 master-data 中的 binlogfile 和 pos 信息,在开启事务后,锁已经释放了,所以对业务影响很小

通过以上两个参数,可以在不长时间锁表的情况下获取准确的 binlogfile 和 pos 信息,从而完成主从配置

实战
导出数据

从主库通过 mysqldump 导出数据

mysqldump -uroot -ppassword –single-transaction –master-data=2 –databases db1 db2 xxx > databases.sql
打包压缩

tar -zcvf databases.sql.tar.gz databases.sql
复制到从库

scp databases.sql.tar.gz root@slave_ip:/data/sql/
后面的操作在从库进行

解压

tar -zxvf databases.sql.tar.gz
导入数据

source /path_to/databases.sql.tar.gz
配置主从同步参数

change master to master_host=‘ip’,master_user=‘slave’,master_port=port,master_password=‘password’,master_log_file=‘mysql-bin.file’,master_log_pos=POS;
其中 master_log_file 和 master_log_pos 就是上面通过 master-data=2 参数导出的,在 sql 文件里面开头部分

启动 slave 同步

start slave;
查看同步状态

show slave status\G;
通过这种方法,可以在不停止业务的情况下,保证数据一致性的同时,快速扩展从库