导入MySQL备份文件至MariaDB后JSON数据损坏,求便捷无损导入方案
解决MySQL转MariaDB时JSON字段批量损坏的问题
一、从MySQL导出时提前规避问题(推荐)
直接用mysqldump导出时指定兼容参数,从根源避免JSON字段转义或格式不兼容:
mysqldump -u 用户名 -p \ --databases 数据库名 \ --compatible=mariadb \ --default-character-set=utf8mb4 \ --hex-blob \ > 备份文件.sql
参数说明:
--compatible=mariadb:强制生成MariaDB兼容的SQL语句--hex-blob:将JSON等特殊字段以十六进制格式导出,避免转义错误--default-character-set=utf8mb4:统一字符集,防止多字节字符导致JSON解析失败
二、导入MariaDB前的环境配置
导入前临时调整MariaDB的SQL模式,避免严格模式下的JSON校验报错:
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'; SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
如果需要永久生效,编辑MariaDB的配置文件(如/etc/my.cnf或/etc/mysql/my.cnf),添加:
[mysqld] sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
重启MariaDB服务后生效。
三、批量修复已导入的损坏JSON字段
如果已经完成导入且出现损坏,可通过Shell脚本自动遍历所有含JSON字段的表并修复(需MariaDB 10.2+版本支持):
#!/bin/bash DB_USER="用户名" DB_PASS="密码" DB_NAME="你的数据库名" # 获取所有JSON字段的表和字段名 mysql -u$DB_USER -p$DB_PASS -N -e "SELECT CONCAT(table_name, '.', column_name) FROM information_schema.columns WHERE data_type='json' AND table_schema='$DB_NAME'" | while read -r TABLE_COL; do TABLE=$(echo $TABLE_COL | cut -d. -f1) COL=$(echo $TABLE_COL | cut -d. -f2) # 修复损坏的JSON字段 mysql -u$DB_USER -p$DB_PASS -e "UPDATE $DB_NAME.$TABLE SET $COL = JSON_REPASE($COL) WHERE NOT JSON_VALID($COL);" done
注意:执行前务必备份数据库,避免修复过程中出现意外。
四、WordPress特定注意事项
部分WordPress插件会将JSON存储在wp_postmeta或自定义表中:
- 登录WP后台,开启Debug模式查看是否有JSON解析相关报错
- 对于插件自定义表,可确认插件是否有MariaDB兼容的版本或特殊导入说明
内容的提问来源于stack exchange,提问作者Doraemon
相关产品推荐
相关产品推荐

