我可以“刷新并locking”Oracle数据库来执行文件系统备份吗?

我正在使用ZFS创build运行OpenVZ容器的快照。

对于MySQL数据库,我可以使用flush tables with read lock将其置于刷新和locking状态。 这将使底层文件处于一致的状态,并保留任何传入的查询,直到完成快照为止,最多花费几秒钟的时间。

这是一个示例脚本,没有错误检查和其他内务处理代码:

 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数据库做同样的事吗?

是否有一个命令可以刷新其表空间,将它们置于一致的状态,适合备份,并保留任何活动,直到解锁为止?

我宁愿避免重新configurationOracle直接使用ZFS作为存储后端,因为简单的OpenVZ容器非常适合我。 事实上,我宁愿有一些低维护技术,没有任何复杂的Oracle设置,如果有的话。

如何阻止Oracle工作是没有办法的。 即使是备份,也是后台非阻塞进程。 使用RMAN进行备份(重新开始)。

另一种方法是使用非常老派的方法。

  • 创build用于备份的备用控制文件(它将创buildOracle控制文件的备份副本 – 在其中具有一些旧的SCN)
  • 执行alter database begin backup 。 这不会停止对数据文件的IO操作。 只有SCN不会写入其中
  • 现在你可以创build快照。
  • 执行alter database end backup
  • 现在您还备份了数据库生成的所有归档重做日志

恢复工作如下:

  • 将备份控制文件复制到正确的位置
  • 复制数据文件(或使用快照)
  • 尝试启动数据库。 数据库将认识到SCN不同,数据文件处于不一致的状态。 因此,它将重新应用来自重要内容的所有更改。
  • 那么你可以打开数据库

整个过程比较复杂,你应该读些关于它的东西。 互联网上有各种各样的文章。 这确实需要一些知识。

恕我直言 – 你的要求没有多大意义。 MySQL对备份没有任何合理的支持,而且人们往往会通过各种诡计绕过这个限制。 商业数据库具有对备份的原生支持,并提供更多的function,然后ZFS文件系统。 例如,您可能会发现PITR(即时点恢复)非常有用。 所以我真的会build议您使用Oracle的RMAN备份,特别是如果您不熟悉Oracle体系结构。

PS:SCN代表系统更改号码。 这个数字随着数据库中的变化而增加,并被写入到每个Oracle数据文件中。

PPS:如果你想恢复数据库状态,你可以使用FLASHBACK DATABASE命令。