通过RMAN备份恢复数据库到其他服务器

本节演示如何通过RMAN创建的备份集,将数据库恢复到其他服务器。本小节执行的操作较多,一定要有一个清醒的大脑,因此赶紧把脑袋里那堆乱七八糟的东西清除清除,要不你一定会看晕的。

设定环境如下:

源库192.168.100.100,SID:jssbook。

目录库192.168.100.101,已安装与源库相同版本的数据库软件(一定要相同版本哟)。

准备工作如下:

记录下源数据库的DBID,DBID的获取方式上节已讲过。

创建完整备份集(含控制文件、数据文件、归档文件),源库为非归档模式也可以,只要确保创建的备份是一致备份,然后将备份集复制到目标服务器的相同路径下。

为简单起见,源端与目标端目录结构保持一致。如果你在测试或正式操作时由于实际原因无法保持源端与目标端结构一致,在恢复过程中注意修改相关路径。

操作步骤如下:

注意,下列操作如非特别注明,均是在目标端服务器上进行的。

1.在源库端创建数据库的完整备份

这个过程不用演示了,请没自信的同学自觉重温第8章。

备份集创建成功之后,将其复制到目录端的相同路径下,强调一点,必须是相同路径。复制方式灵活多样,Windows环境可以直接通过共享复制,Linux/UNIX下可以通过FTP。

2.在目标服务器上创建OracleService

如果是Linux/UNIX环境,不需要执行本步骤,只要在连接数据库时指定ORACLE_SID环境变量即可。

如果是Windows服务器,需要通过ORADIM命令创建一个OracleService,创建的SID要与源库相同,操作如下:

1. C:/Documents and Settings/Administrator>ORADIM -NEW -SID JSSBOOK

2. Instance created.

上述命令创建了一个名为jssbook的OracleService。

关于ORADIM命令的参数说明,直接执行ORADIM命令,不加任何参数即可看到简要说明。

3.配置目标端数据库的初始化参数文件

这个配置主要包括两步:

第一步是将源库端的SPFILE初始化参数文件复制到目标端的适当路径,即%ORACLE_HOME%/database目录下,如果是Linux/UNIX环境则是在$ORACLE_HOME/dbs目录下。

第二步是要修改其中的部分参数值,这一步并不是必须的,如果目标端的路径与源端保持完全一致,不做任何修改都可以。不过如果路径不一致的话,至少要保证如下几个参数所指定的值正确有效:

control_files:控制文件路径。

audit_file_dest:Oracle审计输出的debug日志路径。

background_dump_dest:LGWR、DBWn之类后台进程输出的debug日志路径。

core_dump_dest:Oracle内核输出的dump日志路径。

user_dump_dest:用户进程输出的debug日志路径。

log_archive_dest_1:归档文件路径,如果启用了归档模式的话。

由于SPFILE是二进制文件,无法直接编辑,如果要修改,可以先通过SPFILE创建PFILE(客户端初始化参数文件),PFILE可以用文本编辑工具打开(如"记事本"),修改完相关参数值后,再通过PFILE创建SPFILE即可,大致步骤如下:

指定ORACLE_SID,然后连接到SQL*Plus命令行环境:

1. C:/Documents and Settings/Administrator>set oracle_sid=jssbook

2. C:/Documents and Settings/Administrator>sqlplus "/ as sysdba"

3. SQL*Plus: Release 10.2.0.1.0 - Production on Tue May 5 13:16:59 2009

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

5. Connected to an idle instance.

根据源库复制过来的SPFILE创建PFILE,注意给PFILE指定适当的路径,执行命令如下:

1. SQL> CREATE PFILE = 'f:/oracle/backup/pfile_jssbook.ora'

2. FROM SPFILE;File created.

如果从源库复制出来的SPFILE并没放在%ORACLE_HOME%/DATABASE目录下,也可以通过FROM SPFILE=''的方式指定SPFILE的详细路径,例如:

1. SQL> CREATE PFILE = 'f:/oracle/backup/pfile_jssbook.ora'

2. FROM SPFILE='f:/oracle/product/10.2.0/db_1/database/ spfilejssbook.ora';

使用"记事本"之类的文本工具打开文件F:/oracle/backup/pfile_jssbook.ora,修改相关参数值并保存。

返回SQL*Plus命令行环境,执行下列命令,根据修改过的PFILE创建SPFILE:

1. SQL> CREATE SPFILE From Pfile='f:/oracle/backup/pfile_jssbook.ora';

2. File created.

SPFILE创建成功,数据库就可以启动到NOMOUNT状态了。

1. SQL> STARTUP NOMOUNT

2. ORACLE instance started.

3. Total System Global Area 314572800 bytes

4. Fixed Size 1248720 bytes

5. Variable Size 67109424 bytes

6. Database Buffers 239075328 bytes

7. Redo Buffers 7139328 bytes

4. 恢复控制文件并进入到加载状态

新开一个命令行窗口,连接到RMAN命令行:

1. C:/Documents and Settings/junsansi>SET ORACLE_SID=jssbook

2. C:/Documents and Settings/junsansi>RMAN TARGET /

3. Recovery Manager: Release 10.2.0.1.0 - Production on

4. Tue May 5 13:54:15 2009

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

6. connected to target database: jssbook (not mounted)

由于此时目标数据库尚无控制文件,因此此处必须首先指定DBID:

1. RMAN> SET DBID=1415261003

2. executing command: SET DBID

从指定备份集中恢复控制文件:

1. RMAN> RESTORE CONTROLFILE FROM 'F:/oracle/backup/

2. C-1415261003-20090505-00';

3. Starting restore at 05-MAY-09

4. using target database control file instead of recovery catalog

5. allocated channel: ORA_DISK_1

6. channel ORA_DISK_1: sid=157 devtype=DISK

7. channel ORA_DISK_1: restoring control file

8. channel ORA_DISK_1: restore complete, elapsed time: 00:00:04

9. output filename=F:/ORACLE/ORADATA/JSSBOOK/CONTROL01.CTL

10. output filename=F:/ORACLE/ORADATA/JSSBOOK/CONTROL02.CTL

11. output filename=F:/ORACLE/ORADATA/JSSBOOK/CONTROL03.CTL

12. Finished restore at 05-MAY-09

控制文件会被恢复到初始化参数CONTROL_FILES指定的路径下。

有了控制文件,就可以将数据库置为MOUNT状态了:

1. RMAN> ALTER DATABASE MOUNT;

2. database mounted

3. released channel: ORA_DISK_1

5.修复数据库

在这个测试环境中,源端与目标端的路径保持一致,因此这里可以直接用源路径修复,如果你的目标库与源库路径不同的话,需要通过SET NEWNAME FOR DATAFILE命令来为数据文件重新设定路径(注意,SET NEWNAME必须要放在RUN块中执行的哟)。执行命令如下:

1. RMAN> RESTORE DATABASE;

2. Starting restore at 05-MAY-09

3. allocated channel: ORA_DISK_1

4. channel ORA_DISK_1: sid=157 devtype=DISK

5. channel ORA_DISK_1: starting datafile backupset restore

6. channel ORA_DISK_1: specifying datafile(s) to restore from backup set

7. restoring datafile 00001 to F:/ORACLE/ORADATA/JSSBOOK/SYSTEM01.DBF

8. restoring datafile 00002 to F:/ORACLE/ORADATA/JSSBOOK/UNDOTBS01.DBF

9. restoring datafile 00003 to F:/ORACLE/ORADATA/JSSBOOK/SYSAUX01.DBF

10. restoring datafile 00004 to F:/ORACLE/ORADATA/JSSBOOK/USERS01.DBF

11. restoring datafile 00005 to F:/ORACLE/ORADATA/JSSBOOK/SCOTT_TBS01.DBF

12. restoring datafile 00006 to F:/ORACLE/ORADATA/JSSBOOK/BOOKS01.DBF

13. channel ORA_DISK_1: reading from backup piece

14. F:/ORACLE/BACKUP/BAK_1JKE921J_1_1

15. channel ORA_DISK_1: restored backup piece 1

16. piece handle=F:/ORACLE/BACKUP/BAK_1JKE921J_1_1 tag=TAG20090505T134835

17. channel ORA_DISK_1: restore complete, elapsed time: 00:00:55

18. Finished restore at 05-MAY-09

觉着神奇是吧,这样都可以,不需要指定备份集位置吗?有这样的疑问说明你独立思考得还不够多啊,虽然说人类一思考上帝就发笑,但是作为一名勤劳、勇敢、朴实(就是不爱思考)的中国人,上帝并不是我们的主要信仰,它也管不了神奇的东方世界这嘎。

应该说,在一般情况下执行本操作时,不需要做特别的设置,前面在备份章节曾经说过,在NOCATALOG模式下,备份集信息是保存在控制文件中的,现在控制文件已经恢复了,它当然知道应该上哪儿找备份集。

那什么时候需要手动指定备份集呢?只有一种情况,当你的备份集不在控制文件的原路径时,你必须通过CATALOG命令重新注册备份集,也就是告诉RMAN,它要找的备份集在哪里。

6.恢复数据库

RECOVER也是同理,不需要你告诉他归档在什么位置,它也知道上哪去找,因为控制文件里都记着呢,直接执行RECOVER即可:

1. RMAN> RECOVER DATABASE;

2. Starting recover at 05-MAY-09

3. using channel ORA_DISK_1

4. starting media recovery

5. channel ORA_DISK_1: starting archive log restore

6. to default destination

7. channel ORA_DISK_1: restoring archive log

8. archive log thread=1 sequence=51

9. channel ORA_DISK_1: reading from backup piece

10. F:/ORACLE/BACKUP/BAK_1KKE923B_1_1

11. channel ORA_DISK_1: restored backup piece 1

12. piece handle=F:/ORACLE/BACKUP/BAK_1KKE923B_1_1

13. tag=TAG20090505T134931

14. channel ORA_DISK_1: restore complete,

15. elapsed time: 00:00:01

16. archive log filename=F:/ORACLE/ORADATA/JSSBOOK

17. /ARCHIVE/ARC00051_0680477835.001 thread=1 sequence=51

18. unable to find archive log

19. archive log thread=1 sequence=52

20. RMAN-00571: ===========================================================

21. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

22. RMAN-00571: ===========================================================

23. RMAN-03002: failure of recover command at 05/05/2009 14:04:38

24. RMAN-06054: media recovery requesting unknown log:

25. thread 1 seq 52 lowscn 983415

报错了?正常的,因为我们创建的热备份并不是一致性备份,源端的归档是过来了,但联机重做日志文件并没有随备份集复制过来,因此恢复时肯定恢复不到源端的当前状态。这个错误是提醒你要想继续恢复的话还需要线程1生成的SEQUENCE#为52的重做日志文件。我们这里只是测试恢复到异机的过程,并不准备保持与源数据库端一模一样(如果你要保持一致,必须复制源数据库端的重做日志文件,那必须首先SHUTDOWN源端数据库才行)。

如果说你只是希望避免看到这个错误,可以在RECOVER DATABASE前指定SET UNTIL SCN或者用SET UNTIL TIME命令设置恢复到的SCN号或时间,执行不完全恢复。当然,我们现在执行的也是不完全恢复。

7.用OPEN RESETLOGS方式打开数据库

最后,以OPEN RESETLOGS方式打开数据库即可:

1. RMAN> ALTER DATABASE OPEN RESETLOGS;

2. database opened

至此,数据库在192.168.100.101服务器端创建成功。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
不小心Truncate表的事情也是有的, 其中大部份时因为工具连错了库, 从儿跑错了角本. 遇到这种事情而没有备份时怎么办呢? 首先要停止数据库, 将这个表所在的表空间的文件拷贝出来, 因为Oracle在Truncate只时将相应Segment的第一个块格式化掉了, 而后面的都还存在, 到下次用时到才真正地重新格式化. 下面来讲一个Truncate表后进行恢复的例子: SQL> CREATE TABLE T_TRUNCATE AS SELECT * FROM TAB; Table created. SQL> SELECT COUNT(*) FROM T_TRUNCATE; COUNT(*) ---------- 14 SQL> ALTER SYSTEM CHECKPOINT; System altered. SQL> TRUNCATE TABLE T_TRUNCATE; Table truncated. SQL> ALTER SYSTEM CHECKPOINT; System altered. 在Truncate时只是Segment Header格式化了, 并将Data Object ID换成一个新的值, 我们可以在AUL中用DESC命令来查看: AUL> desc anysql.t_truncate Storage(OBJ#=9976 OBJD=9977 TS=4 FILE=4 BLOCK=5235 CLUSTER=0) No. SEQ INT Column Name Type --- --- --- ----------------------------- ---------------- 1 1 1 TNAME VARCHAR2(30) NOT NULL 2 2 2 TABTYPE VARCHAR2(7) 3 3 3 CLUSTERID NUMBER 要恢复这个表的数据, 首先要在AUL中运行SCAN EXTENT命令, 因为Segment Header被格式化了, 所以Extent Map也可能丢失, 而Scan Extent则将扫描整个数据文件并将Extent分配信息写入AULEXT.TXT文件: AUL> SCAN EXTENT FILE 4 2006-12-18 21:32:10 2006-12-18 21:32:24 恢复的关键是要获得这个表原来的Data Object ID, 在这个例子中我在Truncate表后什么也没有做就关闭数据库进行恢复了. 从上面的DESC命令可以看出表的Segment Header是(4,5235), 而新的Data Object ID是9977, 老的Data Object ID我们可以从Segment Header的后面一个数据块中得到, 如果这个表有几个Free List Group, 则可能还要再后面几个块. 用AUL的ORADUMP命令来看一下后面一个块: AUL> ORADUMP FILE 4 BLOCK 5236 RDBA=0x01001474(4/5236)=16782452,type=0x06,fmt=0xa2,seq=0x02,flag=0x04 seg/obj=0x000026f8=9976,csc=0x0000.0006caf5,itc=3,typ=1 - DATA FLG=0x32, fls=0, nxt=0x01001471(4/5233)=16782449 ...... 可以看到原来的Data Object ID是9976, 现在可以恢复了, 先不指定原来的Data Object ID试试? AUL> unload table anysql.t_truncate; 2006-12-18 21:33:37 Unload OBJD=9977 FILE=4 BLOCK=5235 CLUSTER=0 ... 2006-12-18 21:33:37 接下来指定原来的Data Object ID, 再试试? AUL> unload table anysql.t_truncate object 9976; 2006-12-18 21:33:45 Unload OBJD=9976 FILE=4 BLOCK=5235 CLUSTER=0 ... P_MV_FACT_SALES|TABLE TIME_DIM|TABLE FACT_SALES|TABLE MV_FACT_SALES|TABLE SEG$|TABLE NUMTEST|TABLE T_OBJECTS|TABLE T_LOBTEST|TABLE T_INCLOB|TABLE CF_XXK|TABLE T_TESTDMP|TABLE T_CLOBDEMO|TABLE T_BLOBDEMO|TABLE T_TRUNCATE|TABLE 2006-12-18 21:33:45 可以看到14条数据全回来了, 当然数据库是复杂的, 如果是一个很大的表, 还是不能保证可以100%恢复的. 最近至少看到二次错误地截断(Truncate)表的例子, 并在网上询问如何恢复, 在这儿我给出AUL/MyDUL的解决方案, 下面是我用的一个测试表: ASQL> DESC TRUNCDEMO NO# NAME NULLABLE TYPE --- ----------------- -------- ------------ 1 COL1 VARCHAR2(20) ASQL> SELECT * FROM TRUNCDEMO; COL1 ----- ROW 1 ROW 2 2 rows returned. 接下来我们来截断表, 其实这个操作只是重新格式化了段头块(Segment Header), 并分配一个新的数据对象号(Data Object ID), 当然空间分配信息也改了, 除非加了重用空间选项(Reuse Storage). 来看一下这个操作的前后变化: ASQL> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS; DATA_OBJECT_ID OBJECT_NAME -------------- ----------- 13676 TRUNCDEMO 1 rows returned. ASQL> truncate table truncdemo; Truncate Table Succeed. ASQL> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS; DATA_OBJECT_ID OBJECT_NAME -------------- ----------- 13677 TRUNCDEMO 1 rows returned. 由于在System表空间中已经记录了新的信息, 因此用当前的System信息是不能恢复过来的,在AUL/MyDUL中可以当作没有System时的情况来处理,在下面的命令中, 我们用Truncate后的数据对象号就不能进行恢复, 而使用Truncate以前的就可以, 当然空间不能被重新利用了是恢复的前提. AUL> unload object 13676 column varchar file 4; 2006-09-18 22:38:58 ROW 1 ROW 2 2006-09-18 22:39:04 AUL> unload object 13677 column varchar file 4; 2006-09-18 22:39:10 2006-09-18 22:39:10 AUL> 因此在意外发生Truncate后, 如果没有备份可以恢复, 首先要做的事是备份一下当前的文件, 免得空间被重用. 而Truncate之前的数据对象号在AUL/MyDUL中是很容易找出来的. 到此已经说明了如何恢复Truncate表了. 跟据原理可以创建一个恢复包Recover_Truncate_Data,然后我们可以做个实验进行验证恢复效果如何: 第一步:创建表 create table truntab1 as select * from dba_objects; 第二步:查询表中记录数 select count(*) from truntab1; --72622 第三步:truncate表中业务数据 truncate table truntab1; 第四步:确认表中记录数为零 select count(*) from truntab1; -- 0 第五步:设置恢复前环境变量 set serveroutput on size 10000000 --//设置大点,默认为2000 bytes exec dbms_output.enable(999999999999999999999); --//默认为2000 bytes 注意:如果不不进行设置,为报PLSQL ORA-20000: ORU-10027: buffer overflow, limit of 10000 第六步:实施truncate表中数据恢复 declare tgtowner varchar2(30); tgttable varchar2(30); datapath varchar2(4000); datadir varchar2(30); rects varchar2(30); recfile varchar2(30); rstts varchar2(30); rstfile varchar2(30); blksz number; rectab varchar2(30); rsttab varchar2(30); copyfile varchar2(30); begin tgtowner := 'SYS'; --指定表名的属用户 tgttable := 'TRUNTAB1'; --指定需要恢复的表名 datapath := 'D:\app\Administrator\oradata\lmis\'; --数据文件所在位置 datadir := 'FY_DATA_DIR'; Recover_Truncate_data.prepare_files(tgtowner, tgttable, datapath, datadir, rects, recfile, rstts, rstfile, blksz); Recover_Truncate_data.fill_blocks(tgtowner, tgttable, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile); Recover_Truncate_data.recover_table(tgtowner, tgttable, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz); end; 第七步:查看输出内容和构造表名: 15:32:44: Directory Name: FY_DATA_DIR4 15:32:45: Recover Tablespace: FY_REC_DATA4; Data File: FY_REC_DATA4.DAT 15:32:46: Restore Tablespace: FY_RST_DATA4; Data File: FY_RST_DATA4.DAT 15:32:48: Recover Table: SYS.TRUNTAB1$2 15:32:48: Restore Table: SYS.TRUNTAB1$$2 15:33:04: [fill_blocks] Data Blocks formatted. 15:33:05: [copy_file] begin copy file: FY_DATA_DIR4\FY_REC_DATA4.DAT => FY_DATA_DIR4\FY_REC_DATA_COPY.DAT 15:33:05: [copy_file] completed. 15:33:05: Copy file of Recover Tablespace: FY_REC_DATA_COPY.DAT 15:33:05: begin to recover table SYS.TRUNTAB1 15:33:19: [restore_table] Trying to restore data to SYS.TRUNTAB1$$2 15:33:20: [restore_table] Expected Records in this round: 411 15:33:20: [restore_table] 411 records recovered 此处省略N行输出............................................ 15:33:44: [restore_table] Expected Records in this round: 0 15:33:44: [restore_table] 0 records recovered 15:33:44: 1033 truncated data blocks found. 15:33:44: 72622 records recovered in backup table SYS.TRUNTAB1$$2 15:33:44: Recovery completed. PL/SQL procedure successfully completed 从红色字体可以看出,恢复72622条,刚好是truncate前业务表中记录数,恢复临时表为:SYS.TRUNTAB1$$2 第七步:查看输出内容和构造表名: insert into truntab1 select * from SYS.TRUNTAB1$$2 第八步:验证数据是否完全恢复 select count(*) from truntab1; --72622 至此,truncate掉的数据成功恢复,并且此方法也可以恢复drop table tablename purge删除的数据, 第九步:清理恢复产生的表空间和数据文件 特别提醒:恢复完成后,该方法会在数据库中产生一个表空间:FY_RST_DATA*,恢复一次产生一个,记得及时清理!否则会导致服务器RMAN备份失败ORA-19566 超出损坏块限制(切记) truncate原理: ? ? ? ?TRUNCATE不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储段头和扩展段图)。也就是说,此时,其基本数据并未被破坏,而是被系统回收、等待被重新分配————因此,要恢复被TRUNCATE的数据,需要及时备份其所在的数据文件。 ? ? 方法:用存储过程包Fy_Recover_Data ? ? 它是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包,这个包是由行内有影响力的DBA大师黄炜先生通过PLSQL编写的,再这里再次感谢他的无私技术分享。Fy_Recover_Data去本文附近中下载 好了,闲话少说,下面通过oracle数据库中scott用户自带的emp表做测试: 步骤1:先把Fy_Recover_Data包拷贝到oracle相关目录下 步骤2:在scott用户下创建test_emp表: SQL> conn scott/tiger; Connected. SQL> select * from tab; TNAME ? ? ? TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS ? ? ? TABLE DEPT ? ? ? TABLE EMP ? ? ? ? ? ? ? ?TABLE SALGRADE ? ? ? TABLE SQL> select count(*) from emp; ? COUNT(*) ---------- 14 SQL> create table test_emp ?as select * from emp; Table created. SQL> select count(*) from test_emp; ? COUNT(*) ---------- 14 步骤3:用truncate删除test_emp表: SQL> truncate table test_emp; Table truncated. SQL> select count(*) from test_emp; ? COUNT(*) ---------- 0 步骤4:在linux中的oracle用户下解压FY_Recover_Data.zip包 $ unzip FY_Recover_Data.zip Archive: ?FY_Recover_Data.zip ? inflating: FY_Recover_Data.SQL? 步骤5:恢复 1)在sys用户下执行存储过程 SQL> @/home/oracle/FY_Recover_Data.SQL Package created. Package body created. 2)查看test_emp表在数据文件中的目录 SQL> select file_name from dba_data_files f, dba_tables t where t.owner='SCOTT' and t.table_name='TEST_EMP' and t.tablespace_name = f.tablespace_name; FILE_NAME -------------------------------------------------------------------------------- /u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf 3)通过脚本恢复,可以用sqlplus命令行或者plsql developer执行 declare ? ? ? tgtowner varchar2(30); ? ? ? tgttable varchar2(30); ? ? ? datapath varchar2(4000); ? ? ? datadir varchar2(30); ? ? ? rects varchar2(30); ? ? ? recfile varchar2(30); ? ? ? rstts varchar2(30); ? ? ? rstfile varchar2(30); ? ? ?blksz number; ? ? ?rectab varchar2(30); ? ? ?rsttab varchar2(30); ? ? ?copyfile varchar2(30); ? ?begin ? ? ?tgtowner := 'SCOTT'; --table owner ? ? ?tgttable := 'TEST_EMP'; ?--table name ? ? ?datapath := '/u03/oracle/oradata/WUTONG/datafile/'; ? ?--必须和test.t1表所在的数据文件的目录相同 ? ? ?datadir := 'FY_DATA_DIR'; ? ? ? ?--oracle中目录的名字,可以修改 ? ? ?Fy_Recover_data.prepare_files(tgtowner, tgttable, datapath, datadir, rects, recfile, rstts, rstfile, blksz); ? ? ?Fy_Recover_data.fill_blocks(tgtowner, tgttable, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile); ? ? ?Fy_Recover_data.recover_table(tgtowner, tgttable, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz); ? ?end; ? ?以上SQL脚本产生2个表空间(2个数据文件),还有1个copy文件。 4)切换到scott用户下查看会发现多了些不一样以test_emp的表,这时找到相关有数据的表,把数据插入原表test_emp SQL> conn scott/tiger Connected. SQL> select * from tab; TNAME ? ? ? TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS ? ? ? TABLE DEPT ? ? ? TABLE EMP ? ? ? TABLE SALGRADE ? ? ? TABLE TEST_EMP ? ? ? TABLE TEST_EMP$ ? ? ? TABLE TEST_EMP$$ ? ? ? TABLE 7 rows selected. SQL> insert into test_emp select * from TEST_EMP$$; 14 rows created. SQL> commit; Commit complete. SQL> select count(*) from test_emp; ? COUNT(*) ---------- 14 当你看到这一步的时候,说明truncate的表已经完全恢复了,恭喜你数据恢复成功!紧张的压力随之而释放,脸上露出灿烂的笑容和自豪感(做DBA很辛苦,数据库能保持正常运行,DBA在幕后做了大量的工作,有时是不会不被公司其他人理解的。。。。。) 步骤6:恢复数据后,把恢复时产生的2个表空间删除,再删除对应数据文件 SQL> conn / as sysdba Connected. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u03/oracle/oradata/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf /u03/oracle/oradata/WUTONG/datafile/FY_REC_DATA.DAT /u03/oracle/oradata/WUTONG/datafile/FY_RST_DATA.DAT 7 rows selected. SQL>?drop tablespace FY_REC_DATA INCLUDING CONTENTS; Tablespace dropped. SQL>?drop tablespace FY_RST_DATA INCLUDING CONTENTS; Tablespace dropped. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u03/oracle/oradata/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf 然后去操作系统下把对应的数据文件删除即可 ---------------------
(一)客户端组件和服务器端组件 2 (二)Oracle Database 的体系架构 2 1. 什么是数据库?什么是实例? 3 2. 存储结构 3 数据文件(data file) 4 联机日志文件(online redo log file) 4 控制文件(control file) 5 归档模式:冷备份,离线备份,热备份,联机备份 6 Spfile:二进制,9i 之后 Pfile:文本,9i 之前 6 可以将 spfile 转换为 pfile 6 注意:scope 的取值有三个:memory、spfile、both 7 一个表空间(tablespace)由一组段组成 8 Tablespaces(表空间) 8 system sysaux temp undo 8 Segments (段) 8 extents (区) 8 Data Block (数据块) 8 3. 进程结构 9 日志写进程(LGWR) 检查点进程(CKPT) 9 归档进程(ARCn) 恢复器进程(RECO) 9 2日志写进程(LGWR) 10 3检查点进程(CKPT) 10 6归档进程(ARCn) 10 7恢复器进程(RECO) 11 4. 内存结构 11 1共享池:shared pool 12 3重做日志缓冲区:log buffer 12 (三)自动内存管理和自动共享内存管理 13 (四)管理方案对象 13 (五)数据字典 15 (一)安装 Oracle Linux 7.3 64 位操作系统 17 (二)安装 Oracle Database 12cR2 19 (三)使用 DBCA 创建 Oracle 数据库 21 (四)验证 Oracle Database 12cR2 环境 25 (五)使用 oracle-database-server-12cR2-preinstall 包 25 三、管理数据库实例 27 (一)管理工具 27 (二)初始化参数 27 (三)数据库启动的过程 29 (四)数据库的关闭 29 四、配置 Oracle 的网络环境 31 (一)连接建立的过程 31 (二)使用 lsnrctl 命令 31 (三)如何配置监听器 33 (四)注册数据库的服务 34 (五)建立连接的方法 36 (六)共享服务器模式 38 (七)分布式数据库基础 40 五、管理用户和权限 42 (一)用户 42 (二)权限 46 (三)角色 51 (四)概要文件:Profile 54 六、管理数据库存储结构 57 (一)存储结构 57 (二)数据块的结构 57 (三)表空间和数据文件 57 (四)什么是自动存储管理 58 七、数据的并发处理 60 (一)锁定的机制 60 (三)锁的队列 60 (四)死锁 62 (五)手动加锁 64 (方式一)lock 语句 64 八、管理还原数据 65 (一)什么是还原数据? 65 (二)还原数据的作用 66 (三)还原数据的工作原理 66 (四)还原数据与重做数据 67 (五)管理还原数据 67 (六)还原保留期和确保还原保留期 67 九、数据库审计 68 (一)什么是数据库审计 68 (二)审计的参数设置 69 (三)强制审计 69 (四)标准审计 69 (五)基于值的审计 71 (六)细粒度审计(FGA) 71 (七)DBA 审计 73 (八)12c 审计的新特性 73 十、移动数据 76 (一)移动数据的整体架构 76 (二)目录对象 76 (三)使用 SQL*Loader 77 (四)数据泵 78 (五)外部表 80 十一、性能管理基础 82 (一)性能监视 82 (二)性能监视 82 (三)管理内存组件 83 (四)使用内存指导 83 (五)使用动态性能视图 84 (六)故障排除和优化视图 85 (七)无效和不可用对象 85 =======第二篇:备份恢复======= 86 一、备份恢复的基本概念 86 (一)衡量数据库恢复性的两个指标 86 (二)数据库故障的类型 86 (三)配置数据库的可恢复性 88 (四)归档日志文件 88 (五)启用 ARCHIVELOG(归档)模式 89 (六)Oracle 数据库备份的解决方案 89 二、闪回 90 (一)什么是闪回 Flashback? 90 (五)闪回查询:Flashback Query 91 (六)闪回版本查询:Flashback Version Query 92 (七)闪回表:Flashback Table 93 (八)闪回数据库:Flashback Database 94 (九)闪回删除:Flashback Drop 95 (十)闪回事务查询:Flashback Transaction Qu

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值