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