关于mysqldump:99的人都不知道的mysqldump的备份原理

简介mysqldump程序是官网逻辑备份工具,生成一组能够导入数据库中以重现原始数据库中的数据对 象和表数据的SQL语句,mysqldump命令还能够生成CSV,或其余分隔文本或XML格局的输入文件。 mysqldump客户端工具执行备份表至多须要的权限:备份表的SELECT权限,导出视图的SHOW VIEW,导出触发器的TRIGGER,以及在不应用--single-transaction选项时须要进行锁表操作的 LOCK TABLES,更多的选项可能就须要更多的其余权限。 如果要从新加载备份文件,则您必须具备执行这个文件中所有语句须要的权限,例如create相应的对象语句就代表须要相应对象的create权限,如果有执行alter批改表构造的DDL语句,则还须要有alter权限。 留神: 如果您有蕴含生成列(generated columns,即列在定义表构造时是定义的一个函数表达式,在插入值的时候忽略这个列,在MySQL外部通过表定义的表达式进行计算得来这个列的值)的表,请应用MySQL 5.7.9或更高版本提供的mysqldump命令来进行备份,晚期版本中提供的mysqldump命令对生成列无奈正确解析定义语句(BUG #20769542),您能够应用 INFORMATION_SCHEMA.COLUMNS表来查问并辨认出具备生成列的表。应用PowerShell在Windows上应用输入重定向进行的备份会创立一个UTF-16编码的备份文件, 如:mysqldump [options]> dump.sql,然而无奈应用UTF-16作为连贯字符集,所以这个备份文件将无奈正确被从新加载到数据库中,因而,须要应用WIN下的专用选项--result-fifile指定备份文件路径,而不是应用输入重定向,如:mysqldump [options] --result-fifile = dump.sql 应用mysqldump来备份的办法通常有三种,一种是备份单表,或者一组指定的库表,一种是一组或一个数据库下的所有表,一种是整个数据库实例,如:mysqldump [options] db_name [tbl_name ...]、mysqldump [options] --databases db_name ...、mysqldump [options] --all- databases。要备份整个数据库下的所有表,不要在db_name之后带任何表名,能够应用-- databases指定库名备份整个数据库下的所有表或应用--all-databases选项备份整个实例原理依据备份参数的不同,具体的备份过程略有差别:首先,执行flflush tables命令把内存中的表构造改变同步到磁盘上(把表敞开之后再从新关上),而后执行flflush tables with read lock加一个全局S锁,为后边获取一个一致性备份做筹备,接着执行set session transaction isolation level repeatable read批改隔离级别为RR,在这个隔离级别下,对于事务引擎innodb能够实现一致性非锁定读,即能够拿到一个一致性快照,而后执行start transaction with consistent snapshot命令开始一个一致性快照事务,这里在整个备份过程中是一个大事务。接着执行show master status获取到 binlog fifilename和position,这个地位就是以后备份数据的binlog地位,对于事务引擎,获取的就是快照数据的binlog地位。获取到binlog地位之后,执行unlock tables解锁事务表,如果是非事务表,在整个备份过程中始终锁着,直到备份实现才开释。在这个步骤之后,开始循环每库,每表这样去备份,依据备份选项,如果有触发器、事件、存储过程和函数等选项,也会进行备份。 在一个库中的表备份开始之前会自定义一个保留点,每个表是从一个点开始的,所以每一个表备份完之后会回滚到这个保留点,这样在有问题的时候就方便进行回滚。一个库下所有表备份完之后就会开释这个保留点。每个表的备份是先查出表构造,而后select *出所有的数据而后生成insert语句。 性能和可扩展性注意事项mysqldump的长处在于是逻辑备份,能够间接关上备份文件进行查看、编辑,以确保导入的备份文件符合要求,但毛病是备份速度较慢,并不适宜备份大表,因为他在备份时生成的是sql语句,而在导入的时候是把这些sql语句一一执行,比方:DDL建表,DML插入数据,而后再DDL创立索引等,设计到大量数据的操作都比拟耗费IO资源。 大表的备份能够应用官网提供的mysqlbackup物理备份工具(MySQL Enterprise Backup产品的 mysqlbackup命令),也能够应用percona公司的percona xtrabackup备份工具(开源,收费的物理备份工具),两者备份的性能和原理都差不多 。 mysqldump备份表数据时是先执行select,而MySQL会把select的数据保留到内存中,而后再把备份数据发送给mysqldump客户端,mysqldump接管到备份数据再写到磁盘备份文件中,如果您应用它来备份大表,则内存可能是一个问题,另外还有可能导致热数据被冲刷的问题。能够应用-- quick选项(或--opt,它启用--quick)来防止一次性select整个表数据到内存再保留到磁盘备份文件中,而是不在内存中缓存备份数据,边读取表数据边发送备份数据给mysqldump客户端, mysqldump客户端再写入磁盘备份文件中,-opt选项是默认启用的,因而要启用内存缓冲(先把 表数据查问进去保留在内存中再写到磁盘备份文件),则须要应用--skip-quick来跳过疾速备份。 如果您应用最新版本的mysqldump备份的文件须要加载到旧版本的实例中,须要应用--skip-opt选 项代替--opt,或者加上--extended-insert选项 。 目前市面上各种备份的工具档次不穷,我也用过不少,最近在用的是沃趣QFusion,不仅仅是备份数据,监控,还原,样样都行,仅供参考。

June 20, 2022 · 1 min · jiezi