MySQL数据库导入sql文件报错解决
导入sql文件的时候各种报错?下面整理了最常见的导入报错和解决办法,照着排查就行。
1. 先看最常见的导入命令
mysql -u root -p 数据库名 < /path/to/你的文件.sql
或者进入MySQL后用source:
mysql -u root -p
USE 数据库名;
source /path/to/你的文件.sql;
2. 报错1:Unknown database
原因: 数据库不存在,你直接导入了。
解决: 先创建数据库再导入:
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET utf8mb4;
然后再执行导入命令。
3. 报错2:Access denied
原因: 权限不够,或者密码错了。
解决: 确认用户名密码对不对,给用户授权:
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;
4. 报错3:File not found
原因: 文件路径不对,或者文件没权限读。
解决:
- 用绝对路径,不要用相对路径
- 确认文件存在:
ls -l /path/to/file.sql - 给文件加读权限:
chmod 644 file.sql
5. 报错4:Duplicate entry
原因: 导入的表已经有数据了,主键冲突。
解决:
- 先清空表再导入:
TRUNCATE TABLE 表名; - 或者导入SQL文件开头加上
DROP TABLE IF EXISTS 表名;
6. 报错5:Unknown collation
原因: 字符集排序规则不一致,比如导出用的是 utf8mb4_general_ci,导入的数据库是 utf8_general_ci。
解决: 导入前设置字符集:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- 导入你的SQL
SET FOREIGN_KEY_CHECKS = 1;
7. 报错6:MySQL server has gone away
原因: SQL文件太大,导入超时了。
解决: 修改MySQL配置:
# /etc/my.cnf
max_allowed_packet = 64M
wait_timeout = 300
interactive_timeout = 300
然后重启MySQL:
systemctl restart mysqld
8. 报错7:Syntax error
原因: SQL文件格式不对,或者MySQL版本不兼容。
解决:
- 导出的时候选择兼容版本
- 去掉注释行(-- 开头的)
- 用文本编辑器打开检查一下有没有乱码
9. 大文件导入更快的方法
如果SQL文件几百MB,用mysql命令行比phpMyAdmin快10倍:
mysql -u root -p 数据库名 < big_file.sql
还可以开事务加速:
SET autocommit = 0;
SET unique_checks = 0;
SET foreign_key_checks = 0;
-- 导入完成后
SET autocommit = 1;
SET unique_checks = 1;
SET foreign_key_checks = 1;
COMMIT;
遇到问题加QQ23979811 协助处理
MySQL数据库导入sql文件报错解决
前言
导入SQL文件到MySQL,经常报各种错。本文总结最常见的导入报错和解决方法。
常用导入命令
mysql -u root -p 数据库名 < xxx.sql
或者登录MySQL后:
source /路径/xxx.sql;
常见报错及解决
报错1:Unknown database
ERROR 1049 (42000): Unknown database 'xxx'
原因: 数据库不存在。
解决: 先创建数据库:
CREATE DATABASE xxx DEFAULT CHARSET utf8mb4;
然后再导入。
报错2:Access denied
ERROR 1044 (42000): Access denied for user
原因: 用户没权限。
解决: 用root用户导入,或者给用户授权。
报错3:File not found
ERROR 1045 (28000): Access denied
或者文件找不到。
原因: 文件路径不对,或者文件权限不对。
解决:
- 确认文件存在:
ls -l /路径/xxx.sql - 确认文件可读:
chmod 644 /路径/xxx.sql - 用绝对路径,别用相对路径
报错4:Table already exists
ERROR 1050 (42S01): Table 'xxx' already exists
原因: 表已经存在了。
解决: 两种方法:
- 先删表再导入:
DROP TABLE xxx; - SQL文件里加
DROP TABLE IF EXISTS xxx;
报错5:Duplicate entry
ERROR 1062 (23000): Duplicate entry 'xxx' for key
原因: 主键重复。
解决:
- 先清空表再导入
- 或者用
INSERT IGNORE跳过重复
报错6:字符集乱码
导入后中文变成乱码。
原因: 字符集不对。
解决: 导入前设置字符集:
SET NAMES utf8mb4;
source /路径/xxx.sql;
或者命令行指定:
mysql -u root -p --default-character-set=utf8mb4 数据库名 < xxx.sql
报错7:max_allowed_packet太小
ERROR 2006 (HY000): MySQL server has gone away
原因: SQL文件太大,MySQL接收不了。
解决: 修改my.cnf,加大max_allowed_packet:
[mysqld]
max_allowed_packet = 64M
重启MySQL生效。
导入大文件技巧
方法1:分卷压缩
把大SQL文件拆成小的:
split -b 10M xxx.sql small_
然后逐个导入。
方法2:跳过外键检查
导入时临时关闭外键检查,更快:
SET FOREIGN_KEY_CHECKS = 0;
source /路径/xxx.sql;
SET FOREIGN_KEY_CHECKS = 1;
常见坑
坑1:用错用户名密码
导入时一直提示密码错误。
解决: 确认用户名密码,或者用 mysql -u root -p 交互式输入密码。
坑2:SQL文件不是UTF-8编码
导入后中文乱码。
解决: 用 file 命令查看文件编码:
file -i xxx.sql
坑3:没选对数据库
导入后数据不知道导到哪去了。
解决: 命令行一定要指定数据库名,或者先 USE 数据库名;
总结
导入SQL文件三步走:
- 先确认数据库存在
- 用正确的字符集导入
- 大文件就调大max_allowed_packet
记住: 报错信息一定要看清楚,别瞎试。
遇到问题加QQ23979811 协助处理