Linux-定時指令碼將一臺伺服器上的mysql資料庫自動備份到另一臺伺服器的資料庫中
阿新 • • 發佈:2018-12-25
有兩臺伺服器,一臺正式伺服器A,一臺測試伺服器B,現需要將正式伺服器A中的資料庫每天備份到測試伺服器B,提高資料庫的容災性以及防止資料庫在測試中出現錯誤。
1.從正式伺服器A中匯出需要備份的資料庫
使用mysqldump指令匯出資料庫檔案
/usr/sbin/mysqldump -u root -ppassword database | gzip > bakdatabaseName.sql.gz
password為資料庫密碼,database為需要備份的資料庫名2.將備份的資料庫檔案傳送至測試伺服器B
使用scp指令傳送備份的資料庫檔案
scp bakdatabaseName.sql.gz [email protected] 測試伺服器B的IP:/root/mysqlbak/bakdatabaseName.sql.gz
該操作需要輸入測試伺服器B的密碼,所以通過另外一個expect指令碼實現與終端的互動從而實現自動輸入密碼,expect需要安裝。
3.通過expect指令碼實現執行scp指令後自動輸入密碼
#!/usr/bin/expect #FileName:scp.exp set timeout 60 if { [llength $argv] < 2} { puts "Usage:" puts "$argv0 local_file remote_path" exit 1 } set local_file [lindex $argv 0] set remote_path [lindex $argv 1] set passwd yourpassword set passwderror 0 spawn scp $local_file $remote_path expect { "*assword:*" { if { $passwderror == 1 } { puts "passwd is error" exit 2 } set timeout 1000 set passwderror 1 send "$passwd\r" exp_continue } "*es/no)?*" { send "yes\r" exp_continue } timeout { puts "connect is timeout" exit 3 } }
只需將程式碼中的yourpassword改為測試伺服器B的密碼,配置完之後執行下面指令
/usr/sbin/scp.exp bakdatabaseName.sql.gz [email protected]測試伺服器B的IP:/root/mysqlbak/bakdatabaseName.sql.gz
完整程式碼
#!/bin/bash
# FileName:bakmysql.sh
# This is a ShellScript For Auto DB Backup
#
backupdir=/root/mysqlbak #本伺服器備份路徑
mysql_bin_dir=/usr/sbin #mysqldump的路徑
databaseName=database #備份的資料庫名字
bakdatabaseName=database_bak_ #備份的資料庫全部表的檔名
mysqluser=user #正式伺服器A的mysql使用者名稱
mysqlpwd=password #正式伺服器A的mysql密碼
targetServerUser=root #測試伺服器B的使用者名稱
targetServerIP=B_IP #測試伺服器B的IP地址
targetpath=/root/mysqlbak #測試伺服器B備份路徑
time=` date +%Y%m%d ` #當天的日期年月日
#從資料庫匯出資料庫備份檔案
$mysql_bin_dir/mysqldump --socket=/tmp/mysql.sock -u $mysqluser -p$mysqlpwd $databaseName | gzip > $backupdir/$bakdatabaseName$time.sql.gz
#保留3天內的備份檔案,時間可通過-mtime 後的 +2 修改
find $backupdir -name "$bakdatabaseName*.sql.gz" -type f -mtime +2 -exec rm -f {} \; > /dev/null 2>&1
#將備份檔案傳送到測試伺服器B
/usr/sbin/scp.exp $backupdir/$bakdatabaseName$time.sql.gz [email protected]$targetServerIP:$targetpath/$bakdatabaseName$time.sql.gz
將bakmysql.sh加入到正式伺服器A的crontab定時任務中
4.將備份的資料庫檔案匯入到測試伺服器B的mysql中
gzip -dc /root/mysqlbak/bakdatabaseName.sql.gz | mysql -u user -ppasswd database
完整程式碼
#!/bin/bash
# FileName:updatemysql.sh
# This is a ShellScript For Auto DB Backup and Delete old Backup
#
backupdir=/root/mysqlbak #測試伺服器B資料庫備份檔案路徑
mysql_bin_dir=/usr/sbin #測試伺服器B的mysql的安裝路徑
databaseName=database #資料庫名字
bakdatabaseName=database_bak_ #備份的資料庫的檔名
mysqluser=user #測試伺服器B的mysql使用者名稱
mysqlpwd=passwd #測試伺服器B的mysql密碼
time=` date +%Y%m%d ` #當天的日期:年月日
#先刪除前一天的資料庫
$mysql_bin_dir/mysql -u $mysqluser -p$mysqlpwd -e "drop database $databaseName;"
#建立新的資料庫
$mysql_bin_dir/mysql -u $mysqluser -p$mysqlpwd -e "create database $databaseName;"
#將備份的資料庫檔案匯入到mysql中
gzip -dc $backupdir/$bakdatabaseName$time.sql.gz | $mysql_bin_dir/mysql -u $mysqluser -p$mysqlpwd $databaseName
#保留3天內的備份檔案,時間可通過-mtime 後的 +2 修改
find $backupdir -name "*.sql.gz" -type f -mtime +2 -exec rm -f {} \; > /dev/null 2>&1
將updatemysql.sh加入到測試伺服器B的crontab定時任務中,定時時間要比bakmysql.sh的定時時間晚一些
注意:
1. 正式伺服器A的mysql版本要比測試伺服器B的mysql版本高,否則匯入會失敗
2. 資料庫備份檔案匯入時由於資料量很大,會出現連線超時
需要修改mysql配置檔案/etc/my.cnf
將[mysqld]中的max_allowed_packet 修改大一點 如20M
max_allowed_packet = 20M
重啟mysql
service mysqld restart
如果還是出現連線超時
在/etc/my.cnf新增以下程式碼
[mysqldump]
quick
max_allowed_packet = 16M