“别再抱怨你此生找不到一个对的人,当初的数学选择题就四个,你也找不到对的答案啊”
前言
昨天帮同事解决主从同步的问题。
原因是同事使用Django
开发了一套运维平台。但是里面的表使用了FOREIGN KEY
,在插入的是报错。造成了主从同步错误
,数据量不大,使用pt-table-checksum
来校验主从数据
操作
一、先跳过主从错误,主从同步关系恢复正常。
1 | STOP SLAVE sql_thread; |
二、使用 pt-table-checksum
1 | pt-table-checksum --set-vars innodb_lock_wait_timeout=200 --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=***** --host=*** --port=*** --user=*** --password='*****' --recursion-method='processlist' |
1 | Error setting innodb_lock_wait_timeout: DBD::mysql::db do failed: Variable 'innodb_lock_wait_timeout' is a read only variable [for Statement "SET SESSION innodb_lock_wait_timeout=1"]. The current value for innodb_lock_wait_timeout is 50. If the variable is read only (not dynamic), specify --set-vars innodb_lock_wait_timeout=50 to avoid this warning, else manually set the variable and restart MySQL. |
于是排除问题:
- 查看MySQL 版本
- 查看MySQL 字符集
- 查看数据库和表的字符集
google查找问题原因
发现篇文章和该错误几乎一致。说到pt-table-checksum已经不支持MySQL 5.1版本。1
2
3
4
5Thank you for the report.
The error is expected since character set utf8mb4 Unknown to the MySQL 5.1
MySQL 5.1 is not a supported version: https://www.percona.com/services/support/mysql-support/percona-toolkit-supported-platforms-and-versions
写了一个patch
pt-table-checksum打补丁
1 | patch pt-table-checksum < pt-table-checksum.utf8mb4.patch |
执行命令
1 | pt-table-checksum --set-vars innodb_lock_wait_timeout=200 --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=***** --host=*** --port=*** --user=*** --password='*****' --recursion-method='processlist' |
发现没有上面的问题,一切都正常。在执行
1 | pt-table-sync --replicate=test.checksums --databases=***** --charset=utf8 h=****,P=****,u=****,p='****' --execute |
总结
使用MySQL 5.1版本的数据库赶快升级吧。太折腾人了。
参考
- Percona: jira