欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle 备份恢复原理 博客分类: Oracle 管理  

程序员文章站 2024-03-22 12:55:22
...
Oracle 的工作模式:
1.Archive
2.Noarchive.

归档模式实际上是保留重做日志文件的副本(当在线重做日志切换时),当数据库down掉时,可以利用以前的备份文件+重做日志(归档及online模式)进行恢复。
查看归档模式
此命令只能是sysdba的权限才可以执行。
SQL>Archive log list;

若是DBA权限,需要下面的语句查看
SELECT log_mode from v$database.

归档和非归档如何转换?
1.启动到Amount状态 
sys@ORCL> startup mount
2.启动到归档模式
sys@ORCL> alter database archivelog;
sys@ORCL> archive log list;
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     295
下一个存档日志序列   297
当前日志序列           297
3.正常启动
alter database open;

归档日志保存的位置:

sys@ORCL> show parameter DB_RECOVERY_FILE_DEST

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      F:\oracle\product\10.2.0\db_1/
                                                 flash_recovery_area
db_recovery_file_dest_size           big integer 2G

--查看重做日志的信息
SELECT 
GROUP#,--第几组日志
SEQUENCE#, --标示重做日志的唯一标示
BYTES,--日志文件大小
ARCHIVED,--标示是否已经归档
STATUS,--状态
FIRST_CHANGE#,--此日志文件记录的SCN开始
FIRST_TIME--日志文件记录开始时间
FROM V$LOG;

select * from v$logfile;--重做日志文件

--切换日志状态,改变当前归档日志
alter system switch logfile;

--归档当前日志文件,并切换日志(只能使用在归档模式下)
alter system archive log current;

------------------------------------------------------------------------------------------------------------
--另外一个重要的概念,SCN(SYSTEM CHANGE NUMBER)
SCN是Oracle的内部时钟


查询系统的SCN,此SCN是大约每隔三秒种增加1
sys@ORCL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                12342762
--另外一个查询方式,此查询每次都会增加1
SELECT CURRENT_SCN FROM v$database;


--查看归档日志的内容

SELECT 
SEQUENCE#,--日志文件标示
FIRST_CHANGE#, --日志文件记录的开始SCN(为上条记录的NEXT_CHANGE#)
NEXT_CHANGE# --日志文件记录的结束SCN
FROM V$ARCHIVED_LOG;

--备份恢复原理

数据库打开的必要条件,这两个视图中的CHECKPOINT_CHANGE需要一致。
v$datafile_header 来之与数据文件,v$datafile信息来之与控制文件。
若数据文件由于问题损坏,使用备份文件+重做日志完成恢复(增大数据文件的SCN号)。

sys@ORCL> select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1           12344521
         2           12344521
         3           12344521
         4           12344521
         5           12344521
sys@ORCL> select file#,checkpoint_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1           12344521
         2           12344521
         3           12344521
         4           12344521
         5           12344521

----备份恢复的种类
--注意备份文件最好存放在另外的磁盘上。
1.完全脱机备份(ARIVELOG|NOARCHIVELOG)

缺点:
需要shutdown
物理拷贝整个文件,而不是有用的数据。

非归档模式(NOARCHIVELOG)只能使用此方式,shutdown之后,进行物理备份。
备份的内容包括:
数据文件(包括undo文件,可以不包括临时文件),
日志文件,
控制文件,(只备份一个就ok,其他都是镜像文件)

当使用此模式恢复时(全部文件复制回去),数据会有所丢失。数据时截止到备份的时间点。

归档模式下(ARCHIVELOG),把备份的文件进行恢复。
数据库打开时,提示介质恢复,输入命令

sys@ORCL> recover datafile 4

  ORA-00279: 更改 12344520 (在 06/15/2013 10:48:14 生成) 对于线程 1 是必需的
  ORA-00289: 建议:
  F:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2013_06_16\O1_MF_1_305_%U_.ARC
  ORA-00280: 更改 12344520 (用于线程 1) 在序列 #305 中
  指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

输入enter 即使用建议的归档日志恢复。
或者数据绝对路径进行恢复。
Auto是全部按照Oracle建议的归档文件进行恢复。
CANCEl是取消恢复

12344520实际上对应的是4号数据文件的文件头号。

当需要使用的归档日志可以使用online重做日志时,就不会于提示,直数据接进行恢复。
当完全恢复完成之后,会发现数据文件头上的SCN号小一相对于控制文件,但没有影响。

若想同时恢复多个数据文件,可以直接使用以下命令:
recover database;

当恢复完后,
Alter database open;

2.部分脱机备份(tablespace offline)

实际上利用tablespace offline后进行物理备份。
当tablespace offline时,Oracle会自动的把此表空间的相关数据写入表空间中。所以此数据文件的SCN会高一些相比其他数据文件

缺点:备份时,相应的表空间上的数据无法读取。
SYSTEM和UNDO表空间都不能offline备份。
经测试,临时表空间也是不能offline的。

恢复过程:
拷贝备份文件至数据文件目录,执行 alter tablespace online.提示需要恢复
执行recover datafile xx;
恢复完之后,alter tablespace online.当执行完后,Oracle会同时更新此数据文件在控制文件及文件头上的SCN号至最新。

此恢复过程可以在数据库OPEN状态下进行。

完全检查点实现时,全部的数据文件会同步检查点号。会以两个方式实现此功能:
  1.shutdown
  2.alter system checkpoint;

-- 当临时表空的文件被删除时,数据库仍然可以启动。Oracle会自动创建一个临时表空间文件。

3.部分联机备份

此备份必须在archive 模式进行,否则报错 ORA-01123: 无法启动联机备份; 未启用介质恢复
缺点:
备份方式采用os copy,数据文件仍处于online状态,有可能出现问题。出现一个块中不一致的数据。
举例,假设你正在备份第100个块在users.dbf文件中。假设os copy读取整个数据块同时DBWR正在更新这个block。在这种情况下,os copy读取了
旧的前半块的数据,和新的数据在块的另一半。这种情况属于破损的块,这个块上的数据在一个scn上是不一致的。
·针对这种情况,Oracle采用了一种保护机制,当表空间处于backup mode(联机备份),每次一个块被改变前,数据库会写整个块的前镜像入redo
中,修改后,也会记录这种变化到redo log中。当恢复时,数据库针对这种破损的块,会先恢复块前镜像,及使用redo中的变化进行恢复。
此方式会导致增加许多redo log。
RMAN不会使用此方式,因为RMAN是Oracle进程备份,不会出现这种破损的块。



备份命令
alter tablespace users begin backup;

查看部分联机备份情况
SELECT  
FILE#, --文件号
STATUS,--ACTIVE标示处于备份状态
CHANGE#,--记录处理备份状态的SCN号
TIME
FROM V$BACKUP;

OS copy表空间的文件。

结束备份
alter tablespace users end backup;

通过观察,当设置表空间为部分联机备份后,数据文件头上面的SCN号会一直保留在当时的SCN上。直到END backup。
但不会影响此表空间上的数据查询及DML语句。

备份整个数据库

alter database begin backup;
alter database end backup;