目录

文/温国兵

一 引子


mysqldump 相信大家已经耳熟能详,相比 mysqldump,mydumper 具有如下优势:

  • 多线程
  • 高性能

仅凭多线程这一点就可以让你对 mydumper 爱不释手。mydumper 最新稳定版是 0.6.2,读者可以从这里下载到。本文讲解怎么编译安装 mydumper,以及怎么使用它。看完此文,相信大家会对 mydumper 有较全面的了解。

二 编译安装


$ yum install make cmake pcre-devel glib2-devel zlib-devel \
gcc gcc-c++ mysql-devel openssl-devel python-sphinx -y
$ tar -zxvf mydumper-0.6.2.tar.gz
$ cd mydumper-0.6.2
$ cmake .
$ make
$ make install

需要注意的是,如果出现像 StackOverFlow 中那样的问题,可以尝试把解压的目录删除,再次解压缩 *.tar.gz 文件即可。

三 使用以及详细讲解


为了测试的便利,我们创建一个目录,用于存放备份的文件。

$ mkdir /backdir
$ cd /backdir/

在备份之前,我已经在测试库中导入了测试数据。下面,逐个展示用法,以及进行相应的讲解。

导出 test 库的数据:

$ mydumper -h 127.0.0.1 -u root -p root --database test
$ ls
export-20150407-144226

-h、-u、-p 这几个参数大家都很熟悉了,跟 mysqldump 一样,这里也就不赘述了。导出的目录为 export-20150407-144226,很显然目录的命名规则是:export-阿拉伯数字表示的具体年月日-阿拉伯数字表示的具体时分秒,其中小时采用 24 小时制。该目录包含 Metadata 以及逻辑备份的 SQL 文件。SQL 文件包括两种,一种是 Schema 文件,命名规则是:数据库名.表名-schema.sql;另一种是数据文件,命名规则是:数据库名.表名.sql。打开备份的 SQL 文件,可以在 Schema 中见到 DDL 语句,在数据文件中看到具体的 INSERT 语句。

指定某个导出目录:

$ mydumper -h 127.0.0.1 -u root -p root --database test \
--outputdir=/backdir/export-20150407-144927
$ ll export-20150407-144927/

使用 --outputdir 参数指定导出目录后,生成的 Metadata 以及逻辑备份的 SQL 文件就保存在指定目录中。

只导出数据不导出表结构:

$ mydumper -h 127.0.0.1 -u root -p root --database test --no-schemas

实现此功能,需要指定 --no-schemas 参数,此时导出的文件中就没有 Schema 文件了。

如果表数据是空,还是产生一个空文件:

为了让测试效果更明星,我创建一个测试数据库,以及只创建一张空表。

mysql -uroot -proot
mysql> CREATE DATABASE robin;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE test
    -> (id INT(4) AUTO_INCREMENT PRIMARY KEY,
    -> name VARCHAR(20));
Query OK, 0 rows affected (0.07 sec)
$ mydumper -h 127.0.0.1 -u root -p root --build-empty-files
$ ls export-20150407-150217/robin.test*
export-20150407-150217/robin.test-schema.sql  export-20150407-150217/robin.test.sql

默认无数据则只有表结构文件,加上 --build-empty-files 参数后,即使是一张空表,仍然会创建一个文件。

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

$ mydumper -h 127.0.0.1 -u root -p root --long-query-guard 300 --kill-long-queries

实现此功能需要指定 --long-query-guard 参数,后面加上限值即可。同时,杀掉长查询,需要指定 --kill-long-queries 参数。

设置需要导出的列表 -–tables-list,需要设置数据库名字,逗号分割:

$ mydumper -h 127.0.0.1 -u root -p root --tables-list=test.mt_test,robin.test

注意,此参数需要加上数据库名字。执行完成后,在导出目录即可看到上述两张表的表结构以及数据。

通过 regex 设置正则表达式,需要设置数据库名字:

$ mydumper -h 127.0.0.1 -u root -p root --regex=test.mt_test

此功能跟上面的 –tables-list 类似。

把单表分成多个 chunks:

$ mydumper -h 127.0.0.1 -u root -p root --rows 2000

实现此功能,加上 --rows 参数。如果一张表的记录数超过设置的值,则这张表会拆分成多个 SQL 文件,命名规则如下:数据库名.表名.0000x.sql,x 从 0 开始。

过滤某个引擎的表:

$ mydumper -h 127.0.0.1 -u root -p root -B test --ignore-engines=innodb

加上 --ignore-engines 参数后,指定的存储引擎就会被过滤,亦即不导出指定存储引擎的表。

查看详细日志:

$ mydumper -h 127.0.0.1 -u root -p root -B test -v 3

加上 -v 参数即可查看日志,取值可以是 0、1、2、3,分别表示静默模式、只输出错误、只输出警告、详细信息,默认取值是 2。

指定导出线程数:

$ mydumper -h 127.0.0.1 -u root -p root -B test --threads 10

前面提到,mydumper 是多线程的。加上 --threads 参数后,可以指定线程数,如果导出的数据较多,建议指定此参数,并且设置一个合理的值。另外,加上此参数,明星导出速度快了很多,这就是多线程的优势。当然,多线程肯定会消耗更多的系统资源。

后台运行:

$ mydumper -h 127.0.0.1 -u root -p root -B test --daemon

加上 --daemon 参数即可实现后台执行导出命令。

压缩导出的 SQL 文件:

$ mydumper -h 127.0.0.1 -u root -p root -B test --compress

加上 --compress 即可实现压缩导出的 SQL 文件。可以看到压缩后的 SQL 文件以 .gz 结尾。我们可以使用 gunzip 命令来解压。具体用法是:gunzip –c filename.gz > filename

我们可以通过下面的测试看到,未经过压缩和经过压缩的导出目录差别很大:

$ du -sh export-20150407-151641/
11M export-20150407-151641/

$ du -sh export-20150407-151811/
1.8M    export-20150407-151811/

最后,更多参数可以通过 mydumper --help 获取。

Enjoy!

四 参考资料


–EOF–

版权声明:自由转载-非商用-非衍生-保持署名(创意共享4.0许可证)