1。摘要数据是企业的重要资产,其重要性不言而喻。数据库为数据提供访问服务,发挥着重要作用。如因意外删除数据、服务器故障、病毒入侵等原因造成数据丢失或服务不可用,将给公司造成重大损失。因此,数据库备份是数据系统中最重要的部分。重要部分。MySQL备份按类型分为逻辑备份、物理备份和快照备份。本文将通过图文并茂的方式来说明常见逻辑备份工具的一致性备份过程,以进一步了解整个逻辑备份过程是如何实现的。2、概念逻辑备份是数据库对象级备份,通过SQL查询数据库中的对象并转储到文件中,包括过程等)和INSERT语句将数据加载到表中。一致性备份是指在某个时间点,导出的数据与导出的备份文件信息相匹配。如果导出多个表的数据,这些不同表之间的数据就是同一时间点的数据。MySQL可以通过全局锁(FTWRL,locktablebackup)和事务(single-transaction,consistentsnapshot)实现。锁表备份在server层实现。在备份期间,实例只能进行SELECT操作;事务一致性快照备份在引擎层实现,支持MVCC引擎表(InnoDB)的备份。在此期间,实例可以对任意表进行DML操作,DDL操作需要根据具体情况具体分析。本文将说明情况(一致性快照备份)。常用的逻辑备份工具:MySQL官方的mysqldump、mysqlpump、mysqlshell的dump方法、第三方开源的mydumper。3.工具说明3.1mysqldump说明mysqldump使用单线程对表进行SELECT查询,并转储到文件中,以达到备份的目的。作为最古老的MySQL备份工具,在备份中应用非常广泛。备份命令mysqldump-udump_user-p-P3306-h127.0.0.1--master-data=2--single-transaction--default-character-set=utf8--all-databases--triggers--routines--events>all.sql备份过程打开general_log查看备份过程。一般的备份流程如下图所示:流程说明:1.连接数据库,设置当前变量,刷新脏页,加全局读锁。此时数据库实例只能SELECT,不做任何其他类型的操作(会影响业务),然后设置事务隔离级别并启用一致性快照,获取BINLOG和GITD信息。此时所有事务支持表(INNODB)的数据都来自同一个时间点。最后释放全局读锁,此时数据库实例可以进行任何操作(一般情况下,加全局读锁和释放锁的时间很短)。2.获取备份对象的元数据信息,单线程导出“SLEECT*”表。导出表分为三种:已导出、未导出、正在导出:对于导出表,可以进行DDL操作(使用SAVEPOINT提前释放导出表的元数据锁);对于未导出的表,INNODB表能否成功执行DDL操作取决于DDL操作模式:no-rebuild模式下的DDL执行成功,rebuild模式下的DDL执行失败(Tabledefinitionhaschanged),MyISAM引擎表可以执行成功;对于正在导出的表,MDL将出现在DDL中。此时,MDL会出现在对该表的后续查询中,导致服务不可用(时间由备份时长决定),直到该表导出完成。3、获取除表以外的其他对象:自定义函数、存储过程、VIEW等。4、获取当前GTID信息,将所有对象的导出dump到一个文件中,完成备份。3.2mysqlpump说明mysqlpump并行导出功能的架构是:队列+线程,允许有多个队列,每个队列有多个线程,一个队列可以绑定一个或多个数据库。在mysqldump的基础上,额外支持:并行备份、延迟创建索引、备份用户、对象通配符过滤、DEFINER忽略等特性。mysqlpump的备份是基于表并行的。每个表的导出只能由单个线程执行。如果一张表很大,大部分时间都花在了这张表的备份上,并行备份的效果未必好。明显的。备份命令mysqlpump-udump_user-p-P3306-h127.0.0.1--set-gtid-purged=on--default-parallelism=2--single-transaction--default-character-set=utf8--exclude-databases=mysql,sys,information_schema,performance_schema>all.sql备份流程打开general_log查看备份流程,一般备份流程如下图所示:流程说明:1.多线程连接数据库,设置当前变量,清理脏页并添加全局读取锁。此时数据库实例只能SELECT,不能进行任何类型的操作(会影响业务)。然后设置事务隔离级别,启用一致性快照读取和获取GITD信息。此时所有支持事务的表(INNODB)数据都来自同一个时间点。最后释放全局读锁,此时数据库实例可以进行任何操作(一般情况下,加全局读锁和释放锁的时间很短)。2、获取除表以外的其他对象:自定义函数、存储过程、VIEW等。3、获取备份对象的元数据信息,多线程导出表“SLEECTcol1,col2,...”。导出表分为三种:已导出、未导出、正在导出:导出表不能进行DDL操作(不支持SAVEPOINT);对于未导出的表,是否可以对INNODB表进行DDL操作成功取决于DDL操作方式:no-rebuildDDL执行成功,rebuildDDL执行失败(表定义发生变化),MyISAM引擎表可以执行成功,但如果在DDL之前导出表结构,再导出数据,恢复时会报异常(表结构与导出数据不一致);对于正在导出的表,DDL会出现MDL,此时对该表的后续查询会出现MDL,导致业务不可用(时间取决于备份的时长而定),直到表导出完成。4、将所有对象的备份转储到一个文件中,完成备份。备份文件中存储的表结构只有主键,二级索引单行存储。目的是在数据恢复后添加二级索引,提高恢复效率(延迟创建索引)。3.3mydumper说明mydumper利用INNODB的MVCC版本控制功能实现多线程并发获取一致性数据。特别是表以chunk的方式批量导出,即支持一个表的多个线程以chunk的方式批量(row-basedmulti-threading),备份对象支持正则匹配。备份命令mydumper-udump_user-p-h127.0.0.1-P3306--use-savepoints--trx-consistency-only-r100000-t2-G-R-E-Bsbtest-o/data/backup/--trx-consistency-only:如果不加,备份完成后释放FTWRL锁。它将在获得一致的快照读取(UNLOCKTABLES)后被释放。--rows:-r,分片导出的行数。--use-savepoints和--rows是互斥的。备份过程打开general_log查看备份过程。一般的备份流程如下图所示:流程说明:1.连接数据库,设置当前变量,刷新脏页,加全局读锁。此时数据库实例只能SELECT,不能执行任何类型的Operation(会影响业务),然后获取BINLOG和GITD信息,设置事务隔离级别,开启一致性快照。此时所有支持事务的表(INNODB)数据都来自同一个时间点。最后释放全局读锁,此时数据库实例可以进行任何操作(通常加全局读锁和释放锁的时间很短)。2.获取备份对象的元数据信息,多线程导出“SLEECT*”表。导出表分为三种:已导出、未导出、正在导出:对于导出表,可以进行DDL操作(使用SAVEPOINT提前释放导出表的元数据锁,如果使用分片导出,SAVEPOINT将不可用);对于未导出的表,对INNODB表的DDL操作是否成功取决于DDL操作方式:no-rebuildDDL执行成功,rebuildDDL执行失败(表定义发生变化),MyISAM引擎的table可以执行成功;对于正在导出的表,DDL会显示MDL,此时对该表的后续查询会显示MDL,导致业务不可用(时间由备份时长决定),直到表导出完成。3、所有表导出后,获取除表以外的其他对象:自定义函数、存储过程、VIEW等。4、所有对象的导出转储到多个文件(将表数据分块导出到多个数据文件),完成备份。3.4mysqlshell说明MySQLShell是Oracle官方提供的用于开发和管理MySQL服务器的交互式工具。其中util.dumpInstance、util.dumpSchemas、util.loadDump等用于MySQL的备份管理,采用zstd实时压缩算法,支持多线程备份,以chunk的形式批量导出,支持多个线程在一张表中以块的形式批量导出。备份命令util.dumpSchemas(['sbtest'],'/data/backup',{"threads":1,"consistent":true})备份过程说明:1.连接数据库,设置当前变量,并清理脏页并添加全局读锁。此时数据库实例只能SELECT,不能进行任何类型的操作(会影响业务)。然后获取BINLOG、GITD和备份对象的元数据信息,然后设置事务隔离级别,启动一致性快照。此时所有支持事务的表(INNODB)数据都来自同一个时间点。最后释放全局读锁,此时数据库实例可以进行任何操作(通常加全局读锁和释放锁的时间很短)。2、获取备份对象:自定义函数、存储过程、VIEW等。3、多线程导出表“SLEECTcol1,col2,...”。导出表分为三种:已导出、未导出、正在导出:导出表不能进行DDL操作(不支持SAVEPOINT);对于未导出的表,需要区分有无PK或UK:无PK和UK,还要根据DDL运行方式:no-rebuildDDL执行成功,rebuildDDL执行失败(表定义已改变),MyISAM引擎表可以执行成功;有PK或者UK,和正在被导出的表的情况是一样的,因为在获取分片信息的时候需要查询表的最大值和最小值。对于正在导出的表,MDL将出现在DDL中。此时,MDL会出现在对该表的后续查询中,导致服务不可用(时间由备份时长决定),直到该表导出完成。4、导出所有对象转存到多个文件(表数据分块导出到多个数据文件)完成备份。3.5小结从上面每次逻辑备份的过程可以看出,在一致性备份下,所有表的DML操作不受影响(短时间的FTWRL除外),而DDL操作有一定的风险。因此,在逻辑备份时,尽量避免DDL操作。各个逻辑备份工具的参数可以在官方文档中找到。对比工具后,如表所示:推荐的逻辑备份需要满足以下条件:支持一致性备份、多线程导出行级切片、导出到多个文件(快速恢复)、延迟创建索引和保存点能力。从上表可以看出,mydumper和mysqlshell中的dump方法可以满足很多条件。4.总结希望通过阅读本文,您可以对逻辑备份的整个实现过程有一个更清晰的认识,对您选择合适的逻辑备份有所帮助。
