mydumper工作原理

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 相比mysqldump,其优势如下: 1 速度快(好多资料都说快10倍,个人持保留意见); 2 支持多线程导出和导入myloader; 3 采用守护进程方式运行,可定时扫描和快照binlog(-snapshot-interval); 4 快速文件压缩;   也有稍许不足之处,如mydumper不处理MySQL的视图,触发器和存储过程,因此使用mydumper去导出schema并不可靠。

相比mysqldump,其优势如下:

1 速度快(好多资料都说快10倍,个人持保留意见);

2 支持多线程导出和导入myloader;

3 采用守护进程方式运行,可定时扫描和快照binlog(-snapshot-interval);

4 快速文件压缩;

 

也有稍许不足之处,如mydumper不处理MySQL的视图,触发器和存储过程,因此使用mydumper去导出schema并不可靠。

实际生产环境中,建议mydumper仅用于导出数据(使用 --no-schemas ),而通过mysqldump来导出schema。

 

mydumper除了为每个表会分别生成table.sql和table-schema.sql,还会生成一个.metadata文件,记录dump的开始和结束时间,以及binlog位置信息。

 

 

参数

-long-query-guard:长查询上限(默认60s),如果当前数据库存在运行时间大于此参数的查询则退出mydumper;

-kill-long-queries:杀死查出的长查询;

-daemon:启用守护进程模式;

-snapshot-interval:快照时间间隔,默认60s;

-t, --threads 使用的线程数,默认4

-C, --compress-protocol 在mysql连接上使用压缩

-e, --enable-binlog 启用二进制恢复数据

-r, --rows 将表分成多个文件批次导出,

  1 确定表的行数,依据pk – uk – cardinality最高的索引(show index from table)选择索引,通过explain select index from table的rows字段确定行数;

  2 已经total_rows和rows将表分成若干分块,每个分块可由不同worker并行执行,适用于大表;

 

 

安装

1 安装cmake,apt-get install cmake;

2 安装兼容包,如apt-get install libglib2.0-dev libmysqlclient15-dev,具体参照官网;

3 下载安装包并编译

#wget http://launchpad.net/mydumper/0.2/0.2.3/+download/mydumper-0.2.3.tar.gz

#tar xzvf mydumper-0.2.3.tar.gz

#cd mydumper-0.2.3/

#cmake .

#make

#make install

 

 

原理

Mysqldump是个单线程工具,只能逐个导出表,而mydumper支持多线程并行导出;

尽管mydumper主线程已经登录进入了mysql,但worker子线程必须再登录一次,因为libmysql是线程不安全的?

 

 

工作流程

1  连接目标数据库;

2  通过show processlist来判断是否有长查询,如果有长查询则退出dump(通过-long-query-guard指定),或者使用-kill-long-queries杀掉长查询;

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

4  创建worker子线程;

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

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

for(;;) {

    ....

    job=(struct job *)g_async_queue_pop(conf->queue);

    ....

    switch (job->type) {

        case JOB_DUMP:

            ....

            dump_table_data_file(thrconn, tj->database, tj->table, tj->where, tj->filename);

            ....

        case JOB_DUMP_NON_INNODB:

            ....

            dump_table_data_file(thrconn, tj->database, tj->table, tj->where, tj->filename);

        case JOB_SCHEMA:

            ....

            dump_schema_data(thrconn, sj->database, sj->table, sj->filename);

 

}

当worker读取到job_shutdown任务时,则会执行如下

case JOB_SHUTDOWN:

    g_message("Thread %d shutting down", td->thread_id);

    if (thrconn)

        mysql_close(thrconn);

    g_free(job);

    mysql_thread_end();

    return NULL;

    break;

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

Main_thread:记录myisam数量

for (non_innodb_table= g_list_first(non_innodb_table); non_innodb_table; non_innodb_table= g_list_next(non_innodb_table)) {

        dbt= (struct db_table*) non_innodb_table->data;

        dump_table(conn, dbt->database, dbt->table, &conf, FALSE);

        g_atomic_int_inc(&non_innodb_table_counter);

}

 

child_thread:当队列中myisam为0时,加入unlock_tables任务

if (g_atomic_int_dec_and_test(&non_innodb_table_counter) && g_atomic_int_get(&non_innodb_done)) {

        g_async_queue_push(conf->unlock_tables, GINT_TO_POINTER(1));

}

 

main_thread:主线程读取unlock_tables任务并执行

g_async_queue_pop(conf.unlock_tables);

g_message("Non-InnoDB dump complete, unlocking tables");

mysql_query(conn, "UNLOCK TABLES");

8  等待worker退出;

 

 

Myloader将数据导入数据库,原理与mydumper类似。

-queries-per-transaction

-directory

 

 

参考资料

http://www.hoterran.info/mydumper_usage

http://blogread.cn/it/article/4071

http://centminmod.com/mydumper.html

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10月前
|
SQL 机器学习/深度学习 存储
PostgreSQL逻辑备份pg_dump使用及其原理解析
PostgreSQL逻辑备份pg_dump使用及其原理解析
184 0
|
存储 SQL 缓存
简述 MySQL 体系结构
MySQL 虽然以简单著称,但其内部结构并不简单。
|
SQL 关系型数据库 MySQL
探索MySQL-Cluster奥秘系列之逻辑备份(13)
数据库的备份恢复一直是数据库工作中的重点内容,如何合理有效地进行数据库的备份,并且当数据库环境发生意外时,能够以最快的时间恢复数据,则是衡量一个DBA是否称职的非常重要的指标。接下来这一小节,我们就来重点看下如何对MySQL-Cluster环境进行逻辑备份。
164 0
|
存储 关系型数据库 MySQL
探索MySQL-Cluster奥秘系列之物理备份(14)
上一小节,我们学习了如何对于MySQL-Cluster集群环境进行逻辑备份,在这一小节中,我们则来看看如何进行物理备份,其实对于逻辑备份和物理备份而言,这两种备份方式都很重要,但是在实际的工作环境中,由于我们接触的环境数据量都比较大,所以使用物理备份更为合适些。
112 0
|
存储 关系型数据库 MySQL
mydumper备份工具介绍与使用
前面文章有介绍过 MySQL 系统自带的 mysqldump 备份工具的使用,其实还有一个开源工具 mydumper 同样适用于 MySQL 的逻辑备份。之前一直没有正式体验过,只是听说比 mysqldump 要快很多,具体使用效果如何, 一起来看下吧。
416 0
mongo中命令工作原理
1.db.runCommand命令 db.runCommand({OPTION:'COLLECTION_NAME'}) runCommand命令是mongo的执行命令,可以执行mongo的任何命令,其它命令比如Drop,Count命令则是runCommand的简写形式,runCommand命令执行完成后有详细的相应结果。
1068 0
|
SQL 关系型数据库 MySQL