如何安全地保存資料一直是IT管理的重要項目,而勤做資料備份絕對是最重要的例行工作。本文將以MySQL資料庫為例,實際示範幾種資料備份的機制,包括以mysqlpump進行備份、透過XtraBackup備份資料庫,以及使用MySQL內建的GTID機制來同步主資料庫與從資料庫內的資料。
但或許是程式的漏洞,此檔案並未加上datadir的選項(此選項是指定資料庫的所在目錄,表示要將檔案還原至此目錄)。
以筆者環境為例,datadir應該設為「/usr/local/mysql5/var」,因此必須在backup-my.cnf內加上「datadir=/usr/local/mysql5/var」設定。
接著要特別注意,由於在還原時,XtraBackup要求要還原的目錄必須為空目錄,因此必須先將「/usr/local/mysql5/var」更名或移除,以保持該目錄為空的狀態,建議採用更名的方式。
在停止從資料庫伺服器的運作後,執行下列指令來更名:
mv /usr/local/mysql5/var/ /usr/
local/mysql5/var-old
接著,就可以進行還原。在此假設備份檔案都存放在名稱為「db」的目錄下,即可利用執行下列指令來還原資料庫:
innobackupex --defaults-file=db/
backup-my.cnf --copy-back db
如果在執行完成後出現如圖4所示的畫面,就表示還原成功,已經備份檔案還原至「/usr/local/mysql5/var/」目錄下。
|
▲圖4 結果顯示還原成功。 |
接著,重新設定「/usr/local/mysql5/var」的權限,執行如下指令:
chown -R mysql:mysql /usr/local/
mysql5/var
最後,重新啟動MySQL伺服器即可。
在說明全資料庫的備份還原的方式後,接著講解如何備份還原單一資料庫。
備份還原單一資料庫
以名稱為「test」的資料庫為例,同樣地,在主資料庫伺服器上執行下列指令來備份「test」資料庫,並以壓縮檔案的形式儲存:
Innobackupex --user=mybackup
--password=mybackup --databases=
test--stream=tar --socket=/
tmp/mysql.sock --port=3306 /
mybackup/$(date +%F)|gzip >/
mybackup/$(date +%F).
tar.gz
在備份完成後,同樣在從資料庫伺服器上進行還原程序,還原步驟如下所示:
停止從資料庫伺服器的運作。
在備份檔案中的backup-my.cnf加上「datadir=/usr/local/mysql5/var/test」(以備份test為例)。
將原先的test資料庫目錄更名,以防萬一還原失敗,還可回復原狀,指令內容如下:
mv /usr/local/mysql5/var/test /
usr/local/mysql5/var/test-old
將從資料庫伺服器上原先的「ibdata1」更名,以防萬一還原失敗,還可回復原狀,執行如下指令:
mv /usr/local/mysql5/var/ibdata1 /
usr/local/mysql5/var/ibdata1-old
假設還原檔案是置於「db」目錄下,以下列指令進行還原:
innobackupex --defaults-file=db
/backup-my.cnf --copy-back db
在還原程序成功後,便會在「/usr/local/mysql5/var/test」下再產生一個「test」目錄,而此目錄內的檔案,才是要還原的「test」資料庫的檔案。
然後,將還原檔中的ibdata1搬移到「/usr/local/mysql5/var/」:
mv /usr/local/mysql5/var/test/
ibdata1 /usr/local/mysql5/var/
接著,搬移還原檔的檔案至正確的位置:
mv /usr/local/mysql5/var/test/test
/* /usr/local/mysql5/var/test/
緊接著,執行如下指令重新設定權限:
chown -R mysql:mysql /usr/local/
mysql5/var/
最後,再重啟從資料庫伺服器即可。
上述不管是使用mysqlpump或XtraBackup程式來進行備份,主資料庫均會與從資料庫存在一定時間的落差。例如定時每天備份主資料庫,從資料庫的內容與主資料庫的內容可能就存在一天的落差。