mysql备份之mydumper工具使用详解

4.2.4 myduper工具

mysql自带的mysqldump是一个只能支持单线程的工具,只能逐个导出表,而mydumper是一个针对mysql和drizzle的高性能多线程的备份工具,备份速度远远高于mysqldump,也是逻辑备份,数据还原时候使用myloader工具。

  1. 多线程备份

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

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

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

    5. 支持文件压缩

    6. 支持导出binlog

    7. 支持多线程恢复

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

    9. 支持将备份文件切块

     

    安装软件开始。。。。。。。。。。。。。。。

    1. 安装mydumper
    2. 链接:https://launchpad.net/mydumper/+download,或者执行git clone https://github.com/maxbube/mydumper,这里需要安装git注意。或者执行wget https://launchpadlibrarian.net/225370879/mydumper-0.9.1.tar.gz
    3. 把下载好的包传到/usr/local/目录下
    4. 准备cmke工具和安装依赖包

      Yum install cmke*

      Yum install glib2-devel mysql-devel zlib-devel prce-devel openssl-devel

       

      一般来说装上面的依赖就足够的,在解压包目录下有readme文档里面也说明要装以上依赖。

    发现有一个包没有是pcre-devel,说明需要去额外安装一下yum源了

    一般如下操作即可

     

     

     

    题外部分。。。。。。。。依赖都装好这部分可不看

     

    下载阿里云源weget -O/etc/yum.repos.d/CentOS-Base-epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    清理缓存

    yum clean all

    重新生成缓存    

    yum makecache

    升级yum源

    yum uptade

     

    下载网易源

    wget -P /etc/yum.repos.d http://mirrors.163.com/.help/CentOS7-Base-163.repo

    清理缓存

    yum clean all

    重新生成缓存

    yum makecache

    升级yum源

    yum uptade

     

    下载网易源

    wget -P /etc/yum.repos.d http://mirrors.163.com/.help/CentOS7-Base-163.repo

    清理缓存

    yum clean all

    重新生成缓存

    yum makecache

    升级yum源

    yum uptade

     

    如果都不行就要去下载包https://vault.centos.org/7.6.1810/os/x86_64/Packages/

     

    放到想要的目录下执行以下命令

    rpm -Uvh ./*.rpm --nodeps --force

    下图使用第三种方式

     

    依赖赖都装好了就开始装软件了。

     

     

    正题部分。。。。。。。。。。

    我放在/usr/local/下面执行解压如图所示

    进入解压目录

    执行cmake .

    make &&make install

     

    不出所料的话是成功安装,但是在执行myduper --help的时候会出现如图问题

    报错说明找不到这个共享库。

     

    按照以下操作。

    可以看到上面有个报错,就是共享库找不到。那就去找。

    按照它给出的共享库并拷贝到库目录下

    发现命令可以正常使用了。

     

    命令参数说明

    -B, --database 需要备份的库

    -T, --tables-list 需要备份的表,用逗号分隔

    -o, --outputdir 输出文件的目录

    -s, --statement-size 生成插入语句的字节数, 默认 1000000

    -r, --rows 分裂成很多行块表

    -c, --compress 压缩输出文件

    -e, --build-empty-files 即使表没有数据,还是产生一个空文件

    -x, --regex 正则表达式: 'db.table'

    -i, --ignore-engines 忽略的存储引擎,用逗号分隔

    -m, --no-schemas 不导出表结构

    -k, --no-locks 不执行共享读锁 警告:这将导致不一致的备份

    -l, --long-query-guard 设置长查询时间,默认60秒

    --kill-long-queries kill掉长时间执行的查询

    -b, --binlogs 导出binlog

    -D, --daemon 启用守护进程模式

    -I, --snapshot-interval dump快照间隔时间,默认60s,需要在daemon模式下

    -L, --logfile 日志文件

    -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

     

    mydumper的工作过程

    a、连接目标数据库;

    b、通过show processlist来判断是否有长查询,根据参数long-query-guard和kill-long-queries决定退出或杀掉长查询;

    c、锁定myisam表,flush tables with read lock;针对innodb table开启事务,start transaction;

    d、创建worker子线程,缺省为4个;

    e、确定候选表,根据类别分别插入innodb_table,non_innodb_table以及table_schemas链表(表结构);

    f、将候选表通过g_async_queue_push加入任务队列(队列最后元素是thread shutdown),由worker子线程从队列中读取表信息并执行数据导出

    g、执行unlock tables,处理完myisam表后立即解锁,以减少锁定时间;

    h、等待worker退出;

     

    备份文件相关信息

    a、所有的备份文件在一个目录中,未指定时为当前目录, 且自动生成备份日期时间文件夹,如export-20150703-145806

    b、目录中包含一个 metadata 文件,该文件记录了备份时间点的二进制日志文件名,日志的写入位置

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

    d、每个表有两个备份文件:database.table-schema.sql 表结构文件,database.table.sql 表数据文件

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

     

    #还原test库,先模拟事故。

    #恢复,发现test数据库回来了,查看表也是完整的。

    #备份单个表

    # mydumper -u root -p 123456 -B test -T L -o /data/backup/

    #还原L表,为了体验还原的效果先把表里的数据删除,在生产中注意备份。

    #恢复表数据,会发现表数据已经恢复。如下

    #myloader -u root -p 123456 -B test -o L -d /data/backup/

    #备份多个表

    # mydumper -u root -p 123456 -B test -T test,L -o /data/backup/

    #恢复表数据,同样删除表或者删除表数据,表如果删掉了可能需要建立一个空表恢复,看到表数据被删了。

    #恢复表数据。

    # myloader -u root -p 123456 -B test -o test,L -d /data/backup/

     

    #备份表L的数据,不备份表结构

    #mydumper -u root -p 123456 -B test -T L -m -o /data/backup/

    #备份test库下的表L,并且进行压缩:

    #mydumper -u root -p 123456 -B test -T L -c -o /data/backup/

     

     

    #mysqldump和mydumper的速度对比

    #备份时间对比

    先使用mysqldump进行全库备份,发现大概用了0.192s

    #time mysqldump --set-gtid-purged=off --single-transaction -uroot -p123456 -A >all.sql

    再使用mydumper全库备份,发现用了0.157s,因为数据量不够大,所以看起来和mysqldump差距不太大,但是在大数据量的情况下,差距是很明显的。

     

    #time mydumper -u root -p 123456 -o /data/backup/

     

    #测试恢复时间对比

    首先用mysql恢复test,时间消耗为0.67s

    再用myloader恢复test库,时间的消耗为0.62s

    #如果数据量更大一点会比较明显,不过也看得出mydumper的备份和恢复都比musqldump快。

     

     

    5、常用备份示例:

    ###备份单个库

    # mydumper -u leshami -p pwd -B sakila -o /tmp/bak

     

    ###备份所有数据库,全库备份期间除了information_schema与performance_schema之外的库都会被备份

    # mydumper -u leshami -p pwd -o /tmp/bak

     

    ###备份单表

    # mydumper -u leshami -p pwd -B sakila -T actor -o /tmp/bak

     

    ###备份多表

    # mydumper -u leshami -p pwd -B sakila -T actor,city -o /tmp/bak

     

    ###当前目录自动生成备份日期时间文件夹,不指定-o参数及值时,如文件夹为:export-20150703-145806

    mydumper -u leshami -p pwd -B sakila -T actor

     

    ###不带表结构备份表

    # mydumper -u leshami -p pwd -B sakila -T actor -m

     

    ###压缩备份及连接使用压缩协议(非本地备份时)

    # mydumper -u leshami -p pwd -B sakila -o /tmp/bak -c -C

     

    ###备份特定表

    # mydumper -u leshami -p pwd -B sakila --regex=actor* -o /tmp/bak

     

    ###过滤特定库,如本来不备份mysql及test库

    # mydumper -u leshami -p pwd -B sakila --regex '^(?!(mysql|test))' -o /tmp/bak

     

    ###基于空表产生表结构文件

    # mydumper -u leshami -p pwd -B sakila -T actor -e -o /tmp/bak

     

    ##设置长查询的上限,如果存在比这个还长的查询则退出mydumper,也可以设置杀掉这个长查询

    #mydumper -u leshami -p pwd -B sakila --long-query-guard 200 --kill-long-queries

     

    ###备份时输出详细日志

    # mydumper -u leshami -p pwd -B sakila -T actor -v 3 -o /tmp/bak

     

    ###导出binlog,使用-b参数,会自动在导出目录生成binlog_snapshot文件夹及binlog

    # mydumper -u leshami -p pwd -P 3306 -b -o /tmp/bak

posted @ 2021-11-26 17:59  头发重要  阅读(1457)  评论(0编辑  收藏  举报