西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)西西教程數(shù)據(jù)庫(kù)教程 → mydumper備份腳本 Mydumper安裝和使用教程

mydumper備份腳本 Mydumper安裝和使用教程

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2015/5/14 17:54:33字體大。A-A+

作者:西西點(diǎn)擊:293次評(píng)論:0次標(biāo)簽: mydumper mysql

  • 類(lèi)型:音頻處理大小:1M語(yǔ)言:中文 評(píng)分:5.1
  • 標(biāo)簽:
立即下載

Mydumper是一個(gè)針對(duì)MySQL和Drizzle的高性能多線程備份和恢復(fù)工具。開(kāi)發(fā)人員主要來(lái)自MySQL,Facebook,SkySQL公司。目前已經(jīng)在一些線上使用了Mydumper。雖然MySQL數(shù)據(jù)庫(kù)備份工具有其自帶的mysqldump,屬于mysql官方的一款備份工具。但是第三方備份工具mydumper憑借優(yōu)越的特點(diǎn)為更多人所使用。

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數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)測(cè)試庫(kù)和表(進(jìn)入mysql數(shù)據(jù)庫(kù))

create database test;

create table test (a int);

mydumper參數(shù)介紹:

-B, --database 需要備份的庫(kù)

-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 即使表沒(méi)有數(shù)據(jù),還是產(chǎn)生一個(gè)空文件

-x, --regex 支持正則表達(dá)式

-i, --ignore-engines 忽略的存儲(chǔ)引擎,用,分隔

-m, --no-schemas 不導(dǎo)出表結(jié)構(gòu)

-k, --no-locks 不執(zhí)行臨時(shí)共享讀鎖 警告:這將導(dǎo)致不一致的備份

-l, --long-query-guard 長(zhǎng)查詢,默認(rèn)60s

--kill-long-queries kill掉長(zhǎng)時(shí)間執(zhí)行的查詢(instead of aborting)

-b, --binlogs 導(dǎo)出binlog

-D, --daemon 啟用守護(hù)進(jìn)程模式

-I, --snapshot-interval dump快照間隔時(shí)間,默認(rèn)60s,需要在daemon模式下

-L, --logfile 日志文件

-h, --host

-u, --user

-p, --password

-P, --port

-S, --socket

-t, --threads 使用的線程數(shù),默認(rèn)4

-C, --compress-protocol 在mysql連接上使用壓縮

-V, --version

-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2

myloader參數(shù)介紹:

-d, --directory 導(dǎo)入備份目錄

-q, --queries-per-transaction 每次執(zhí)行的查詢數(shù)量, 默認(rèn)1000

-o, --overwrite-tables 如果表存在刪除表

-B, --database 需要還原的庫(kù)

-e, --enable-binlog 啟用二進(jìn)制恢復(fù)數(shù)據(jù)

-h, --host

-u, --user

-p, --password

-P, --port

-S, --socket

-t, --threads 使用的線程數(shù)量,默認(rèn)4

-C, --compress-protocol 連接上使用壓縮

-V, --version


-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2

mydumper輸出文件:

metadata:元數(shù)據(jù) 記錄備份開(kāi)始和結(jié)束時(shí)間,以及binlog日志文件位置。

table data:每個(gè)表一個(gè)文件

table schemas:表結(jié)構(gòu)文件

binary logs: 啟用--binlogs選項(xiàng)后,二進(jìn)制文件存放在binlog_snapshot目錄下

daemon mode:在這個(gè)模式下,有五個(gè)目錄0,1,binlogs,binlog_snapshot,last_dump。

備份目錄是0和1,間隔備份,如果mydumper因某種原因失敗而仍然有一個(gè)好的快照,

當(dāng)快照完成后,last_dump指向該備份。

time mydumper -B test -o /tmp/test2.bak -r 5000

mydumper備份腳本

#!/bin/bash  

#ocpyang@126.com  

########腳本說(shuō)明  

#1.默認(rèn)讀取當(dāng)前目錄下database.txt文件,備份部分?jǐn)?shù)據(jù)庫(kù)  

#2.如果database.txt為空,則執(zhí)行全備或備份指定的個(gè)別數(shù)據(jù)庫(kù)  

#set parameter

mydumper=/usr/local/bin/mydumper  #根據(jù)自己的實(shí)際情況設(shè)置  

dir_backup=/backup  #根據(jù)自己的實(shí)際情況設(shè)置  

mysql_host=localhost  #根據(jù)自己的實(shí)際情況設(shè)置  

mysql_port=33306  #根據(jù)自己的實(shí)際情況設(shè)置  

mysql_user=root  #根據(jù)自己的實(shí)際情況設(shè)置  

mysql_pass=123456  #根據(jù)自己的實(shí)際情況設(shè)置  

now_date=`date +%Y%m%d%H%M`  

if [ ! -d $dir_backup ]; then  

  echo -e "\e[1;31m 保存?zhèn)浞莸闹髂夸?$dir_backup不存在,將自動(dòng)新建. \e[0m"  

  mkdir -p ${dir_backup}  

fi  

export black='\033[0m'  

export boldblack='\033[1;0m'  

export red='\033[31m'  

export boldred='\033[1;31m'  

export green='\033[32m'  

export boldgreen='\033[1;32m'  

export yellow='\033[33m'  

export boldyellow='\033[1;33m'  

export blue='\033[34m'  

export boldblue='\033[1;34m'  

export magenta='\033[35m'  

export boldmagenta='\033[1;35m'  

export cyan='\033[36m'  

export boldcyan='\033[1;36m'  

export white='\033[37m'  

export boldwhite='\033[1;37m'  

cecho ()  

## -- Function to easliy print colored text -- ##  

 # Color-echo.  

 # 參數(shù) $1 = message  

 # 參數(shù) $2 = color  

{  

local default_msg="No message passed."  

message=${1:-$default_msg}  # 如果$1沒(méi)有輸入則為默認(rèn)值default_msg.  

color=${2:-black} # 如果$1沒(méi)有輸入則為默認(rèn)值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\n"  "$message"  

  tput sgr0# tput sgr0即恢復(fù)默認(rèn)值  

  printf "$black"  

return  

}  

cechon ()

 # Color-echo.  

 # 參數(shù)1 $1 = message  

 # 參數(shù)2 $2 = color  

{  

local default_msg="No message passed."  

 # Doesn't really need to be a local variable.  

message=${1:-$default_msg}  # 如果$1沒(méi)有輸入則為默認(rèn)值default_msg.  

color=${2:-black} # 如果$1沒(méi)有輸入則為默認(rèn)值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即恢復(fù)默認(rèn)值  

  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 "將在當(dāng)前目錄下新建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  

 #開(kāi)始時(shí)間  

 started_time=`date +%s`  

 echo "備份開(kāi)始時(shí)間:${started_time}"  

 db_num00=`awk 'NR==1,NR==0 { print NR}' ${filepath}/tmpdatabases.txt |tail -n1`  

 echo "此次將備份${db_num00}個(gè)數(shù)據(jù)庫(kù):"  

 echo  

 or_dbnum=0  

 for i in  `awk 'NR==1,NR==0 { print $1}'  ${filepath}/tmpdatabases.txt`;  

 do

((or_dbnum+=1))  

mysql_databases=$i  

db_dpname=$dir_backup/${i}.${now_date}  

  echo -e "\e[1;32m  mydumper開(kāi)始備份第${or_dbnum}個(gè)數(shù)據(jù)庫(kù)$i..... \e[0m"  

 sleep 2  

 echo -e "\e[1;32m  mydumper玩命備份中.....稍等片刻.... \e[0m"  

 ${mydumper} \  

 --database=${mysql_databases} \  

 --host=${mysql_host} \  

 --port=${mysql_port} \  

 --user=${mysql_user} \  

 --password=${mysql_pass} \  

 --outputdir=${db_dpname} \  

 --no-schemas \  

 --rows=50000 \  

 --build-empty-files \  

 --threads=4 \  

 --compress-protocol \  

 --kill-long-queries

 if [ "$?" -eq 0 ];then  

 echo -e "\e[1;32m  mydumper成功將數(shù)據(jù)庫(kù)$i備份到:${db_dpname}. \e[0m"  

 echo

 else  

 echo -e "\e[1;31m 備份異常結(jié)束. \e[0m"  

 fi  

 done  

else  

  ipname=''  

  read -p "Please input you want to backup database name[a|A:ALL]:" ipname  

  #開(kāi)始循環(huán)  

  #開(kāi)始時(shí)間  

  started_time=`date +%s`  

  echo "備份開(kāi)始時(shí)間:${started_time}"  

  if [ "$ipname" = "a" -o "$ipname" = "A" ];then  

db_num=`awk 'NR==2,NR==0 { print NR-1}' ${judegedate_01} |tail -n1`  

echo "此次將備份${db_num}個(gè)數(shù)據(jù)庫(kù):"  

echo

mysql_databases=$ipname  

or_dbnum=0  

 for i in  `awk 'NR==2,NR==0 { print $1}'  ${judegedate_01}`;  

 do

 ((or_dbnum+=1))  

mysql_databases=$i  

db_dpname=$dir_backup/${i}.${now_date}  

  echo -e "\e[1;32m  mydumper開(kāi)始備份第${or_dbnum}個(gè)數(shù)據(jù)庫(kù)$i..... \e[0m"  

 sleep 2  

 echo -e "\e[1;32m  mydumper玩命備份中.....稍等片刻.... \e[0m"  

 ${mydumper} \  

 --database=${mysql_databases} \  

 --host=${mysql_host} \  

 --port=${mysql_port} \  

 --user=${mysql_user} \  

 --password=${mysql_pass} \  

 --outputdir=${db_dpname} \  

 --no-schemas \  

 --rows=50000 \  

 --build-empty-files \  

 --threads=4 \  

 --compress-protocol \  

 --kill-long-queries

 if [ "$?" -eq 0 ];then  

 echo -e "\e[1;32m  mydumper成功將數(shù)據(jù)庫(kù)$i備份到:${db_dpname}. \e[0m"  

 echo

 else  

 echo -e "\e[1;31m 備份異常結(jié)束. \e[0m"  

 fi  

 done  

  else

echo "此次備份的數(shù)據(jù)庫(kù)名為:$ipname"  

echo 

#開(kāi)始時(shí)間  

STARTED_TIME=`date +%s`  

mysql_databases=$ipname  

db_dpname=$dir_backup/${mysql_databases}.${now_date}  

judegedate_02="judegedate02.`date +%y%m%d%h%m%s`.txt"  

schema_judege02="select schema_name from information_schema.schemata where schema_name='${ipname}';"  

mysql -h${mysql_host} -P${mysql_port}  -u${mysql_user} -p${mysql_pass} -e"${schema_judege02}" >${judegedate_02}  

if [ ! -s "${judegedate_02}" ];then  

 echo ""  

 echo -e "\e[1;31m  ******************************************************************* \e[0m"  

 echo -e "\e[1;31m  !o(︶︿︶)o! The  schema_name ${ipname} not exits,pleae check . ~~~~(>_<)~~~~  \e[0m"  

 echo -e "\e[1;31m  ********************************************************************** \e[0m"  

 echo ""  

 rm -rf ${judegedate_01}  

 rm -rf ${judegedate_02}  

 exit 0  

else  

 echo -e "\e[1;32m  mydumper開(kāi)始備份請(qǐng)稍等..... \e[0m"  

 sleep 2  

 echo -e "\e[1;32m  mydumper玩命備份中.....稍等片刻.... \e[0m"  

 ${mydumper} \  

 --database=${mysql_databases} \  

 --host=${mysql_host} \  

 --port=${mysql_port} \  

 --user=${mysql_user} \  

 --password=${mysql_pass} \  

 --outputdir=${db_dpname} \  

 --no-schemas \  

 --rows=50000 \  

 --build-empty-files \  

 --threads=4 \  

 --compress-protocol \  

 --kill-long-queries

 if [ "$?" -eq 0 ];then  

 echo -e "\e[1;32m  mydumper成功將數(shù)據(jù)庫(kù)備份到:${db_dpname}. \e[0m"  

 else  

 echo -e "\e[1;31m 備份異常結(jié)束. \e[0m"  

 fi  

fi  

  # 循環(huán)結(jié)束  

  fi  

fi  

rm -rf ${judegedate_01}  

rm -rf ${judegedate_02}  

rm -rf ${filepath}/tmpdatabases.txt  

echo "完成于: `date +%F' '%T' '%w`"  

######################################################################################################################  

執(zhí)行結(jié)果如下:#####################  

The databases name in current instance is:

information_schema  

mysql  

performance_schema  

test  

wind  

mpiao  

mpadmin  

mplog  

Please input you want to backup database name[a|A:ALL]:A  

備份開(kāi)始時(shí)間:1431574874  

此次將備份8個(gè)數(shù)據(jù)庫(kù):  

  mydumper開(kāi)始備份第1個(gè)數(shù)據(jù)庫(kù)information_schema.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)information_schema備份到:/backup/information_schema.201505141141.

  mydumper開(kāi)始備份第2個(gè)數(shù)據(jù)庫(kù)mysql.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)mysql備份到:/backup/mysql.201505141141.

  mydumper開(kāi)始備份第3個(gè)數(shù)據(jù)庫(kù)performance_schema.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)performance_schema備份到:/backup/performance_schema.201505141141.

  mydumper開(kāi)始備份第4個(gè)數(shù)據(jù)庫(kù)test.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)test備份到:/backup/test.201505141141.

  mydumper開(kāi)始備份第5個(gè)數(shù)據(jù)庫(kù)wind.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)wind備份到:/backup/wind.201505141141.

  mydumper開(kāi)始備份第6個(gè)數(shù)據(jù)庫(kù)mpiao.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)mpiao備份到:/backup/mpiao.201505141141.

  mydumper開(kāi)始備份第7個(gè)數(shù)據(jù)庫(kù)mpadmin.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)mpadmin備份到:/backup/mpadmin.201505141141.

  mydumper開(kāi)始備份第8個(gè)數(shù)據(jù)庫(kù)mplog.....

  mydumper玩命備份中.....稍等片刻....

  mydumper成功將數(shù)據(jù)庫(kù)mplog備份到:/backup/mplog.201505141141.

Mydumper備份腳本模板

# 這是一個(gè)本地備份多臺(tái)MYSQL的腳本


# 設(shè)定被備份主機(jī)信息

TYPE=ALL

IPADDR=localhost

PASSWD=密碼


# 指定主目錄

BACKUP_FILES_PATH=&quot;/home/ftp/b/backup_data/mydumper&quot;


# 以當(dāng)前系統(tǒng)時(shí)間新建備份文件夾

TIME_DIR=$(date -d "yesterday" +"%Y")/$(date +"%m")/$(date +"%d")/$(date +"%Y%m%d%H%M%S")

BACKUP_FILES_DIR=${BACKUP_FILES_PATH}/$TYPE/$TIME_DIR;echo "新建備份目錄:$BACKUP_FILES_DIR"


# 設(shè)置你想保存的天數(shù),我這里設(shè)置的是保存30天之內(nèi)的備份

SAVE_DAYS=30


# 刪除指定時(shí)間前的文件

find $BACKUP_FILES_PATH -mtime +$SAVE_DAYS -exec rm -rf {} \;


# 新建備份目錄

echo &quot;新建備份目錄:$BACKUP_FILES_DIR&quot;

mkdir -p $BACKUP_FILES_DIR

echo &quot;備份對(duì)象:$IPADDR&quot;&gt;$BACKUP_FILES_DIR/log


# 開(kāi)始遠(yuǎn)程備份

# mydumper只需要3個(gè)全局權(quán)限 SELECT, RELOAD, LOCK TABLES 

# 如果記錄需要二進(jìn)制日志和指針信息 需要再添加2個(gè)權(quán)限 REPLICATION SLAVE, REPLICATION CLIENT

time mydumper -h $IPADDR -u mydumper -p $PASSWD -o $BACKUP_FILES_DIR -c 9 -C -e -t 6 2&gt;&gt;$BACKUP_FILES_DIR/log


cat $BACKUP_FILES_DIR/metadata

cat $BACKUP_FILES_DIR/log


# 復(fù)制最新的到外層文件夾

rm -rf ${BACKUP_FILES_PATH}/$TYPE/LastBackUp

cp -r $BACKUP_FILES_DIR ${BACKUP_FILES_PATH}/$TYPE/LastBackUp


# 設(shè)定權(quán)限

chown -R 1018:1100 $BACKUP_FILES_DIR


# 恢復(fù)

# time myloader -h localhost -u root -p 密碼 -d /home/ftp/b/backup_data/mydumper/ALL/LastBackUp -o -v 3 -C -t 6


# 追加此腳本到計(jì)劃任務(wù)

# echo "17 05 * * * sh /root/shell/backup_mysql.sh" >> /var/spool/cron/root

# echo "06 05 * * * sh /root/shell/backup_mysql.sh" >> /var/spool/cron/root

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)