Mysql
我可以“刷新並鎖定”一個 Oracle 數據庫來進行文件系統備份嗎?
我正在使用 ZFS 拍攝正在執行的 OpenVZ 容器的快照。
對於 MySQL 數據庫,我可以
flush tables with read lock
用來將它們置於刷新和鎖定狀態。這將使基礎文件處於一致狀態並保留任何傳入查詢,直到我完成快照,這最多需要幾秒鐘。這是一個範例腳本,沒有錯誤檢查和其他內務程式碼:
vz_root=/var/lib/vz/root/$veid mysql_locked=/var/run/mysql_locked # flush & lock MySQL, touch mysql_locked, and wait until it is removed vzctl exec $veid mysql -NB <<-EOF & flush tables with read lock; delimiter ;; system touch $mysql_locked system while test -e $mysql_locked; do sleep 1; done exit EOF # wait for the preceding command to touch mysql_locked while ! test -e $vz_root$mysql_locked; do sleep 1; done # take a snapshot of the VZ filesystem, while MySQL is being held locked zfs snapshot zpool/private/$veid@$(date +"%Y-%m-%d_%H:%M") # unlock MySQL rm -f $vz_root$mysql_locked
我可以為 Oracle 數據庫做同樣的事情嗎?
是否有一個命令可以刷新其表空間,使它們處於一致狀態,適合備份,並保持任何活動,直到我解鎖它?
我寧願避免重新配置 Oracle 以直接使用 ZFS 作為儲存後端,因為簡單的 OpenVZ 容器非常適合我。事實上,我寧願有一些低維護技術,沒有任何復雜的 Oracle 設置(如果有的話)。
“沒有辦法”如何阻止 Oracle 工作。甚至備份也是後台非阻塞程序。使用 RMAN 進行備份(推薦)。
另一種方法是使用非常老派的方法。
- 為備份創建備用控製文件(它將創建 Oracle 控製文件的備份副本 - 其中包含一些舊的 SCN)
- 執行
alter database begin backup
. 這不會停止針對數據文件的 IO 操作。只有SCN不會寫在裡面- 現在您可以創建快照了。
- 執行
alter database end backup
- 現在您還備份了數據庫生成的所有歸檔重做日誌
恢復工作如下:
- 將備份控製文件複製到正確的位置
- 複製數據文件(或使用快照)
- 嘗試啟動數據庫。數據庫將辨識 SCN 不同,並且數據文件處於不一致狀態。因此它將重新應用重做日誌中的所有更改。
- 然後你可以打開數據庫
整個過程比較複雜,你應該閱讀一些有關它的內容。網上有各種各樣的文章。這確實需要一些知識。
恕我直言-您的要求沒有多大意義。MySQL 對備份沒有任何合理的支持,人們傾向於通過各種 hack 繞過這個限制。商業數據庫具有對備份的內置本地支持,並且確實提供了比 ZFS 文件系統更多的功能。例如,您可能會發現 PITR(時間點恢復)非常有用。所以我真的建議你為 Oracle 使用 RMAN 備份,特別是如果你不熟悉 Oracle 架構。
PS:SCN 代表 System Change Number。每當數據庫發生變化時,這個數字就會增加,並寫入每個 Oracle 數據文件。
PPS:如果要恢復數據庫狀態,可以使用 FLASHBACK DATABASE 命令。