MySQL 8.0是目前广泛使用的数据库版本,在实际开发和维护过程中,经常需要将已有的数据导入到新的数据库中,比如迁移旧库数据、恢复备份数据或者批量导入业务数据。不同的数据格式和导入场景需要选择不同的导入方式,操作不当很容易出现报错或者数据异常。

使用source命令导入SQL文件
这是最常见的导入方式,适用于导入包含完整建表语句和数据插入语句的SQL备份文件。操作步骤非常简单,首先需要通过命令行登录到MySQL 8.0客户端。
登录命令如下:
mysql -u 用户名 -p
输入密码后进入MySQL交互界面,首先需要选择要导入数据的目标数据库,如果没有对应数据库可以先创建:
-- 创建数据库,指定字符集避免中文乱码 CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 切换到目标数据库 USE test_db;
之后使用source命令指定SQL文件的路径即可完成导入:
source /home/user/backup.sql
需要注意SQL文件的路径需要是MySQL客户端有权限读取的路径,如果是Windows系统,路径中的反斜杠需要替换为正斜杠,比如source D:/backup/backup.sql。
使用LOAD DATA语句导入文本数据
如果需要导入CSV、TXT等分隔符文本格式的数据,使用LOAD DATA语句效率会比逐条插入高很多,适合大批量数据导入场景。
基本语法格式如下:
LOAD DATA [LOCAL] INFILE '文件路径' INTO TABLE 表名 CHARACTER SET 字符集 FIELDS TERMINATED BY '字段分隔符' OPTIONALLY ENCLOSED BY '字段包裹符' LINES TERMINATED BY '行分隔符' IGNORE 忽略行数 ROWS;
下面是一个实际导入CSV文件的示例,假设CSV文件内容如下,路径为/home/user/user_data.csv:
id,name,age,email 1,张三,25,zhangsan@ipipp.com 2,李四,28,lisi@ipipp.com 3,王五,22,wangwu@ipipp.com
对应的导入语句为:
-- 先创建对应的表结构
CREATE TABLE IF NOT EXISTS user (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100)
) DEFAULT CHARACTER SET utf8mb4;
-- 执行导入,LOCAL表示读取客户端本地文件,不使用LOCAL则读取MySQL服务器上的文件
LOAD DATA LOCAL INFILE '/home/user/user_data.csv'
INTO TABLE user
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY 'n'
IGNORE 1 ROWS;
如果导入时报错提示没有文件读取权限,需要检查MySQL的secure_file_priv参数配置,该参数限制了LOAD DATA可以读取的文件路径,可以通过下面的语句查看当前配置:
SHOW VARIABLES LIKE 'secure_file_priv';
如果值为NULL,表示禁止导入导出文件;如果值为空字符串,表示不限制路径;如果为指定路径,只能读取该路径下的文件。如果是Docker部署的MySQL 8.0,需要将文件挂载到对应路径或者修改配置文件调整该参数。
使用图形化工具导入数据
如果习惯使用图形化界面操作,也可以通过Navicat、DBeaver、MySQL Workbench等工具完成数据导入,以MySQL Workbench为例,操作步骤如下:
- 连接目标MySQL 8.0实例,选择要导入数据的数据库
- 点击顶部菜单的Server选项,选择Data Import选项
- 选择Import from Self-Contained File,指定要导入的SQL文件路径,或者选择Import from Dump Project Folder选择备份文件夹
- 选择目标数据库,点击Start Import即可开始导入
图形化工具操作更直观,适合不熟悉命令行操作的用户,不过大文件导入时效率会比命令行稍低一些。
常见导入问题及解决办法
字符集不匹配导致中文乱码
导入数据出现中文乱码时,需要保证SQL文件、导入语句、数据库表的字符集一致,建议使用utf8mb4字符集,这是MySQL 8.0的默认字符集,支持所有Unicode字符。
权限不足导致导入失败
使用source命令导入需要用户有对应数据库的所有权限,使用LOAD DATA语句如果需要读取客户端本地文件,需要给用户授予FILE权限,同时连接时加上--local-infile参数:
mysql -u 用户名 -p --local-infile
大文件导入超时
导入大SQL文件时出现超时报错,可以调整MySQL的max_allowed_packet参数,增大允许的最大数据包大小:
-- 临时调整,重启后失效 SET GLOBAL max_allowed_packet = 1024 * 1024 * 1024; -- 查看当前配置 SHOW VARIABLES LIKE 'max_allowed_packet';
如果需要永久生效,可以修改MySQL的配置文件my.cnf,在[mysqld]段落添加max_allowed_packet=1G,重启MySQL服务即可。