迁移后需同步max_allowed_packet、sql_mode、时区、字符集及lower_case_table_names等关键参数:旧值需显式配置到my.cnf并重启生效,避免隐式降级或行为偏差。

迁移后 max_allowed_packet 突然报错
新服务器默认值常为 4MB,而旧库可能设为 64MB 或更高。若应用执行大 BLOB、长 INSERT 或导出导入操作,会直接触发 Packet too large 错误。
- 检查旧库:登录原 MySQL,执行
SHOW VARIABLES LIKE 'max_allowed_packet'; - 新库需同步该值,修改
my.cnf中的max_allowed_packet = 64M(注意单位是M,不是MB) - 必须重启 MySQL 生效,仅
SET GLOBAL无法突破启动时上限
sql_mode 不一致导致 INSERT 失败
MySQL 5.7+ 默认启用严格模式(如 STRICT_TRANS_TABLES),而老环境可能是空或宽松模式。迁移后常见报错:Incorrect integer value: '' for column 'id' at row 1。
- 导出旧库当前模式:
SELECT @@sql_mode; - 新库配置中显式设置
sql_mode = "...",不要依赖默认值 - 若业务依赖宽松行为(如隐式类型转换),不建议直接照搬旧值;应优先修复 SQL,再逐步收紧模式
时区和 timestamp 行为差异
旧服务器可能设为 SYSTEM(即系统本地时区),新服务器若未配置,DEFAULT CURRENT_TIMESTAMP 字段可能按 UTC 写入,造成时间偏移。
- 确认旧库时区:
SELECT @@time_zone, @@system_time_zone; - 新库应在
my.cnf中设置default-time-zone = '+08:00'(或'Asia/Shanghai') - 注意:修改后新建连接才生效;已有连接仍用旧时区,需重连
字符集与排序规则未对齐
即使表定义声明了 utf8mb4,若服务端 character_set_server 是 latin1,新建表/临时表/函数内部字符串仍会降级,引发乱码或索引失效。
- 比对关键变量:
character_set_server、collation_server、init_connect - 推荐统一设为:
character_set_server = utf8mb4,collation_server = utf8mb4_unicode_ci - 注意
init_connect若含 SET 语句,需确保其语法兼容新版本(如 8.0+ 不允许 SET @var 在 init_connect 中)
lower_case_table_names 和 innodb_file_per_table 这类影响元数据行为的参数——它们不报错,但会导致后续备份、表拷贝、跨平台恢复失败。务必在初始化实例前就定好,而不是等出问题再调。










