結合Git實現Mysql差別備份,可用於生產環境

埋頭苦幹多年一直沒寫過文章,今天突發狂想,爲LNMP陣營貢獻一些力量。就從平時工做過程當中的心得和一些技巧分享出來。今天就猿們最熟悉的Mysql開始宅鳥的開篇博客文章。歡迎猿們拍磚、轉載。mysql

注意:宅鳥的測試環境和生產環境爲ubuntulinux


Mysql是程序猿和運維猿最關心的開發利器之一,今天就來談談Mysql的平常備份之宅鳥見.git

常見的Mysql備份方法不少在此不在贅述。直上乾貨!sql


本shell腳本運行須要安裝shell

git  數據庫

ssh  ubuntu

要求讀者對mysql,git,ssh,shell有必定了解bash


本腳本功能:把遠程mysqlserver經過腳本配置的白名單和黑名單把指定數據庫sql文件利用git版本控制備份到localserver指定目錄下,服務器

經過版本控制git查看數據庫表數據的變化運維


預先配置好從localserver->mysqlserver的免密碼登陸(配置過程)

localserver(192.168.1.110)


db_backup_local.sh



#!/bin/bash
#created by lihuibin
#date 2013-8-30
#desc backup mysqlsql file from mysqlserver to localserver
tar_path="/root/mysql_backup"
ssh root@192.168.1.120 /root/shell/db_backup.sh
[ -d $tar_path ] && cd $tar_path; git pull  || git clone root@192.168.1.20:/root/shell/mysql_backup.git


mysqlserver(192.168.1.120)

假設mysqlserver服務器上有testdb1,testdb2,exdb1,exdb2四個數據庫


腳本位置:/root/shell/db_backup.sh


#!/bin/bash
#created by lihuibin
#date 2013-8-30
#desc  exec mysqldump mysqlsql file from mysqlserver to git
time=`date '+%F %R'`
mysql_user="backup_user"
mysql_password="backup_passwd"
mysql_host="127.0.0.1"
mysql_port="3306"
tar_path=/root/shell/mysql_backup
backup_db_arr=("testdb1" "testdb2")  #須要備份的數據庫列表
#backup_db_arr=()
exclude_db_arr=("exdb1" "exdb2")     #排除備份的數據庫列表  當backup_db_arr爲空的時候,exclude_db_arr生效,不爲空時僅backup_db_arr有效
[ -d $tar_path ]
is_first_backup=$?
in_array() {
    local hay needle=$1
    shift
    for hay; do
        [[ $hay == $needle ]] && return 0
    done
    return 1
}
backup_length=${#backup_db_arr[@]}
#echo $backup_length
exclude_length=${#exclude_db_arr[@]}
#echo $exclude_length;
#in_array "dopool_blog" ${backup_db_arr[@]} && echo hit || echo miss
for dbname in `mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "show databases" |sed '1,2d'`
do
     if [ $backup_length -gt 0 ]; then
          in_array $dbname ${backup_db_arr[@]} || continue
     elif [ $backup_length -eq 0 -a $exclude_length -gt 0 ]; then
          in_array $dbname ${exclude_db_arr[@]} && continue
     fi
     for tablename in `mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "show tables from $dbname" |sed '1d'`
     do
         mkdir -p $tar_path/$dbname/
         /usr/bin/mysqldump --lock-tables=TRUE  --extended-insert=FALSE --complete-insert=TRUE -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname $tablename > $tar_path/$dbname/$tablename.sql
     done
done
init_git(){
tar_path=`dirname $1`
dir_name=`basename $1` 
cd $1
git init
git add .
git commit -a -m "init $time"
cd $tar_path
git clone --bare $dir_name/
rm -rf $dir_name
git clone $dir_name.git
}
[ $is_first_backup -eq 1 ] && init_git $tar_path || {
                                                     cd $tar_path;
                                                     git add .;
                                                     git commit -a -m " back up $time";
                                                     git push;  
                                                    }


腳本執行後,就能夠結合git的tig、diff命令查看每次備份的中數據庫表中版本變化

幹活吐槽結束 有不足之處,歡迎拍磚!!!

相關文章
相關標籤/搜索