多线程工具:Mydumper

mydumper 是一个多线程的逻辑mysql数据备份工具,相比mysqldump要快。也有能力从远程服务器检索二进制日志,并同时dump数据。
优势:
1、并行,性能,避免昂贵的字符集转换;
2、容易管理备份输出,分开表文件、元数据,容易查看和解析数据;
3、一致性,对所有线程维护快照,提供master和slave的精确日志位置;
4、可管理性,支持正则方式指定要备份或者要排除备份的数据库和表;

项目地址: https://launchpad.net/mydumper

备份数据库的权限:
SELECT:备份数据库和表
REPLICATION SLAVE:使用-b选项进行二进制备份时需要,mydumper线程以slave的角色连接到备份服务器进行二进制日志检索

查看数据库连接可知:
    
    
    
    
  1. root@[(none)] 16:44:50>show processlist;
  2. +----+-------------+-----------+------+-------------+------+-----------------------------------------------------------------------------+------------------+----------+
  3. | Id | User        | Host      | db   | Command     | Time | State                                                                       | Info             | Progress |
  4. +----+-------------+-----------+------+-------------+------+-----------------------------------------------------------------------------+------------------+----------+
  5. | 55 | backup      | localhost | NULL | Binlog Dump |  295 | Master has sent all binlog to slave; waiting for binlog to be updated       | NULL             |    0.000 |
  6. | 56 | backup      | localhost | NULL | Binlog Dump |  295 | Master has sent all binlog to slave; waiting for binlog to be updated       | NULL             |    0.000 |
  7. +----+-------------+-----------+------+-------------+------+-----------------------------------------------------------------------------+------------------+----------+
SUPER:使用--use-savepoints选项时


一、备份
实例:
1、备份test库的所有表
    
    
    
    
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p backup@123 -t 4 -B test -o /data/backup/logic/
 
参数说明:
-t指定dump数据的线程数,默认为4
-B指定要备份的数据库
-o指定备份文件存放目录,默认为export-YYYYMMDD-HHMMSS目录,备份数据的每个表包括一个表定义文件和一个数据文件,指定的目录不存在,会自动创建
 
查看备份数据:
# ll
total 196580
-rw-r--r-- 1 root root       152 Aug  9 21:13 metadata
-rw-r--r-- 1 root root       378 Aug  9 21:13 test.sbtest1-schema.sql
-rw-r--r-- 1 root root 200894827 Aug  9 21:13 test.sbtest1.sql

2、备份多个数据库
    
    
    
    
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 8 --regex '^(?:mysql|employees)' -r 50000 -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)

参数说明:
--regex,-x:使用正则表达式匹配数据库和表,这里备份mysql和employees这两个库
--row,-r:多少行分开表到一个块(一个单独的文件存储),默认没有限制

3、备份使用压缩,同时只备份个别表
   
   
   
   
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 8 -B test -T t1,t4 -r 50000 -e -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)

参数说明:
-T, --tables-list:指定要备份的表,可以用逗号隔开多个表
--build-empty-files,-e: 对没有数据的表,也生成一个空数据文件,默认不创建空数据库文件,只有表定义文件

4、创建压缩备份
    
    
    
    
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 8 -x '^test.sbtest1' -c -r 50000 -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)

参数说明:
--compress,-c:压缩输出文件,对每一个数据文件和表定义进行单独压缩,使用gzip进行压缩,可以使用gunzip或gzip -d进行解压

5、不备份myisam表
    
    
    
    
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 8 -i myisam  -r 50000 -s 1000 -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)
  2. ** (mydumper:10630): WARNING **: Row bigger than statement_size for sakila.staff

对含有blob等字段的表,导出时使用二进制文件存储,非sql文本文件。
[root@myhost02 20140810-155349]# file sakila.staff.sql          
sakila.staff.sql: data
[root@myhost02 20140810-155349]# file sakila.payment.sql 
sakila.payment.sql: ASCII text

参数说明:
--statement-size,-s:指定insert语句的最大大小,在分开到一个新语句时,默认1000 000bytes
--ignore-engines,-i:用逗号分隔的存储引擎列表,忽略备份

6、只备份数据
    
    
    
    
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 6 -B test -r 50000 -m -o /data/backup/logic/$(date +%Y%m%d-%H%M%S) 

--no-schemas,-m:不dump模式(表定义)

7、备份binlog文件:前提服务器有开启二进制日志,没有适当权限,mydumper将挂起
    
    
    
    
  1.  mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 6 -B test -r 50000 -b -v 3 -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)

--binlogs,-b:从服务器获得binlogs
-v 3:显示详细输出信息,默认为2输出警告,1输出错误,0静默


其他选项:
-F, --chunk-filesize:根据指定大小,单位MB,将分成多个独立文件,未压缩之前的大小
--compress-input,-C:使用客户端协议压缩,连接到mysql服务器
--long-query-guard,-l:长查询执行超时时间,默认60s
--kill-long-queries,-k:kill长查询,而不是终止dump
--daemon,-D:后台模式
--snapshot-interval,-I:在后台模式,每个dump快照之间的间隔,单位分钟,默认60分钟
--logfile,-L:记录日志输出
--no-locks,-k:不执行临时的共享读锁,将会引起不一致备份
--tz-utc:SET TIME_ZONE='+00:00' at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones, defaults to on use --skip-tz-utc to disable.

8、备份时,减少锁
    
    
    
    
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 6 -B test -r 50000 -b -v 3 --less-locking --use-savepoints -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)

--less-locking:减少在innodb表上的锁时间
--use-savepoints:Use savepoints to reduce metadata locking issues, needs SUPER privilege,减少元数据锁,不能跟跟--row同用(** (mydumper:31109): WARNING **: --use-savepoints disabled by --rows)

 
输出文件:
mydumper在备份时生成几个文件,每个表都有自己的表定义和数据文件。
metadata文件:包含备份开始时间和结束时间,二进制日志坐标
如:
    
    
    
    
  1. # cat 20140810-164819/metadata 
  2. Started dump at: 2014-08-10 16:48:19
  3. SHOW MASTER STATUS:
  4.         Log: mysql-bin.000002
  5.         Pos: 647
  6. SHOW SLAVE STATUS:
  7.         Host: 10.0.37.122
  8.         Log: mysql-bin.000017
  9.         Pos: 200
  10. Finished dump at: 2014-08-10 16:48:19

表数据:每个表写到一个单独的文件,如果使用--rows选项,每个块将独立一个文件
表定义:当使用--schemas选项,将为每个表创建一个表定义文件
二进制日志:当使用--binlogs选项,检索二进制日志存放在备份目录的binlog_snapshot子目录中,如果启动二进制日志,mydumper将不断的检索二进制日志到binlog_snapshot子目录,直到数据备份完成
 
9、忽略备份某些数据库(如 test和mysql ):默认不会备份performance_schema和information_schema
    
    
    
    
  1. mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 6 --regex '^(?!(mysql|test))' -r 50000 -b -v 3 -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)

10、备份所有库
mydumper -S /log/mariadb10/mysql.sock -u backup -p "backup@123" -t 6 -r 50000 -b -v 3 -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)_all


 二、恢复
myloader:
多线程的恢复mydumper备份数据。

其他选项:
--compress-protocol,-C:使用客户端协议压缩,连接到mysql服务器
--overwrite-tables,-o:当还原schema时,删除任何存在的表

1、恢复单个库
    
    
    
    
  1. root@[(none)] 17:00:39>drop database test;

  2. myloader -S /log/mariadb10/mysql.sock -u root -t 6 -B test -d /data/backup/logic/20140810-165701_all/ -q 100 -e

参数说明:
--directory,-d:指定mydumper的备份目录,用于还原
--database,-B:加载数据到哪个数据库,如果是多个数据库的备份文件,可能会产生重复表名错误
--queries-per-transaction,-q:还原时,每个事务包含多少insert语句,默认1000
--threads,-t:多少线程用于恢复数据,默认4
--enable-binlog,-e:加载数据时,记录日志到mysql二进制日志,默认关闭

注意:
因-d只能指定备份目录,这样将恢复备份目录下的所有表到test库中,不仅仅之前备份test库的表。建议每个数据库独立一个目录。如果备份在一起,可以创建一个目录,然后拷贝原数据文件和需要库下的文件到这个目录,然后将myloader指定到这个目录,如:
mkdir 20140810-165701_all/test
cd 20140810-165701_all/
mv test.* test
cp metadata test
myloader -S /log/mariadb10/mysql.sock -u root -t 6 -B test -d /data/backup/logic/20140810-165701_all/test/ -q 100 -e

2、恢复单个表或多个表
    
    
    
    
  1. root@[test] 17:11:04>drop table t1,t2;
  2. Query OK, 0 rows affected (0.00 sec)

拷贝t1,t2备份数据到单独的目录:
    
    
    
    
  1. cd 20140810-165524
  2. mkdir test
  3. cp metadata  test
  4. cp test.{t1,t2}* test            
  5. ll test
  6. total 260
  7. -rw-r--r-- 1 root root    201 Aug 10 17:15 metadata
  8. -rw-r--r-- 1 root root    206 Aug 10 17:16 test.t1-schema.sql
  9. -rw-r--r-- 1 root root 125076 Aug 10 17:16 test.t1.sql
  10. -rw-r--r-- 1 root root    206 Aug 10 17:16 test.t2-schema.sql
  11. -rw-r--r-- 1 root root 125146 Aug 10 17:16 test.t2.sql

进行恢复:
    
    
    
    
  1. myloader -S /log/mariadb10/mysql.sock -u root -t 6 -B test -d /data/backup/logic/20140810-165524/test/

3、进行多库恢复
同单库恢复,将需要的表拷贝到相应的目录,然后单独进行恢复操作。

三、mydumper工作流程
默认mydumper使用4个线程dump数据和1个主线程。
主线程:FLUSH TABLES WITH READ LOCK
DUMP线程:START TRANSACTION WITH CONSISTENT SNAPSHOT;dump 非innodb表
 
主线程:UNLOCK TABLES
DUMP线程:dump innodb表
 
从0.6版本开始,对锁表进行了优化:
主线程:FLUSH TABLES WITH READ LOCK
DUMP线程:START TRANSACTION WITH CONSISTENT SNAPSHOT;
LL DUMP线程:LOCK TABLES non-Innodb
主线程:UNLOCK TABLES
LL DUMP线程:dump non-Innodb表,UNLOCK non-Innodb
DUMP线程:dump Innodb表
 
现在全局read锁,直到less-locking线程获得non-Innodb表锁后就释放,这样是比较快的。less-locking对myisam或archive没有承重更新时有帮助。
 
四、mydumper和mysqldump效率比较
数据表大小:
root@[(none)] 00:41:09>select sum(DATA_LENGTH+INDEX_LENGTH)/1024/1024/1024 length from information_schema.tables where TABLE_NAME like 'sbtest%';
+----------------+
| length         |
+----------------+
| 4.863800048828 |
+----------------+
1 row in set (0.00 sec)

# time /opt/Percona-Server-5.6.19-rel67.0-618.Linux.x86_64/bin/mysqldump -S /log/percona56/mysql.sock -q --single-transaction --databases test > /data/backup/logic/test.sql

real    0m55.489s
user    0m47.328s
sys     0m6.613s

# time mydumper -S /log/percona56/mysql.sock -B test -o /data/backup/logic/$(date +%Y%m%d-%H%M%S)                                                                       

real    0m11.552s
user    0m20.671s
sys     0m4.059s

总结:
1、mydumper进行备份时可以指定select语句大小,备份文件大小等,myloader进行恢复时可以指定事务大小;
2、myloader进行恢复时只能指定备份目录,为了恢复的方便性,在mydumper进行备份时,每个数据库单独备份目录存放;
3、myloader进行恢复时可以指定是否开启写二进制日志;
4、mydumper在进行备份时,需要先获得全局锁,只有备份完非innodb存储引擎表后才释放;

参考:
1、 http://centminmod.com/mydumper.html#mydumper
2、 http://www.mysqlperformanceblog.com/2014/06/13/mydumper-less-locking/
3、 http://www.percona.com/doc/percona-server/5.6/management/backup_locks.html



来自为知笔记(Wiz)


你可能感兴趣的:(多线程工具:Mydumper)