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

    因爲[utf8mb4](https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html)支持更多的字符,所以一般都使用utf8mb4字符集。在MySQL 8.0中默認字符集就已經是utf8mb4了。但是,在MySQL 5.7中,默認的字符集還是utf8。而這接下來的一切,正是在5.7中發生的。

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

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

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

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

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

此時,就可以看到數據是不一樣的。

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

備份的連接用的是utf8。

至此結案。接下來再備份導入看看效果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'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章