设为首页 收藏本站
查看: 796|回复: 0

[经验分享] Mydumper:MySQL多线程逻辑备份与恢复

[复制链接]

尚未签到

发表于 2018-10-10 09:40:53 | 显示全部楼层 |阅读模式
MySQL多线程逻辑备份
  目前版本已经更新到了0.9.1,新增了一些参数,现在对新参数了解一下:

  • Mydumper简介
      Mydumper是一个多线程的MySQL逻辑备份工具.

    •   逻辑备份速度非常快(跟mysqldump相比)
    •   myisam和innodb表的一致性备份
    •   如果不是使用myisam表,几乎无”锁”(no locking)
    •   每个表都是导出到独立的文件
    •   快速压缩,通常mydumper压缩的文件比XtraBackup压缩的文件小3~5倍

  • Mydumper安装
    # yum install cmake glib2-devel zlib zlib-devel pcre-devel gcc-c++  
    # wget -c https://launchpad.net/mydumper/0.5/0.5.2/+download/mydumper-0.5.2.tar.gz
      
    # tar zxvf mydumper-0.5.2.tar.gz
      
    # cd mydumper-0.5.2
      
    # cmake .
      
    # make && make install


  • 生成2个工具:mydumper(备份),myloader(导入),放入到bin目录下。
  • mydumper
      Mydumper通过使用多线程同时dump多个表或是表的一部分.它有很多选项参数mydumper --help.
      以下是其中三个重要参数:
    --database:指定要导出备份的数据库名  
    --threads:指定使用线程的数目.通常可设置为CPU的核数目,当然有时也会设置更多.
      
    --rows:指定每个"块"(chunk)的行(记录)数目.具体值的设置取决于数据表的记录数目.
      一个备份脚本例子dbdump.sh:
    #!/bin/bash  

      
    MYDUMPER=`which mydumper`
      
    DIR_BACKUP=/backup
      
    DB_HOST=192.168.1.190
      
    DB_PORT=3306
      
    DB_NAME=sakila
      
    DB_USER=root
      
    DB_PASS=123456
      

      
    FDAY=`date "+%F"`
      
    DB_DUMP=$DIR_BACKUP/$DB_NAME.$FDAY
      

      
    $MYDUMPER \
      
        --database=$DB_NAME \
      
        --host=$DB_HOST \
      
        --port=$DB_PORT \
      
        --user=$DB_USER \
      
        --password=$DB_PASS \
      
        --outputdir=$DB_DUMP \
      
        --rows=500000 \
      
        --compress \
      
        --build-empty-files \
      
        --threads=2 \
      
        --compress-protocol \
      
        --kill-long-queries
      注:由于Mydumper不处理MySQL的视图,触发器和存储过程,因此使用mydumper去导出schema并不可靠.
      实际生产环境中,建议mydumper仅用于导出数据(使用--no-schemas),而通过mysqldump来导出schema.
MySQL多线程逻辑恢复

  • Myloader
      上面在安装Mydumper的同时也安装了Myloader.
      使用Myloader进行恢复的脚本例子dbload.sh:
    #!/bin/bash  

      
    MYLOADER=`which myloader`
      
    DB_HOST="192.168.1.190"
      
    DB_PORT=3306
      
    DB_NAME="sakila2"
      
    DB_USER="root"
      
    DB_PASS="123456"
      

      
    DB_DUMP="/data/backup/sakila.2013-04-29"
      

      
    $MYLOADER \
      
        --database=$DB_NAME \
      
        --host=$DB_HOST \
      
        --port=$DB_PORT \
      
        --user=$DB_USER \
      
        --password=$DB_PASS \
      
        --directory=$DB_DUMP \
      
        --queries-per-transaction=50000 \
      
        --threads=6 \
      
        --compress-protocol \
      
        --verbose=3
root@op3:/home/zhoujy# mydumper  --help  Usage:
  mydumper [OPTION...] multi-threaded MySQL dumping
  Help Options:  -?, --help
  Show help optionsApplication Options:
  -B, --database      需要备份的数据库,一个数据库一条命令备份,要不就是备份所有数据库,包括mysql。
  -T, --tables-list    需要备份的表,用逗号分隔。
  -o, --outputdir     备份文件目录
  -s, --statement-size  生成插入语句的字节数,默认1000000,这个参数不能太小,不然会报 Row bigger than statement_size for tools.t_serverinfo
  -r, --rows         试图用行块来分割表,该参数关闭--chunk-filesize
  -F, --chunk-filesize  行块分割表的文件大小,单位是MB
  -c, --compress      压缩输出文件
  -e, --build-empty-files   即使表没有数据,也产生一个空文件
  -x, --regex           正则表达式匹配,如'db.table'
-i, --ignore-engines   忽略的存储引擎,用逗号分隔  -m, --no-schemas      不导出表结构
  -d, --no-data         不导出表数据
  -G, --triggers        导出触发器
  -E, --events         导出事件
  -R, --routines       导出存储过程
  -k, --no-locks       不执行共享读锁 警告:这将导致不一致的备份
  --less-locking       减到最小的锁在innodb表上.
  -l, --long-query-guard   设置长查询时间,默认60秒,超过该时间则会报错:There are queries in PROCESSLIST running longer than 60s, aborting dump
-K, --kill-long-queries kill掉长时间执行的查询,备份报错:Lock wait timeout exceeded; try restarting transaction  -D, --daemon          启用守护进程模式
  -I, --snapshot-interval     dump快照间隔时间,默认60s,需要在daemon模式下
  -L, --logfile               使用日志文件,默认标准输出到终端
  --tz-utc                    备份的时候允许备份Timestamp,这样会导致不同时区的备份还原会出问题,默认关闭,参数:--skip-tz-utc to disable.  --skip-tz-utc                --use-savepoints            使用保存点记录元数据的锁信息,需要SUPER权限
  --success-on-1146           Not increment error count and Warning instead of Critical in case of table doesn't exist
  --lock-all-tables           锁全表,代替FLUSH TABLE WITH READ LOCK
  -U, --updated-since         Use Update_time to dump only tables updated in the last U days
  --trx-consistency-only      Transactional consistency only
  -h, --host                  The host to connect to
  -u, --user                  Username with privileges to run the dump
  -p, --password              User password
  -P, --port                  TCP/IP port to connect to
  -S, --socket                UNIX domain socket file to use for connection
  -t, --threads               备份执行的线程数,默认4个线程
  -C, --compress-protocol     在mysql连接上使用压缩协议
  -V, --version               Show the program version and exit
  -v, --verbose               更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
  myloader(0.9.1):
root@op:~# myloader --help  
Usage:
  
  myloader [OPTION...] multi-threaded MySQL loader
  

  
Help Options:  -?, --help
  
Show help optionsApplication Options:
  
-d, --directory                   备份文件所在的目录
  
-q, --queries-per-transaction     每个事务的query数量, 默认1000
  
-o, --overwrite-tables            如果表存在则先删除,使用该参数,需要备份时候要备份表结构,不然还原会找不到表
  
-B, --database                    指定需要还原的数据库
  
-s, --source-db                   还原的数据库
  
-e, --enable-binlog               启用二进制日志恢复数据
  
-h, --host                        The host to connect to
  
-u, --user                        Username with privileges to run the dump
  
-p, --password                    User password
  
-P, --port                        TCP/IP port to connect to
  
  -S, --socket                      UNIX domain socket file to use for connection
  
  -t, --threads                     使用的线程数量,默认4
  
  -C, --compress-protocol           连接上使用压缩协议
  
  -V, --version                     Show the program version and exit
  
  -v, --verbose                     更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
  测试:测试基本用法
  1:备份
./mydumper -u zjy -p ##### -h 192.168.220.245 -P 3306 -B chushihua -o /home/zhoujy/bak/root:homezhoujybak# ls  分析:mydumper把数据和表结构分开备份,并且把二进制日志备份出来单独放到一个文件中。
metadata:元数据 记录备份开始和结束时间,以及binlog日志文件位置。table data:每个表一个文件  table schemas:表结构文件
  
binary logs: 启用--binlogs选项后,二进制文件存放在binlog_snapshot目录下
  
daemon mode:在这个模式下,有五个目录0,1,binlogs,binlog_snapshot,last_dump。
  
备份目录是0和1,间隔备份,如果mydumper因某种原因失败而仍然有一个好的快照,当快照完成后,last_dump指向该备份。
  2:还原:还原到另一台服务器,先建立要还原的数据库(chushihua)
./myloader -u root -p 123456 -h 192.168.200.25 -P 3307 -B chushihua -d /home/zhoujy/bak/  和备份一样查看是多线程
  进一步测试:测试一些常用的参数
  备份指定表(-T),并且不要导出表结构(-m)
./mydumper -u root-p 123456 -h 192.168.220.252 -P 3306 -m -B test -T b,a,c,d,e,g,f,h,i -o /home/zhoujy/bak/  zhoujy@zhoujy:~/bak$ ls -lh
  -rw-rw-r-- 1 zhoujy zhoujy 3.4K 2013-11-14 20:57 test.a.sql
  -rw-rw-r-- 1 zhoujy zhoujy 1.6M 2013-11-14 20:57 test.b.sql
  -rw-rw-r-- 1 zhoujy zhoujy 7.8M 2013-11-14 20:57 test.c.sql
  -rw-rw-r-- 1 zhoujy zhoujy 1.7M 2013-11-14 20:57 test.d.sql
  -rw-rw-r-- 1 zhoujy zhoujy 303K 2013-11-14 20:57 test.e.sql
  -rw-rw-r-- 1 zhoujy zhoujy 517K 2013-11-14 20:57 test.f.sql
  -rw-rw-r-- 1 zhoujy zhoujy 646K 2013-11-14 20:57 test.g.sql
  -rw-rw-r-- 1 zhoujy zhoujy 394K 2013-11-14 20:57 test.h.sql
  -rw-rw-r-- 1 zhoujy zhoujy  34K 2013-11-14 20:57 test.i.sql
  -rw-rw-r-- 1 zhoujy zhoujy   75 2013-11-14 20:57 metadata
  压缩备份文件(-c),备份binlog(-b),正则表达式备份表(-x)
./mydumper -u root -p 123456 -h 192.168.200.25 -P 3306 -m -c -b --regex=tmp.* -B test  -o /home/zhoujy/bak/drwx------ 2 zhoujy zhoujy 4.0K 2013-11-14 21:16 binlog_snapshot  
-rw-rw-r-- 1 zhoujy zhoujy  133 2013-11-14 21:16 metadata
  
-rw-rw-r-- 1 zhoujy zhoujy  94K 2013-11-14 21:16 test.tmp_0808.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy  75K 2013-11-14 21:16 test.tmp_0809.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy  25K 2013-11-14 21:16 test.tmp_0813.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy 208K 2013-11-14 21:16 test.tmp_0826.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy  915 2013-11-14 21:16 test.tmp_0827.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy  901 2013-11-14 21:16 test.tmp_0912.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy 2.1K 2013-11-14 21:16 test.tmp_0916.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy 622K 2013-11-14 21:16 test.tmp_0918_a.sql.gz
  
-rw-rw-r-- 1 zhoujy zhoujy  28M 2013-11-14 21:16 test.tmp_0918_ff.sql.gz
  如上所示,备份文件已经是压缩的了(用gzip -d 解压),并且备份出了tmp.*匹配出来的所有表,二进制日志也被备份到了binlog_snapshot文件中,并且也是被压缩的。
  新版本里(0.91)已经不能备份binlog了,没有-b参数。这里说明下备份指定数据库的方法:--regex 正则匹配
  #指定备份数据库:备份abc、bcd、cde
  mydumper -u backup -p 123456  -h 192.168.180.13 -P 3306 -t 3 -c -l 3600 -s 10000000 -e --regex 'abc|bcd|cde' -o bbb/
指定不备份的数据库:不备份abc、mysql、test,备份其他数据库mydumper -u backup -p 123456  -h 192.168.180.13 -P 3306 -t 3 -c -l 3600 -s 10000000 -e --regex '^(?!(abc|mysql|test))' -o bbb/  还原,表存在先删除(-o):这里需要注意,使用该参数,备份目录里面需要有表结构的备份文件。
./myloader -u root -p 123456 -h 192.168.200.25 -P 3306 -o -B test -d /home/zhoujy/bak/  mydumper支持一张表多个线程以chunk的方式批量导出,参数-r:试图用行块来分割表,该参数关闭--chunk-filesize参数。如:
mydumper -u zjy -p xxx  -h 192.168.123.70 -P 3306 -t 5 -c -r 300000 -l 3600 -s 10000000 -B vs -o /home/zhoujy/vs/  表示每个线程用300000行块来分割表,通过show processlist 看到:5个线程备份
  这个可以更好的备份数据库,不管数据库里是否有大表。
  本文出自http://www.cnblogs.com/zhoujinyi/p/3423641.html



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619807-1-1.html 上篇帖子: mysql逻辑备份mydump 下篇帖子: MySQL逻辑备份利器-mydumper
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表