Oracle10g备份与恢复之物理备份--OS物理备份
本篇文章来说明Oracle数据库的物理备份方式中的用操作系统OS方式进行的备份。之前说过,物理备份分为脱机的冷备份(数据库关闭状态下)和联机的热备份(数据库运行状态下)。本文就来说明OS方式的冷备份与热备份。在讲解实例之前,先说明两个知识点,数据库的启动顺序和归档模式。
数据库的启动顺序用三种命令,实现不同的阶段:
STARTUP NOMOUNT,启动数据实例。
STARTUP MOUNT,启动数据实例,加载数据库。
STARTUP,启动数据实例,加载数据库并打开数据库。
Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组,每个日志组最少有一个日志文件成员,每个成员的内容是一样的,也就是说如果存在多个磁盘,就可以利用多个磁盘,为每个日志文件组建立多个成员,以应对磁盘损坏性质的数据恢复,如果只有一个磁盘,为每个日志组建立多个成员就没太大必要了。当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志1,当1写满的时候,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。
数据库使用归档方式运行时才可以进行灾难性恢复。
归档日志模式和非归档日志模式的区别:
非归档模式恢复时只能做完全备份恢复。最近一次完全备份到系统出错期间的数据不能恢复。
归档模式才可以做热备份,并且可以做增量备份,可以做部分恢复。在归档模式下,数据库数据文件出现问题,如果日志文件完好,则在恢复时,数据库就可以根据日志文件进行前滚操作或回滚操作来还原数据。前滚是指数据操作记录在日志里的完整事务还没有写到数据文件中的操作,回滚是指一个整个的事务,执行了一半,写入了部分数据,为保证数据的一致性,需要强制撤销这部分未完成的操作。
虽然在归档模式下可以保证数据库在恢复时数据丢失到最小的级别,甚至零丢失,但是数据库运行在归档模式下,在日志组切换时会有稍微的延迟,影响数据库的性能,所以要根据实际来决定是否归档,即使归档也要根据情况配置好日志组的大小。
下面我们就讲解OS下的物理备份,首先说明OS下物理冷备份。冷备份不需要处于归档模式下,所以我们先说冷备份非归档模式下的备份与恢复。
1、非归档模式下的OS冷备份与恢复
当数据库可以暂时处于关闭状态时,我们需要将它在这一稳定时刻的数据相关文件转移到安全的区域,当数据库遭到破坏,再从安全区域将备份的数据库相关文件拷贝回原来的位置,这样,就完成了一次快捷安全等数据转移。备份步骤:
1)关闭数据库(shutdown normal)
2)拷贝相关文件到安全区域(利用操作系统命令拷贝数据库的所有的数据文件、日志文件、控制文件、参数文件、口令文件(包括路径))。
可以用下列命令查询相关的文件位置。
数据文件:select file_name from dba_data_files;
日志文件:select member from v$logfile;
控制文件:select name from v$controlfile;
参数文件包括pfile和spfile,windows下目录类似为:E:\oracle\product\10.2.0\db_1\dbs。
参数文件init.ora,为可选备份,windows下目录类似为:E:\oracle\product\10.2.0\db_1\srvm\admin。
口令文件即密码文件,为可选备份,windows下目录类似为:E:\oracle\product\10.2.0\db_1\database。
3)重新启动数据库(startup)。以上步骤也可以写一个脚本,执行脚步来备份。
下面来说一下非归档模式OS物理冷备份的恢复。在此情况下的恢复很简单,只需要存在一个和原来一样的数据库,将曾经备份的文件复制还原到原先的位置即可。
(这里注意,虽然冷备份我们备份了联机重做日志文件,但是在恢复时要根据情况来恢复日志文件。如果确定不需要备份之后的部分数据,则直接覆盖日志文件。如果想尽可能多的保留备份后的部分数据,最好只有在日志文件也丢失或损坏的情况下(此时数据库一般会报错),才直接进行日志文件的恢复。如果日志文件没有丢失或损坏,则要看日志文件组是否已经被覆盖重写,如果没有重写则有可能达到完全数据的恢复,重写了被重写的这部分日志文件组对应的数据就会丢失了,而正在写入的这部分数据不会丢失,但为了保持数据库的一致性,这时虽然不恢复日志可能会多还原部分最近的数据,但最好日志也一起恢复吧,因为丢失了中间时间段的日志文件组被重写的那部分数据,不过可以根据实际情况来决定。)
然后执行下面的命令后,在打开数据库(startup)即可,注意保证监听程序正常配置运行。(当然恢复之前,数据库一定是关闭的。)
SQL> recover database until cancel;
SQL> startup mount;
SQL> alter database open resetlogs; (用重置日志(resetlogs)的方式打开数据库)。用重置日志(resetlogs)的方式打开数据库,Oracle会执行两个操作: a. 重新创建所有的联机重做日志文件。 b.将日志的序列号归为1。生成一个新的数据库incarnation。
SQL> startup;
在这里再强调一下,冷备份如果日志文件丢失的情况下恢复的,那么备份之后写入的数据无法恢复。如果日志文件没有丢失并且没有被覆盖重写(可能性很小),就不需要恢复日志文件,将实现完全恢复。
2、归档模式下的OS冷备份与恢复
归档模式下的备份只比非归档模式下要注意一点,那就是需要将归档日志同时拷贝备份,但不必再备份联机重写日志文件了,因为日志自动归档了,备份联机重写日志文件就没多大必要了,除非是上一次刚归档过,并且下一次归档前你备份了这个正在使用的日志,并且恰巧此时数据库出问题了而且正在使用的日志文件丢失了,但这种可能性太小太小了。
归档模式下的恢复也只比非归档模式下多一点,同样也是需要将归档日志进行恢复。恢复时如果存在未归档的联机重做日志文件,那么就可以实现完全恢复,如果未归档的日志文件丢失(此时数据库会报错),可能会丢失少部分当天的数据。与非归档模式下OS冷备份恢复相比,对应的需要改变的恢复命令只有如下一句:SQL> recover database until cancel using backup controlfile ;其他命令和先后顺序相同。
注意:在做了alter database open resetlogs;会把online redelog file清空,数据文件丢失.所以这个时候要做一个全备份。resetlogs命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始,每次使用resetlogs命令的时候,SCN不会被重置,不过oracle会重置日志序列号,而且会重置联机重做日志内容.这样做是为了防止不完全恢复后日志序列会发生冲突(因为现有日志和数据文件间有了时间差)。
3、OS热备份的备份与恢复
热备份必须运行在归档模式下。所以在备份之前必须检查并设置数据库的归档模式。而且热备份只能在数据库不使用或使用率低的情况下进行,并且热备份的备份与恢复是不允许出错的,必须成功。设置数据库归档步骤:
1)查看当前数据库是否处在归档模式:
SQL>select name,log_mode from v$database;或用archive log list;
如果不是Archive模式,则设定数据库运行于归档模式下:
(1)SQL> conn / as sysdba (以DBA身份连接数据库)
(2)SQL> shutdown immediate; (立即关闭数据库)
(3)SQL> startup mount (启动实例并加载数据库,但不打开)
(4)SQL> alter database archivelog; (更改数据库为归档模式)
(5)SQL> alter database open; (打开数据库)
(6)SQL> alter system archive log start; (启用自动归档)
(7)SQL> exit (退出)
设置完自动归档后,一定要做一次完全的冷备份,因为非归档日志模式下产生的备份对于归档模式已经不可用了.这一步非常重要!
此时Oracle数据库将以自动归档的方式工作在Archive模式下。其中参数LOG_ARCHIVE_DEST是指定的归档日志文件的路径,建议与Oracle数据库文件存在不同的硬盘,一方面减少磁盘I/O竞争,另外一方面也可以避免数据库文件所在硬盘毁坏之后的文件丢失。归档路径也可以直接指定为磁带等其它物理存储设备,但要考虑读写速度、可写条件和性能等因素。
注意:当数据库处在ARCHIVE模式下时,一定要保证指定的归档路径可写,否则数据库就会挂起,直到能够归档所有归档信息后才可以使用。另外,为创建一个有效的备份,当数据库在创建时,必须履行一个归档模式下全数据库的冷备份,就是说数据库需要运行在归档方式,然后正常关闭数据库,备份所有的数据库组成文件。这一备份是整个备份的基础,因为该备份提供了一个所有数据库文件的拷贝。体现了冷备份与热备份的合作关系,以及强大的能力。
可以用下列命令查看归档的路径:SQL>show parameter db_recovery_file_dest;
更改归档路径: SQL>alter system set log_archive_dest='...' scope=spfile;
SQL>shutdown immediate;
SQL>startup;
强制切换归档日志: SQL>alter system switch logfile;
取消归档:SQL>alter database noarchivelog;
归档路径参数除了有log_archive_dest形式,还有另一种log_archive_dest_n可以设置多个归档路径,而且可以设置远程归档与本地归档并存,这两种参数方式设置时不可以共存。
除了自动归档,还可以使用手动归档方式来进行一些操作。
归档当前日志文件:
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
归档序号为052的日志文件:
SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE 052;
归档所有日志文件:
SQL>ALTER SYSTEM ARCHIVE LOG ALL;
改变归档日志目标:
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT TO '&PATH';
归档模式就说这么多,下面来正式说明OS物理热备份。首先我们从上面知道在归档模式下,热备份之前一定是要有一次完全数据库的冷备份的,包括数据文件,归档日志文件,控制文件,参数文件以及口令文件。之后我们便可以对数据库进行OS方式的热备份。热备份包括归档日志的备份,控制文件的备份,以及最重要的数据文件的备份,参数文件全备份时已经备份了,所以为可选备份。
2)我们首先讲控制文件的备份与恢复步骤:
(1)SQL> alter database backup controlfile to ‘c:\control.bak’;备份控制文件
(2)将数据库关闭后删除所有的控制文件,然后执行下列命令恢复。
SQL> recover database until cancel using backup controlfile;
注意应用归档日志文件和联机重做日志文件的方法:如果有所需要的归档日志文件,按回车键。 如果没有所需要的归档日志文件,依次用每一个联机重做日志文件来试。
(3)SQL> alter database open resetlogs; 最后使用resetlogs方式打开数据库。(用重置日志(resetlogs)的方式开开数据库,Oracle会执行两个操作: a. 重新创建所有的联机重做日志文件。 b.将日志的序列号归为1。生成一个新的数据库incarnation。 )
3)归档日志的备份与恢复步骤:
(1)归档当前日志:alter system archive log current;
也可以用强制归档命令进行日志切换:ALTER SYSTEM SWITCH LOGFILE;
这两个命令均可以实现当前日志的归档。
(2)临时停止归档进程:archive log stop;
(3)用OS命令拷贝备份归档日志。
(4)重新启动归档进程:archive log start;
此处说明一点,如果归档日志过大,且日志生成过快,要慎用第(2)步,也可以不用,直接先备份已生成好的归档日志,避免影响日志归档切换导致数据库等待,影响用户使用。
对于归档日志的恢复只需要将备份文件拷贝到原位置就可以了,对于不用的归档日志,要根据实际情况定期删除。
4)联机重做日志的恢复:
联机重做日志文件没有备份,只能有命令来恢复。 所以联机重做日志文件发生问题是很严重的,因为极有可能丢失数据,而且在恢复联机日志文件组后,一定要再做一次全备份!!!
联机重做日志的恢复要根据实际情况进行恢复,看丢失的联机重做日志文件(1)是否是当前活动的,(2)是否是当前正在写入的,(3)以及是否已经归档,或者(4)全部联机日志文件丢失的情况来进行恢复。
当联机重做日志文件出现故障时,可以使用下列命令查询日志文件组的状态:
select group#,archived,sequence#,status from v$log; 执行结果如下:
查看日志组对应的日志文件:SELECT GROUP#,STATUS,MEMBER FROM V$LOGFILE;如下:
日志文件组的状态说明:
unused:该日志组从未被使用过。
current:当前正在使用的日志组,当前lgwr正在写的日志组。
active:表示记录在该日志组中的事务提交所造成的数据块的改变,没有完全从数据库缓冲区写入到数据文件,日志组处于这种状态,是不允许被覆盖的,一旦写完成,则变成inactive状态
inactive:表示记录在该日志组中的事务提交所造成的数据块的改变,完全从数据库缓冲区写入到数据文件,日志组处于这种状态,可以被覆盖的。
其中ARC列代表日志文件组是否已经归档,对于损坏的是已经归档的日志文件组,不会造成数据丢失,如果是其他的非归档的日志文件组,不管是不是当前正在写入的日志文件组,都可能会造成日志对应的数据的丢失。还有如果数据库是使用shutdown abort;方式关闭下丢失的联机重做日志文件,那么日志文件将无法恢复。
日志文件组恢复情况分类说明:
(1)全部联机重做日志文件组丢失的恢复:(必定丢失部分数据,但如果此时没有用户写入数据不会丢失)
(2)当前写入日志文件组丢失的恢复:(同上)
(3)非当前写入且是活动的日志文件组丢失的恢复:(同上,因为是活动的正在往数据文件写入数据,尚未归档)
(4)非当前写入且非活动的日志文件组丢失的恢复:(归档了不会丢失数据,可以用归档日志恢复,未归档可能丢失数据)
(5)非当前写入且未被使用的日志文件组的恢复:(不会丢失数据,也无需恢复)
具体恢复分类:
【A】数据库启动时出错:
(1)恢复非当前联机的日志组,如上图组2和组3都是非当前联机且非活动的日志组,在启动数据库时,若不能打开非活动状态的联机重做日志文件组,将会报错终止启动。
首先确定出现问题的日志组中是否有日志成员存在,如果有先用alter system checkpoint;强迫数据库将未写完的脏数据提前写入数据文件。再用下列命令进行恢复:alter database add logfile '' reuse to group 2;或alter database clear logfile group 2;。如果所有成员都丢失了,就先删除整个日志组,再创建新的日志组如下:
alter database drop logfile group 2;
alter database add logfile group 2 '' size 50M;
(2)恢复当前联机的日志组,上图中状态为current或active的日志组,如果有此类日志组损坏,不可以用clear命令。需要执行基于取消的恢复,用recover database until cancel;然后用alter database open resetlogs;方式打开数据库。如果此种方式不可以,则就要进行强制恢复了,强制恢复步骤如下:
a、创建配置文件:SQL> create pfile from spfile;
b、停掉数据库:SQL> shutdown immediate;(可能本身就没有打开)
c、设置隐含参数_allow_resetlogs_corruption为“TRUE”:在生成的参数文件中改,参数文件在windows类似目录C:\oracle\product\10.2.0\db_1\database\initorcl.ORA下。
d、使用pfile启动数据库到mount状态:SQL> startup mount pfile=C:\oracle\product\10.2.0\db_1\database\initorcl.ORA;
e、利用until cancel进行恢复:SQL> recover database until cancel;可能会报错,不用管。
f、用resetlogs方式打开数据库:SQL> alter database open resetlogs;
g、还原参数文件参数_allow_resetlogs_corruption为“FALSE”。并逆生成二进制配置文件spfile。
再不行就需要使用不完全介质恢复了(即之前的备份恢复)。
也可以采用下面的顺序:
a、SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
b、SQL> shutdown immediate;
c、SQL> startup mount;
d、SQL> recover database until cancel;
e、SQL> alter database open resetlogs;f、SQL> alter system set "_allow_resetlogs_corruption"=false scope=spfile;
【B】数据库运行时出错:
(1)恢复非当前联机且非活动日志组,如上图组2和组3都是非当前联机且非活动的日志组,可以先用alter system checkpoint;强迫数据库将未写完的脏数据提前写入数据文件。再用下列命令进行恢复:alter database clear logfile group 2;如果未归档则用:alter database clear unarchived logfile group 2;
(2)恢复当前联机的或活动的日志组,如果有此类日志组损坏,一般而言,这种情况下Oracle会自动关闭,如果幸运的话没有关闭,应该马上执行alter system checkpoint,然后关闭数据库,依次执行
startup mount;
alter database clear unarchived logfile;
alter database open;
幸运的话会成功打开,如果不能打开,那就仿照【A】进行强制恢复,再不可以就需要执行数据库不完全恢复。
再次强调,做完联机重做日志文件恢复,一定要做一个完整的数据库备份。
5)数据文件的备份与恢复
OS数据文件的热备份主要是针对表空间对应的数据文件的备份。
表空间数据文件的备份:
(1)首先,修改表空间文件为备份模式 ALTER TABLESPACE tablespace_name BEGIN BACKUP;
(2)然后,拷贝表空间文件到安全区域。
(3)最后,将表空间的备份模式关闭 ALTER TABLESPACE tablespace_name END BACKUP;
也可以是针对数据库的备份,但是一般采用针对表空间的备份。针对数据库的备份如下:
(1)alter database begin backup;
(2)拷贝所有的datafile到备份目录。
(3)alter database end backup;
针对表空间的恢复:
将数据文件还原回原位置,然后进行恢复: SQL>recover datafile ‘c:\oracle\oradata\erp\users01.dbf’;
针对全库进行恢复:
对于全库的恢复,需要之前全部数据库的备份,以及全部备份之后的所有归档日志完好无损。
全库恢复步骤:
(1)shutdown数据库。
(2)将全备份的数据文件放到原来系统的目录中。
(3)将全备份到失败点的所有归档日志放到参数LOG_ARCHIVE_DEST所指定的位置。
(4)利用sqlplus登陆到空实例。(connect / as sysdba)
startup mount;
set autorecovery on;
recover database;
alter database open;
至此,Oracle数据OS方式的热备份完成了。
除了上面的恢复方式,Oracle还提供了基于时间点的数据恢复方式。方式如下:
(1)SQL> startup mount;
(2)SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
(3)SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
(4)SQL> recover database until time '2015-01-17 21:57:28';
(5)SQL> alter database open resetlogs;
本篇文章对于OS方式物理备份介绍到此,下篇文章将继续说明Oracle数据库的rman备份方式。
Oracle数据库备份与恢复总结5--Oracle备份与恢复之物理备份--Rman备份