Mydumper的介绍及使用

介绍

https://launchpad.net/mydumper     -----》mydumper官网

MySQL在备份方面包含了自身的mysqldump工具,但其只支持单线程工作,这就使得它无法迅速的备份数据。而mydumper作为一个实用工具,能够良好支持多线程工作,这使得它在处理速度方面十倍于传统的mysqldump。其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备份工作,那么会引起DML阻塞。但一般现在的MySQL都有主从,备份也大部分在从上进行,所以锁的问题可以不用考虑。这样,mydumper能更好的完成备份任务。

mydumper和mysqldump区别

mysqldump是最简单的逻辑备份方式。在备份myisam表的时候,如果要得到一致的数据,就需要锁表,简单而粗暴。而在备份innodb表的时候,加上–master-data=1 –single-transaction 选项,在事务开始时刻,记录下binlog 位置点,然后利用mvcc来获取一致的数据,由于是一个长事务,在写入和更新量很大的数据库上,将产生非常多的undo,显著影响性能。

1) 优点:简单,可针对单表备份,在全量导出表结构的时候尤其有用。

2) 缺点:简单粗暴,单线程,备份慢而且恢复慢,跨IDC有可能遇到时区问题。
mydumper是mysqldump的加强版。相比mysqldump:

3) 内置支持压缩,可以节省2-4倍的存储空间。

4) 支持并行备份和恢复,因此速度比mysqldump快很多,但是由于是逻辑备份,仍不是很快。

mydumper特性

Mydumper主要特性:是一个针对MySQL和Drizzle的高性能多线程备份和恢复工具,开发人员主要来自MySQL,Facebook,SkySQL公司。

  1. 轻量级C语言写的

  2. 执行速度比mysqldump快10倍

  3. 事务性和非事务性表一致的快照(适用于0.2.2以上版本)

  4. 快速的文件压缩

  5. 支持导出binlog

  6. 多线程恢复(适用于0.2.1以上版本)

  7. 以守护进程的工作方式,定时快照和连续二进制日志(适用于0.5.0以上版本)

  8. 开源 (GNU GPLv3)

Mydumper 的优势

  1. 并行能力 (因此有高速度) 和性能 (高效的代码避免了耗费 CPU 处理能力的字符集转换过程)

  2. 更容易管理输出 (每个表都对应独立的文件,转储元数据等,便于查看/解析数据)

  3. 一致性 :跨线程维护快照, 提供精确的主从日志定位等。

  4. 可管理性 : 支持用 PCRE 来包含/排除指定的数据库和表(LCTT译注:PCRE,Perl Compatible Regular Expression,Perl兼容正则表达式)

mydumper安装

yum install glib2-devel mysql-devel zlib-devel pcre-devel

wget https://launchpadlibrarian.net/225370879/mydumper-0.9.1.tar.gz

tar xf mydumper-0.9.1.tar.gz

cd mydumper-0.9.1

cmake .

make

make install

mydumper备份机制

主线程 FLUSH TABLES WITH READ LOCK , 施加全局只读锁,以阻止 DML 语句写入,保证数据的一致性

读取当前时间点的二进制日志文件名和日志写入的位置并记录在 metadata 文件中,以供即使点恢复使用

N 个(线程数可以指定,默认是 4 ) dump 线程 START TRANSACTION WITH CONSISTENT SNAPSHOT ; 开启读一致的事物

dump non-InnoDB tables , 首先导出非事物引擎的表

主线程 UNLOCK TABLES 非事物引擎备份完后,释放全局只读锁

dump InnoDB tables , 基于事物导出 InnoDB 表

事物结束

mydumper参数介绍

-B, --database              要备份的数据库,不指定则备份所有库

 
-T, --tables-list           需要备份的表,名字用逗号隔开
 

-o, --outputdir             备份文件输出的目录


-s, --statement-size        生成的insert语句的字节数,默认1000000


-r, --rows                  将表按行分块时,指定的块行数,指定这个选项会关闭 --chunk-filesize

 
-F, --chunk-filesize        将表按大小分块时,指定的块大小,单位是 MB

 
-c, --compress              压缩输出文件


-e, --build-empty-files     如果表数据是空,还是产生一个空文件(默认无数据则只有表结构文件)


-x, --regex                 是同正则表达式匹配 'db.table'
 

-i, --ignore-engines        忽略的存储引擎,用都厚分割

 
-m, --no-schemas            不备份表结构


-k, --no-locks              不使用临时共享只读锁,使用这个选项会造成数据不一致

 
--less-locking              减少对InnoDB表的锁施加时间(这种模式的机制下文详解)

 
-l, --long-query-guard      设定阻塞备份的长查询超时时间,单位是秒,默认是60秒(超时后默认mydumper将会退出)

 
--kill-long-queries         杀掉长查询 (不退出)


-b, --binlogs               导出binlog

 
-D, --daemon                启用守护进程模式,守护进程模式以某个间隔不间断对数据库进行备份


-I, --snapshot-interval     dump快照间隔时间,默认60s,需要在daemon模式下
 

-L, --logfile               使用的日志文件名(mydumper所产生的日志), 默认使用标准输出

 
--tz-utc                    跨时区是使用的选项,不解释了


--skip-tz-utc               同上

 
--use-savepoints            使用savepoints来减少采集metadata所造成的锁时间,需要 SUPER 权限


--success-on-1146           Not increment error count and Warning instead of Critical in case of table doesn't exist

 
-h, --host                  连接的主机名


-u, --user                  备份所使用的用户

 
-p, --password              密码


-P, --port                  端口


-S, --socket                使用socket通信时的socket文件

 
-t, --threads               开启的备份线程数,默认是4
 

-C, --compress-protocol     压缩与mysql通信的数据

 
-V, --version               显示版本号


-v, --verbose               输出信息模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默认为 2

mydumper示例

导出yh库的数据

mydumper -h 127.0.0.1 -u root -p 123456 -B yh

会在当前目录下出现如下内容

[root@yh ~]# ll

total 4

drwx------ 2 root root 4096 Aug 26 21:08 export-20170826-210835

[root@yh ~]# cd export-20170826-210835/

[root@yh export-20170826-210835]# ll

total 16

-rw-r--r-- 1 root root  75 Aug 26 21:08 metadata  -》记录备份开始和结束时间,以及binlog日志文件位置

-rw-r--r-- 1 root root  61 Aug 26 21:08 yh-schema-create.sql   ---》存放建库的sql语句

-rw-r--r-- 1 root root 178 Aug 26 21:08 yh.test-schema.sql  ---》存放对表的操作sql语句

-rw-r--r-- 1 root root 183 Aug 26 21:08 yh.test.sql    ----》存放数据的文件

指定某一个目录

[root@yh ~]# mydumper -h 127.0.0.1 -u root -p 123456 -B yh -o my_sql

[root@yh ~]# ll

total 4

drwx------ 2 root root 4096 Aug 26 21:22 my_sql

[root@yh ~]# ll my_sql/

total 16

-rw-r--r-- 1 root root  75 Aug 26 21:22 metadata

-rw-r--r-- 1 root root  61 Aug 26 21:22 yh-schema-create.sql

-rw-r--r-- 1 root root 178 Aug 26 21:22 yh.test-schema.sql

-rw-r--r-- 1 root root 183 Aug 26 21:22 yh.test.sql

-o参数可以自动创建目录,所以想备到哪里就直接写路径就可以了

不导出表结构

[root@yh ~]# mydumper -h 127.0.0.1 -u root -p 123456 -B yh -m -o my_sql

[root@yh ~]# ll

total 4

drwx------ 2 root root 4096 Aug 26 21:29 my_sql

[root@yh ~]# ll my_sql/

total 8

-rw-r--r-- 1 root root  75 Aug 26 21:29 metadata

-rw-r--r-- 1 root root 183 Aug 26 21:29 yh.test.sql

-----》和上面对比,从这里便可以看出没有建表的sql语句文件《------

只备份单个表

[root@yh ~]# mydumper -h 127.0.0.1 -u root -p 123456 -B yh -T a -o my_backup

[root@yh ~]# ll my_backup/

total 16

-rw-r--r-- 1 root root  75 Aug 26 22:05 metadata

-rw-r--r-- 1 root root 175 Aug 26 22:05 yh.a-schema.sql

-rw-r--r-- 1 root root 169 Aug 26 22:05 yh.a.sql

-rw-r--r-- 1 root root  61 Aug 26 22:05 yh-schema-create.sql

也可以指定多个表中间用逗号分开

使用压缩参数进行压缩

[root@yh ~]# mydumper -h 127.0.0.1 -u root -p 123456 -B yh -T a -c -o my_backup

[root@yh ~]# ll my_backup/

total 16

-rw-r--r-- 1 root root  75 Aug 26 22:12 metadata

-rw-r--r-- 1 root root 170 Aug 26 22:12 yh.a-schema.sql.gz

-rw-r--r-- 1 root root 162 Aug 26 22:12 yh.a.sql.gz

-rw-r--r-- 1 root root  81 Aug 26 22:12 yh-schema-create.sql.gz

一些其他的用法

如果表数据是空,还是产生一个空文件(默认无数据则只有表结构文件)

mydumper -h 127.0.0.1 -u root -p 123456 -B yh --build-empty-files

设置长查询的上限,如果存在比这个还长的查询则退出mydumper,也可以设置杀掉这个长查询

mydumper -h 127.0.0.1 -u root -p 123456 --long-query-guard 200 --kill-long-queries

设置要dump的列表–tables-list,不需要设置db名字,逗号分割

mydumper -h 127.0.0.1 -u root -p 123456 --tables-list=ddd,zzz

通过regex也设置正则表达,需要设置db名字

mydumper -h 127.0.0.1 -u root -p 123456 --regex=test.z

把单表分成多个chunks,这个后面会讲分割的原理

mydumper -h 127.0.0.1 -u root -p 123456 --rows 10000

过滤某个引擎的表

mydumper -h 127.0.0.1 -u root -p 123456 -B test --ignore-engines=innodb

详细日志

mydumper -h 127.0.0.1 -u root -p 123456 -B test -v 3

进行数据恢复

myloader使用参数

-d, --directory                   备份文件的文件夹


-q, --queries-per-transaction     每次事物执行的查询数量,默认是1000


-o, --overwrite-tables            如果要恢复的表存在,则先drop掉该表,使用该参数,需要备份时候要备份表结构

 
-B, --database                    需要还原的数据库


-e, --enable-binlog               启用还原数据的二进制日志


-h, --host                        主机


-u, --user                        还原的用户


-p, --password                    密码


-P, --port                        端口


-S, --socket                      socket文件


-t, --threads                     还原所使用的线程数,默认是4


-C, --compress-protocol           压缩协议


-V, --version                     显示版本


-v, --verbose                     输出模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默认为2 

myloader恢复示例

进入数据库drop掉yh库

mysql> drop database yh;

Query OK, 5 rows affected (0.03 sec)

[root@yh ~]# ll my_backup/

total 32

-rw-r--r-- 1 root root  75 Aug 26 22:32 metadata

-rw-r--r-- 1 root root 170 Aug 26 22:32 yh.a-schema.sql.gz

-rw-r--r-- 1 root root 162 Aug 26 22:32 yh.a.sql.gz

-rw-r--r-- 1 root root 171 Aug 26 22:32 yh.b-schema.sql.gz

-rw-r--r-- 1 root root 171 Aug 26 22:32 yh.c-schema.sql.gz

-rw-r--r-- 1 root root 171 Aug 26 22:32 yh.d-schema.sql.gz

-rw-r--r-- 1 root root 170 Aug 26 22:32 yh.e-schema.sql.gz

-rw-r--r-- 1 root root  81 Aug 26 22:32 yh-schema-create.sql.gz

[root@yh ~]# mydumper -h 127.0.0.1 -u root -p 123456 -B yh -d my_backup

进入数据库进行查看

mysql> show databases like 'yh';

+---------------+

| Database (yh) |

+---------------+

| yh            |

+---------------+

1 row in set (0.00 sec)

mysql> show tables;

+--------------+

| Tables_in_yh |

+--------------+

| a            |

| b            |

| c            |

| d            |

| e            |

+--------------+

5 rows in set (0.00 sec)

 

猜你喜欢

转载自www.cnblogs.com/HByang/p/9120578.html