1. 程式人生 > >linux備份mysql資料庫冷備熱備定時備份資料

linux備份mysql資料庫冷備熱備定時備份資料

特別強調shell指令碼執行備份資料庫檔案自動穿件sql檔案寫入檔案空的原因:使用備份命令mysqldump命令要使用絕對路徑,因為直接執行時是在mysql的bin目錄下執行的,所以沒有問題,但是crontab就不是在mysql的bin下了,所以找不到mysqldump的命令了。

冷備是把資料庫服務,比如MySQL,Oracle停下來,然後使用拷貝、打包或者壓縮命令對資料目錄進行備份;那麼我們很容易想到熱備就是在MySQL或者其他資料庫服務在執行的情況下進行備份。但是,這裡存在一個問題,因為生產庫在執行的情況下,有對該庫的讀寫,讀寫頻率有可能高,也可能低,不管頻率高低,總會就會造成備份出來的資料和生產庫中的資料不一致的情況。熱備這段時間,其他人不可以操作是不現實的,因為你總不可能終止使用者訪問Web程式。要解決這個問題,可以採用指定備份策略,比如哪個時間段進行備份,備份哪些資料等等,總之,保證資料的完整性和一致性,切記,備份重於一切!!!


熱備採用的是使用mysqldump命令進行備份,此工具是MySQL內建的備份和恢復工具,功能強大,它可以對整個庫進行備份,可以對多個庫進行備份,可以對單張表或者某幾張表進行備份。但是無法同時備份多個庫多個表,只有分開備份。下面我們看下熱備的示意圖,並進行熱備模擬。

冷備份(off, 慢, 時間點上恢復)
冷備份發生在資料庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的資料庫。冷備份是將關鍵性檔案拷貝到另外位置的一種說法。對於備份資料庫資訊而言,冷備份是最快和最安全的方法。

冷備份的優點: 
1.是非常快速的備份方法(只需拷貝檔案) 
2.容易歸檔(簡單拷貝即可) 
3.容易恢復到某個時間點上(只需將檔案再拷貝回去) 
4.能與歸檔方法相結合,作資料庫“最新狀態”的恢復。 
5.低度維護,高度安全。 

冷備份的缺點: 
1.單獨使用時,只能提供到“某一時間點上”的恢復。 
2.在實施備份的全過程中,資料庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,資料庫必須是關閉狀態。 
3.若磁碟空間有限,只能拷貝到磁帶等其它外部儲存裝置上,速度會很慢。 
4.不能按表或按使用者恢復。 
值得注意的是冷備份必須在資料庫關閉的情況下進行,當資料庫處於開啟狀態時,執行資料庫檔案系統備份是無效的 。而且在恢復後一定要把資料庫檔案的屬組和屬主改為mysql。

熱備份 (on, 快)
熱備份是在資料庫執行的情況下,備份資料庫操作的sql語句,當資料庫發生問題時,可以重新執行一遍備份的sql語句。

熱備份的優點: 
1.可在表空間或資料檔案級備份,備份時間短。 
2.備份時資料庫仍可使用。 
3.可達到秒級恢復(恢復到某一時間點上)。 
4.可對幾乎所有資料庫實體作恢復。 
5.恢復是快速的,在大多數情況下在資料庫仍工作時恢復。 

熱備份的缺點: 
1.不能出錯,否則後果嚴重。 
2.若熱備份不成功,所得結果不可用於時間點的恢復。 
3.因難於維護,所以要特別仔細小心,不允許“以失敗而告終”。linux

定時執行備份的資料庫shell指令碼檔案backDataBase.sh

#!/bin/bash   
savedir=/data/mydata/databackup/
#cd "$savedir"  
my_user=root
my_pwd=123456
db_name=lxy
time="$(date +"%Y-%m-%d-%H-%M-%S")"  
echo "$time  執行資料庫$db_name備份開始 ";
/usr/local/mysql/bin/mysqldump -u$my_user -p$my_pwd --database $db_name >$savedir$db_name-"$time".sql  
cd  $savedir;
tar -zcPvf $db_name-"$time".tar.gz $db_name-"$time".sql;
rm -rf $db_name-"$time".sql;
echo "$time  執行資料庫$db_name備份結束 ";  

執行資料恢復shell指令碼

#!/bin/bash
username=root;
passwd=123456;
backfile=/data/mydata/databackup/lxy.sql;
dbname=lxy
mysql -u$username -p$passwd $dbname <$backfile;

crontab -e新增系統定時任務 每天早上5點02分執行備份;

02 5 * * * /data/mydata/databackup/backDataBase.sh >>/data/mydata/databackup/backMysqlLog.log

單獨執行命令執行如下

mysqldump -uroot -p123456  db_name > backdb.sql