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

mysql命令导入SQL文件失败:常见报错和权限前提
直接用 mysql 命令导入SQL文件,最常卡在权限或连接环节。不是语法写错,而是用户没权限、数据库不存在、或者没指定目标库。
-
ERROR 1045 (28000): Access denied:说明当前用户没权限,别硬试密码,先确认是否用了有INSERT和CREATE权限的账号(比如root或专门建的导入用户) -
ERROR 1049 (42000): Unknown database 'xxx':目标库还没创建,得先用mysql -u root -p -e "CREATE DATABASE xxx CHARACTER SET utf8mb4;" - 没加
-D或--database参数,又没在SQL文件里写USE xxx;,数据会导进默认库(通常是test),而不是你想要的库
正确导入命令格式与必须带的参数
最稳的写法是显式指定主机、端口、用户、密码、目标库,并强制字符集一致——尤其备份文件含中文时,漏掉--default-character-set大概率乱码。
- 基础命令:
mysql -h localhost -P 3306 -u root -p --default-character-set=utf8mb4 -D mydb -
-D mydb必须写,不能省;mydb要是已存在的库名 - 如果密码为空,去掉
-p;如果密码含特殊字符(如$、!),建议用-p交互输入,避免shell解析出错 - 路径用绝对路径更可靠,比如
/home/user/backups/202405.sql,别依赖当前工作目录
大SQL文件导入慢或中断:怎么避免超时和锁表
超过50MB的SQL文件,直接mysql命令容易被max_allowed_packet或wait_timeout打断,且单线程导入效率低。
- 导入前临时调大限制:
mysql -u root -p -e "SET GLOBAL max_allowed_packet=512*1024*1024; SET GLOBAL innodb_log_file_size=256*1024*1024;" - 用
source方式替代重定向(适合交互式导入):mysql -u root -p -D mydb进入后执行source /path/to/backup.sql;,能更好控制进度 - 如果SQL里含大量
INSERT语句,备份时最好用--skip-extended-insert(每行一条INSERT),否则单条超长语句可能触发packet限制
导入后数据不对:编码、时间戳、外键约束这三处最容易漏查
看起来“成功”了,但查数据发现中文变问号、时间全成0000-00-00、或者某些表空着——问题往往不在导入命令本身,而在上下文环境不匹配。
- 检查源库和目标库的
character_set_database是否一致:SELECT @@character_set_database;,不一致就导出时加--default-character-set=utf8mb4,导入时也得对应 - SQL文件开头如果有
SET time_zone = '+00:00';,而你的服务器时区是Asia/Shanghai,时间字段会偏移8小时;导入前手动删掉或改成SET time_zone = '+08:00'; - 外键约束导致插入失败?导入前加
SET FOREIGN_KEY_CHECKS=0;,导入后再SET FOREIGN_KEY_CHECKS=1;;这个开关必须出现在SQL文件开头,或在mysql连接后手动执行


















