MySQL 工具之mysqldumper介绍

概述

mysqldump无法并行,这点与Oracle的expdp相比,存在一定的劣势,但是开源的mysqldumper是一个很好的补充。
mydumper(http://www.mysqldumper.org/)是一个在GNU GPLv3许可下发布的高性能MySQL备份和恢复工具集。mydumper是多线程的,他创建一个mysql备份就比随mysql发布的mysqldump工具要快得多。
mydumper也有从源端服务器恢复二进制日志的能力。

mysqldumper优点
1.多线程,可以是转存数据快很多
2.mydumper的输出已于管理和分析,因为他的表和元数据是分开的单独文件。
3. 所有线程都维护有一直的快照,这边提供了精准的主从位置。
4.Mydumper支持Perl正则表达式,这样就既可以包括是数据库名和报名的模式匹配,也可以配置这种匹配。
5.通过名为myloader的多线程工具,mydumper工具集也可以从mydumper备份中恢复数据。

主要备份步骤概括
1.主线程 FLUSH TABLES WITH READ LOCK, 施加全局只读锁,以阻止DML语句写入,保证数据的一致性
2.读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用
3.N个(线程数可以指定,默认是4)dump线程 START TRANSACTION WITH CONSISTENT SNAPSHOT; 开启读一致的事物
4.dump non-InnoDB tables, 首先导出非事物引擎的表
5.主线程 UNLOCK TABLES 非事物引擎备份完后,释放全局只读锁
6.dump InnoDB tables, 基于事物导出InnoDB表
7.事务结束

一.mysqldumper安装

数据库版本 : MySQL 5.7
操作系统版本: CentOS 7.8

软件地址:https://github.com/maxbube/mydumper/releases

yum -y install cmake glib2 pcre pcre-devel mysql-devel
-- 通过浏览器进行下载
yum -y install mydumper-0.9.5-2.el7.x86_64.rpm
[root@10-31-1-119 src]# yum -y install mydumper-0.9.5-2.el7.x86_64.rpm
已加载插件:fastestmirror, langpacks
正在检查 mydumper-0.9.5-2.el7.x86_64.rpm: mydumper-0.9.5-2.x86_64
mydumper-0.9.5-2.el7.x86_64.rpm 将被安装
正在解决依赖关系
--> 正在检查事务
---> 软件包 mydumper.x86_64.0.0.9.5-2 将被 安装
--> 解决依赖关系完成

依赖关系解决

============================================================================================================================================================================================================
 Package                                      架构                                       版本                                        源                                                                大小
============================================================================================================================================================================================================
正在安装:
 mydumper                                     x86_64                                     0.9.5-2                                     /mydumper-0.9.5-2.el7.x86_64                                     7.6 M

事务概要
============================================================================================================================================================================================================
安装  1 软件包

总计:7.6 M
安装大小:7.6 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : mydumper-0.9.5-2.x86_64                                                                                                                                                                 1/1 
  验证中      : mydumper-0.9.5-2.x86_64                                                                                                                                                                 1/1 

已安装:
  mydumper.x86_64 0:0.9.5-2                                                                                                                                                                                 

完毕!
[root@10-31-1-119 src]# 
[root@10-31-1-119 src]# which mydumper 
/usr/bin/mydumper
[root@10-31-1-119 src]# 
[root@10-31-1-119 src]# which myloader
/usr/bin/myloader

二.参数介绍

2.1 mydumper参数详解

  -B, --database              需要备份的数据库
  -T, --tables-list           备份的表,使用英文逗号分隔
  -O, --omit-from-file        包含要跳过的database.table条目列表的文件,每行一个(在应用正则表达式选项之前跳过)
  -o, --outputdir             备份文件指定的目录
  -s, --statement-size        INSERT语句的字节数, 默认 1000000
  -r, --rows                  尝试将表的数据按多少行分隔为块,当使用--chunk-filesize时此参数关闭。
  -F, --chunk-filesize        表的数据按照多少M分隔,输出为备份文件,单位为M
  -c, --compress              压缩输出文件
  -e, --build-empty-files     若表没有数据仍然生成一个空文件
  -x, --regex                 使用正则表达式
  -i, --ignore-engines        忽略存储引擎,使用英文逗号分隔
  -N, --insert-ignore         使用--insert-ignore备份行数
  -m, --no-schemas            不导出表结构
  -d, --no-data               卜导出表数据
  -G, --triggers              备份触发器
  -E, --events                备份事件(mysql的定时任务)
  -R, --routines              备份自定义的存储过程和函数
  -W, --no-views              不导出视图
  -k, --no-locks              不执行临时共享锁。警告:此操作会引起不一致的备份。 
  --no-backup-locks           不使用percona的备份锁
  --less-locking              在InnoDB表使用最小的锁表时间
  -l, --long-query-guard      设置备份时候慢查询的计时器,单位妙,默认值60.
  -K, --kill-long-queries     杀掉长查询语句
  -D, --daemon                是以daemon模式使用
  -I, --snapshot-interval     dump快照间隔时间,默认60分钟,需要在daemon模式下
  -L, --logfile               备份日志文件路径,默认是stdout输出
  --tz-utc                    在备份文件的顶部标注SET TIME_ZONE='+00:00',当服务器位于不同的时区或者在不同时区的服务器之前迁移timestamp数据,默认是禁用的
  --skip-tz-utc               默认值
  --use-savepoints            使用保存点减少数据锁定的问题,需super权限
  --success-on-1146           如表不存在则不增加错误计数,使用告警替换严重级别。
  --lock-all-tables           使用lock table 锁定所有的表,替代FTWRL
  -U, --updated-since         仅备份过去几天更新的表数据
  --trx-consistency-only      仅事务一致性
  --complete-insert           insert语句是完整的,包括列名
  -h, --host                  连接的主机
  -u, --user                  连接的用户,需要必需的权限
  -p, --password              连接用户的密码
  -a, --ask-password          提示输入用户的密码
  -P, --port                  连接使用的端口
  -S, --socket                连接使用的socket文件
  -t, --threads               备份使用的并发线程,默认是4
  -C, --compress-protocol     mysql连接上使用压缩协议
  -V, --version               展示mydumper程序的版本号
  -v, --verbose               输出信息的等级 0 = silent, 1 = errors, 2 = warnings, 3 = info默认为2
  --defaults-file             使用指定的配置文件
  --ssl                       连接使用SSL
  --key                       SSL连接使用的秘钥文件路径
  --cert                      SSL连接使用的认证文件路径
  --ca                        SSL连接使用证书颁发机构文件的路径名
  --capath                    包含PEM格式的受信任SSL CA证书的目录的路径名
  --cipher                    用于SSL加密的允许密码列表

2.2 myloader参数详解

  -d, --directory                   数据恢复的目录
  -q, --queries-per-transaction     每个事务的查询数,默认1000
  -o, --overwrite-tables            若表存在则删除
  -B, --database                    需要恢复的数据库
  -s, --source-db                   恢复的数据
  -e, --enable-binlog               恢复数据的时候开启binlog
  -h, --host                        连接的主机
  -u, --user                        连接的用户
  -p, --password                    连接的用户密码
  -a, --ask-password                提示输入用户
  -P, --port                        连接的端口
  -S, --socket                      连接使用的socket文件
  -t, --threads                     恢复使用的线程数,默认是4
  -C, --compress-protocol           在mysql连接的时候使用压缩协议
  -V, --version                     显示myloader的版本新
  -v, --verbose                     输出日志的等级, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默认为2
  --defaults-file                   使用指定的配置文件

三.使用案例

3.1 测试数据准备

create database test character set utf8;
use test;
create table t1(id int,name varchar(1000));

DELIMITER //

CREATE PROCEDURE p5()
BEGIN
  
  declare l_n1 int default 1000000;
 
  
  while l_n1 > 0 DO  
     insert into t1 select l_n1,repeat('w',1000);
     set l_n1 = l_n1 - 1;
  end while;
  
  select l_n1;  

END;
//

DELIMITER ;

-- 往测试表录入100w条数据,执行时间比较长,可以优化下,分批提交
call p5;

--拷贝一个表t2
create table t2 as select * from t1;

3.2 备份test库下的t1和t2两张表

备份进程是放在后台执行,查看日志才知道什么时候导出完成

/usr/bin/mydumper  -h 10.31.1.119 -u root -p abc123 -B test -T t1,t2  -t 4 -r 100000 -c --less-locking  -v 3 -D -L /var/log/mydumper.log   -o /backup/mydumper/20200826

查看备份日志

[root@10-31-1-119 20200826]# tail -100f /var/log/mydumper.log
2020-08-26 16:39:16 [INFO] - Connected to a MySQL server
2020-08-26 16:39:16 [INFO] - Started dump at: 2020-08-26 16:39:16

2020-08-26 16:39:16 [INFO] - Written master status
2020-08-26 16:39:16 [INFO] - Thread 5 connected using MySQL connection ID 2468
2020-08-26 16:39:16 [INFO] - Thread 6 connected using MySQL connection ID 2469
2020-08-26 16:39:16 [INFO] - Thread 7 connected using MySQL connection ID 2470
2020-08-26 16:39:16 [INFO] - Thread 8 connected using MySQL connection ID 2471
2020-08-26 16:39:16 [INFO] - Thread 1 connected using MySQL connection ID 2472
2020-08-26 16:39:16 [INFO] - Thread 2 connected using MySQL connection ID 2473
2020-08-26 16:39:16 [INFO] - Thread 3 connected using MySQL connection ID 2474
2020-08-26 16:39:16 [INFO] - Thread 4 connected using MySQL connection ID 2475
2020-08-26 16:39:16 [INFO] - Thread 7 shutting down
2020-08-26 16:39:16 [INFO] - Thread 5 shutting down
2020-08-26 16:39:16 [INFO] - Thread 8 shutting down
2020-08-26 16:39:16 [INFO] - Thread 4 dumping data for `test`.`t1`
2020-08-26 16:39:16 [INFO] - Thread 6 shutting down
2020-08-26 16:39:16 [INFO] - Thread 3 dumping data for `test`.`t2`
2020-08-26 16:39:16 [INFO] - Thread 1 dumping schema for `test`.`t1`
2020-08-26 16:39:16 [INFO] - Thread 2 dumping schema for `test`.`t2`
2020-08-26 16:39:16 [INFO] - Non-InnoDB dump complete, unlocking tables
2020-08-26 16:39:16 [INFO] - Thread 2 shutting down
2020-08-26 16:39:16 [INFO] - Thread 1 shutting down
2020-08-26 16:39:28 [INFO] - Thread 3 shutting down
2020-08-26 16:39:28 [INFO] - Thread 4 shutting down
2020-08-26 16:39:28 [INFO] - Finished dump at: 2020-08-26 16:39:28

备份文件如下:

[root@10-31-1-119 20200826]# ll
总用量 0
drwx------. 2 root root 157 8月  26 16:39 0
drwx------. 2 root root   6 8月  26 16:39 1
lrwxrwxrwx. 1 root root   1 8月  26 16:39 last_dump -> 0
[root@10-31-1-119 20200826]# 
[root@10-31-1-119 20200826]# du -sh *
11M     0
0       1
0       last_dump
[root@10-31-1-119 20200826]# cd 0
[root@10-31-1-119 0]# ls -lrth
总用量 11M
-rw-rw-rw-. 1 root root   83 8月  26 16:39 test-schema-create.sql.gz
-rw-rw-rw-. 1 root root  195 8月  26 16:39 test.t1-schema.sql.gz
-rw-rw-rw-. 1 root root  195 8月  26 16:39 test.t2-schema.sql.gz
-rw-rw-rw-. 1 root root 5.1M 8月  26 16:39 test.t2.sql.gz
-rw-rw-rw-. 1 root root 5.1M 8月  26 16:39 test.t1.sql.gz
-rw-rw-rw-. 1 root root  142 8月  26 16:39 metadata

3.3 恢复数据

删除数据

[root@10-31-1-119 src]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2484
Server version: 5.7.31-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> 
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> drop table t1;
Query OK, 0 rows affected (0.19 sec)

mysql> drop table t2;
Query OK, 0 rows affected (0.19 sec)

mysql> 

数据恢复

[root@10-31-1-119 0]# /usr/bin/myloader   -h 10.31.1.119 -u root -p abc123  -B test -e -t 8  -d /backup/mydumper/20200826/ --overwrite-tables -v 3

** (myloader:21232): CRITICAL **: 16:46:37.885: the specified directory is not a mydumper backup

[root@10-31-1-119 0]# 
[root@10-31-1-119 0]# /usr/bin/myloader   -h 10.31.1.119 -u root -p abc123  -B test -e -t 8  -d /backup/mydumper/20200826/0/ --overwrite-tables -v 3
** Message: 16:46:58.957: 8 threads created
** Message: 16:46:58.957: Dropping table or view (if exists) `test`.`t1`
** Message: 16:46:58.959: Creating table `test`.`t1`
** Message: 16:46:58.967: Dropping table or view (if exists) `test`.`t2`
** Message: 16:46:58.968: Creating table `test`.`t2`
** Message: 16:46:58.975: Thread 2 restoring `test`.`t1` part 0
** Message: 16:46:58.975: Thread 7 restoring `test`.`t2` part 0
** Message: 16:46:58.975: Thread 6 shutting down
** Message: 16:46:58.975: Thread 4 shutting down
** Message: 16:46:58.975: Thread 1 shutting down
** Message: 16:46:58.975: Thread 5 shutting down
** Message: 16:46:58.975: Thread 8 shutting down
** Message: 16:46:58.975: Thread 3 shutting down


** Message: 16:48:09.018: Thread 7 shutting down
** Message: 16:48:09.668: Thread 2 shutting down

四.mydumper正则拓展

-- 1.不备份 mysql和test两个数据库的数据
 mydumper --regex '^(?!(mysql\.|test\.))'
-- 2.备份 mysql和test两个数据库的数据
 mydumper --regex '^(mysql\.|test\.)'

参考文献:

1.https://blog.csdn.net/vkingnew/article/details/83010053
2.https://blog.csdn.net/weixin_30445169/article/details/96141753

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页