MySQL 备份和恢复策略
?
備份策略一:直接拷貝數據庫文件(不推薦)
備份策略二:使用mysqlhotcopy備份數據庫(完全備份,適合小型數據庫備份)
備份策略三:使用mysqldump備份數據庫(完全+增量備份,適合中型數據庫備份)
備份策略四:使用主從復制機制(replication)(實現數據庫實時備份)
?
備份策略一、直接拷貝數據庫文件
直接拷貝數據文件最為直接、快速、方便,但缺點是基本上不能實現增量備份。為了保證數據的一致性,需要在備份文件前,執行以下?
FLUSH?
也就是把內存中的數據都刷新到磁盤中,同時鎖定數據表,以保證拷貝過程中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接拷貝回原來的數據庫目錄下即可。
?
備份策略二、使用mysqlhotcopy備份數據庫
mysqlhotcopy?
本備份策略適合于小型數據庫的備份,數據量不大,可以采用mysqlhotcopy程序每天進行一次完全備份。
備份策略布置:
(1)、安裝DBD-mysql?
shell>?
shell>?
shell>?
shell>?
shell>?
shell>?
shell>?
(2)、設置crontab任務,每天執行備份腳本
shell>?
0?
每天凌晨3:00執行備份腳本。
?
mysqlbackup.sh注釋:
#!/bin/sh
# Name:mysqlbackup.sh
# PS:MySQL DataBase Backup,Use mysqlhotcopy script.
# Write by:i.Stone
# Last Modify:2007-11-15
#
# 定義變量,請根據具體情況修改
# 定義腳本所在目錄
scriptsDir=`pwd`
# 數據庫的數據目錄
dataDir=/usr/local/mysql/data/
# 數據備份目錄
tmpBackupDir=/tmp/tmpbackup/
backupDir=/tmp/mysqlbackup/
# 用來備份數據庫的用戶名和密碼
mysqlUser=root
mysqlPWD=111111
# 定義eMail地址
eMail=alter@somode.com
# 如果臨時備份目錄存在,清空它,如果不存在則創建它
if [[ -e $tmpBackupDir ]]; then
?
else
?
fi
# 如果備份目錄不存在則創建它
if [[ ! -e $backupDir ]];then
?
fi
# 清空MySQLBackup.log
if [[ -s MySQLBackup.log ]]; then
?
fi
# 得到數據庫備份列表,在此可以過濾不想備份的數據庫
for databases in `find $dataDir -type d | \
?
?
?
?
?
# 備份數據庫
?
?
?
?
done
# 壓縮備份文件
date=`date -I`
cd $tmpBackupDir
tar czf $backupDir/mysql-$date.tar.gz ./
# 發送郵件通知
if [[ -s MySQLBackup.log ]]; then
?
fi
# 使用smbclientmv.sh腳本上傳數據庫備份到備份服務器
# $scriptsDir/smbclientmv.sh
?
smbclientmv.sh注釋
#!/bin/sh
# Name:smbclientmv.sh
# PS:Move the data to Backup Server.
# Write by:i.Stone
# Last Modify:2007-11-15
#
# 定義變量
# 備份服務器名
BackupServer="BackupServerName"
# 共享文件夾名
BackupShare="ShareName"
# 備份服務器的訪問用戶名和密碼
BackupUser="SMBUser"
BackupPW="SMBPassword"
# 定義備份目錄
BackupDir=/tmp/mysqlbackup
date=`date -I`
# Move the data to BackupServer
smbclient //$BackupServer/$BackupShare \
$BackupPW -d0 -W WORKGROUP -U $BackupUser \
-c "put $BackupDir/mysql-$date.tar.gz \
mysql-$date.tar.gz"
# Delete temp files
rm -f $BackupDir/mysql-$date.tar.gz
(3)、恢復數據庫到備份時的狀態
mysqlhotcopy 備份出來的是整個數據庫目錄,使用時可以直接拷貝到 mysqld 指定的 datadir (在這里是 /usr/local/mysql/data/)目錄下即可,同時要注意權限的問題,如下例:
shell> cp -rf db_name /usr/local/mysql/data/
shell> chown -R mysql:mysql /usr/local/mysql/data/ (將 db_name 目錄的屬主改成 mysqld 運行用戶)
本套備份策略只能恢復數據庫到最后一次備份時的狀態,要想在崩潰時丟失的數據盡量少應該更頻繁的進行備份,要想恢復數據到崩潰時的狀態請使用主從復制機制(replication)。
?
備份策略三、使用mysqldump備份數據庫
mysqldump?
對于中等級別業務量的系統來說,備份策略可以這么定:第一次完全備份,每天一次增量備份,每周再做一次完全備份,如此一直重復。而對于重要的且繁忙的系統來說,則可能需要每天一次全量備份,每小時一次增量備份,甚至更頻繁。為了不影響線上業務,實現在線備份,并且能增量備份,最好的辦法就是采用主從復制機制(replication),在?
備份策略布置:
(1)、創建備份目錄
Shell>?
Shell>?
(2)、啟用二進制日志
采用?
啟用?
[mysqld]
log-bin
然后啟動?
(3)、配置SSH密鑰登錄,用于將MySQL備份傳送到備份服務器(如果備份服務器為Windows,請跳過此部)。
1)、在MySQL所在服務器(192.168.0.20)生成SSH密鑰
[root@lab?
Generating?
Enter?
Enter?
Enter?
Your?
Your?
The?
c2:96:9f:2d:5a:8e:08:42:43:35:2f:85:5e:72:f8:1c?
?
2)、在備份服務器(192.168.0.200)上創建目錄,修改權限,并傳送公鑰。
[root@lab?
The?
RSA?
Are?
Warning:?
root@192.168.0.200's?
[root@lab?
root@192.168.0.200's?
id_rsa.pub?
3)、測試SSH登錄
[root@lab?
Last?
[root@lib?
?
(4)、設置crontab任務,每天執行備份腳本
shell>?
#每個星期日凌晨3:00執行完全備份腳本
0?
#周一到周六凌晨3:00做增量備份
0?
?
mysqlFullBackup.sh注釋:
#!/bin/sh
# Name:mysqlFullBackup.sh
# PS:MySQL DataBase Full Backup.
# Write by:i.Stone
# Last Modify:2007-11-17
#
# Use mysqldump --help get more detail.
#
# 定義變量,請根據具體情況修改
# 定義腳本目錄
scriptsDir=`pwd`
# 定義數據庫目錄
mysqlDir=/usr/local/mysql
# 定義用于備份數據庫的用戶名和密碼
user=root
userPWD=111111
# 定義備份目錄
dataBackupDir=/tmp/mysqlbackup
# 定義郵件正文文件
eMailFile=$dataBackupDir/email.txt
# 定義郵件地址
eMail=alter@somode.com
# 定義備份日志文件
logFile=$dataBackupDir/mysqlbackup.log
DATE=`date -I`
echo "" > $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
cd $dataBackupDir
# 定義備份文件名
dumpFile=mysql_$DATE.sql
GZDumpFile=mysql_$DATE.sql.tar.gz
# 使用mysqldump備份數據庫,請根據具體情況設置參數
$mysqlDir/bin/mysqldump -u$user -p$userPWD \
--opt --default-character-set=utf8 --extended-insert=false \
--triggers -R --hex-blob --all-databases \
--flush-logs --delete-master-logs \
--delete-master-logs \
-x > $dumpFile
# 壓縮備份文件
if [[ $? == 0 ]]; then
?
?
?
?
# Delete daily backup files.
?
?
# Delete old backup files(mtime>2).
?
# 如果不需要將備份傳送到備份服務器或備份服務器為Windows,請將標綠的行注釋掉
# Move Backup Files To Backup Server.
#適合Linux(MySQL服務器)到Linux(備份服務器)
?
?
?
?
?
?
else
?
fi
# 寫日志文件
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile
# 發送郵件通知
cat $eMailFile | mail -s "MySQL Backup" $eMail
mysqlDailyBackup.sh注釋:?#!/bin/sh
# Name:mysqlDailyBackup.sh
# PS:MySQL DataBase Daily Backup.
# Write by:i.Stone
# Last Modify:2007-11-17
#
# 定義變量,請根據具體情況修改
# 定義數據庫目錄和數據目錄
scriptsDir=`pwd`
mysqlDir=/usr/local/mysql
dataDir=$mysqlDir/data
# 定義用于備份數據庫的用戶名和密碼
user=root
userPWD=111111
# 定義備份目錄,每日備份文件備份到$dataBackupDir/daily
dataBackupDir=/tmp/mysqlbackup
dailyBackupDir=$dataBackupDir/daily
# 定義郵件正文文件
eMailFile=$dataBackupDir/email.txt
# 定義郵件地址
eMail=alter@somode.com
# 定義日志文件
logFile=$dataBackupDir/mysqlbackup.log
# 得到數據庫所在主機的主機名
HOSTNAME=`uname -n`
#
echo "" > $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
#
# 刷新日志,使數據庫使用新的二進制日志文件
$mysqlDir/bin/mysqladmin -u$user -p$userPWD flush-logs
cd $dataDir
# 得到二進制日志列表
fileList=`cat $HOSTNAME-bin.index`
iCounter=0
for file in $fileList
do
?
done
nextNum=0
iFile=0
for file in $fileList
do
?
?
# 跳過最后一個二進制日志(數據庫當前使用的二進制日志文件)
?
?
?
?
# 跳過已經備份的二進制日志文件
?
?
?
# 備份日志文件到備份目錄
?
?
?
?
?
?
?
done
if [[ $iFile == 0 ]];then
?
else
?
?
# 如果不需要將備份傳送到備份服務器或備份服務器為Windows,請將標綠的行注釋掉
# Move Backup Files To Backup Server.
#適合Linux(MySQL服務器)到Linux(備份服務器)
?
?
?
?
?
?
fi
# 發送郵件通知
cat $eMailFile | mail -s "MySQL Backup" $eMail
# 寫日志文件
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile
?
rsyncBackup.sh注釋:
#!/bin/sh
# Name:rsyncBackup.sh
# PS:Move Backup Files To Backup Server.
# Write by:i.Stone
# Last Modify:2007-11-17
#
# 請根據具體情況修改,注意最后有“/”
# 定義數據庫備份目錄
dataBackupDir=/tmp/mysqlbackup/
# 定義備份服務器上存放備份數據的目錄
backupServerDir=/root/mysqlbackup/
# 定義備份服務器
backupServer=192.168.0.200
#
# 同步備份文件到備份服務器
rsync -a --delete $dataBackupDir -e ssh $backupServer:$backupServerDir > /dev/null 2>&1
rmBackup.sh注釋:
#!/bin/sh
# Name:rmBackup.sh
# PS:Delete old Backup.
# Write by:i.Stone
# Last Modify:2007-11-15
#
# 定義備份目錄
dataBackupDir=/tmp/mysqlbackup
# 刪除mtime>2的日志備份文件
find $dataBackupDir -name "mysql_*.gz" -type f -mtime +2 -exec rm {} \; > /dev/null 2>&1
(5)?
用?
/usr/local/mysql/bin/mysql?
對于任何可適用的更新日志,將它們作為?
%?
ls?
本套備份策略只能恢復數據庫到最后一次備份時的狀態,要想在崩潰時丟失的數據盡量少應該更頻繁的進行備份,要想恢復數據到崩潰時的狀態請使用主從復制機制(replication)。如果使用本套備份腳本,將日志文件和數據文件放到不同的磁盤上是一個不錯的主義,這樣不僅可以提高數據寫入速度,還能使數據更安全。
?
總結
以上是生活随笔為你收集整理的MySQL 备份和恢复策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一生所爱歌词。
- 下一篇: 配置MySQL主从复制