工具:MySQL Data Dumper 备份/还原MySQL

2015年11月18日 | 分类: 【技术】

编译安装MySQL Data Dumper:

参考:http://blog.163.com/sz2273_pr/blog/static/41264296201251523422911/

MySQL自带的备份工具mysqldump只有单线程,碰到数据量比较大的时候备份窗口太久了,影响了其他脚本的运作时间和效率。MySQL Data Dumper是一个多线程备份工具,适时地解决了这个问题。

下载:https://github.com/maxbube/mydumper

先安装cmake,因为这个软件要用cmake编译。

参考:http://amon.org/cmake

再安装mydumper兼容包,根据官网文档,centos/redhat等其他系统需要的包名是不同的,可根据实际系统去查阅官网资料:

参考:https://answers.launchpad.net/mydumper/+faq/349

yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel

最新版本:mydumper-0.9.1.tar.gz (2015-11-06)

wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz
tar xzvf mydumper-0.9.1.tar.gz && cd mydumper-0.9.1
cmake .
make && make install

使用方法:

以下备份脚本只启用了8线程备份,可自行根据实际情况适当增减:

mydumper --kill-long-queries -u root -B dbname -T db-tables-name -p 'password' -v 2 -c -t 8 --outputdir=/home/backup/20120615/

下面是各项常用参数解释:

–host, -h 连接的mysql服务器
–user, -u 用户备份的连接用户
–password, -p
–port, -P 连接端口
–socket, -S 连接socket文件
–database, -B 需要备份的数据库
–table-list, -T 需要备份的表,用,分隔
–outputdir, -o 输出的目录
–build-empty-files ,-e 如果表数据是空,还是产生一个空文件,默认无数据则只有表结构文件
–regex, -x 支持正则表达式,如mydumper –regex ’^(?!(mysql|test))’
–ignore-engines, -i 忽略的存储引擎
–no-schemas, -m 不导出表结构
–long-query-guard 长查询,默认60s,超过则通过mydumper
–kill-long-queries, -k 可以设置kill长查询
–verbose, -v 0 = silent, 1 = errors, 2 = warnings, 3 = info,默认是2
–binlogs, -b 导出binlog
–daemon, -D 启用守护进程模式
–snapshot-interval, -I dump快照间隔时间,默认60s
–logfile, -L mysqldumper日志输出,一般在Daemon模式下使用

恢复备份的话配套使用myload命令来实现:

myloader -d /home/backup/20120615/ -o -B dbname  -u root -p 'passwd' -t 4 &

myloader 大多参数和mydumper一样
–directory, -d 要还原的数据目录
–overwrite-tables, -o Drop any existing tables when restoring schemas

自动备份脚本:

基本功能如下(如果允许的话请自行增加异地/异机灾备):
1. 备份数据库;
2. 加上了过期代码,保留了7天的备份,以免硬盘被撑爆了,有需求的请自行增减时间;
3. 通过对比可得知数据库备份使用了多长时间。

#!/bin/bash
#This is a ShellScript for auto DB-Backup
#201204 by szy
#Setting 

DBName=test
DBUser=root
DBPasswd=password

BackupPath=/home/backup/db
LogFile=/home/backup/log/DBbackup.log

NewFile="$BackupPath"/"$DBName1"/$(date +%y%m%d)
OldFile="$BackupPath"/"$DBName1"/$(date +%y%m%d --date='7 days ago')

echo "----------------Backup Start-------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "-----------------------------------------------------" >> $LogFile  

#Delect Old File
if [ -d $OldFile ] 
then 
    rm -rf $OldFile >> $LogFile 2>&1 
    echo "----------[$OldFile]Delete Old File Success!----------" >> $LogFile 
else 
    echo "----------[$DBName]No Old Backup File!-------------" >> $LogFile 
fi 

#Backup
echo "----------------------$DBName----------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile

if [ -d $NewFile ] 
then 
   echo "----------[$NewFile]The Backup File is exists,Can't Backup!----------" >> $LogFile  
else 
mkdir $NewFile
 mydumper --kill-long-queries -u $DBUser -B $DBName -p $DBPasswd -v 2 -c -t 8 --outputdir=$NewFile
 fi 

 echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
 echo "--------------This ShellScript End-------------------" >> $LogFile