一、命令简介
mysqldump 是 MySQL 数据库官方提供的逻辑备份工具。它能够将一个或多个 MySQL 数据库的结构和数据,以标准的 SQL 语句形式导出到一个文本文件中。这个文件可以用于数据备份、迁移、在不同 MySQL 服务器之间复制数据库,或者作为版本控制的数据库结构快照。 其核心原理是通过连接 MySQL 服务器,执行查询来读取数据库元数据和表数据,然后生成相应的 CREATE 和 INSERT 等 SQL 语句。
二、语法格式
plaintext
mysqldump [options] [db_name [tbl_name ...]]参数说明: [options]: 用于控制备份行为的各种选项,例如指定用户名、密码、备份模式等。这是最常用的部分。 [db_name]: 指定要备份的数据库名称。 [tbl_name ...]: 可选。在指定了 db_name 后,可以进一步指定要备份的该数据库中的特定表。不指定则备份整个数据库。
更通用的调用形式是结合选项来指定数据库:
plaintext
mysqldump [options] --databases db_name1 [db_name2 ...] mysqldump [options] --all-databases三、常用选项及说明
mysqldump 选项繁多,以下分类列出最常用和关键的选项。
连接选项
表格
| 选项 | 简写 | 说明 |
|---|---|---|
| --user=user_name | -u | 用于连接 MySQL 服务器的用户名。 |
| --password[=password] | -p | 连接 MySQL 服务器的密码。安全建议:在命令行中使用 -p 而不直接跟密码,执行后会提示输入,可避免密码泄露。 |
| --host=host_name | -h | MySQL 服务器主机名或 IP 地址。默认为 localhost。 |
| --port=port_num | -P | MySQL 服务器监听的 TCP/IP 端口号。默认为 3306。 |
输出内容控制选项
表格
| 选项 | 说明 |
|---|---|
| --all-databases | 备份 MySQL 实例中的所有数据库。 |
| --databases db1 db2 | 备份一个或多个指定的数据库。 |
| --tables | 覆盖 --databases 选项,使其后的参数被解释为表名。需与数据库名配合使用。 |
| --no-data | -d 只导出数据库表结构(CREATE 语句),不导出数据。 |
| --no-create-info | -t 只导出数据(INSERT 语句),不导出表结构(CREATE 语句)。 |
| --no-create-db | -n 在 --databases 或 --all-databases 模式下,抑制 CREATE DATABASE 语句。 |
| --skip-triggers | 不导出触发器。 |
| --routines | -R 导出存储过程和函数。 |
| --events | -E 导出事件调度器事件。 |
| --compact | 产生更简洁的输出,省略一些注释和选项,适用于调试或需要最小化输出时。 |
| --skip-comments | 在导出结果中不添加注释。 |
数据导出与一致性选项
表格
| 选项 | 说明 |
|---|---|
| --single-transaction | 重要:在导出数据之前,启动一个事务(需要表支持事务,如 InnoDB)。这可以确保在导出过程中得到一个一致性的数据快照,而无需锁定表。是进行在线热备的常用方式。 |
| --lock-tables | -l 为每个被导出的数据库锁定其所有表。在 --single-transaction 禁用时默认启用。对于 MyISAM 表或需要跨数据库一致性时可能有用。 |
| --skip-lock-tables | 不锁定表。警告:这可能导致导出的数据不一致(例如,在导出过程中有数据写入)。仅在可以接受不一致性或确定无写入时使用。 |
| --lock-all-tables | -x 一次性锁定所有数据库的所有表,保证整个导出期间全局一致性。会导致所有表只读。 |
| --add-locks | 在输出的每个表数据周围添加 LOCK TABLES 和 UNLOCK TABLES 语句。这可以在导入时加快速度。 |
| --master-data[=value] | 用于主从复制。将二进制日志文件名和位置(CHANGE MASTER TO 语句)写入输出。value 为 1 时以注释形式写入,为 2 时以可执行语句形式写入。启用此选项会自动启用 --lock-all-tables(除非同时使用 --single-transaction)。 |
| --flush-logs | -F 在开始导出前,刷新 MySQL 服务器的日志文件。与 --master-data 或 --all-databases 结合使用,便于做全量备份后的增量恢复。 |
输出格式选项
表格
| 选项 | 说明 |
|---|---|
| --complete-insert | -c 使用完整的 INSERT 语句(包含列名)。这使导出文件更具可读性,且在表结构发生变化后可能更易于导入。 |
| --extended-insert | -e 使用多值列表语法(INSERT INTO ... VALUES (...), (...), ...)。这是默认行为,可以显著减少导出文件大小并加快导入速度。使用 --skip-extended-insert 来禁用。 |
| --add-drop-database | 在每个 CREATE DATABASE 语句前添加 DROP DATABASE 语句。 |
| --add-drop-table | 在每个 CREATE TABLE 语句前添加 DROP TABLE 语句。默认启用。使用 --skip-add-drop-table 来禁用。 |
| --hex-blob | 使用十六进制格式导出二进制字段(如 BLOB, BINARY, VARBINARY, BIT)。避免因特殊字符导致数据损坏。 |
| --result-file=file_name | -r 将输出直接定向到指定文件。在 Windows 系统上,此选项可以避免换行符被转换。通常用输出重定向 > 即可。 |
四、示例用法
备份单个数据库(包含结构和数据)到文件
plaintext
mysqldump -u root -p mydatabase > mydatabase_backup.sql(执行后会提示输入 root 密码)
只备份数据库结构(不包含数据)
plaintext
mysqldump -u root -p -d mydatabase > mydatabase_schema.sql只备份数据库中的数据(不包含结构)
plaintext
mysqldump -u root -p -t mydatabase > mydatabase_data.sql备份多个数据库
plaintext
mysqldump -u root -p --databases db1 db2 db3 > multi_db_backup.sql备份所有数据库(完整实例备份)
plaintext
mysqldump -u root -p --all-databases > all_databases_backup.sql使用事务保证一致性并记录二进制日志位置(InnoDB 热备)
plaintext
mysqldump -u root -p --single-transaction --master-data=2 --databases mydatabase > mydatabase_hotbackup.sql此命令适合 InnoDB 表,在备份期间不锁表,并记录备份时刻的 binlog 位置,便于搭建主从或做基于时间点的恢复。
五、注意事项
- 备份策略:mysqldump 是逻辑备份,适合中小型数据库。对于超大型数据库(TB 级),备份和恢复时间可能很长,需要考虑物理备份工具(如 Percona XtraBackup)或文件系统快照。
- 密码安全:避免在命令行或 shell 脚本中直接使用 -pYourPassword,这会暴露密码。推荐使用 -p 交互式输入,或在配置文件中指定(如~/.my.cnf),并设置严格的文件权限。
- 字符集一致性:如果源数据库使用了非默认字符集,建议在备份时使用 --default-character-set=utf8mb4(根据实际情况调整)选项,确保导出的 SQL 文件字符集正确,避免乱码。
- 大表处理:默认的 --extended-insert 选项会生成包含大量数据的单条 INSERT 语句。在导入时,如果这条语句出错,可能导致整个导入失败。对于特别大的表,可以考虑使用 --skip-extended-insert 选项,但会显著增大备份文件。
- 恢复测试:定期测试备份文件的恢复流程至关重要,以确保备份是真正有效且可用的。切勿等到灾难发生时才第一次尝试恢复备份。