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

Oracle数据库里头,用户管理角度讲讲备份恢复和重做日志那些事儿

在Oracle数据库这个“大仓库”里,用户管理就像是仓库管理员的工作,你不仅要确保货物(也就是数据)能顺利进出,更重要的是,万一仓库失火、水管爆裂或者有人误操作损坏了货物,你得有办法把仓库恢复到出事前的样子,保证业务不中断,这里面的核心法宝,备份恢复”和“重做日志”这两件事,它们俩的关系,好比是“存档点”和“操作记录”,紧密相连,缺一不可。

第一部分:重做日志——数据库的“黑匣子”

想象一下,你正在玩一个不能随时存档的单机游戏,但游戏有个功能,会把你所有的操作指令(向前走三步”、“挥剑一次”)一字不差地记录下来,这个记录本,就是Oracle的重做日志(Redo Log)。(来源:Oracle官方文档中关于重做日志的基本概念)

它的核心作用是记录所有对数据产生的变更,当任何用户执行了INSERT(新增)、UPDATE(修改)、DELETE(删除)这些会改变数据的操作时,Oracle并不会立刻、直接把修改后的数据写入到存储数据的永久文件(数据文件)里,那样做太慢了,因为要到处找位置,Instead,它会先把这些“变更动作”用最快的速度写到重做日志文件里,你可以理解为,它先记下“流水账”:“在A表的第100行,把工资字段从5000改成6000”。

这个“黑匣子”通常由好几个文件组成,循环使用,写满了一个,就切换到下一个,就像录音机的磁带一样,当最后一个写满后,又回过头来覆盖第一个文件继续写,这个过程叫做日志切换。(来源:Oracle架构中日志切换与检查点的描述)

那为什么要覆盖?因为Oracle认为,如果一次变更操作已经被完整地记录了下来,并且这个变更所产生的“脏数据”也已经安全地写入了永久的数据文件中(这个过程由一个叫检查点的机制来保证),那么这部分重做记录的历史使命就基本完成了,就可以被覆盖再利用了,这确保了重做日志文件不会无限膨胀。

重做日志的核心价值在于:保证数据的一致性提供恢复的能力,万一数据库突然断电,内存里还没来得及写入数据文件的数据就丢了,但没关系,因为“操作记录”在重做日志里存着呢,重启数据库后,Oracle会自动读取重做日志,把那些已经发生但还没写入数据文件的变更重新操作一遍,这样数据就恢复到了断电前的状态,一点不差,这个自动过程叫实例恢复。(来源:Oracle恢复机制中的实例恢复原理)

第二部分:备份恢复——仓库的“保险单”

重做日志能救急,但它只能解决短时间内的、小范围的故障,比如突然断电,如果遇到更严重的问题,比如存储数据的硬盘整个坏掉了,或者有人误执行了“DELETE FROM 重要客户表”这种毁灭性的命令,光靠循环覆盖的重做日志就无能为力了,因为坏掉的硬盘上的数据文件没了,或者错误的操作也被忠实记录了下来。

这时候,就需要我们事先准备好的“保险单”——备份

从用户管理的角度看,备份主要分两种:

  1. 物理备份:这是最根本、最直接的备份,说白了,就是定期把数据库那些核心的、存储数据的物理文件(主要是数据文件、控制文件)原样复制一份,存到另一个安全的地方,比如另一块硬盘或者磁带库里,这就像给整个仓库的货物清单和货架结构拍了一张完整的快照。(来源:用户管理的备份恢复手册中对物理备份的定义)
  2. 逻辑备份:这个工具叫数据泵,它不像物理备份那样复制整个文件,而是把数据库里的对象(比如表、视图、存储过程)的结构和数据,用一种SQL语句的形式“导出”成一个文件,恢复的时候,再把这些SQL语句执行一遍,把数据和对象“导入”重建,这好比不是拍货架的照片,而是把仓库里每件货物的名称、规格、位置等信息列成一张详细的清单。

物理备份是恢复的基石,逻辑备份则更灵活,常用于迁移特定数据或修复某些表的误操作。

第三部分:备份与日志如何协同工作——上演“时光倒流”

备份和重做日志是怎么配合起来实现“时光倒流”的呢?我们模拟一个最经典的场景:硬盘损坏,丢失了部分数据文件。

  1. 拿出保险单:找到最近一次做的那个完整的物理备份(比如上周六晚上的冷备份或热备份),把它恢复到原来的位置,这时候,数据库的状态就回到了上周六晚上的样子。
  2. 翻阅黑匣子记录:显然,从上周六晚上到今天出事之间好几天的数据都丢了,别急,重做日志(及其归档副本)登场了,自从上次备份后,所有的数据变更都详细记录在重做日志里,为了不让循环日志被覆盖,DBA会开启归档模式,让数据库在覆盖一个重做日志文件前,先把它复制一份保存起来,这个副本叫归档日志。(来源:归档模式与非归档模式的对比)
  3. 重放操作:DBA会告诉Oracle:请从上周六备份恢复完成的那个时间点开始,按顺序重新应用(Reapply)之后所有的归档日志和还没有被归档的重做日志,Oracle会像放电影一样,把这一段时间里所有提交过的数据变更操作,严格按照顺序重新执行一遍。
  4. 恢复到故障点:当所有有效的记录都重放完毕,数据库就神奇地恢复到了硬盘损坏前的那一刻的状态,那些在备份之后才产生的新数据,也都回来了,这个过程叫做不完全恢复(如果只恢复到某个错误操作之前)或完全恢复(如果恢复到故障发生的最后一秒)。(来源:用户管理恢复场景的分类)

备份决定了我们能回到多远的过去(备份时间点),而重做日志和归档日志决定了我们能“前进”到离故障点多近的地方,备份的频率(比如每天备还是每周备)决定了你可能丢失的数据量(恢复点目标,RPO),而恢复过程的速度则决定了业务中断的时间(恢复时间目标,RTO)。

对于Oracle数据库的用户管理者来说,理解备份恢复和重做日志,就是理解如何构建一套“安全网”,你要做的就是:合理地规划并执行物理和逻辑备份,确保归档模式开启以保存完整的历史操作记录,并定期测试恢复流程,当真正的问题发生时,你才能心中有底,从容不迫地把数据库拉回到正轨,保障数据的安全和业务的连续性。

Oracle数据库里头,用户管理角度讲讲备份恢复和重做日志那些事儿