MySQL因字符集致使主從數據不一致

由於utf8mb4支持更多的字符,因此通常都使用utf8mb4字符集。在MySQL 8.0中默認字符集就已是utf8mb4了。可是,在MySQL 5.7中,默認的字符集仍是utf8。而這接下來的一切,正是在5.7中發生的。php

最近接了個任務,由於機房須要搬遷,須要遷移數據庫。爲了減小停機時間,經過主從切換方式進行。而又由於須要合併服務器,又採用了多源複製的手段。掂量了一下,以爲仍是邏輯備份的方式方便。說幹就幹,先導出數據:mysqldump -u root -p'123456' --single-transaction --events --triggers --routines --master-data=2 --databases db1 db2 db3 --result-file='a001.sql'。導入數據後需校驗一下數據,checksum table就挺好用了。從兩端跑出來結果,一對比倒是不同的。搗鼓了半天,終於發現玄機。這裏直接公佈答案。html

爲了方便描述,現將主從不一致結果放到一個庫中展現:
MySQL因字符集致使主從數據不一致
雖然,查詢結果看着是同樣的,但倒是不同的數據。mysql

對應的表結構:
MySQL因字符集致使主從數據不一致sql

這裏看到表的字符集是utf8mb4。對應的字符集設置:
MySQL因字符集致使主從數據不一致數據庫

發現客戶端的字符集和表的字符集是不一致的。修改客戶端字符集後再查看:
MySQL因字符集致使主從數據不一致json

此時,就能夠看到數據是不同的。服務器

回去看備份文件:
MySQL因字符集致使主從數據不一致ide

備份的鏈接用的是utf8。code

至此結案。接下來再備份導入看看效果mysqldump -u root -p'123456' --single-transaction --default-character-set=utf8mb4 --events --triggers --routines --master-data=2 --databases db1 db2 db3 --result-file='a001.sql'htm

然而,故事到這裏尚未結束。還有一個Bug(table with json data type,checksum table result inconsistent)等着我。

相關文章
相關標籤/搜索