场景1:单台数据库,四个数据库,test1,test2,test3,test4,平均个库10G文件,共40G
正常主从步骤,备份(三个小时),传输(一个小时),导入(三个小时),mysql主库需要锁表至少连续7个小时,这个线上是很难接受的
优化后的方案只需要分开四次,每次主库锁表只需要40分钟左右
操作1:mysql 主库锁表,记录Relay_Log_File,Read_Master_Log_Pos,导出数据库。
注意:FLUSH TABLES WITH READ LOCK;锁表为线程锁,当断开当前连接后自动解锁,需要放在screen后台,导出数据库时加上参数 导出master Relay_Log_File ,Read_Master_Log_Pos记录。导出数据后 对比 show master查看到的数值和mysql库文件中记录的一致。
操作2:确保 show master status 查看到的数值和mysql库文件中记录的一致。解锁mysql主库。此时线上mysql已经能正常处理读写事务。
操作3:从库 my.cnf配置,同步忽略数据库
replicate-do-db = test1
replicate-ignore-db = test2
replicate-ignore-db = test3
replicate-ignore-db = test4
mysql 配置主从关系,指定 刚刚记录的 Relay_Log_File ,Read_Master_Log_Pos,启动主从,start slave;
观察,mysql主从状态,mysql从Relay_Log_File会同步到主的最新数值。
到此锁住库40分钟解决了第一个库
操作四:继续同步其他数据库test2
首先确认mysql主从 Read_Master_Log_Pos一致
锁主表,停从库slave,导出数据库test2,解锁主库锁表,修改从库my.cnf加上同步test2,重启mysql,导入数据库2,启动slave...
锁住库40分钟左右,同步完第二个数据库。
.....
只需要找空闲时间操作,分四次,每次40分钟,需要7个小时主从数据就同步完了..
方法二:无论主库多大,只需要锁库一分钟
备份数据带参数 --master-data=2 --single-transaction
主库锁表,然后从库先停止主从。确认 主从Read_Master_Log_Pos一致
准备备份参数是锁表设置一致性快照,然后解锁表,根据一致性快照备份数据,只支持innodb
主从解锁表,备份好后,导入从库,启动主从。自动同步新产生的数据。