Mydumper是一個針對MySQL和Drizzle的高性能多線程備份和恢復工具。開發人員主要來自MySQL,Facebook,SkySQL公司。目前已經在一些線上使用了Mydumper。雖然MySQL數據庫備份工具有其自帶的mysqldump,屬於mysql官方的一款備份工具。但是第三方備份工具mydumper憑借優越的特點為更多人所使用。
1、Mydumper安裝
# yum install glib2-devel mysql-devel zlib-devel pcre-devel
# wget http://launchpad.net/mydumper/0.5/0.5.1/+download/mydumper-0.5.1.tar.gz
# tar zxvf mydumper-0.5.1.tar.gz -C ../software/
# cmake .
# make
# make install
2、在mysql數據庫中創建一個測試庫和表(進入mysql數據庫)
create database test;
create table test (a int);
mydumper參數介紹:
-B, --database 需要備份的庫
-T, --tables-list 需要備份的表,用,分隔
-o, --outputdir 輸出目錄
-s, --statement-size Attempted size of INSERT statement in bytes, default 1000000
-r, --rows 試圖分裂成很多行塊表
-c, --compress 壓縮輸出文件
-e, --build-empty-files 即使表沒有數據,還是產生一個空文件
-x, --regex 支持正則表達式
-i, --ignore-engines 忽略的存儲引擎,用,分隔
-m, --no-schemas 不導出表結構
-k, --no-locks 不執行臨時共享讀鎖 警告:這將導致不一致的備份
-l, --long-query-guard 長查詢,默認60s
--kill-long-queries kill掉長時間執行的查詢(instead of aborting)
-b, --binlogs 導出binlog
-D, --daemon 啟用守護進程模式
-I, --snapshot-interval dump快照間隔時間,默認60s,需要在daemon模式下
-L, --logfile 日志文件
-h, --host
-u, --user
-p, --password
-P, --port
-S, --socket
-t, --threads 使用的線程數,默認4
-C, --compress-protocol 在mysql連接上使用壓縮
-V, --version
-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
myloader參數介紹:
-d, --directory 導入備份目錄
-q, --queries-per-transaction 每次執行的查詢數量, 默認1000
-o, --overwrite-tables 如果表存在刪除表
-B, --database 需要還原的庫
-e, --enable-binlog 啟用二進制恢復數據
-h, --host
-u, --user
-p, --password
-P, --port
-S, --socket
-t, --threads 使用的線程數量,默認4
-C, --compress-protocol 連接上使用壓縮
-V, --version
-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
mydumper輸出文件:
metadata:元數據 記錄備份開始和結束時間,以及binlog日志文件位置。
table data:每個表一個文件
table schemas:表結構文件
binary logs: 啟用--binlogs選項後,二進制文件存放在binlog_snapshot目錄下
daemon mode:在這個模式下,有五個目錄0,1,binlogs,binlog_snapshot,last_dump。
備份目錄是0和1,間隔備份,如果mydumper因某種原因失敗而仍然有一個好的快照,
當快照完成後,last_dump指向該備份。
time mydumper -B test -o /tmp/test2.bak -r 5000
mydumper備份腳本
#!/bin/bash
########腳本說明
#1.默認讀取當前目錄下database.txt文件,備份部分數據庫
#2.如果database.txt為空,則執行全備或備份指定的個別數據庫
#set parameter
mydumper=/usr/local/bin/mydumper #根據自己的實際情況設置
dir_backup=/backup #根據自己的實際情況設置
mysql_host=localhost #根據自己的實際情況設置
mysql_port=33306 #根據自己的實際情況設置
mysql_user=root #根據自己的實際情況設置
mysql_pass=123456 #根據自己的實際情況設置
now_date=`date +%Y%m%d%H%M`
if [ ! -d $dir_backup ]; then
echo -e "e[1;31m 保存備份的主目錄:$dir_backup不存在,將自動新建. e[0m"
mkdir -p ${dir_backup}
fi
export black=' 33[0m'
export boldblack=' 33[1;0m'
export red=' 33[31m'
export boldred=' 33[1;31m'
export green=' 33[32m'
export boldgreen=' 33[1;32m'
export yellow=' 33[33m'
export boldyellow=' 33[1;33m'
export blue=' 33[34m'
export boldblue=' 33[1;34m'
export magenta=' 33[35m'
export boldmagenta=' 33[1;35m'
export cyan=' 33[36m'
export boldcyan=' 33[1;36m'
export white=' 33[37m'
export boldwhite=' 33[1;37m'
cecho ()
## -- Function to easliy print colored text -- ##
# Color-echo.
# 參數 $1 = message
# 參數 $2 = color
{
local default_msg="No message passed."
message=${1:-$default_msg} # 如果$1沒有輸入則為默認值default_msg.
color=${2:-black} # 如果$1沒有輸入則為默認值black.
case $color in
black)
printf "$black" ;;
boldblack)
printf "$boldblack" ;;
red)
printf "$red" ;;
boldred)
printf "$boldred" ;;
green)
printf "$green" ;;
boldgreen)
printf "$boldgreen" ;;
yellow)
printf "$yellow" ;;
boldyellow)
printf "$boldyellow" ;;
blue)
printf "$blue" ;;
boldblue)
printf "$boldblue" ;;
magenta)
printf "$magenta" ;;
boldmagenta)
printf "$boldmagenta" ;;
cyan)
printf "$cyan" ;;
boldcyan)
printf "$boldcyan" ;;
white)
printf "$white" ;;
boldwhite)
printf "$boldwhite" ;;
esac
printf "%sn" "$message"
tput sgr0# tput sgr0即恢復默認值
printf "$black"
return
}
cechon ()
# Color-echo.
# 參數1 $1 = message
# 參數2 $2 = color
{
local default_msg="No message passed."
# Doesn't really need to be a local variable.
message=${1:-$default_msg} # 如果$1沒有輸入則為默認值default_msg.
color=${2:-black} # 如果$1沒有輸入則為默認值black.
case $color in
black)
printf "$black" ;;
boldblack)
printf "$boldblack" ;;
red)
printf "$red" ;;
boldred)
printf "$boldred" ;;
green)
printf "$green" ;;
boldgreen)
printf "$boldgreen" ;;
yellow)
printf "$yellow" ;;
boldyellow)
printf "$boldyellow" ;;
blue)
printf "$blue" ;;
boldblue)
printf "$boldblue" ;;
magenta)
printf "$magenta" ;;
boldmagenta)
printf "$boldmagenta" ;;
cyan)
printf "$cyan" ;;
boldcyan)
printf "$boldcyan" ;;
white)
printf "$white" ;;
boldwhite)
printf "$boldwhite" ;;
esac
printf "%s" "$message"
tput sgr0# tput sgr0即恢復默認值
printf "$black"
return
}
judegedate_01="judegedate01.`date +%y%m%d%h%m%s`.txt"
schema_judege01="select schema_name from information_schema.schemata ;"
mysql -h${mysql_host} -P${mysql_port} -u${mysql_user} -p${mysql_pass} -e"${schema_judege01}" >${judegedate_01}
echo -e "e[1;31m The databases name in current instance is: e[0m"
awk 'NR==2,NR==0 { print $1}' ${judegedate_01}
echo " "
#Get the current script path and create a file named database.txt
#in order to save the backup databases name.
filepath=$(cd "$(dirname "$0")"; pwd)
if [ ! -s "${filepath}/database.txt" ];then
echo "將在當前目錄下新建databases.txt."
touch ${filepath}/database.txt
echo "#Each line is stored a valid database name">${filepath}/database.txt
chmod 700 ${filepath}/database.txt
fi
#Remove the comment line
awk 'NR==2,NR==0 { print $1}' ${filepath}/database.txt> ${filepath}/tmpdatabases.txt
#To determine whether a file is empty
if [ -s ${filepath}/tmpdatabases.txt ];then
#開始時間
started_time=`date +%s`
echo "備份開始