当前位置:首页 > 问答 > 正文

Oracle数据库备份里那些模式怎么用才不出错,实际操作经验分享

说到Oracle数据库备份,很多人一开始会被各种模式和术语吓到,比如什么完全备份、增量备份、归档模式、非归档模式,还有RMAN工具,其实说白了,备份的核心目的就一个:万一数据库出问题了,你能用备份的东西把它完好无损地恢复回来,数据尽量少丢,下面我就结合一些老师傅的经验和实际踩过的坑,用大白话聊聊几种常见备份模式怎么用才不容易出错。

最根本的一个选择是,你的数据库要不要开启“归档模式”(ARCHIVELOG mode),这个决定直接影响了你后面能采用哪种备份策略和能恢复到什么程度,根据Oracle官方文档和大量DBA的实践经验,这是一个分水岭。

如果你用的是“非归档模式”(NOARCHIVELOG mode),那你的数据库就像是一个用记事本写日记,你每次关机(数据库关闭)的时候,才能把写好的内容(数据)一次性保存到一个单独的备份文件里(这就是冷备份或一致备份),这种模式的优点是简单,备份和恢复操作都直截了当,但缺点太要命了:你只能恢复到你做备份的那个时间点,比如你每天晚上12点做备份,那么今天上午10点数据库硬盘坏了,你最多只能把数据恢复到昨天晚上的状态,从昨晚到今天上午10点之间做的所有工作、产生的所有新数据就全丢了,这种模式一般只用在那些数据特别不重要、可以随时重建、或者几乎不更新的测试库、开发库上,生产环境几乎没人敢这么干,风险太大。

对于正经的业务系统,绝大多数情况下,你必须把数据库切换到“归档模式”,开启了这个模式,数据库就变得像在用带录音功能的电话,它不仅在日志文件里记录你的操作,还会在日志文件写满后,自动把它复制成一份份独立的“归档日志文件”保存起来,这样做的好处是,即使数据库是7x24小时不停机,你也能在它运行的时候做备份(这就是热备份),更重要的是,恢复的时候,你可以先恢复昨天晚上的完整备份,然后再把今天产生的所有归档日志文件“重放”一遍,这样就能把数据一直恢复到出故障前的那个时间点,实现所谓的“完全恢复”,数据零丢失或丢失极少(可能只丢几秒钟的数据),这是保证业务连续性的基石,很多资深DBA,比如一些Oracle ACE专家在技术分享中反复强调,生产数据库的第一条军规就是:必须运行在归档模式下。

Oracle数据库备份里那些模式怎么用才不出错,实际操作经验分享

确定了用归档模式,接下来就是具体怎么备份了,这里主要说两种最常见的组合拳:完全备份和增量备份。

“完全备份”(Full Backup)好理解,就是一次性地把整个数据库的所有数据文件、控制文件、归档日志等都打个包备份出来,这是恢复的基础,是必须定期做的,但它有个问题:如果数据库很大,每次完全备份会花很长时间,占用大量存储空间和系统资源。

Oracle数据库备份里那些模式怎么用才不出错,实际操作经验分享

为了解决这个问题,就要引入“增量备份”(Incremental Backup),增量备份不是备份全部数据,而是只备份自从上一次备份(可以是上一次完全备份,也可以是上一次增量备份)以来,哪些数据块被修改过,这就像你写了一篇长文档,第一次保存是全文保存(完全备份),之后每次只保存修改过的那几个段落(增量备份),速度快多了,备份文件也小多了。

但用增量备份有个关键点容易出错,就是级别的选择,RMAN工具里增量备份有等级(Level)的概念,比如Level 0和Level 1,根据Oracle的备份与恢复指南,这里有个核心经验:你必须把Level 0增量备份当作完全备份的基石来用,什么意思?Level 0备份虽然也是增量备份的一种,但它会备份所有被使用过的数据块,其本质和完全备份是一样的,只是它会被记录为“Level 0”,以便后续的Level 1备份(只备份上次Level 0以来变化的数据)能够识别基础,一些实际案例表明,很多人误以为Level 1可以直接基于上一个Level 1,这是不对的,一个稳妥的策略是,比如每周日晚上做一个Level 0增量备份(作为本周的基础),然后周一到周六每天晚上做Level 1增量备份,这样恢复时,先恢复周日的Level 0,再按顺序应用周一到出问题时的Level 1备份,最后应用归档日志,这种策略既节省了平时备份的时间和空间,又保证了恢复链的清晰可靠。

还有一个极其重要但容易被忽视的经验是:一定要备份归档日志文件,并且要在备份后适时删除旧的归档日志。 你在做任何形式的数据库备份(无论是完全还是增量)之后,一定要紧接着备份一次当前所有的归档日志文件,并确认备份成功,因为恢复数据库时,光有数据文件备份是不够的,还必须要有从备份开始那一刻到恢复目标时间点之间的所有归档日志,如果不备份它们,或者备份失败,你的恢复操作就可能卡在半路,无法到达最新状态,磁盘空间是有限的,归档日志会不停地产生,所以要根据你的备份策略和保留策略,定期用RMAN命令删除已经备份过的旧归档日志,避免把磁盘撑爆导致数据库挂起,这个“备份并清理”的日常维护操作,是保证备份系统健康运行的关键习惯。

再强调一条黄金法则:任何备份策略在没有经过成功恢复验证之前,都等于没有备份。 你配置了再漂亮的备份脚本,设置了再科学的备份计划,如果从来没有在实际的测试环境里完整地演练过恢复过程,那么一切都是纸上谈兵,你不知道你的备份文件是否真的完好无损,不知道恢复步骤是否会遇到意想不到的错误,也不知道整个恢复过程到底需要多长时间,只有定期做恢复演练,才能确保当真正的灾难发生时,你能够从容不迫地把数据库救回来,这是所有有经验的数据库管理员最深刻的共识。