工欲善其事,必先利其器。

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是一个功能强大的工具,适用于各种数据库备份和恢复场景。通过合理使用选项,可以满足不同的需求,如备份结构、数据、触发器、存储过程等。欢迎继续讨论交流!
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐