說明:
本文實現利用shell實現遠程mysql數據庫備份。通過在數據服務器mysqldump導出需要備份的數據庫,scp拷貝到指定的備份服務器。爲了不需要輸入密碼就能直接scp,這裏,會先生成ssh key。
數據庫服務器爲A,用來遠程存放備份的服務器爲B
實現:
1.生成ssh key認證,避免SSH輸入密碼
openssh在A服務器用openssh生成一堆密鑰
# ssh-keygen -d //passphrase一定留空,否則又要輸入密碼。會生成~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub文件 # chmod 600 ~/.ssh/id_rsa //設置屬性 把~/.ssh/id_rsa.pub文件的內容複製後添加到B服務器用戶目錄~/.ssh/authorized文件裏,設置屬性 # chmod 600 ~/.ssh/authorized
puttygen在A服務器生成密鑰對
菜單|Conversions|Export OpenSSH Key //導出OpenSSH格式的私鑰,保存爲id_rsa,放到A服務器用戶目錄~/.ssh/下 # chmod 600 ~/.ssh/id_rsa //設置屬性 公鑰在puttygen最上面那一堆最長的字符串就是,複製後添加到B服務器用戶目錄~/.ssh/authorized文件裏,同樣設置屬性 # chmod 600 ~/.ssh/authorized
2.在數據庫服務器A新建sql_backup.sh,用於mysqldump導出要備份的數據庫,scp到備份服務器上
# vim sql_bakup.sh //添加以下內容
#!/bin/bash sqlfile=$(date -d yesterday "+%Y%m%d")".sql" #指定要拷貝的數據庫文件名,以日期(減一天)命名 /usr/local/webserver/mysql/bin/mysqldump -u***** -p*** test > $sqlfile gzip $sqlfile #壓縮,對於大數據庫非常必要 scp $sqlfile".gz" [email protected]:/www/backup/mysql/ echo `date -d yesterday "+%Y%m%d"` succ >> /root/shell/sum.txt #將備份操作記錄到sum.txt中去
mysql_backup.sh還有一種寫法,寫得更緊湊。實現本地不保存,直接備份到B服務器。mysqldump -udbuser -pdbpass dbname|gzip -c|ssh remoteuser@remoteip ‘cat > ~/’`date “+%Y%m%d%H%M%S”`’.sql.gz’其中dbuser是數據庫用戶名,dbpass是數據庫密碼,dbname是數據庫名,remoteuser是遠程B服務器的用戶名,remoteip是遠程B服務器的IP
如果本地不保存,直接備份到B服務器
#!/bin/bash
mysqldump -udbuser -pdbpass dbname|gzip -c|ssh remoteuser@remoteip 'cat > ~/'`date "+%Y%m%d%H%M%S"`'.sql.gz'
其中dbuser是數據庫用戶名,dbpass是數據庫密碼,dbname是數據庫名,remoteuser是遠程B服務器的用戶名,remoteip是遠程B服務器的IP
#!/bin/bash
backup_time=`date +%Y_%m_%d_%H`
current_ip="${要備份的機器ip}"
remote_ip="${遠程機器ip}"
remote_path="/home/quant_group/mysql/${current_ip}/full/${backup_time}.tar"
mysql_host="--host=${current_ip}"
mysql_user="--user=${備份的用戶名}"
mysql_pass="--password=${備份的密碼}"
mysql_port="--port=3306"
defaults_file="--defaults-file=/home/quant_group/mysql/3306/my.cnf"
mysqldump -udbuser -pdbpass dbname | gzip | sshpass -p '' ssh root@${remote_ip} "cat - > ${remote_path}"
3.數據庫服務器A上編輯crontab,讓mysql_backup腳本定期執行
# crontab -e //每天0點備份昨天A的test數據庫到B的/www/backup/mysql
00 00 * * * /bin/bash /root/shell/sql_bakup.sh
4.還原數據庫
# gzid -d 20121127.sql.gz #解壓 # mysql -u**** -p*** -S /tmp/mysql > use test #沒有就新建個數據庫 > source /www/backup/mysql/20121127.sql