MySQL多线程逻辑备份工具之mydumper

存储架构 2015-01-15

下载安装

Contents

yum -y install cmake glib2 pcre pcre-devel mysql-devel

wget https://launchpad.net/mydumper/0.6/0.6.2/+download/mydumper-0.6.2.tar.gz

tar xf mydumper-0.6.2.tar.gz

cd mydumper-0.6.2

cmake .

make && make install

注释:如果只要帮助可以这样编译make doc_html

安装之后生成两个二进制命令/usr/local/bin/mydumper(备份)和/usr/local/bin/myloader(恢复)

mydumper特性

  • 多线程备份,生成多个备份文件
  • 针对MyISAM表加读锁,会阻塞DML语句
  • 保证备份数据一致性
  • 支持文件压缩和导出binlog
  • 支持多线程恢复
  • 支持守护进程模式,定时快照和连续二进制日志
  • 支持正则匹配
  • 恢复支持是否启用binlog及指定事物的大小(多少insert)
  • 无法备份视图和触发器
  • 备份整库时可用备份存储过程和函数,单库备份等情况无法对其进行备份

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

备份所生成的文件

  1. 所有的备份文件在一个目录中,目录可以自己指定
  2. 目录中包含一个metadata文件

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

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

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

database.table.sql 表数据文件

如果对表文件分片,将生成多个备份数据文件,可以指定行数或指定大小分片

mydumper参数详解

PHP

-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参数详解

PHP

-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

使用案例

PHP

1.导出test库下面的table1和table2表结构和数据
/usr/local/bin/mydumper  -h 10.1.1.1 -u root -p root -B test1 -T table1,table2  -t 8 -r 100000 -c --less-locking  -v 3 -D -L /var/log/mydumper.log   -o /geekwolf/test_table1_table2/
若只导出数据增加-m参数
2.将导出的数据导入到10.1.1.2服务器的test2库中
/usr/local/bin/myloader   -h 10.1.1.2 -u root -p root  -B test2 -e -t 8  -d /geekwolf/test_table1_table2/ --overwrite-tables -v 3

注释 :后台记录导出导入的时间

PHP

输入screen命令
然后(time myloader   -h 10.1.1.2 -u user  -p 'ap' -B mnew_gz -e -t 8  -d /geekwolf/m_members/ --overwrite-tables -v 3) 2>/geekwolf/im.log
最后Ctrl+A+D

最后其他备份工具如:mysqldump/mysqlhotcopy/MySQLDumper 、mk-parallel-dump/mk-parallel-restore 、Xtrabackup/LVM Snapshot 暂时想到这么多,以后再想到再补充吧,也欢迎各位大拿fork工具库提交 https://github.com/geekwolf/sa-scripts/blob/master/devops.md

责编内容by:Geekwolf's Blog (源链)。感谢您的支持!

您可能感兴趣的

nodejs MySQL connection with SQLite Failover I'm looking for a simple example (as I'm new to node) on how to connect to MySQ...
Monitoring MySQL with NGINX Amplify The initial surge of web servers for the Internet tended to run the famous LAMP...
Using ioping to Evaluate Storage Performance for M... In this blog post, we’ll look at how ioping can be used with other tools to und...
Unable to insert data that is stored in variables ... am trying to insert the data entered into the web form into database table,i am ...
sql优化基础篇 优化的步骤: 0.先sql运行看看是否真的很慢,注意设置SQL_NO_CACHE 1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询...