一、 问题是这样来的
BG内部要进行数据库的容灾演习,需要模拟线上实际的环境进行测试,这就需要copy一份线上的数据库到测试库中,其实也就是重建一个线上数据库。要完成这个任务其实有N种不同的做法,但是我当时一想:“好久没有测试一下数据备份是否正常了。”就决定利用备份数据进行重建测试库,于是乎就导出了一份XXXX.sql文件,直接往测试库里面导入,由于线上库的实际数据量还不小,所以当我按完“Enter”后就决定下班回家,估计等我到家了就差不多完成了。
结果竟然出问题了,屏幕上出现:
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
二、 苦逼的探索
mysql的varchar主键只支持不超过767个字节或者768/2=384个双字节 或者767/3=255个三字节的字段 而GBK是双字节的,UTF8是三字节的。
那么问题来了,为什么线上业务库中正常的数据直接移植到另一个库,竟然会报设置表中字段不合法的错!
(1)字符集设置不同?
第一个想法是查看两个库的字符集设置是不是不一样,果然线上库的字符集character_set_database=lantin1,而测试库的字符集character_set_database= utf8。这时候,我很天真的以为可能是因为建表的时候没有指定字符集,所以在导入测试库的时候默认使用utf-8字符集,导致Specified key was too long。所以就更改了测试库中默认的字符集,但是导入数据的时候依然还是报同样的错误。而且我在建表的语句中发现了,其实原来