ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 手动的表空间时间点恢复实验过程

手动的表空间时间点恢复实验过程

原创 Linux操作系统 作者:红叶DBA 时间:2011-02-27 16:45:09 0 删除 编辑
手动的表空间时间点恢复实验:

思想:通过辅助数据库,将目标数据库的部分文件以时间点恢复的方式恢复到辅助数据库,然后从辅助数据库中取出待恢复表空间的元数据,导入到目标数据库,以完成目标数据库的时间点恢复操作。
本实验其实就是目标数据库待恢复表空间在数据库中元数据的替换过程,怎么获得元数据,是本次试验的关键点,也是实验的主要步骤。

遇到的错误问题及解决:
1、        在试验中,必须先创建有效的备份,即备份完成时间必须要在恢复时间点之前。
2、        在Linux系统中,进行exp操作时,’sys/password@xxx as sysdba’ 必须使用转移字符 ’\’ 改写成:\’sys/password@xxx as sysdba\’,否则会报as sysdba格式的错误。
3、        在使得待恢复表空间联机之前,必须要关闭辅助数据库,否则会出现类似无法识别文件头的错误

具体实验步骤如下:

1、以sysdba的身份登录数据库,查看将要恢复的表空间的,检查其是否与其他表空间存在关联,或者存在不支持时间点恢复的对象。如果有,则需要进行相应的修复,例如导入导出、转移到别的表空间,或者将引用的对象转移到恢复表空间等等。

[oracle@RAC1 ~]$ sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Feb 9 10:53:15 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

IDEL > conn /as sysdba
Connected to an idle instance.
IDEL > startup
ORACLE instance started.

Total System Global Area  134217728 bytes
Fixed Size                  1218148 bytes
Variable Size              62917020 bytes
Database Buffers           67108864 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
IDEL > desc ts_pitr_check
Name                                     Null?    Type
----------------------------------------------------------------- -------- --------------------------------------------
OBJ1_OWNER                                       VARCHAR2(30)
OBJ1_NA                                           VARCHAR2(30)
OBJ1_SUBNAME                                     VARCHAR2(30)
OBJ1_TYPE                                          VARCHAR2(16)
TS1_NAME                                          VARCHAR2(30)
OBJ2_NAME                                         VARCHAR2(30)
OBJ2_SUBNAME                                      VARCHAR2(30)
OBJ2_TYPE                                          VARCHAR2(15)
OBJ2_OWNER                                        VARCHAR2(30)
TS2_NAME                                          VARCHAR2(30)
CONSTRAINT_NAME                                  VARCHAR2(30)
REASON                                            VARCHAR2(81)

如果下面的查询返回值是大于0的数字,则需要一些特殊的操作了,此处不需要。
IDEL > select count(*) from ts_pitr_check where ts1_name='USERS' or ts2_name='USERS';

  COUNT(*)
----------
         0

2、检查恢复操作将要影响到的对象,如果有在恢复时间点之后创建的比较重要的表,那么就需要导出或者做一些转移的操作,在此可以根据creation_time列与恢复时间点比较,并作出比较。

IDEL > desc ts_pitr_objects_to_be_dropped
Name                                    Null?    Type
----------------------------------------------------------------- -------- --------------------------------------------
OWNER                                  NOT NULL VARCHAR2(30)
NAME                                   NOT NULL VARCHAR2(30)
CREATION_TIME                           NOT NULL DATE
TABLESPACE_NAME                                 VARCHAR2(30)

IDEL > select * from ts_pitr_objects_to_be_dropped where tablespace_name='USERS';

OWNER                          NAME                           CREATION_ TABLESPACE_NAME
------------------------------ ------------------------------ --------- ------------------------------
HONGYE                         BIN$myEaviBQtCXgQAB/AQA28A==$0 31-JAN-11 USERS
HONGYE                         T                              31-JAN-11 USERS

IDEL > conn hongye/hongye
Connected.
HONGYE:159@HONGYE2 > purge recyclebin;

Recyclebin purged.

HONGYE:159@HONGYE2 > select table_name from user_tables;

TABLE_NAME
------------------------------
T
TT

3、构建本次试验的测试数据,选择当前的SCN为即将进行的时间点恢复的时间点,则在此之前所创建的对象都不会受到影响。此次,在t表中插入一些测试数据,并truncate表t,并删除tt表,然后做时间点恢复,如果成功了话,那么期望的结果是:t表中数据已经找回,且tt表还依然存在。

HONGYE:143@HONGYE2 > truncate table t
  2  ;

Table truncated.

HONGYE:143@HONGYE2 > insert into t values(1,'name1');

1 row created.

HONGYE:143@HONGYE2 > insert into t values(2,'name2');

1 row created.

HONGYE:143@HONGYE2 > insert into t values(2,'name3');

1 row created.

HONGYE:143@HONGYE2 > insert into t values(3,'name3');

1 row created.

HONGYE:143@HONGYE2 > commit
  2  ;

Commit complete.

HONGYE:143@HONGYE2 > select * from t;

        ID NAME
---------- ----------
         1 name1
         2 name2
         2 name3
         3 name3

获取恢复时间点,此处的SCN非常重要,是后续恢复操作截止时间的参照。
HONGYE:143@HONGYE2 > select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                  382237

HONGYE:143@HONGYE2 > truncate table t;

Table truncated.

HONGYE:143@HONGYE2 > drop table tt purge;

Table dropped.

HONGYE:143@HONGYE2 > exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

4、创建辅助实例,参数可以使用从别处拷贝的pfile进行一些修改,注意的是一定要使用和目标数据库一样的db_name,但是据说会有内存使用方面的问题,但是在本次实验中,我没有遇到这类的问题。
可以使用不同的db_unique_name。
可以在SQL*PLUS或者RMAN中将辅助实例启动到nomount状态。
此处属于基础内容,实验记录就不用保留了。

5、连接目标数据库和辅助数据库,本次实验中,由于我配置了与辅助实例相关的网络文件,所以可以将环境变量中的ORACLE_SID=,但是如果没有配置的话,则可以将ORACLE_SID=,前提是必须有目标数据库的网络配置。总之一句话:在目标数据库和辅助数据库中,至少有一个已经配置了正确的网络文件。

[oracle@RAC1 dbs]$ rman

Recovery Manager: Release 10.2.0.1.0 - Production on Wed Feb 9 11:16:20 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

RMAN> connect target /

connected to target database: HONGYE2 (DBID=860418810)

RMAN> connect auxiliary sys/hongye50@auxiliary

connected to auxiliary database: HONGYE2 (not mounted)

6、恢复辅助数据库的控制文件,
从主数据库的控制文件自动备份中恢复,此时切记:一定要设置好正确的恢复时间点,本次的实验中是以SCN为界的。
在恢复完辅助数据库的控制问件之后就可以mount辅助数据库了。

RMAN> run{
2> set until scn 382237;
3> restore clone controlfile;
4> sql clone 'alter database mount clone database';
5> sql 'alter system archive log current';
6> }

executing command: SET until clause

Starting restore at 09-FEB-11
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backupset restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /oracle/flash_recovery_area/HONGYE2/autobackup/2011_02_09/o1_mf_s_742647952_6o414k9x_.bkp
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/oracle/flash_recovery_area/HONGYE2/autobackup/2011_02_09/o1_mf_s_742647952_6o414k9x_.bkp tag=TAG20110209T110552
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
output filename=/oracle/rmantest/auxiliary/control01.ctl
Finished restore at 09-FEB-11

sql statement: alter database mount clone database

sql statement: alter system archive log current

RMAN> exit


Recovery Manager complete.

7、以sysdba进入数据库,查看system表空间、undo表空间、temp表空间的所有相关文件号,还要查看将要做时间点恢复的表空间的文件名,这些信息将在后续操作中被用到。
将要进行时间点恢复的表空间离线。

[oracle@RAC1 dbs]$ sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Feb 9 11:20:00 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

IDEL > conn / as sysdba
Connected.
SYS:143@HONGYE2 > desc dba_data_files
Name                                    Null?    Type
----------------------------------------------------------------- -------- --------------------------------------------
FILE_NAME                                        VARCHAR2(513)
FILE_ID                                            NUMBER
TABLESPACE_NAME                                  VARCHAR2(30)
BYTES                                             NUMBER
BLOCKS                                            NUMBER
STATUS                                             VARCHAR2(9)
RELATIVE_FNO                                       NUMBER
AUTOEXTENSIBLE                                    VARCHAR2(3)
MAXBYTES                                          NUMBER
MAXBLOCKS                                         NUMBER
INCREMENT_BY                                      NUMBER
USER_BYTES                                         NUMBER
USER_BLOCKS                                        NUMBER
ONLINE_STATUS                                      VARCHAR2(7)

SYS:143@HONGYE2 > select file_id,tablespace_name from dba_data_files;

   FILE_ID TABLESPACE_NAME
---------- ------------------------------
         1 SYSTEM
         2 UNDOTBS1
         3 SYSAUX
         4 USERS

SYS:143@HONGYE2 > select file_name from dba_data_files where file_id=4;

FILE_NAME
------------------------------------------------------------------------------------------------------------------------
/oracle/oradata/hongye2/users01.dbf

SYS:143@HONGYE2 > select file_id,tablespace_name from dba_temp_files;

   FILE_ID TABLESPACE_NAME
---------- ------------------------------
         1 TEMP

将要恢复的表空间离线,等待恢复,如果在之前已经离线了,则不需要此步骤。
SYS:143@HONGYE2 > alter tablespace users offline for recover;

Tablespace altered.

SYS:143@HONGYE2 > exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@RAC1 dbs]$ rman

Recovery Manager: Release 10.2.0.1.0 - Production on Wed Feb 9 11:22:48 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

RMAN> connect target /

connected to target database: HONGYE2 (DBID=860418810)

RMAN> connect auxiliary sys/hongye50@auxiliary

connected to auxiliary database: HONGYE2 (DBID=860418810, not open)

8、执行辅助数据库的时间点恢复,注意设置不同文件的新文件名,其中system、undo、temp等表空间需要新的文件名,而已经离线的待恢复表空间则不需要,使用set newname来实现此重命名操作,还可以在init文件中使用db_file_name_convert参数进行转化。
切记:时间点的设置,一定要准确且和前面使用的一致。
恢复完成后,将辅助数据库的相关文件联机。

RMAN> run{
2> set until scn 382237;
3> set newname for datafile 4 to '/oracle/oradata/hongye2/users01.dbf';
4> set newname for clone tempfile 1 to new;
5> set newname for clone datafile 1 to new;
6> set newname for clone datafile 2 to new;
7> switch clone tempfile all;
8> restore clone datafile 1,2,4;
9> switch clone datafile all;
10> sql clone 'alter database datafile 1 online';
11> sql clone 'alter database datafile 2 online';
12> sql clone 'alter database datafile 4 online';
13> }

executing command: SET until clause

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

renamed temporary file 1 to /oracle/rmantest/auxiliary/AUXILIARY/datafile/o1_mf_temp_%u_.tmp in control file

Starting restore at 09-FEB-11
using channel ORA_AUX_DISK_1

skipping datafile 4; already restored to file /oracle/oradata/hongye2/users01.dbf
channel ORA_AUX_DISK_1: starting datafile backupset restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /oracle/rmantest/auxiliary/AUXILIARY/datafile/o1_mf_system_%u_.dbf
restoring datafile 00002 to /oracle/rmantest/auxiliary/AUXILIARY/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oracle/flash_recovery_area/HONGYE2/backupset/2011_02_09/o1_mf_nnndf_TAG20110209T110503_6o41306k_.bkp
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/oracle/flash_recovery_area/HONGYE2/backupset/2011_02_09/o1_mf_nnndf_TAG20110209T110503_6o41306k_.bkp tag=TAG20110209T110503
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:26
Finished restore at 09-FEB-11

datafile 1 switched to datafile copy
input datafile copy recid=8 stamp=742649583 filename=/oracle/rmantest/auxiliary/AUXILIARY/datafile/o1_mf_system_6o42por8_.dbf
datafile 2 switched to datafile copy
input datafile copy recid=9 stamp=742649583 filename=/oracle/rmantest/auxiliary/AUXILIARY/datafile/o1_mf_undotbs1_6o42posj_.dbf

sql statement: alter database datafile 1 online

sql statement: alter database datafile 2 online

sql statement: alter database datafile 4 online

9、执行辅助数据库的介质恢复操作,确保将辅助实例恢复到指定的时间。
切记:时间点的设置,准确、一致。
介质恢复完成后,由于是不完全恢复,所以要使用resetlogs方式打开数据库。

RMAN> run{
2> set until scn 382237;
3> recover clone database tablespace "SYSTEM","UNDOTBS1","USERS" delete archivelog;
4> alter clone database open resetlogs;
5> }

executing command: SET until clause

Starting recover at 09-FEB-11
using channel ORA_AUX_DISK_1

starting media recovery

archive log thread 1 sequence 8 is already on disk as file /oracle/flash_recovery_area/HONGYE2/archivelog/2011_02_09/o1_mf_1_8_6o41yn3w_.arc
channel ORA_AUX_DISK_1: starting archive log restore to default destination
channel ORA_AUX_DISK_1: restoring archive log
archive log thread=1 sequence=7
channel ORA_AUX_DISK_1: reading from backup piece /oracle/flash_recovery_area/HONGYE2/backupset/2011_02_09/o1_mf_annnn_TAG20110209T110549_6o414h3y_.bkp
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/oracle/flash_recovery_area/HONGYE2/backupset/2011_02_09/o1_mf_annnn_TAG20110209T110549_6o414h3y_.bkp tag=TAG20110209T110549
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
archive log filename=/oracle/product/10.2.0/db_1/dbs/arch1_7_742402857.dbf thread=1 sequence=7
channel clone_default: deleting archive log(s)
archive log filename=/oracle/product/10.2.0/db_1/dbs/arch1_7_742402857.dbf recid=8 stamp=742649698
archive log filename=/oracle/flash_recovery_area/HONGYE2/archivelog/2011_02_09/o1_mf_1_8_6o41yn3w_.arc thread=1 sequence=8
media recovery complete, elapsed time: 00:00:04
Finished recover at 09-FEB-11

database opened

RMAN> exit

Recovery Manager complete.

10、实验接近尾声了,将辅助数据库中和待恢复表空间相关的源数据导出,指定exp中的关键字point_in_time_recover=y,此处需要注意的是Linux系统环境下单引号的转义问题,否则导出不会成功。

在进行导出之前,也可以进入辅助数据库中查看一下相关表空间是否恢复到了期望值,要确保ORACLE_SID=
[oracle@RAC1 auxiliary]$ sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Feb 9 11:41:18 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

IDEL > conn /as sysdba
Connected.
SYS:34@HONGYE2 > select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
UNDOTBS1                       ONLINE
SYSAUX                         OFFLINE
TEMP                           ONLINE
USERS                          READ ONLY

SYS:34@HONGYE2 > select table_name from dba_tables where tablespace_name='USERS';

TABLE_NAME
------------------------------
T
TT

SYS:34@HONGYE2 > select * from hongye.t;

        ID NAME
---------- ----------
         1 name1
         2 name2
         2 name3
         3 name3

SYS:34@HONGYE2 > select * from hongye.tt;

        ID NAME
---------- ---------------
         6 count(*) from t

SYS:34@HONGYE2 > shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS:34@HONGYE2 > exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

进行源数据的导出工作,要确保ORACLE_SID=
[oracle@RAC1 dbs]$ exp \'sys/hongye50 as sysdba\' point_in_time_recover=y tablespaces=users file=/oracle/rmantest/auxiliary/users_pitr.dmp

Export: Release 10.2.0.1.0 - Production on Wed Feb 9 11:36:32 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
Note: table data (rows) will not be exported

About to export Tablespace Point-in-time Recovery objects...
For tablespace USERS ...
. exporting cluster definitions
. exporting table definitions
. . exporting table                             TT
. . exporting table                              T
EXP-00091: Exporting questionable statistics.
. exporting referential integrity constraints
. exporting triggers
. end point-in-time recovery
Export terminated successfully with warnings.

导出成功了,可以看到目录下的导出文件users_pitr.dmp
[oracle@RAC1 dbs]$ cd /oracle/rmantest/auxiliary/
[oracle@RAC1 auxiliary]$ ls
adump  AUXILIARY  bdump  cdump  control01.ctl  pfile.ora  redo01.log  redo02.log  redo03.log  udump  users_pitr.dmp

导出完成后,要关闭辅助数据库,否则目标数据库的待恢复表空间将无法联机,因为辅助数据库和目标数据库对于待恢复的表空间,实际上使用的是同一个数据文件,如果不关闭,会有类似以下两个错误,因为同一个数据文件,不能同时被两个数据库打开。
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/oracle/oradata/hongye2/users01.dbf'

[oracle@RAC1 auxiliary]$ sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Feb 9 11:41:18 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

IDEL > conn /as sysdba
Connected.
SYS:34@HONGYE2 > shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS:34@HONGYE2 > exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

11、将第10步中得到了源数据导出文件导入到目标数据库,同样需要制定参数point_in_time_recover=y。
这其中,一定要记得改变系统变量ORACLE_SID=

[oracle@RAC1 auxiliary]$ export ORACLE_SID=hongye2
[oracle@RAC1 auxiliary]$ imp \'sys/hongye50 as sysdba\' point_in_time_recover=y file=/oracle/rmantest/auxiliary/users_pitr.dmp

Import: Release 10.2.0.1.0 - Production on Wed Feb 9 11:39:43 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

Export file created by EXPORT:V10.02.01 via conventional path
About to import Tablespace Point-in-time Recovery objects...
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses WE8ISO8859P1 character set (possible charset conversion)
. importing SYS's objects into SYS
. importing HONGYE's objects into HONGYE
. . importing table                           "TT"
. . importing table                            "T"
. importing SYS's objects into SYS
Import terminated successfully without warnings.

12、结尾,在目标数据库SQL*PLUS中,使得待恢复的表空间联机,则表空间的时间点恢复完成,可以检查一下相关的数据,不过在前面其实已经检查过了,其实辅助数据库和目标数据库的users表空间的数据文件是同一个文件。

[oracle@RAC1 auxiliary]$ sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Feb 9 11:40:00 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

IDEL > conn /as sysdba
Connected.
SYS:143@HONGYE

SYS:143@HONGYE2 > desc dba_tablespaces
Name                                    Null?    Type
----------------------------------------------------------------- -------- --------------------------------------------
TABLESPACE_NAME                         NOT NULL VARCHAR2(30)
BLOCK_SIZE                               NOT NULL NUMBER
INITIAL_EXTENT                                     NUMBER
NEXT_EXTENT                                      NUMBER
MIN_EXTENTS                              NOT NULL NUMBER
MAX_EXTENTS                                       NUMBER
PCT_INCREASE                                       NUMBER
MIN_EXTLEN                                         NUMBER
STATUS                                             VARCHAR2(9)
CONTENTS                                          VARCHAR2(9)
LOGGING                                           VARCHAR2(9)
FORCE_LOGGING                                     VARCHAR2(3)
EXTENT_MANAGEMENT                               VARCHAR2(10)
ALLOCATION_TYPE                                   VARCHAR2(9)
PLUGGED_IN                                        VARCHAR2(3)
SEGMENT_SPACE_MANAGEMENT                       VARCHAR2(6)
DEF_TAB_COMPRESSION                              VARCHAR2(8)
RETENTION                                         VARCHAR2(11)
BIGFILE                                            VARCHAR2(3)

SYS:146@HONGYE2 > select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
UNDOTBS1                       ONLINE
SYSAUX                         ONLINE
TEMP                           ONLINE
USERS                          OFFLINE

SYS:146@HONGYE2 > alter tablespace users online;

Tablespace altered.

SYS:146@HONGYE2 > conn hongye/hongye
Connected.
HONGYE:146@HONGYE2 > select table_name from user_tables;

TABLE_NAME
------------------------------
T
TT

HONGYE:146@HONGYE2 > select * from t;

        ID NAME
---------- ----------
         1 name1
         2 name2
         2 name3
         3 name3

HONGYE:146@HONGYE2 > select * from tt;

        ID NAME
---------- ---------------
         6 count(*) from t

HONGYE:146@HONGYE2 >
最后,自己手动删除辅助实例和辅助数据库。

总结:本次实验纯属个人研究,实际上自动的表空间时间点恢复是一个很简单的操作命令就可以完成此次实验的所有步骤了,但是为了能够清晰的理解时间点恢复的具体流程,还是手动来一遍印象比较深刻,更能够加深自己的理解。同时,针对实验过程中问题的解决,也是一次很大的收获。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24465008/viewspace-688034/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-08-19

  • 博文量
    54
  • 访问量
    70899