乐趣区

关于mysql:MySQL备份迁移之mydumper

简介

mydumper 是一款开源的 MySQL 逻辑备份工具,次要由 C 语言编写。与 MySQL 自带的 mysqldump 相似,然而 mydumper 更快更高效。
mydumper 的一些长处个性:
s

  • 轻量级 C 语言开发
  • 反对多线程备份数据,备份后按表生成多个备份文件
  • 反对事务性和非事务性表一致性备份
  • 反对将导出的文件压缩,节约空间
  • 反对多线程复原
  • 反对已守护过程模式工作,定时快照和间断二进制日志
  • 反对按指定大小将备份文件切割
  • 数据与建表语句拆散

下载安装

装置形式十分多,以下介绍几种常见的形式。

  • Ubuntu 中自带了 myloader

    sudo apt-get install mydumper

  • 应用 deb 包装置,以 Ubuntu 为例

    apt-get install libatomic1
    wget https://github.com/mydumper/m…$(lsb_release -cs)_amd64.deb dpkg -i mydumper_0.11.5-1.$(lsb_release -cs)_amd64.deb

  • 编译装置
  • docker 装置

依据理论平台状况,可抉择不同的装置形式,官网也提供了一些常见的装置文档,https://github.com/mydumper/mydumper

参数阐明

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            不备份表构造
-d, --no-data               不备份表数据
-G, --triggers              备份触发器
-E, --events                备份事件
-R, --routines              备份存储过程和函数
-W, --no-views              不备份视图
--where                     只导出符合条件的数据
-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                    跨时区时应用的选项。容许备份 timestamp, 这样会导致不同时区的备份还原出问题,默认敞开。--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                    还原到的数据库(指标库)-s, --source-db                   被还原的数据库(源数据库),-s db1 -B db2,示意源库中的 db1 数据库,导入到 db2 数据库中。-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 

罕用案例

mydumper 导出示例

# 集体理论中最罕用的备份语句
mydumper -B test -o /home/mydumper/data/test -e -G -R -E -D -u root -p 123456 -h 192.168.0.191 -P 3306 -v 3 --long-query-guard 288000 --skip-tz-utc --no-locks --logfile /home/mydumper/log/test

# 备份全副数据库 
mydumper -u root -p 123456 -o /home/mydumper/data/all/

# 备份全副数据库,排除零碎库,mydumper -u root -p 123456 --regex '^(?!(mysql|sys|performance_schema|information_schema))' -o /home/mydumper/data/all/

# 备份全副数据库,蕴含触发器、事件、存储过程及函数
mydumper -u root -p 123456 -G -R -E -o /home/mydumper/data/all/

# 备份指定库
mydumper -u root -p 123456 -G -R -E -B db1 -o /home/mydumper/data/db1

# 备份指定表
mydumper -u root -p 123456 -B db1 -T tb1,tb2 -o /home/mydumper/data/db1

# 只备份表构造
mydumper -u root -p 123456 -B db1 -d -o /home/mydumper/data/db1

# 只备份表数据
mydumper -u root -p 123456 -B db1 -m -o /home/mydumper/data/db1

myloader 导入案例

# 集体理论中最罕用的导入语句
myloader -h 192.168.0.192 -P 33306 -u root -p 123456 -t 1 -v 3 -d /home/mydumper/data/test/0/ -B test

# 从备份中复原指定库
myloader -u root -p 123456 -s db1 -o -d /home/mydumper/data/all/0/

# 导入时开启 binlog
myloader -u root -p 123456 -e -o -d /home/mydumper/data/db1/0/

# 将源库的 db1 导入到备库的 db1_bak 库中
myloader -u root -p 123456 -B db1_bak -s db1 -o -d /home/mydumper/data/db1/0/

# 导入特定的某几张表
## 先将 metadata 文件和须要独自导入的表的构造文件和数据文件导入到独自的文件夹中。此处默认库已建好,否则还须要复制建库相干语句。cp /home/mydumper/data/db1/0/metadata /backup/db1/0/
cp /home/mydumper/data/db1/0/d1.t1-schema.sql /backup/db1/0/
cp /home/mydumper/data/db1/0/d1.t1.sql /backup/db1/0/
## 从新文件夹中导入数据
myloader -u root -p 123456 -B db1 -d /backup/db1/0/
## 以上就能够独自导入 db1.t1 表

对于 -e 参数,须要略微留神下。默认状况下,myloader 是不开启 binlog 的,这样能够进步导入速度。如果导入实例有从库,且须要导入的后果同步到从库上,则须要应用 -e 关上 binlog 记录。

导出之后的目录如下,以数据库 d1,其中有表 t1 为例:

-d1
 -0
   metadata             记录备份工夫点的 Binlog 信息,日志文件名和写入地位
   d1-schema-create.sql 建库语句
   d1-schema-post.sql   存储过程,函数,事件创立语句
   d1.t1-schema.sql     表构造文件
   d1.t1.sql            表数据文件,若应用了分块参数,大表的数据文件会呈现多个,以数字离开。-1

以上为比拟常见的导出后的目录构造,依据理论状况不同,可能还有会含有触发器的文件,含有视图的文件等。

常见问题与实践经验

  • Error switching to database whilst restoring table

    应用 myloader 导入时会呈现这类报错,能够尝试的解决办法如下:调大 wait_timeout 参数;调大 max_packet_size 参数;应用一个线程导入,-t 1。

  • (myloader:35671): CRITICAL **: Error restoring test.email_logger from file test.email_logger.sql: Cannot create a JSON value from a string with CHARACTER SET ‘binary’.

    MySQL 的一个 Bug,能够尝试手动批改对应的备份文件,将

    /!40101 SET NAMES binary/;

    批改为:

    /!40101 SET NAMES utf8mb4/;

  • (myloader:34726): CRITICAL **: Error restoring test.(null) from file test-schema-post.sql: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

    在导入 AWS RDS 时局部存储过程创立失败,有比拟严格的权限限度,须要导入用户有 SUPER 权限,然而 AWS RDS 用户无奈授予 SUPER 权限。针对这部分存储过程,能够思考手动在备份库上创立。

  • 大表导出优化

    应用 -r-F 参数,对导出的数据文件进行分片。

  • 备份机器配置尽可能高

    备份前先预估大小,防止机器磁盘有余。尽可能选用配置较高的机器,放慢备份速度。

  • 非必要数据不备份

    备份前对于不必备份的数据能够提前进行一次删除,也可在导出数据时增加正则参数等过滤局部表

  • 备份尽量不跨网络

    备份数据时尽量在内网中进行,若须要将数据迁徙到外网,能够备份完之后,将备份文件拷贝到外网服务器上,尽量减少导出时网络不稳固的烦扰。导入时同理。

  • 放慢导入速度的一些办法

    抉择适合的线程数,依据理论状况和机器配置,抉择适合的线程参数,并非线程数越多越快。
    导入时敞开 MySQL 的 binlog 写入,待导入实现后再开启。
    在内网或较稳固的环境中进行导入。

原理与架构

mydumper 工作流程


次要步骤概括

  • 主线程 FLUSH TABLES WITH READ LOCK,施加全局只读锁,阻止 DML 语句写入,保证数据的一致性。
  • 读取以后工夫点的二进制日志文件名和日志写入的地位并记录在 metadata 文件中。
  • N 个 dump 线程 START TRANSACTION WITH CONSISTENT SNAPSHOT,开启读统一的事务。
  • dump non-InnoDB tables,首先导出非事务引擎的表。
  • 主线程 UNLOCK TABLES 非事务引擎备份完后,开释全局只读锁。
  • dump InnoDB tables,基于事务导出 InnoDB 表。
  • 事务完结。

myloader 工作原理


更多技术文章,请关注我的集体博客 www.immaxfang.com 和小公众号 Max 的学习札记

退出移动版