我正在使用 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 进行备份(推荐)。
另一种方法是使用非常老派的方法。
alter database begin backup
. 这不会停止针对数据文件的 IO 操作。只有SCN不会写在里面alter database end backup
恢复工作如下:
整个过程比较复杂,你应该阅读一些有关它的内容。网上有各种各样的文章。这确实需要一些知识。
恕我直言-您的要求没有多大意义。MySQL 对备份没有任何合理的支持,人们倾向于通过各种 hack 绕过这个限制。商业数据库具有对备份的内置本地支持,并且确实提供了比 ZFS 文件系统更多的功能。例如,您可能会发现 PITR(时间点恢复)非常有用。所以我真的建议你为 Oracle 使用 RMAN 备份,特别是如果你不熟悉 Oracle 架构。
PS:SCN 代表 System Change Number。每当数据库发生变化时,这个数字就会增加,并写入每个 Oracle 数据文件。
PPS:如果要恢复数据库状态,可以使用 FLASHBACK DATABASE 命令。