你可以通过调整 mysqldump 的选项,将默认的批量插入(Bulk INSERT)改为逐条插入(每行一个 INSERT 语句)。以下是具体步骤和解释:


方法 1:使用 --skip-extended-insert 选项

在备份数据库时,添加 --skip-extended-insert 选项,这会强制生成逐条插入的 SQL 语句。

备份命令示例

mysqldump --skip-extended-insert --complete-insert -u [用户名] -p [数据库名] > backup.sql

参数说明:

  • --skip-extended-insert:禁用批量插入,每条数据生成独立的 INSERT 语句。
  • --complete-insert:在 INSERT 语句中保留列名(避免表结构变化导致的列顺序问题)。

方法 2:同时处理字符集问题

如果报错与字符集相关,还需确保备份时指定正确的字符集(如 utf8mb4):

mysqldump --skip-extended-insert --default-character-set=utf8mb4 -u [用户名] -p [数据库名] > backup.sql

关键点:

  • --default-character-set=utf8mb4:强制使用 utf8mb4 字符集导出数据,避免字符丢失或乱码。

还原数据库

使用以下命令还原备份文件:

mysql -u [用户名] -p [数据库名] < backup.sql

注意事项

  1. 性能影响

    • 逐条插入会显著增加备份文件大小和还原时间,仅建议在调试错误时使用。
    • 生产环境仍推荐批量插入以提高效率,但需确保字符集和转义正确。
  2. 错误调试

    • 如果还原时报错,检查具体错误行(如特殊字符、转义符 \、或二进制数据)。
    • 使用 grep 或文本编辑器定位错误位置,例如:
      grep -n "INSERT" backup.sql | less
      
  3. 替代方案

    • 如果 SQL 格式仍存在问题,可尝试导出为 CSV 格式:
      mysqldump -u [用户名] -p --tab=/path/to/output [数据库名] --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by='\n'
      
    • 使用 mysqlimport 导入 CSV 数据。

通过上述方法,你可以生成逐条插入的 SQL 备份文件,更方便地定位和修复字符或语法问题。 ![调整 mysqldump 的选项,将默认的批量插入(Bulk INSERT)改为逐条插入]调整 mysqldump 的选项,将默认的批量插入(Bulk INSERT)改为逐条插入