【mydumper介绍】
mydumper是一个针对 MySQL 和 Drizzle 的高性能多线程备份和恢复工具。此工具的开发人员分别来自 MySQL、Facebook、SkySQL公司,目前已经有一些大型产品业务测试并使用了该工具。我们在恢复数据 时也可以使用myloader工具
【mydumper特性】
1、采用轻量级C语言写的代码
2、相比于mysqldump,其速度快了近10倍
3、具有事务性和非事务性表一致的快照(适用于0.2.2+)
4、可快速进行文件压缩
5、支持导出binlog
6、可多线程恢复(适用于0.2.1+)
可以用守护进程的工作方式,定时扫描和输出连续的二进制日志
【mydumper参数】
注:标红的为必须掌握参数
-h:连接的MySQL服务器
-u:用户备份的连接用户
-c:压缩导出的文件
-p:用户的密码
-P:连接端口
-S:连接socket文件
-B:指定导出的数据库名,不加该参数,默认将执行的mysql实例下的所有数据库全部导出
-T:需要备份的表,用逗号(,)分隔
-o: 输出的目录
-t: 要使用的并发线程数,默认为4,需要综合存储IO性能等因素确定具体值
-V:查看版本
-v:详细级别输出 0 = 沉默, 1 = 错误, 2 = 警告, 3 = 信息,默认是2
-e: 默认无数据则只有表结构文件,加了-e则有表数据文件。但是表数据文件仍然为空
-x:支持正则表达式,如 mydumper -regx '^(?!(mysql|test))'
-i:忽略的存储引擎,用逗号(,)分隔
-m:不导出表结构和库结构,只导表数据,甚用
-d: 不导出表数据,只导表结构和库结构
-long-query-quard:长查询,默认60秒
-k:kill杀了长时间运行的查询
-b:导出binlog
-D:启用守护进程模式
-I:dump快照间隔,默认60s
-L:mysqldumper的日志输出,一般在Daemon模式下使用
【mydumper安装方法】
yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel gcc gcc-c++
wget -c https://launchpad.net/ubuntu/+archive/primary/+files/mydumper_0.9.1.orig.tar.gz
tar xzvf mydumper_0.9.1.orig.tar.gz
cd mydumper-0.9.1/
cmake .
make
make install
【mydumper效率测试】
mysqldump 与 mydumper 的执行时间的对比
[root@localhost mysql]# du -sh test
20M test
可看到一共有20兆数据
mysqldump执行的时间情况:
[root@localhost opt]# time mysqldump -uroot -pxxx -B test > test.sql
real 0m0.671s
user 0m0.382s
sys 0m0.033s
mydumper执行的时间情况:
[root@localhost backup]# time mydumper -u root -p wsyht -B test -o /data/backup/
real 0m0.480s
user 0m0.233s
sys 0m0.028s
总结:mydumper的速度是远远比mysqldump的速度快的多的
【mydumer导出实战】
1、导出所有库
不加 -B 会导出所有库,不加 -o 会在当前目录下以当前日期时间命名创建一个目录,如下:
[root@localhost backup]# mydumper -u root -p wsyht #不指定参数进行全备
[root@localhost backup]# ls
export-20160619-192629 #自已创建的备份目录
一般不用全备就用-B参数指定库名,不想他自已在当前路径创建备份目录就用-o指定他备份的路径
2、压缩导出
说明:
-c 压缩参数
压缩导出后,后辍名会变成.sql.gz
[root@localhost backup]# mydumper -u root -p wsyht -B test -c -o /data/backup/
[root@localhost backup]# ls
metadata test-schema-create.sql.gz test.t1-schema.sql.gz test.t1.sql.gz
3、不压缩备份
导出来的文件则是.sql
[root@localhost backup]# mydumper -u root -p wsyht -B test -o /data/backup/
metadata test-schema-create.sql test.t1-schema.sql test.t1.sql
注意!注意!注意!重要事情说三篇。在终端输入命令备份数据的时候,参数 跟 后面的值
一定要以空格分隔,否则会报如下错误
[root@localhost ~]# mydumper -h 127.0.0.1 -uroot -p 'wsyht' -B test -o /data/backup/
option parsing failed: Error parsing option -r, try --help
上面报错就是因为-u 没有跟 root 以空格分隔,而是黏在一起写,所以报错
【mydumper导出的文件介绍】
在导出文件的时候,可以看到生成了四个文件,下面我们来逐一介绍:
metadata:这个文件指定了你从开始备份文件到结束备份文件的时间
test.t1-schema-create.sql: 这个文件是备份创建库的sql语句
test.t1-schema.sql:这个文件是备份创建表的sql语句
test.t1.sql 这个文件是备份插入表数据的sql语句
【myloader参数】
注:标红的为必须掌握参数
-d: 指定恢复备份的目录,该目录必须是mydumper生成的,myloader会判断该目录是否存在metadata文件
-h:连接的MySQL服务器
-u:用户备份的连接用户
-C:导入压缩份备出来的文件
-p:用户的密码
-P:连接端口
-S:连接socket文件
-B:指定恢复的数据库名
-o: 表存在则会删除
-t: 要使用的并发线程数,默认为4,需要综合存储IO性能等因素确定具体值
-V:查看版本
-v:详细级别输出 0 = 沉默, 1 = 错误, 2 = 警告, 3 = 信息,默认是2
-s: 该参数为myloader新增参数,用于恢复备份目录中指定的数据库
-e:启用恢复数据的二进制日志
-q: 表示在工作线程导入表数据时,多少条记录做一次提交,默认为1000
【myloader导入实战】
1、恢复所有库
说明,不加-B指定要导的库,默认导入当初备份出来的那个库
这里之前备份的是test库,则导进库的时候会创建一个test库
如果是所有库,原理一样,自动创建所有库,因为备份时,库语句也备份了
[root@localhost test]# mysql -uroot -pwsyht -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
[root@localhost test]# myloader -u root -p wsyht -d /data/backup/test/
[root@localhost test]# mysql -uroot -pwsyht -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
2、恢复到新库
说明:
无论库存在与否都可以直接导
如果-B指定需要导入的库不存在,他也会先帮你创建,无需你再手动创建,非常方便
[root@localhost test]# mysql -uroot -pwsyht -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
[root@localhost test]# myloader -u root -p wsyht -B wsyht -d /data/backup/test/
[root@localhost test]# mysql -uroot -pwsyht -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| wsyht |
+--------------------+
3、恢复到原库
说明:
即恢复到已创建好的库和表中,如果已存在了表,则必须加-o参数
[root@localhost test]# mysql -uroot -pwsyht -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| wsyht |
+--------------------+
[root@localhost test]# myloader -u root -p wsyht -B test -d /data/backup/test/
** (myloader:20499): CRITICAL **: Error restoring test.t1 from file test.t1- schema.sql.gz: Table 't1' already exists
上面说我表已经存在,则加-o参数自动删除已存在的表再导进
[root@localhost test]# myloader -u root -p wsyht -B test -o -d /data/backup/test/
4、恢复指定目录的库
说明:
即一个目录备份了多个库,我不想恢复这个目录下的所有库,只想恢复这个目录下的一个库
则需要加-s参数指定要恢复那个目录下的哪个库
[root@localhost test]# ls
metadata mysql.plugin-schema.sql.gz
mysql.columns_priv-schema.sql.gz mysql.proc-schema.sql.gz
mysql.db-schema.sql.gz mysql.procs_priv-schema.sql.gz
mysql.db.sql.gz mysql-schema-create.sql.gz
mysql.event-schema.sql.gz mysql.servers-schema.sql.gz
mysql.func-schema.sql.gz mysql.tables_priv-schema.sql.gz
mysql.help_category-schema.sql.gz mysql.time_zone_leap_second-schema.sql.gz
mysql.help_category.sql.gz mysql.time_zone_name-schema.sql.gz
mysql.help_keyword-schema.sql.gz mysql.time_zone-schema.sql.gz
mysql.help_keyword.sql.gz mysql.time_zone_transition-schema.sql.gz
mysql.help_relation-schema.sql.gz mysql.time_zone_transition_type-schema.sql.gz
mysql.help_relation.sql.gz mysql.user-schema.sql.gz
mysql.help_topic-schema.sql.gz mysql.user.sql.gz
mysql.help_topic.sql.gz test-schema-create.sql.gz
mysql.host-schema.sql.gz test.t1-schema.sql.gz
mysql.ndb_binlog_index-schema.sql.gz test.t1.sql.gz
可看到上面有两种不同颜色的压缩包,即存了两个库在这个目录下
[root@localhost test]# myloader -u root -p wsyht -B auth -s mysql -d /data/backup/test/
[root@localhost test]# mysql -uroot -pwsyht -e"show databases;" +--------------------+
| Database |
+--------------------+
| information_schema |
| auth |
| mysql |
| test |
+--------------------+
[root@localhost test]# mysql -uroot -pwsyht -e"use auth;show tables;"
+---------------------------+
| Tables_in_auth |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| servers |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
可看到上面已经把备份的库导进新库auth里面
注:如果上面不加 -s 参数指定需要导入该目录的哪个库,则会两个库都导进auth库
如果 -s 和 -B 两个参数都不加,则会默认导入之前原来导出的那个库
则从test库导出来的库,会再导进test库,从mysql库导出来的会再导进mysql库
最后再啰嗦两句,总结一下:
库存在,导进没影响,库不存在,也不需要事先创建,因为当时备份库的时候也一起把建库 语句也备份了,更方便的和神奇是,你加-B参数随便起一个库名,导数据的时候,他也可以帮你 建好该库,然后导数据,但如果表存在的话,则需加-o参数,他会帮自已帮你删了表然后再继续 导,而不需要我们手动去删库删表再导,而且使用多线程导入速度杠杠的,是不是觉得减轻了我 们许多工作,并且提高了我们运维不少的工作效率,哈哈!!!