MySQL备份神器:mysqldump使用指南,轻松搞定数据备份与恢复!
mysqldump中一个非常重要的选项,特别适用于使用InnoDB存储引擎的数据库。它的作用是确保在备份过程中数据的一致性,而不会锁定整个数据库。
·
工欲善其事,必先利其器。
1 常规备份工具总览

根据以上图示:我们可以清晰的认识备份的工具:一是数据库级别的数据备份与恢复,二是表级别的数据局导入导出以及展现形式,三是日志级别的日志信息的恢复。
2 备份类型
单从备份类型上来说,数据备份可以分为热备份和冷备份。
- 热备份主要是指的是在线备份,不会中断现有的业务访问情况下的备份,在实际生产环境下,涉及的大部分场景均是热备份。
- 冷备份主要是使用系统命令来完成备份工作,主要师基于物理文件层面的复制备份,例如像cp、scp、rsync等命令,特点就是速度快、事务一致性保证,但是需要暂停数据库服务,因此使用场景相对会较少。
3 常用备份工具:mysqldump
mysqldump是MySQL提供的一个命令行工具,用于备份数据库。它会生成一个SQL脚本,可以用来重建数据库及其内容对于备份工具。
##基本语法:
mysqldump -u [用户名] -p[密码] [数据库名] > [输出文件.sql]
##参数解释
-u [用户名]:指定MySQL用户名
-p[密码]:指定MySQL密码(-p 后面没有空格)
[数据库名]:要备份的数据库名称
> [输出文件.sql]:将输出重定向到一个文件
mysqldump,从性能上来说,虽然没有那么高,但是在对于数据量较小的业务环境上还是比较实用的,在实际工作中,mysqldump的使用频率也是比较高。以下是核心选项使用介绍:
3.1 常用选项介绍
3.1.1 single-transaction选项
mysqldump中一个非常重要的选项,特别适用于使用InnoDB存储引擎的数据库。它的作用是确保在备份过程中数据的一致性,而不会锁定整个数据库。
作用:
- 一致性备份:--single-transaction通过启动一个事务(transaction)来确保备份的数据是一致的。它会在备份开始时创建一个快照,备份过程中即使有其他写操作,也不会影响备份的数据
- 非阻塞:与lock-tables不同,single-transaction不会锁定整个数据库,因此其他用户仍然可以读写数据库
注意事项:
- 仅适用于InnoDB:single-transaction只对支持事务的存储引擎(如 InnoDB)有效,如果数据库中有MyISAM表,single-transaction无法保证这些表的一致性,可能需要结合lock-tables使用
- 长时间运行的事务:如果备份过程中有长时间运行的事务,可能会导致备份失败或性能问题
- 与lock-tables冲突:single-transaction和 --lock-tables不能同时使用,因为它们的行为是冲突的
- 备份大表时的性能:对于非常大的表,single-transaction可能会导致备份时间较长,因为它需要维护事务的一致性
##示例
##备份单个数据库(InnoDB)
mysqldump -u root -p --single-transaction mydb > /data/tmp/mydb_backup.sql
##备份所有数据库(InnoDB)
mysqldump -u root -p --single-transaction --all-databases > /data/tmp/all_db_backup.sql
##结合其他选项(如存储过程、触发器)
mysqldump -u root -p --single-transaction --routines --triggers mydb > /data/tmp/full_backup.sql
3.1.2 master-data选项
master-data选项是mysqldump中一个非常有用的选项,主要用于主从复制(Master-Slave Replication)的场景。它会在备份文件中记录当前二进制日志(Binary Log)的文件名和位置(Position),这对于设置从库(Slave)非常重要。
作用:
- 记录二进制日志信息:当启用master-data时,mysqldump会在备份文件的开头添加一条change master to语句,其中包含当前的二进制日志文件名(master_log_file)和位置(master_log_pos)。可以帮助在从库上设置主库的复制起点。
- 锁定表:如果master-data设置为1,mysqldump会在备份开始时短暂锁定所有表,以确保二进制日志信息的准确性;如果设置为2,则不会锁定表,但需要确保备份期间没有写操作。
注意事项:
- 锁定表的影响:如果使用master-data=1,备份期间会短暂锁定表,可能会影响写操作,对于InnoDB表,建议结合single-transaction使用,以避免锁定表。
- 二进制日志必须启用:使用master-data时,主库必须启用二进制日志(log_bin),否则会报错。
- 备份文件的开头:master-data会将change master to语句添加到备份文件的开头,因此在恢复备份时不需要手动修改。
- 与dump-slave区别:master-data用于主库备份,记录主库的二进制日志信息;dump-slave用于从库备份,记录从库的二进制日志信息。
##示例
##备份数据库并记录二进制日志信息(锁定表)
mysqldump -u root -p --master-data=1 mydb > /data/tmp/backup.sql
##生成的备份文件开头会包含类似以下内容
change master to master_log_file='mysql-bin.000001', master_log_pos=12345;
##备份数据库并记录二进制日志信息(不锁定表)
mysqldump -u root -p --master-data=2 mydb > /data/tmp/backup.sql
##结合single-transaction使用
,如果数据库使用的是InnoDB存储引擎,可以结合single-transaction使用,以避免锁定表
mysqldump -u root -p --master-data=2 --single-transaction mydb > /data/tmp/backup.sql
3.1.3 add-drop-database选项
add-drop-database选项是mysqldump中的一个选项,用于在备份文件中添加drop database语句。作用是在恢复备份时,先删除目标数据库(如果存在),然后再创建并恢复数据。
作用:
- 删除现有数据库:在备份文件的开头添加 drop database if exists 语句。如果目标数据库已经存在,恢复备份时会先删除该数据库,然后重新创建。
- 确保干净的恢复环境:使用add-drop-database可以避免恢复备份时出现冲突(如表结构不一致或数据重复)。
注意事项:
- 谨慎使用:add-drop-database会删除目标数据库及其所有数据,因此在恢复备份时要特别小心,确保不会误删重要数据。
- 与all-databases结合使用:如果备份所有数据库(使用all-databases),add-drop-database会为每个数据库添加drop database语句。
- 与databases结合使用:如果备份多个数据库(使用databases),add-drop-database会为每个数据库添加drop database语句。
- 与no-create-db冲突:add-drop-database和no-create-db不能同时使用;add-drop-database会添加 drop database和create database语句;no-create-db会跳过create database语句。
##示例
##备份数据库并添加drop database语句
mysqldump -u root -p --add-drop-database mydb > /data/tmp/backup.sql
##生成的备份文件内容例子
drop database if exists `mydb`;
create database `mydb`;
use `mydb`;
##恢复备份
mysql -u root -p < /data/tmp/backup.sql
##恢复时,会先删除mydb(如果存在),然后重新创建并恢复数据
3.1.4 triggers、routines、ecevts选项
在mysqldump中,--triggers、--routines和 --events是三个常用的选项,用于控制备份内容是否包含 触发器、存储过程和函数以及事件。
--triggers
- 作用:备份数据库中的触发器(Triggers)
- 默认行为:默认情况下,mysqldump会备份触发器,除非显式使用--skip-triggers 禁用
##示例
mysqldump -u root -p --triggers mydb > /data/tmp/backup.sql
--routines
- 作用:备份数据库中的存储过程和函数
- 默认行为:默认情况下,mysqldump不会备份存储过程和函数,除非显式使用--routines
##示例
mysqldump -u root -p --routines mydb > /data/tmp/backup.sql
--events
- 作用:备份数据库中的事件(Events)
- 默认行为:默认情况下,mysqldump 不会备份事件,除非显式使用 --events
##示例
mysqldump -u root -p --events mydb > /data/tmp/backup.sql
3.1.5 order-by-primary选项
order-by-primary选项是mysqldump中的一个选项,用于在备份数据时按照主键顺序 导出表中的数据,这个选项可以提高备份的效率,并在某些情况下优化恢复过程。
作用:
- 按主键排序
1)在备份数据时,order-by-primary会按照表的主键(primary key)顺序导出数据2)如果没有主键,则按照表的第一个唯一索引(unique index)排序3)如果既没有主键也没有唯一索引,则不会排序
- 优化备份和恢复
1)按主键顺序导出数据可以提高备份效率,尤其是在恢复数据时,可以减少索引重建的开销2)对于innodb表,按主键顺序备份可以减少磁盘 i/o,提高性能注意事项:
- 仅对有主键或唯一索引的表有效:如果表没有主键或唯一索引,order-by-primary不会生效
- 对myisam表的影响:对于myisam表,按主键顺序备份可能不会显著提高性能,因为myisam表的存储方式与innodb不同
- 备份时间可能增加:对于非常大的表,按主键排序可能会导致备份时间略微增加,因为需要对数据进行排序
- 与skip-extended-insert结合使用:如果使用skip-extended-insert(将每条数据生成单独的insert语句),order-by-primary的效果会更明显。
##示例
##备份单个数据库并按主键排序
mysqldump -u root -p --order-by-primary mydb > /data/tmp/backup.sql
##备份所有数据库并按主键排序
mysqldump -u root -p --order-by-primary --all-databases > /data/tmp/all_db_backup.sql
##结合其他选项使用
mysqldump -u root -p --order-by-primary --single-transaction --routines --triggers mydb > /data/tmp/full_backup.sql
3.1.6 skip-extended-insert选项
skip-extended-insert是 mysqldump中的一个选项,用于控制备份文件中inser语句的生成方式。默认情况下,mysqldump会使用扩展插入格式来生成insert语句,而skip-extended-insert会禁用这种格式,改为每条记录生成一个单独的insert语句。
作用:
- 禁用扩展插入:默认情况下,mysqldump会将多条记录合并到一个insert语句中
- 提高可读性:每条记录生成一个insert语句,使得备份文件更易于阅读和编辑
- 部分恢复:如果需要从备份文件中恢复部分数据,单独的insert语句会更方便
注意事项:
- 备份文件大小:使用skip-extended-insert会导致备份文件变大,因为每条记录都会生成一个完整的insert语句
- 恢复性能:单独的insert语句可能会导致恢复速度变慢,因为每条记录都需要单独执行
- 与extended-insert冲突:skip-extended-insert和extended-insert是互斥的,不能同时使用
- 默认行为:默认情况下,mysqldump使用扩展插入格式,以减小备份文件大小并提高恢复性能
##示例
##备份数据库并禁用扩展插入
mysqldump -u root -p --skip-extended-insert mydb > /data/tmp/backup.sql
##生成的备份文件内容示例
INSERT INTO `test` VALUES (1, 'A');
INSERT INTO `test` VALUES (2, 'B');
INSERT INTO `test` VALUES (3, 'C');
##结合其他选项使用
mysqldump -u root -p --skip-extended-insert --single-transaction --routines --triggers mydb > /data/tmp/full_backup.sql
3.1.7 complete-insert选项
complete-insert选项是mysqldump中的一个选项,用于在生成insert语句时包含完整的列名。默认情况下,mysqldump生成的insert语句只包含值,而不包含列名。使用complete-insert后,insert语句会明确列出列名,从而提高备份文件的可读性和灵活性。
作用:
- 包含列名:使用complete-insert后,insert语句会包含列名
- 提高可读性和灵活性
1)包含列名的insert语句更易于阅读和理解2)如果表结构发生变化,包含列名的insert语句仍然可以正确执行注意事项:
- 备份文件大小:使用complete-insert 会增加备份文件的大小,因为每条insert语句都包含列名
- 与skip-extended-insert 结合使用:如果同时使用skip-extended-insert,每条记录都会生成一个单独的insert语句,并包含列名
- 默认行为:默认情况下,mysqldump生成的insert语句不包含列名
##示例
##备份数据库并包含列名
mysqldump -u root -p --complete-insert mydb > /data/tmp/backup.sql
##生成的备份文件内容示例:
insert into `test` (`id`, `name`) values (1, 'a');
insert into `test` (`id`, `name`) values (2, 'b');
##结合其他选项使用
mysqldump -u root -p --complete-insert --single-transaction --routines --triggers mydb > /data/tmp/full_backup.sql
3.1.8 replace选项
replace选项是mysqldump中的一个选项,用于在生成insert语句时,将insert替换为replace。replace是mysql中的一种特殊语句,它的行为类似于insert,但如果插入的数据与表中的主键或唯一索引冲突,则会 先删除冲突的行,再插入新数据。
作用:
- 使用replace语句:默认情况下,mysqldump 生成的是insert语句;使用replace后,生成的语句会变为replace
- 处理主键或唯一索引冲突:如果插入的数据与表中的主键或唯一索引冲突,replace 会先删除冲突的行,再插入新数据
注意事项:
- 数据丢失风险:使用replace时,如果主键或唯一索引冲突,会先删除冲突的行,再插入新数据
- 与insert ... on duplicate key update的区别:replace是删除冲突行并插入新数据,insert ... on duplicate key update是更新冲突行,而不是删除
- 备份文件大小:使用replace不会显著增加备份文件的大小
- 适用表类型:replace语句要求表必须有主键或唯一索引,否则它的行为与insert完全相同
##示例
##备份数据库并使用replace语句
mysqldump -u root -p --replace mydb > /data/tmp/backup.sql
##生成的备份文件内容示例:
replace into `table` (`id`, `name`) values (1, 'a');
replace into `table` (`id`, `name`) values (2, 'b');
replace into `table` (`id`, `name`) values (3, 'c');
##结合其他选项使用
mysqldump -u root -p --replace --single-transaction --routines --triggers mydb > /data/tmp/full_backup.sql
3.2 常见使用场景
1. 备份单个数据库
mysqldump -u root -p mydb > /data/tmp/mydb_backup.sql
2. 备份所有数据库
mysqldump -u root -p --all-databases > /data/tmp/all_db_backup.sql
3. 备份多个数据库
mysqldump -u root -p --databases db1 db2 > /data/tmp/databases_backup.sql
4. 备份指定表
mysqldump -u root -p mydb table1 table2 > /data/tmp/tables_backup.sql
5. 只备份表结构
mysqldump -u root -p --no-data mydb > /data/tmp/schema_only.sql
6. 只备份数据
mysqldump -u root -p --no-create-info mydb > /data/tmp/data_only.sql
7. 备份并压缩
mysqldump -u root -p mydb | gzip > /data/tmp/mydb_backup.sql.gz
8. 恢复备份
mysql -u root -p mydb < /data/tmp/mydb_backup.sql
3.2 高级用法
1. 主从复制备份
mysqldump -u root -p --master-data=2 --single-transaction mydb > /data/tmp/backup.sql
2. 备份存储过程和触发器
mysqldump -u root -p --routines --triggers mydb > /data/tmp/full_backup.sql
3. 按主键顺序备份
mysqldump -u root -p --order-by-primary mydb > /data/tmp/backup.sql
4. 生成包含列名的insert语句
mysqldump -u root -p --complete-insert mydb > /data/tmp/backup.sql
5. 使用replace语句备份
mysqldump -u root -p --replace mydb > /data/tmp/backup.sql
4 总结
mysqldump是一个功能强大的工具,适用于各种数据库备份和恢复场景。通过合理使用选项,可以满足不同的需求,如备份结构、数据、触发器、存储过程等。欢迎继续讨论交流!
更多推荐
所有评论(0)