mydumper 备份原理和使用方法(备份mysql)

一:个人使用环境:CentOS6.5  + Mysql5.7mysql

MySQL备份工具比较:linux

一、mysqldump:属于逻辑备份,会存在锁表,但考虑到数据量比较大,锁表的时间会比较长,业务不容许,pass掉;正则表达式

二、xtrabackup:属于物理备份,不存在锁表,但考虑到2台DB使用的都是共享表空间,同时在业务B的数据库进行恢复时,一是时间比较长,二是数据确定不正确,pass掉(测试过);sql

三、mydumper:属于逻辑备份,是一个多线程、高性能的数据逻辑备份、恢复的工具,且锁表的时间很短(40G数据,10分钟之内),同时会记录binlog file和pos,业务能够接受。数据库

二:介绍多线程

MySQL 自身的 mysqldump 工具支持单线程工做, 依次一个个导出多个表,没有一个并行的机 ,这就使得它没法迅速的备份数据。less

mydumper 做为一个实用工具,可以良好支持多线程工做, 能够并行的多线程的从表中读入数据并同时写到不一样的文件里 ,这使得它在处理速度方面快于传统的 mysqldump 。其特征之一是在处理过程当中须要对列表加以锁定,所以若是咱们须要在工做时段执行备份工做,那么会引发 DML 阻塞。但通常如今的 MySQL 都有主从,备份也大部分在从上进行,因此锁的问题能够不用考虑。这样, mydumper 能更好的完成备份任务。socket

mydumper 特性工具

轻量级C语言写的性能

  1. 执行速度比mysqldump快10倍
  2. 保证事务性和非事务性表一致的快照(适用于0.2.2以上版本)
  3. 快速的文件压缩
  4. 支持导出binlog(新版本里已经不能备份binlog)
  5. 支持将备份文件切块
  6. 支持多线程备份(由于是多线程逻辑备份,备份后会生成多个备份文件)
  7. 支持多线程恢复(适用于0.2.1以上版本)
  8. 备份时对MyISAM表施加FTWRL(FLUSH TABLES WITH READ LOCK),会阻塞DML语句
  9. 支持以守护进程的工做方式,定时快照和连续二进制日志(适用于0.5.0以上版本)
  10. 支持将备份文件切块
  11. 开源 (GNU GPLv3)

三: mydumper 的安装

首先你要安装cmake 、make 工具

mydumper 使用 c 语言编写,使用 glibc 库

官方下载地址:

https://launchpad.net/mydumper/+download

linux  wget下载:

#wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz

首先安装依赖包

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

#tar -xvzf mydumper-0.9.1.tar.gz
#cd mydumper-0.9.1
#cmake .

#make && make install

安装完成后生成两个二进制文件 mydumper 和 myloader 位于 /usr/local/bin 目录下

mydumper 备份机制

此处省略10000字...

主要步骤归纳

  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. 事物结束

备份所生成的文件

  • 全部的备份文件在一个目录中,目录能够本身指定
  • 目录中包含一个 metadata 文件

记录了备份数据库在备份时间点的二进制日志文件名,日志的写入位置,

若是是在从库进行备份,还会记录备份时同步至主库的二进制日志文件及写入位置

  • 每一个表有两个备份文件:

database.table-schema.sql 表结构文件

database.table.sql 表数据文件

若是对表文件分片,将生成多个备份数据文件,能够指定行数或指定大小分片

mydumper 和 myloader 的使用

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

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

使用案例 备份 game 库到 /backup/01 文件夹中,并压缩备份文件

mydumper -u root -p ### -h localhost -B game -c -o /backup/01

备份全部数据库,并备份二进制日志文件,备份至 /backup/02 文件夹

mydumper -u root -p ### -h localhost -o /backup/02

备份 game.tb_player 表,且不备份表结构,备份至 /backup/03 文件夹

mydumper -u root -p ### -h localhost -T tb_player -m -o /backup/03

还原

myloader -u root -p ### -h localhost -B game -d /backup/02

mydumper 的 less locking 模式

mydumper 使用 --less-locking 能够减小锁等待时间,此时 mydumper 的执行机制大体为

  • 主线程 FLUSH TABLES WITH READ LOCK (全局锁)
  • Dump 线程 START TRANSACTION WITH CONSISTENT SNAPSHOT;
  • LL Dump 线程 LOCK TABLES non-InnoDB (线程内部锁)
  • 主线程 UNLOCK TABLES
  • LL Dump 线程 dump non-InnoDB tables
  • LL DUmp 线程 UNLOCK non-InnoDB
  • Dump 线程 dump InnoDB tables

binary logs(新版已废弃)

启用--binlogs选项后,二进制文件存放在binlog_snapshot目录下

daemon mode

  • 在这个模式下,有五个目录0、一、binlogs、binlog_snapshot、last_dump。

  • 备份目录是0和1,间隔备份,若是mydumper因某种缘由失败而仍然有一个好的快照,当快照完成后,last_dump指向该备份。

以当天日期时间做为名称建立文件夹

#mkdir `date +%Y%m%d%H%M%S`

举例使用:

备份

 #mydumper -u root -p PWD -h IP -B funds_balance -c -o / opt/`date +%Y%m%d%H%M%S` 

还原

# myloader -u root -p PWD -h IP -B funds_balance -d /opt/20160923161614

相关文章
相关标签/搜索