MySQL mydumper使用方法详解

 

mydumper工具


而你的MySQL版本应该更新到5.5版本以上,mydumper作为一个实用工具,能够良好支持多线程工作,可以并行的多线程的从表中读入数据并同时写到不同的文件里这使得它在处理速度方面快于传统的mysqldump。

mysqldumper其特征之一是在处理过程中需要对列表加以锁定,如果我们需要在工作时段执行备份工作,那么会引起DML阻塞不过现在的MySQL一般都是主从结构,备份也大部分在从上进行,所以锁的问题可以不用考虑因此mydumper能更优秀快速的完成备份任务

mydumper特性

1.多线程备份

2因为是多线程逻辑备份,备份后会生成多个备份文件

3.备份时对MyISAM表施加FTWRL(FLUSH TABLES WITH READ LOCK),会阻塞DML语句

4.保证备份数据的一致性

5.支持文件压缩

6.支持导出binlog

7.支持多线程恢复

8.支持以守护进程模式工作,定时快照和连续二进制日志

9.支持将备份文件切块

mydumper优点

1.轻量级C语言写的

2.执行速度比mysqldump快10倍

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

4.快速的文件压缩

5.支持导出binlog

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

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

8.开源(GNUGPLv3)

mydumper缺点

mydumper的多线程备份是基于表的,当只有一张表或99张是小表,张是超级大表,mydumper不如mysqldump,甚至更慢

对于大表情况注意使用参数-r

mydumper备份机制


相对于MySQL官方提供的逻辑备份工具 mysqldump , mydumper最大的特点就是可以采用多线程并行备份,大大提高了数据导出的速度。这里对mydumper的工作原理做个分析,看一下mydumper如何巧妙的利用Innodb引擎提供的MVCC版本控制的功能,实现多线程并发获取一致性数据。

这里一致性数据指的是在某个时间点,导出的数据与导出的Binlog文件信息相匹配,如果导出了多张表的数据,这些不同表之间的数据都是同一个时间点的数据。

在mydumper进行备份的时候,由一个主线程以及多个备份线程完成。其主线程的流程是:

  1. 连接数据库
  2. FLUSH TABLES WITH READ LOCK 将脏页刷新到磁盘并获得只读锁
  3. START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT / 开启事物并获取一致性快照
  4. SHOW MASTER STATUS 获得binlog信息
  5. 创建子线程并连接数据库
  6. 为子线程分配任务并push到队列中
  7. UNLOCK TABLES / FTWRL / 释放锁

子线程的主要流程是:

  1. 连接数据库
  2. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE
  3. START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT /
  4. 从队列中pop任务并执行

上述两个线程的流程的关系如图

备份所生成的文件

  1. 所有的备份文件在一个目录中,目录可以自己指定
  2. 目录中包含一个metadata文件(记录备份的时候是从哪个点开始备份的) 
[root@localhost test]# cat metadata
Started dump at: 2020-06-21 13:26:41
SHOW MASTER STATUS:
	Log: mysql-bin.000001
	Pos: 762
	GTID:

Finished dump at: 2020-06-21 13:26:41

记录了备份数据库在备份时间点的二进制日志文件名,日志的写入位置,如果是在从库进行备份,还会记录备份时同步至从库的二进制日志文件及写入位置

3. 每个表有两个备份文件:

database.table-schema.sql 表结构文件
database.table.sql 表数据文件
如果对表文件分片,将生成多个备份数据文件,可以指定行数或指定大小分片

[root@localhost test]# ll | tail -n 4
drwx------ 2 root root  16384 Jun 21 13:28 test
-rw-r--r-- 1 root root    230 Jun 21 13:26 test.mytest-schema.sql
-rw-r--r-- 1 root root    143 Jun 21 13:26 test.mytest.sql
-rw-r--r-- 1 root root     65 Jun 21 13:26 test-schema-create.sql

[root@localhost backup]# cd test/
[root@localhost test]# cat  test.mytest-schema.sql
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;

/*!40103 SET TIME_ZONE='+00:00' */;
CREATE TABLE `mytest` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

[root@localhost test]# cat test.mytest.sql
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;
/*!40103 SET TIME_ZONE='+00:00' */;
INSERT INTO `mytest` VALUES
(1,"lulei");

[root@localhost test]# cat test-schema-create.sql
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */;

 

mydumper实战 


下载安装mydumper 

下载地址:
https://launchpad.net/mydumper

[root@localhost ~]# ls
anaconda-ks.cfg   mydumper-0.9.5-2.el7.x86_64.rpm
[root@localhost ~]# rpm -ivh mydumper-0.9.5-2.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:mydumper-0.9.5-2                 ################################# [100%]
[root@localhost ~]# which mydumper
/usr/bin/mydumper
[root@localhost ~]# which myloader
/usr/bin/myloader

 mydumper常见参数

常见参数:
mydumper参数
-B, --database              要备份的数据库,不指定则备份所有库
-T, --tables-list           需要备份的表,名字用逗号隔开
-o, --outputdir             备份文件输出的目录
-c, --compress              压缩输出文件
-e, --build-empty-files     如果表数据是空,还是产生一个空文件(默认无数据则只有表结构文件)
-x, --regex                 是同正则表达式匹配 'db.table'
-i, --ignore-engines        忽略的存储引擎,用都厚分割
-m, --no-schemas            不备份表结构
--less-locking              减少对InnoDB表的锁施加时间
-L, --logfile               使用的日志文件名(mydumper所产生的日志), 默认使用标准输出
-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 -u root -p 123456 --database fxdb1 --outputdir fxdb1 --verbose=3 --logfile dumper.log

备份全库可以看到是多线程备份 

[root@localhost test]# mydumper -u root -p root  --verbose=3 --outputdir test 
** Message: 13:28:47.722: Connected to a MySQL server
** Message: 13:28:47.732: Started dump at: 2020-06-21 13:28:47

** Message: 13:28:47.732: Written master status
** Message: 13:28:47.735: Thread 1 connected using MySQL connection ID 17
** Message: 13:28:47.737: Thread 2 connected using MySQL connection ID 18
** Message: 13:28:47.739: Thread 3 connected using MySQL connection ID 19
** Message: 13:28:47.740: Thread 4 connected using MySQL connection ID 20
** Message: 13:28:47.789: Thread 1 dumping data for `mysql`.`columns_priv`
** Message: 13:28:47.789: Thread 2 dumping data for `mysql`.`db`
** Message: 13:28:47.789: Thread 3 dumping data for `mysql`.`event`
** Message: 13:28:47.789: Thread 4 dumping data for `mysql`.`func`
** Message: 13:28:47.791: Empty table mysql.event
** Message: 13:28:47.791: Thread 3 dumping data for `mysql`.`ndb_binlog_index`
** Message: 13:28:47.792: Thread 2 dumping data for `mysql`.`proc`

下面是具体备份语句 

1.备份单库:
mydumper -u root -p 123456 --database db1 --outputdir db1
mydumper -u root -p 123456 --database db1 --outputdir db1 --verbose=3
备份所生成的文件:
1.所有的备份文件在一个目录中,目录可以自己指定。
2.目录中包含一个metadata文件
 记录了备份数据库在备份时间点的二进制日志文件名,日志的写入位置,
 如果是在从库进行备份,还会记录备份时同步至主库的二进制日志文件及写入位置
3.每个表有两个备份文件:
  db1-schema-create.sql 数据库结构文件
 db1.tbs1-schema.sql 表结构文件
 db1.tbs1.sql 表数据文件
 如果对表文件分片,将生成多个备份数据文件,可以指定行数或指定大小分片



2.备份多个数据库
一次备份一个数据库,指定--database,使用--regex,正则表达式
mydumper -u root -p 123456 --regex '^(db1\.|db2\.)' --outputdir db12 --verbose=3
默认包含视图,但是routine,event,trigger需要另外指定参数。

3.备份所有数据库:
全库备份期间除了information_schema与performance_schema之外的库都会被备份
mydumper -u root -p 123456 --outputdir fxfull --verbose=3

4.备份单表
mydumper -u root -p 123456 --database db1 --tables-list tbs,tbs2 --outputdir tbs12 --verbose=3
多表用逗号分隔
mydumper -u root -p 123456 --database db1 --tables-list tbs,tbs2,tbs3 --build-empty-files --outputdir tbs123 --verbose=3


5.只备份结构
mydumper -u root -p 123456 --database db1 --no-data --outputdir db1 --verbose=3

6.开启压缩
mydumper -u root -p 123456 --database db1 --compress --outputdir db1 --verbose=3

7.导出触发器,存储过程,函数,事件,视图
  -G, --triggers  导出触发器
  -E, --events    导出事件
  -R, --routines  导出存储过程和函数
创建存储过程:
CREATE PROCEDURE proc()
BEGIN
  SELECT * FROM tbs1;
END;

创建视图:
create view v_tbs1 as select * from tbs;

默认会导出视图,不会导出存储过程、函数、事件、触发器。
-W, --no-views  不导视图
mydumper -u root -p 123456 --database db1 --triggers -E --events --routines --outputdir tbs

一致性备份:
--less-locking 少锁等待时间
mydumper -u root -p 123456 --database db1 --less-locking --outputdir tbs --verbose=3

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/106884371