版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://sds07s7.blogbus.com/logs/62548066.html
玩Oracle也有2年的时间了, 零零散散的也整理一些资料。 东西一多了,就理不清楚。 所以结合张晓明的《大话Oracle RAC》的一些内容,和自己整理的一些笔记,对Oracle 的备份和恢复做了一个系统的整理。 也是自己对知识的一个巩固吧。
一. 准备知识
先来看一些准备知识,了解Oracle的物理结构,有如下4种。
1. 数据文件和数据块
Oracle 数据库的存储空间是用表空间来表示的,表空间只是一个逻辑概念,而物理上每个表空间是由磁盘文件组成,这些文件叫做数据文件(Data file),每个表空间可以由一个到多个数据文件组成,每个数据文件被划分为若干个最小的存储单位: 数据块(data block)。
具体参考我的blog: 表空间(tableSpace) 段(segment) 盘区(extent) 块(block) 关系
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/13/4962476.aspx
Oracle 的用户数据是写到数据块上的,Oracle 是在SGA上操作数据的,修改数据或者添加数据都是在内存中进行,这些被修改的内存不会立即写入磁盘,而是以特定的时间间隔被写入磁盘。 如果哦数据库正常关闭,则在关闭之前将内存中的数据同步到磁盘,这时数据状态是一致的。如果数据库不正常关闭(如宕机,shutdown abort),内存中的内容没有完全写回磁盘,这时数据文件是不一致的。 如果数据文件是从备份中恢复出来的,数据文件也是不一致的,不一致性的数据文件必须恢复到一致的状态。
2. 日志文件
Oracle 数据库日志文件包括 联机日志 和 归档日志, 这些文件都是用来记录数据库修改历史的。Oracle 数据库至少要有两组联机日志,联机日志循环使用,当一组联机日志写满后,就要切换到另一组联机日志,后者的内容就会被覆盖,这个过程叫作日志切换(Log Switch),在日志切换时会触发检查点(CheckPoint)。
数据库的修改操作要记录到日志文件中,并且这个记录动作是在修改数据之前进行的,正因为日志文件中记录了所有的修改历史,因此如果有过去某个时点的备份文件,并且有从那是到当前的所有日志文件,就可以通过在备份文件上"重演"这些日志的方式,把数据文件恢复到当前状态或者之间的任何时点的状态。
日志线程(Redo Thread):
每个实例用到的联机日志就是一个Redo Thread,单实例有且仅有一个Redo Thread。在RAC 环境下,每个实例都需要自己的联机日志,也就是每个实例都有自己的Redo Thread。 这种每实例一个Redo Thread的设计就是为了避免实例间共享Redo 文件引发的竞争,提高系统性能。 但是这也带了一个问题,就是用RMAN 备份RAC 的时候,需要所有的日志文件。 故需要在两个节点上互相把日志传送到另一个节点。
Thread 这个参数用来指定实例使用的Redo Thread 线程号。一般和该实例的INSTANCE_NUMBER 参数相同。 通过视图V$LOG的Thread#列可以确定日志组所属的线程。
注意: 因为RAC 环境下有多个日志线程,所以在添加日志时必须指定线程号。
SQL>alter database add logfile thread 1 group 5 ('/oracle/oradata/redo5') size 50m;
在RAC 环境下,用户操作是分布在多个实例之间的,各实例都有自己的联机日志,恢复时必须把所有实例的联机日志都合并,把Redo Log Record 按照SCN 排序,才能整理出准确的用户操作记录,所以RAC的联机日志必须放在共享存储上,以保证实例都能访问其他实例的联机日志。
在看一个sql 的查询结果:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ---------------- ----
1 1 24585 104857600 1 YES ACTIVE
2 1 24583 104857600 1 YES INACTIVE
3 1 24584 104857600 1 YES INACTIVE
8 1 24586 104857600 1 NO CURRENT
从查询结果上,我们可以看到联机日志有3个状态。
INACTIVE: 表示DBWR 已经做完,该日志包含的数据修改已经写到数据文件
ACTIVE: DBWR 没有做完,数据还没有写到数据文件。
CURRENT:当前正在使用的日志。 没有DBWR 操作。
RedoLog Checkpoint 和 SCN关系
http://blog.csdn.net/tianlesoftware/archive/2010/0 1/25/5251916.aspx
Redo Log 和Checkpoint not complete
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/01/4908066.aspx
Oracle 归档与非归档的切换
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/19/4693470.aspx
log file sync(日志文件同步) 与 Log file parallel write 等待事件
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/02/4916671.aspx
3. 控制文件
控制文件记录了数据库的物理结构和状态(比如数据文件名,每个数据文件的检查点号,联机状态),包括备份和恢复的信息也记录在控制文件中。 恢复过程要根据控制文件中的信息,比如数据库的检查点,当前联机日志,数据文件检查点等来进行恢复操作,如果控制文件丢失,则恢复的过程会很艰难。
控制文件里包含的具体信息,参考我的Blog:
Oracle 控制文件
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/13/4974440.aspx 4. Undo Segment修改记录过程中,记录修改之前的状态会被记录到Undo Segment中, 这条记录叫作前镜像(before images)。 当需要撤销修改比如执行Rollback时,就用这条前镜像覆盖现有记录,对于Insert 操作,前镜像就是一个空记录,对于Undate,Delete 操作,前镜像就是修改之前的记录。
在数据库恢复过程中,日志和Undo Segment 共同起作用,二者保证了最终恢复的一致状态。二者也对应了恢复的两个阶段: 前滚(Roforware)和 回滚(Rollback)。在前滚阶段,在文件上重演日志内容,以把文件恢复到数据库关闭时的状态,但是数据库关闭时可能有很多修改操作没有提交,这些操作必须进行回滚,这就要利用Undo Segment的内容。
Oracle undo 回滚段管理
http://blog.csdn.net/tianlesoftware/archive/2009/1 1/30/4901666.aspx
二.备份
备份是指数据的拷贝,这个拷贝可以用来重建数据库。 备份可以分为物理备份和逻辑备份。
物理备份: 指对数据文件,控制文件,联机日志文件等文件进行物理拷贝的方法,这种方法是在文件层进行的,通过冗余的文件备份来体统数据保护。物理备份又可分为联机备份(也叫作联机热备)和脱机备份(也称冷备)。
逻辑备份: 利用Oracle 提供的导出工具把重要数据导出到文件,以后恢复时在利用工具把数据重新导入到数据库中,这种保护是在数据层进行的。 该类工具有: exp/imp, expdp/impdp(10g 以后版本)。
物理备份是最强健的数据保护方也,也是备份策略中首选的方法,逻辑备份只能作为物理备份的补充手段,不足以保护数据丢失。
物理备份又可分为用户管理备份(User-Managed Backup)和RMAN备份(Recovery Manager)。 前者是联合使用SQL 命令和OS的cp 命来进行文件备份。 Rman 备份指利用RMAN 工具来进行备份。
Rman 备份有几点好处:
1. 增量备份
2. 数据块恢复:可以在新进行数据块恢复,不必进行数据文件恢复,提高系统的可用性。
3. 压缩备份
4. 加密备份
具体用法参考blog:
RMAN 备份与恢复 实例
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/20/4699320.aspx
Oracle Rman 命令详解(List report backup configure)
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/13/4976998.aspx
Oracle Rman跨resetlogs版本恢复
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/17/4682463.aspx
ORACLE 数据库逻辑备份 简单 EXP/IMP
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/24/4718366.aspx
Oracle 10g EXPDP和IMPDP使用说明
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/16/4674224.aspx
三.恢复
3.1 理论知识:
Oracle 在运行过程中,所有对于数据的修改都是在内存中进行,Oracle 每要修改一个记录必须先把记录所在的数据块加载到内存中,然后在内存中进行修改。但是提交(commit)时,修改的数据块不会立即写回磁盘。基于性能考虑,Oracle是采用"延时写"的算法定期批量的把数据块写回磁盘。因此在数据库运行过程中,内存的内容总是比磁盘数据新。 当数据库正常关闭时(Shutdown Immediate,shutdown normal,shutdown tracsactional),Oracle 会把SGA内容全部写回磁盘后才关闭数据库,这时内存和磁盘就完全同步了。 所以正常关闭数据库后数据不会丢失,但是如果数据库是异常关闭(突然短线,shutdown abort),内存中的数据来不及同步到磁盘,这是就会产生了数据不一致,Oracle 在次打开数据库时,就需要进行实例恢复。
Oracle 的Redo 机制保证了数据库恢复的可行性,在修改数据之前,代表本次修改操作的Redo记录必须先被保存下来(Write Ahead Logging),然后才真正修改数据记录。在处理commit语句时,Oracle 会在Log buffer产生一条commit 记录,为了保证事务的持久化,所有Redo 记录和这一条commit记录都要被写到磁盘的联机日志文件(Log Force At commit),但是数据块(Data Block)不必写回磁盘。 如果联机日志空间不够,还会触发日志切换(Log Switch),旧日志的检查点必须完成才能被覆盖,如果采用归档模式,这个日志还必须完成归档才能覆盖。
这些日志中都会带有SCN,SCN类似于时间戳,Oracle 按照SCN对日志内容进行排序,就可以得到操作历史,Oracle 也是根据SCN来判断数据文件是否需要恢复的。
数据库在正常运行时,每个数据文件的终止SCN(STOP SCN)会被设置为无穷大(NULL),而其他的那些SCN应该完全一样。如果数据库正常关闭,关闭之前会执行一个检查点动作,每个数据文件的终止SCN 会被设置成启动SCN(Start SCN)。 如果数据库异常关闭,终止SCN 来不及设置为启动SCN,仍然保持NULL。
当clean shutdown 时,checkpoint会进行,并且此时datafile的stop scn和start scn会相同。 等到我们开启数据库时,Oracle检查datafile header中的start scn和存于control file中的datafile的scn是否相同, 如果相同,接着检查start scn和stop scn是否相同,如果仍然相同,数据库就会正常开启,否则就需要recovery... 等到数据库开启后,储存在control file中的stop scn就会恢复为NULL值,此时表示datafile是open在正常模式下了。
如果不正常SHUTDOWN (shutdown abort),则mount数据库后,你会发现stop scn并不是等于其它位置的scn, 而是等于NULL,这表示Oracle在shutdown时没有进行checkpoint,下次开机必须进行crash recovery。
注意:当发生checkpoint时,会把SCN写到四个地方去。三个地方于control file内,一个在datafile header。
Control file三个地方为
1.System checkpoint SCN
2.2.Datafile checkpoint SCN
3.Stop SCN 另外一个地方在datafile header内
4.Start SCN
更多内容参看blog: RedoLog Checkpoint 和 SCN关系 http://blog.csdn.net/tianlesoftware/archive/2010/0 1/25/5251916.aspx Oracle恢复可以分成实例恢复(Instance Recovery),介质恢复(Media Recovey),其中介质恢复又可分为完全恢复(Complete Recovery)和不完全恢复(Incomplete Recovery)。 |