mydumper介绍

  • mydumper负责导出 MySQL 数据库的一致备份
  • myloader从 mydumper 读取备份,连接到目标数据库并导入备份。
    mydumper的github地址:https://github.com/mydumper/mydumper
    mydumper 主要有以下几点特性:
  • 支持多线程导出数据,速度更快。
  • 支持一致性备份。
  • 支持将导出文件压缩,节约空间。
  • 支持多线程恢复。
  • 支持以守护进程模式工作,定时快照和连续二进制日志。
  • 支持按照指定大小将备份文件切割。 数据与建表语句分离。

安装

第一种方法:在github上直接下载rpm包进行安装:

$ wget https://github.com/mydumper/mydumper/releases/download/v0.12.5-3/mydumper-0.12.5-3.el7.x86_64.rpm
$ rpm -ivh mydumper-0.12.5-3.el7.x86_64.rpm

第二种方法:yum安装:

$ release=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/mydumper/mydumper/releases/latest | cut -d'/' -f8)
$ yum install https://github.com/mydumper/mydumper/releases/download/${release}/mydumper-${release:1}.el7.x86_64.rpm

mydumper使用

安装完成后出现两个可执行程序:mydumper和 myloader

运行mydumper --help查看选项参数:

-B, --database                # 指定导出的数据库
-o, --outputdir               # 要将文件输出到的目录
-d, --no-data                 # 不导出表数据
-D, --daemon                  # 启用守护程序模式
-L, --logfile                 # 要使用的日志文件名,默认情况下使用标准输出
--disk-limits                 # 如果确定没有足够的磁盘空间,则设置暂停和恢复的限制。接受以下值:'<resume>:<pause>',以MB为单位。例如:100:500 当只有100MB可用时将暂停,如果有500MB可用时将恢复
-t, --threads                 # 要使用的线程数,默认为4
-C, --compress-protocol       # 对MySQL连接使用压缩
-V, --version                 # 显示程序版本并退出
-v, --verbose                 # 输出的详细性,0=无提示,1=错误,2=警告,3=信息,默认值2
--defaults-file               # 使用特定的默认文件
--ssl                         # 使用SSL连接
--ssl-mode                    # 与服务器连接的所需安全状态:DISABLED, PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY
--key                         # 密钥文件的路径名
--cert                        # 证书文件的路径名
--ca                          # 证书颁发机构文件的路径名
--capath                      # 包含PEM格式的受信任SSL CA证书的目录的路径名
--cipher                      # 用于SSL加密的允许密码列表
--tls-version                 # 服务器允许加密连接使用哪些协议
--stream                      # 一旦文件被写入,它将通过标准输出流
--no-delete                   # 流完成后,它不会删除文件
-O, --omit-from-file          # 包含数据库列表的文件。要跳过的表条目,每行一个(在应用regex选项之前跳过)
-T, --tables-list             # 要备份的表,以逗号隔开(不排除regex选项)
-h, --host                    # 连接的主机地址
-u, --user                    # 用户名
-p, --password                # 密码
-a, --ask-password            # 提示输入用户密码
-P, --port                    # 端口
-S, --socket                  # 用于连接的UNIX域套接字文件
-x, --regex                   # 正则表达式
-G, --triggers                # 导出触发器。默认情况下,不会转储触发器
--split-partitions            # 将分区转储到单独的文件中。此选项覆盖分区表的--rows选项。
--max-rows                    # 在估计表之后,限制每个块的行数,默认为1000000
--no-check-generated-fields   # 与生成的字段相关的查询将不会被执行。如果生成了列,则会导致恢复问题
--order-by-primary            # 如果不存在主键,则按主键或唯一键对数据排序
-E, --events                  # 转储事件。缺省情况下,不转储事件
-R, --routines                # 转储存储过程和函数。默认情况下,它不转储存储过程或函数
-W, --no-views                # 不转储视图
-M, --checksum-all            # 转储所有元素的校验和
--data-checksums              # 用数据转储表校验和
--schema-checksums            # 转储模式表和视图创建校验和
--routine-checksums           # 转储触发器、函数和例程校验和
--tz-utc                      # 在转储的顶部设置TIME_ZONE='+00:00',以允许在服务器具有不同时区的数据或数据在不同时区的服务器之间移动时转储时间戳数据,默认情况下使用——skip-tz-utc禁用。
--complete-insert             # 使用包含列名的完整INSERT语句
-z, --tidb-snapshot           # 用于TiDB的快照
-N, --insert-ignore           # 使用INSERT IGNORE转储行
--replace                     # 使用REPLACE转储行
--exit-if-broken-table-found  # 如果遇到损坏的表则退出
--success-on-1146             # 如果表不存在,则不增加错误计数和警告而不是关键
--use-savepoints              # 使用保存点减少元数据锁定问题,需要SUPER特权
-s, --statement-size          # 尝试INSERT语句的大小(以字节为单位),默认为1000000
-F, --chunk-filesize          # 将表拆分为输出文件大小的块。该值的单位是MB
-e, --build-empty-files       # 即使表中没有可用的数据,也要构建转储文件
--where                       # 只转储选定的记录
-i, --ignore-engines          # 逗号分隔的要忽略的存储引擎列表
--csv                         # 自动启用--load-data并设置变量以CSV格式导出。
-r, --rows                    # 尝试将表分成这样多行的块。这个选项关闭--chunk-filesize
-c, --compress                # 压缩输出文件
--exec                        # 命令使用文件作为参数执行
--long-query-retries          # 重试检查长查询,默认为0(不重试)
--long-query-retry-interval   # 重新尝试长查询检查之前的等待时间(以秒为单位),默认为60
-l, --long-query-guard        # 以秒为单位设置长查询定时器,默认为60秒
--tidb-snapshot               # 用于TiDB的快照
-U, --updated-since           # 使用Update_time只转储最近U天更新的表
-k, --no-locks                # 不执行临时共享读锁。警告:这将导致不一致的备份
-Y, --all-tablespaces         # 转储所有表空间。
--no-backup-locks             # 不使用Percona备份锁
--lock-all-tables             #  使用LOCK TABLE代替FTWRL
--less-locking                # 最小化InnoDB表的锁时间。
-m, --no-schemas              # 不备份表数据
-K, --kill-long-queries       # 终止长时间运行的查询(而不是中止)
--set-names                   # 设置名称,使用风险自负,默认二进制

导出后文件命名规则大致如下:

dbname-schema-create.sql:建库语句。
dbname-schema-post.sql:包含事件、存储过程及函数创建语句(若存在则有该文件)。
dbname.tbname.metadata:记录这个表的行数。
dbname.tbname-schema.sql:此表的创建语句。
dbname.tbname-schema-triggers.sql:创建触发器语句(若该表存在触发器 则有此文件)。
dbname.tbname.sql:该表的插入数据语句(若该表为空 则不存在此文件)。
dbname.viewname-schema.sql:创建视图语句(只列举出视图字段)。
dbname.viewname-schema-view.sql:创建视图的真正语句。
metadata:记录开始及结束备份的时间以及二进制日志位置。

常用命令
备份全部数据库:

# 备份全部数据库 
mydumper -u root -p 123456 -o /mysql_backup/all/
# 全量备份 会备份 mysql、sys 系统库及其他自建库

# 备份全部数据库 包含触发器、事件、存储过程及函数
mydumper -u root -p 123456 -G -R -E -o /mysql_backup/all2/

# 备份指定库
mydumper -u root -p 123456 -G -R -E -B db1 -o /mysql_backup/db1/

# 使用正则 排除系统库
mydumper -u root -p 123456 -G -R -E --regex '^(?!(mysql|sys))' -o /mysql_backup/all3

# 备份指定表
mydumper -u root -p 123456 -B db1 -T tb1,tb2 -o /mysql_backup/tb/

# 只备份表结构
mydumper -u root -p 123456 -d -B db1 -o /mysql_backup/nodata/

# 只备份表数据
mydumper -u root -p 123456 -m -B db1 -o /mysql_backup/noschema/

# 压缩备份某个表
mydumper -u root -p 123456 -B db1 -T tb1 -c -o /mysql_backup/compress/

#按照条件备份
mydumper -u root -p -B 数据库 -T 数据表 --where="条件" -c -o /mysql_backup/compress/
#按照行数备份
mydumper -u root -p -B 数据库 -T 数据表 --where="条件  LIMIT 条数" -c -o /mysql_backup/compress/

myloader使用

使用myloader --help查看选项参数:

-d, --directory                              # 要导入的转储文件的目录
-q, --queries-per-transaction                # 每个事务的查询数,默认为1000
-o, --overwrite-tables                       # 如果存在表则删除
--append-if-not-exist                        # 添加IF NOT EXISTS到建表语句中
-B, --database                               # 还原到的数据库(目标库)
-s, --source-db                              # 被还原的数据库(源数据库),-s db1 -B db2,表示源库中的db1数据库,导入到db2数据库中。
-e, --enable-binlog                          # 启用还原数据的二进制日志记录
--innodb-optimize-keys                       # 创建没有索引的表,并在最后添加索引
--set-names                                  # 设置名称,使用风险自负,默认二进制
-L, --logfile                                # 要使用的日志文件名称,默认使用标准输出
--purge-mode                                 # 指定截断模式,可以是:NONE, DROP, TRUNCATE and DELETE
--disable-redo-log                           # 禁用REDO_LOG,然后启用它,不检查初始状态
-r, --rows                                   # 将INSERT语句拆分为这么多行。
--max-threads-per-table                      # 每个表使用的最大线程数,默认为4
--skip-triggers                              # 跳过触发器。默认情况下,它导入触发器
--skip-post                                  # 跳过事件、存储过程和函数。默认情况下,它导入事件、存储过程或函数
--no-data	                                   # 不导入表数据
--serialized-table-creation                  # 重新创建表将以每次一个线程的方式执行
--resume                                     # 期望在备份目录中找到恢复文件,并只处理那些文件
--pmm-path                                   # 默认值将是/usr/local/percona/pmm2/collectors/textfile-collector/high-resolution
-t, --threads                                # 要使用的线程数,默认为4
-C, --compress-protocol                      # 在MySQL连接上使用压缩
-V, --version                                # 显示程序版本并退出
-v, --verbose                                # 输出的详细性,0=无提示,1=错误,2=警告,3=信息,默认值2
--no-delete                                  # 不会在流完成后删除文件
-O, --omit-from-file                         # 包含数据库列表的文件。要跳过的表项,每行一个(在应用regex选项之前跳过)
-T, --tables-list                            # 要备份的表,以逗号隔开(不排除regex选项)
-h, --host                                   # 连接的主机地址
-u, --user                                   # 用户名
-p, --password                               # 密码
-a, --ask-password                           # 提示输入用户密码
-P, --port                                   # 端口
-S, --socket                                 # 用于连接的UNIX域套接字文件
-x, --regex                                  # 正则表达式
--skip-definer                               # 从CREATE语句中移除DEFINER。缺省情况下,不修改语句

常用命令:

从备份中恢复指定的库:
$ myloader -u root -p 123456 -s testdb -o -d /backup/mysql/

导入时开启binlog:
$ myloader -u root -p 123456 -e -s testdb -o -d /backup/mysql/

将源库的testdb导入到备库的test01库:
$ myloader -u root -p 123456 -B test01 -s testdb -o -d /backup/mysql/

导入特定的表:
在导出的目录中选择metadata文件和需要单独导入的表的结构文件和数据文件移到一个新目录下,最好提前建好库表,否则需要把建库表的文件一起移动到新目录,移动到新目录后可以使用myloader指定新目录进行恢复数据。

使用java调起命令

//拼写myDumper执行命令
        String[] cmds = new String[]{
                "mydumper", "-u", "root", "-p", "123456", "-B", "db1", "-T", "tb", "-o", "/mysql_backup/tb/"
        };
        try {
            //java调起myDumper命令
            Runtime.getRuntime().exec(cmds);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

注意:

  • -t, --threads # 要使用的线程数,默认为4这里的线程数是值备份多个表执行的线程数如果对单个表进行备份的话线程数设置是不起作用的
  • 物理机效率大于虚拟机
  • 命令使用String[]数组拼接