安装
首先去官网https://launchpad.net/mydumper下载对应的版本
rpm -qa|grep 检测下面的包是否有未安装的
glib2-devel zlib-devel pcre-devel openssl-devel cmake
有没安装的用yun -y install 安装
解压压缩包:tar -zxvf mydumper-0.9.1.tar.gz
然后继续安装
cd mydumper-0.9.1
cmake .
make
make install
至此安装完成
进入到 cd /usr/local/bin目录
mydumper --help
这时候出现报错
mydumper: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory
表面看缺少依赖
确定检查:
这时候能清晰看到这个包没有,知道问题,接下来的处理方式就简单了
找到对应的包:find / -name libmysqlclient.so.20
然后拷贝一份 cp /home/it_tool/mysql/lib/libmysqlclient.so.20 /usr/lib/libmysqlclient.so.20
ldconfig
这样就可以解决了
使用
mydumper:多线程备份工具
文件介绍:其生成文件夹一共有四个文件
- metadata 日志文件
- db_name-schema-create.sql 建库文件
- db_name.tb_name-schema.sql 建表文件
- db_name.tb_name.sql 数据文件
基础备份:mydumper -u root -p *** -B dumper_test -o /home/backup/
基础恢复:myloader -u root -p *** -d /home/backup
mydumper参数详解:
-B, --database 要备份的数据库,不指定则备份所有库
-T, --tables-list 需要备份的表,多表用逗号隔开
-o, --outputdir 备份文件输出的目录
-s, --statement-size 生成的 insert 语句的字节数,默认 1000000(这个参数不能太小,不然会报 Row bigger than statement_size for tools.t_serverinfo)
-r, --rows 将表按行分块时,指定的块行数,指定这个选项会关闭 --chunk-filesize
-F, --chunk-filesize 将表按大小分块时,指定的块大小,单位是 MB
-c, --compress 压缩输出文件(压缩级别为1-9,可以不指定,也可以指定)
-e, --build-empty-files 如果表数据是空,还是产生一个空文件(默认无数据则只有表结构文件)
-x, --regex 支持正则表达式匹配'db.table',如mydumper –regex '^(?!(mysql|test))'
-i, --ignore-engines 忽略的存储引擎,用逗号分割
-m, --no-schemas 不备份表结构
-d, --no-data 不备份表数据
-G, --triggers 备份触发器
-E, --events 备份事件
-R, --routines 备份存储过程和函数
-k, --no-locks 不使用临时共享只读锁,使用这个选项会造成数据不一致
--less-locking 减少对 InnoDB 表的锁定时间
-l, --long-query-guard 设定阻塞备份的长查询超时时间,单位是秒,默认是60秒(超时后默认mydumper将会退出)
-K, --kill-long-queries 杀掉长查询 (而不是退出 mydumper)
-D, --daemon 启用守护进程模式,守护进程模式以某个间隔不间断对数据库进行备份
-I, --snapshot-interval 每个备份快照之间的间隔(以分钟为单位),需要 --daemon 选项,默认为 60
-L, --logfile 使用的日志文件名(mydumper所产生的日志), 默认使用标准输出
--tz-utc 设置时区,只有备份应用到不同时区时使用。默认使用 --skip-tz-utc 来关闭该选项
--skip-tz-utc 见上
--use-savepoints 使用 savepoints 来减少采集 metadata 所造成的锁时间,需要 SUPER 权限
--success-on-1146 不增加错误计数,如果表不存在,则警告而不是严重
--lock-all-tables 锁住实例上所有表,而不是给实例施加 FTWRL
-U, --updated-since 使用 update_time 来备份最近 U 天内有过更新记录的表
--trx-consistency-only Transactional consistency only
-h, --host 连接的主机名
-u, --user 备份所使用的用户
-p, --password 密码(不支持交互式输入密码)
-P, --port 端口
-S, --socket 使用 socket 方式备份实例(使用不成功,暂时只成功的使用了基于 host 的方式备份)
-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 需要还原的数据库
-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 -h 127.0.0.1 -P 3307 -u mydumper_test -p mydumper_123 -B pt_test -o /home/backup/pt_test
打开通用日志,可以看到备份的基本操作
(注:这里的多个Connect代表了开启多个线程)
1.这里可以看到备份账号是先查看线程是否有DDL操作,如果没有则加全局锁(注:加全局锁需要账号有reload权限,否则默认会警告加锁失败,这时候就无法保证数据一致性)
2.开始事务
3.检查主从信息,获取当前数据库的状态信息,就是数据库当前正在使用的二进制日志及当前执行二进制日志位置,执行了哪些GTID,设置一些session级别的配置项,如隔离级别等
4.查看表状态,建库语句,表数据,建表语句
5.解除全局锁
特别参数:
--no-locks(可以通过当前时间的备份加上备份开始时间之后的二进制日志来做备份恢复,极特别情况会出现数据不一致)
mydumper --no-locks -h 127.0.0.1 -P 3307 -u mydumper_test -p mydumper_123 -B pt_test -o /home/backup/pt_test
** (mydumper:10719): WARNING **: 15:19:47.371: Executing in no-locks mode, snapshot will notbe consistent
加上--no-lock之后查看通用日志可以发现不加全局锁了
--less-locking
mydumper --less-locking -h 127.0.0.1 -P 3307 -u mydumper_test -p mydumper_123 -B pt_test -o /home/backup/pt_test
查看通用日志,可以发现与没加参数时接触锁定的时间要早,具体原因还没有研究明白,后续补充