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

我可以“刷新并锁定” 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 设置(如果有的话)。

答案1

没有办法停止 Oracle 的工作。即使备份也是后台非阻塞进程。使用 RMAN 进行备份(建议使用)。

另一种方法是采用非常传统的方法。

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

恢复过程如下:

  • 将备份控制文件复制到正确的位置
  • 复制数据文件(或使用快照)
  • 尝试启动数据库。数据库将识别出 SCN 不同,并且数据文件处于不一致状态。因此它将重新应用重做日志中的所有更改。
  • 然后你就可以打开数据库

整个过程比较复杂,你应该阅读一些相关内容。互联网上有很多文章。这确实需要一些知识。

恕我直言 - 您的请求没有多大意义。MySQL 没有任何合理的备份支持,人们倾向于通过各种黑客手段绕过此限制。商业数据库内置了对备份的本机支持,并且确实提供了比 ZFS 文件系统更多的功能。例如,您可能会发现 PITR(时间点恢复)非常有用。因此,我真的建议您使用 RMAN 备份 Oracle,特别是如果您不熟悉 Oracle 架构的话。

PS:SCN 代表系统更改编号。每当数据库中发生更改时,此数字就会增加,并被写入每个 Oracle 数据文件中。

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

相关内容