兩臺服務器,一臺正式服務器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 root@測試服務器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 root@測試服務器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 $targetServerUser@$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