广告位 · 页头(后台-模块管理-新建模块后替换此区域)

MySQL怎么导入导出数据库?命令行与工具详解

MySQL 导入导出数据库是运维和开发中经常要做的事情。比如要把线上库拉到本地调试、给客户提供数据快照,或者做每日自动备份,本质上都是把数据库变成可移植的 SQL 文件,再在另一台服务器上执行。这些操作并不复杂,但想做得稳定、高效,还是需要了解几个核心参数和常见限制。接下来会先讲最常用的命令行方案,再介绍图形化工具和一些容易踩坑的细节。

MySQL怎么导入导出数据库?命令行与工具详解

一、用 mysqldump 导出数据库

mysqldump 是 MySQL 自带的逻辑备份工具,它会把数据库中的表结构和数据转换成一系列 SQL 语句,例如 CREATE TABLE、INSERT 等,输出到标准输出。最常见的用法是通过重定向把结果写入一个 .sql 文件。基本命令格式如下:

# 导出单个数据库
mysqldump -u root -p mydb > mydb_backup.sql

这里的 -u 指定登录用户,-p 表示需要输入密码。命令执行后终端会提示输入密码,不会直接以明文拼在命令里。重定向符号 > 在 Linux 和 macOS 下没有问题;在 Windows 的 PowerShell 里,直接使用 > 可能生成 UTF-16 编码文件,导致导入时出错。更稳妥的做法是使用 --result-file 参数指定输出文件,命令变成 mysqldump -u root -p --result-file=mydb_backup.sql mydb,这样不会出现编码混乱。

如果一次要导出多个数据库,可以加上 --databases 参数,并在后面列出数据库名。这样导出的 SQL 文件中会自动带上 CREATE DATABASE 和 USE 语句,导入时就不用手动创建同名数据库。对于整机迁移,还可以使用 --all-databases 导出所有库。只看单张表时,直接在数据库名后面写表名即可。

# 一次导出多个数据库
mysqldump -u root -p --databases db1 db2 db3 > multi_db.sql
# 导出全部数据库
mysqldump -u root -p --all-databases > all_db.sql
# 只导出 mydb 库中的 users 表
mysqldump -u root -p mydb users > users_backup.sql

除了整库导出,mysqldump 还支持只导结构或只导数据。--no-data 表示不导出数据,--no-create-info 表示不导出建表语句。这两个参数在做表结构变更或数据迁移拆分时非常有用。例如把生产库的表结构复制到测试环境,但不要数据,就可以用 --no-data。

# 只导出表结构
mysqldump -u root -p --no-data mydb > schema.sql
# 只导出数据,不导建表语句
mysqldump -u root -p --no-create-info mydb > data_only.sql

二、将 SQL 文件导入到目标数据库

导入的常用工具是 mysql 命令。mysql 既是客户端程序,也能直接执行 SQL 文件。导入时需要先保证目标数据库已经存在;如果备份文件是用 --databases 或 --all-databases 导出的,文件里自带建库语句,就可以不指定目标库。最基础的导入命令是:

# 导入到已存在的数据库
mysql -u root -p target_db < mydb_backup.sql
# 导入自带建库语句的备份文件
mysql -u root -p < multi_db.sql

如果你已经登录到了 mysql 客户端,不想退出再执行命令,也可以使用 source 指令。source 后面跟 SQL 文件的完整路径。在 Windows 客户端中,路径里的反斜杠容易被当成转义字符,因此建议把路径中的反斜杠写成正斜杠,或者使用双反斜杠。比如 source C:/backup/mydb_backup.sql。执行前最好先用 USE 切换到目标数据库,因为 source 不会自动选择库。

-- 登录后执行
USE target_db;
SOURCE C:/backup/mydb_backup.sql;

如果导入的文件很大,普通 mysql 命令可能会因为单条 INSERT 数据包过大而中断。可以在登录参数里加大 max_allowed_packet 的数值,例如 --max_allowed_packet=512M。同时也可以使用 --force 让 mysql 在遇到错误时继续执行后面的语句,适合边导入边记录错误的场景。但 --force 不解决根本问题,乱码或语法错误仍需要排查。

三、一致性备份与关键参数

直接执行 mysqldump 导出一个正在写入的库,有可能会出现数据不一致。对 InnoDB 表来说,推荐加 --single-transaction。这个参数会在导出开始时开启一个事务,并利用 MVCC 机制生成一致性快照,后续读取的都是同一时刻的数据,不会阻塞其他会话写入。需要注意的是 --single-transaction 主要对 InnoDB 生效,如果库里还有 MyISAM 表,仍然可能被锁。

# InnoDB 一致性备份,避免长时间锁表
mysqldump -u root -p --single-transaction --quick --default-character-set=utf8mb4 mydb > mydb_safe.sql

--quick 参数让 mysqldump 边读边输出,而不是把整张表先载入内存,这对大表非常重要。默认情况下 --opt 选项已经开启了一批优化参数,包括 --quick、--add-drop-table、--add-locks 等,因此日常使用时通常不需要手动加 --quick。但如果你的配置文件中关闭了 --opt,可以在命令行重新指定。

字符集也是导入导出绕不开的问题。数据库使用 utf8mb4 已经很普遍,如果导出时客户端默认字符集不是 utf8mb4,就可能把中文写成乱码。建议在导出和导入命令中同时加上 --default-character-set=utf8mb4,保证两端一致。对于包含存储过程、触发器和事件的库,默认导出可能不包含这些对象,需要加上 --routines、--triggers、--events。

# 导出完整对象,包括存储过程和事件
mysqldump -u root -p --routines --events --triggers mydb > mydb_full.sql

四、图形化工具与其他导入导出方式

如果只是偶尔操作,不喜欢记命令,MySQL Workbench、phpMyAdmin、Navicat、DataGrip 等工具都能完成导入导出。以 MySQL Workbench 为例,左侧导航栏进入 Data Export 可以选择要导出的库和表,下方可以勾选导出结构还是数据、是否包含存储过程等选项。Data Import 则可以选择备份文件夹或单个 SQL 文件,导入进度会显示在日志区域。phpMyAdmin 的导出页面支持 SQL、CSV、JSON 等多种格式,导入时直接上传文件即可。

图形化工具的背后大多还是调用 mysqldump 和 mysql 命令,但优点是参数被封装成了界面选项,不容易漏掉字符集等设置。缺点是当数据库较大时,浏览器或客户端容易超时,而且不适合放在 crontab 或计划任务里自动执行。生产环境建议优先掌握命令行,工具可以作为辅助。

除了 SQL 文本方式,MySQL 还支持 SELECT INTO OUTFILE 和 LOAD DATA INFILE 这样的数据文件导入导出。这种方式适合只需要某张表的数据,且数据量很大的场景。因为不经过 SQL 语句解析,导入速度通常会快很多。不过它要求 MySQL 服务器有 secure_file_priv 配置允许的目录,且导出文件写的是服务器本地路径,不是客户端路径。

-- 导出 users 表数据到 CSV 文件
SELECT * FROM users INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/users.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
-- 从 CSV 文件导入到 users 表
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

五、常见错误与排查思路

导入导出时最常见的报错是 Access denied for user。这种情况通常不是密码错误,而是当前账号没有足够的权限。导出需要对对应库有 SELECT 权限,如果还要导出存储过程或视图,需要额外权限;导入则需要 CREATE、INSERT、ALTER、DROP 等权限。可以先在管理员账号下执行 SHOW GRANTS FOR 用户名 来确认权限范围,或者直接用 root 账号完成操作。

另一个常见错误是 Unknown database。当执行 mysql 命令指定了 target_db,但目标实例上不存在这个库时就会报这个错。解决办法是先执行 CREATE DATABASE target_db DEFAULT CHARACTER SET utf8mb4; 创建目标库,再导入。如果备份文件自带建库语句,就不需要指定库名,直接导入即可。

乱码问题也经常出现。如果在导入后发现中文变成了问号或不可读字符,要重点检查三处:导出时的 --default-character-set、导入时的 --default-character-set,以及 SQL 文件本身的编码。最好三者统一为 utf8mb4。如果备份文件是从其他数据库系统或旧版本 MySQL 生成的,还可能遇到 COLLATE 不兼容的情况,需要手动修改文件里的排序规则。

导入大文件时可能出现中断,报错信息是 Lost connection to MySQL server during query 或者 Got a packet bigger than max_allowed_packet bytes。前者通常是服务器超时或者网络不稳定,可以增加 --max_allowed_packet 和 --net_buffer_length,必要时把大文件拆成多个小文件依次导入。后者提醒单条 INSERT 数据过大,同样需要调大 max_allowed_packet,或者导出时使用 --skip-extended-insert 让每条 INSERT 只插入一行,虽然文件会变大,但单条语句更小。

最后还要注意外键约束。mysqldump 默认导出的 SQL 文件开头通常会有 SET FOREIGN_KEY_CHECKS=0,结尾恢复为 SET FOREIGN_KEY_CHECKS=1,这样导入时即使表之间有外键依赖,也不会因为建表或插入顺序而报错。如果你手工编辑过备份文件,要确保这两句没有被删掉,否则导入带外键的数据时容易失败。

广告位 · 文章底部(后台-模块管理替换此区域)