简介
mysqlpump是逻辑备份的工具,生成一组SQL语句,可以执行这些SQL语句来还原数据库和表。它dump一个或多个MySQL数据库,以便备份或传输到另一个服务器。
mysqlpump的并行导出功能的架构为:队列+线程,允许有多个队列,每个队列下有多个线程,而一个队列可以绑定1个或者多个数据库。但是,对于每张表的导出只能是单个线程的
(图片来自https://yq.aliyun.com/articles/602572)
5.7.11之前不支持
--single-transaction
则不允许并行,必须设置--default-parallelism=0
,所以最好5.7.11之后的版本再用这个工具
特性
- 基于表并行备份数据库和数据库中的对象,加快备份过程(mysqldump是单线程备份,速度很慢)
- 更细粒度的控制数据库和数据库对象(表,存储过程,用户账户)的备份
- 备份生成用户账户的语句(create user , grant) 而不是直接插入mysql系统数据库中
- 可以将备份出来的数据进行压缩,算法可以选择LZ4和ZLIB。
- 查看备份进度(–watch-progress)
- 对于备份文件的应用,InnoDB会先把行都插入完成再建立二级索引,而不是先建立二级索引再插入行,后者会导致插入的过程中需要维护二级索引。
常用选项
mysqlpump跟mysqldump选项大致相同,多了几个并行复制,压缩相关的选项
常用选项 | 描述 |
---|---|
–add-drop-database | CREATE DATABASE之前加个DROP DATABASE语句 |
–add-drop-table | CREATE TABLE之前加个DROP TABLE语句 |
–add-drop-user | CREATE USER之前加个DROP USER语句 |
–all-databases, -A | 备份所有数据库 |
–compress,-C | 启动压缩,默认 |
–compress-output=algorithm | 指定压缩算法,LZ4或者ZLIB,LZ4的解压方式shell> lz4 -d input_file output_file ZLIB的解压方式shell> openssl zlib -d < input_file > output_file |
–default-parallelism=N | 每个并行处理队列默认的线程数,默认为2,如果--parallel-schemas 设置了并行度,那么会覆盖这个默认值,当 --default-parallelism=0 也没有--parallel-schemas 选项,mysqlpump作为单线程进程运行,不创建任何队列。5.7.11之前不支持与--single-transaction 一起用 |
–defer-table-indexes | 在备份过程中,延迟为每个表创建索引,直到数据备份完成,如果是InnoDB存储引擎,则延迟创建二级索引,默认此参数开启,禁用可以指定--skip-defer-table-indexes |
–exclude-databases=db_list | 不备份的数据库列表,用逗号分隔 |
–extended-insert=N | 一条INSERT语句默认会包含多行,如果要指定每个INSERT语句中包含的行数,可以设置这个值,默认为250,值为1时,每一行会有一个INSERT语句 |
–host=host_name, -h host_name | 指定主机名 |
–include-databases=db_list | 需要备份的数据库列表,逗号分隔 |
–parallel-schemas=[N:]db_list | 创建一个用于处理数据库的队列,db_list表示备份的数据库,逗号分隔,N表示该队列使用N线程,如果N未给出则使用–default-parallelism 此参数设置的值 |
–password[=password], -p[password] | 用户密码 |
–routines | 备份存储过程 |
–set-gtid-purged=value | 控制是否向SET @@GLOBAL.gtid_purged 输出添加语句来启用对写入备份文件的GTID信息的控制,如果是用于备份,或是用于创建第二个从库则设置为ON,如果是为了恢复误删的数据等,则设置为OFF,如果不指定默认为AUTO,判断规则是如果备份服务器启用了GTID则设置为ON |
–single-transaction | 设置隔离级别模式 为RR(可重复读),仅对支持事务的引擎有用,不支持事务的表不保证状态一致。备份过程不要有DDL,否则可能会导致mysqlpump的select操作检索内容的时候获取错误的状态信息退出(备份的时候会先show create table 然后select,如果两个语句中执行了ddl,会导致报错信息,表定义发生变化,) |
–triggers | 备份触发器 |
–user=user_name, -u user_name | 用户 |
–watch-progress | 显示进度信息,默认打开 |
–users | 备份用户,默认不备份用户,如果只备份用户shell> mysqlpump --exclude-databases=% --users |
可以使用通配符,%表示匹配0个或多个任意字符的字符串,_表示匹配单个任意字符
实例
实例1:多线程备份
建立一个队列来处理 db1
和db2
另一个排队的过程db3
。所有队列都使用2个线程
mysqlpump --parallel-schemas=db1,db2 --parallel-schemas=db3 --set-gtid-purged=ON --include-databases=db1,db2,db3 > pump.sql
实例2:多线程备份
建立一个队列来处理 db1
,建立4个线程,使用一致性读,执行过程会先设置隔离级别为RR,执行FLUSH TABLES WITH READ LOCK
,然后连接4个线程进去开启一致性视图进行备份 。这些线程启动START TRANSACTION WITH CONSISTENT SNAPSHOT
之后解锁表,对于不支持事务的表,使用lock和unlock,如果不--include-databases=db1
指定备份库,默认全库备份
mysqlpump --parallel-schemas=db1 --default-parallelism=4 --set-gtid-purged=ON --single-transaction --include-databases=db1 > pump.sql
实例3:多线程备份
队列db1
和db2
使用五个线程,队列db3
使用三个线程,默认队列使用默认的两个线程。
mysqlpump --parallel-schemas=5:db1,db2 --parallel-schemas=3:db3
实例4:备份用户
mysqlpump --exclude-databases=% --users
很多参数都与mysqldump一样,这里就省略了