mysql导入sql文件失败主因是权限不足、目标库未创建或未指定数据库;需用有insert/create权限的用户,先建库,再用mysql -h -p -u -p --default-character-set=utf8mb4 -d指定库执行。

用 mysql 命令行执行 SQL 文件恢复数据库
直接执行 mysql 命令导入 SQL 文件是最常用、最可靠的方式,前提是目标数据库已存在(或先用 CREATE DATABASE 创建)。它不依赖图形界面,适合脚本化和生产环境。
常见错误现象:执行后无报错但数据没进来;提示 Unknown database;中文乱码;主键冲突导致中断。
- 确保数据库已创建:
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" - 导入时显式指定字符集:
mysql -u root -p --default-character-set=utf8mb4 mydb (注意不是 <code>--charset,后者在导入时不生效) - 如果 SQL 文件含
CREATE DATABASE或USE语句,需去掉或加-D参数跳过库名检查,否则可能报错ERROR 1049 (42000): Unknown database - 大文件导入前建议关闭自动提交:
mysql -u root -p -e "SET autocommit=0; SOURCE /path/to/backup.sql; COMMIT;" mydb,可显著提升速度
用 source 命令在 MySQL 客户端内恢复
适用于交互式调试或小规模恢复,但对路径敏感、不支持管道、且容易因路径不存在静默失败。
使用场景:你已经登录到 mysql 客户端,想快速验证某个 SQL 片段或小备份。
- 必须使用绝对路径:
source /home/user/backup.sql(相对路径常报Failed to open file) - 当前连接的数据库必须与 SQL 文件中的表所属库一致,否则会报
Table 'xxx' doesn't exist—— 即使文件里有USE mydb;,source也不会自动切换 - 若文件含多条语句且含分号,确保客户端分隔符未被修改(默认是
;),否则可能只执行第一句 - 遇到
ERROR 1062 (23000): Duplicate entry时,source不会停止,但后续语句仍继续执行,可能造成数据不一致
mysqldump 备份文件能否直接用 mysql 执行?
能,但必须确认导出时是否用了 --no-create-info 或 --skip-add-drop-table 等选项。默认生成的 dump 文件包含建库、建表、删表语句,直接执行可能覆盖线上结构。
性能影响:含 DROP TABLE 的 dump 在恢复时会重建所有索引,比仅插入快不了多少;而纯 INSERT 文件更适合增量追加。
- 查看文件开头确认结构:
head -n 20 backup.sql | grep -E "(CREATE DATABASE|DROP TABLE|INSERT INTO)" - 如只需数据,用
sed过滤掉 DDL:sed -n '/^INSERT INTO/p' backup.sql > data_only.sql(注意这会丢掉SET FOREIGN_KEY_CHECKS等关键设置) - 恢复前务必停写或锁表,否则
INSERT过程中并发写入可能导致主从延迟或唯一键冲突
遇到 ERROR 2006 (HY000): MySQL server has gone away 怎么办
这是恢复大 SQL 文件时最典型的中断错误,根本原因是 max_allowed_packet 或 wait_timeout 不足,和网络无关。
不是重试就能解决,必须调参后重新执行整个导入流程。
- 查当前值:
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_allowed_packet';",默认通常只有 4MB - 临时增大(需重启 mysql 服务才对所有连接生效):
mysqld --max_allowed_packet=512M,或在my.cnf中写入[mysqld]\nmax_allowed_packet = 512M - 导入命令本身也可绕过部分限制:
mysql --max-allowed-packet=512M -u root -p mydb (注意这里是客户端参数,不是服务端) -
wait_timeout过短会导致长事务中断,设为28800(8 小时)更稳妥
真正麻烦的不是语法或命令,而是恢复前没确认字符集一致性、没检查外键约束状态、也没预估好锁表时间——这些不会报错,但会让恢复后的数据处于“看似成功、实则异常”的状态。











