Mysql

我可以“刷新並鎖定”一個 Oracle 數據庫來進行文件系統備份嗎?

  • June 4, 2015

我正在使用 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 命令。

引用自:https://serverfault.com/questions/696603