MySQL Replication--修复从库上单个数据库的数据
问题描述
由于运维失误,从库未及时设置read_only,导致从库上某库数据被修改,由于整个实例数据量较大,重做成本较高,而该数据库数据较少,因此考虑如何修复该数据库的数据。
操作前提
1、复制使用位点同步,未使用MASTER_AUTO_POSITION=1选项
2、程序对数据库操作不存在跨库事务,保证过滤该库的复制事件后不会丢失其他库的事件。
处理步骤
1、停止该从库上复制(实际复制已停止)
STOP SLAVE;
2、在主库上备份整表数据(注意记录主库位点)
/export/servers/mysql/bin/mysqldump \ --socket="/export/data/mysql/tmp/mysql.sock" \ --host="127.0.0.1" \ --port=3358 \ --user='mysql_root' \ --password="mysql_root_pws" \ --default-character-set="utf8" \ --single-transaction \ --databases 'demodb' \ --hex-blob --opt --quick \ --events --routines --triggers \ --master-data=2 \ --set-gtid-purged=OFF \ > /export/data/mysql/dumps/demodb.sql
3、修改从库复制属性,跳过该库相关复制
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB=(test,demodb)
4、将主库上mysqldump出来的文件复制到从库,并查看位点信息
head -n 100 /export/data/mysql/dumps/demodb.sql |grep 'CHANGE MASTER' 输出结果为: CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.003001', MASTER_LOG_POS=749489338;
5、使用START SLAVE UNTIL将复制执行到备份位点
START SLAVE UNTIL MASTER_LOG_FILE='mysql-bin.003001', MASTER_LOG_POS=749489338;
6、将备份位点的数据更新到从库中
/export/servers/mysql/bin/mysql \ --host="127.0.0.1" \ --port=3358 \ --user='mysql_root' \ --password="mysql_root_pws" \ --database="mysql" \ --verbose \ --batch \ -vvv \ </export/data/mysql/dumps/demodb.sql \ 1>/export/data/mysql/dumps/demodb.log \ 2>/export/data/mysql/dumps/demodb.err
7、修改从库复制属性,去除对该库的过滤复制
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB=(test)
8、开启复制,复制恢复正常
START SLAVE;