ITPub博客

首页 > 数据库 > Oracle > nologging插入需再次备份一点分析

nologging插入需再次备份一点分析

原创 Oracle 作者:dotaddjj 时间:2012-08-08 23:32:34 0 删除 编辑

相信经常看见文章 blog上面提到用nologging方式插入数据后需要马上进行备份,下面用两个例子来对nologging方式插入后需要再次备份后才能进行完全恢复进行分析.

SQL> create table t_nolog01 as select * from dba_objects where 1<>1;

Table created

SQL> alter table t_nolog01 nologging;

Table altered

SQL> select table_name,logging from user_tables where table_name='T_NOLOG01';

TABLE_NAME LOGGING

------------------------------ -------

T_NOLOG01 NO

Rman>backup tablespace users;

对users表空间进行了一个备份,注意这里在nologging插入前备份的

SQL> insert /*+append*/ into t_nolog01 select * from dba_objects;

72141 rows inserted

SQL> commit;

Commit complete

此时正常关闭数据库删除users表空间,然后用users表空间的备份恢复打开数据库后

SQL> select count(*) from t_nolog01;

select count(*) from t_nolog01

ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 171)

ORA-01110: 数据文件 4: 'F:APPORADATAXIAOYUUSER01.DBF'

ORA-26040: 数据块是使用 NOLOGGING 选项加载的

如果利用增量备份在nologging插入后再次备份,数据应该不会出现丢失,进行第二个测试:

SQL> create table t_test_nolog01 tablespace test as select * from dba_objects where 1<>1;

Table created

SQL> alter table t_test_nolog01 nologging;

Table altered

SQL> select table_name,logging,tablespace_name from user_tables where table_Name='T_TEST_NOLOG01';

TABLE_NAME LOGGING TABLESPACE_NAME

------------------------------ ------- ------------------------------

T_TEST_NOLOG01 NO TEST

RMAN> backup incremental level 0 database;

SQL> insert /*+append*/ into t_test_nolog01 select * from dba_Objects;

72143 rows inserted

SQL> commit;

Commit complete

RMAN> backup incremental level 1 database;

关闭数据库后删除test表空间的数据文件,然后进行恢复。

RMAN> shutdown immediate;

数据库已关闭

数据库已卸装

Oracle 实例已关闭

RMAN> startup mount;

RMAN> restore datafile 6;

通道 ORA_DISK_1: 将数据文件 00006 还原到 F:APPORADATAXIAOYUTEST01.DBF

通道 ORA_DISK_1: 正在读取备份片段 E:RECOVERY_AREAXIAOYUBACKUPSET2012_0

1_MF_NNND0_TAG20120808T225808_824ZN1Q0_.BKP

通道 ORA_DISK_1: 段句柄 = E:RECOVERY_AREAXIAOYUBACKUPSET2012_08_08O1_

D0_TAG20120808T225808_824ZN1Q0_.BKP 标记 = TAG20120808T225808

通道 ORA_DISK_1: 已还原备份片段 1

通道 ORA_DISK_1: 还原完成, 用时: 00:00:15

完成 restore 于 08-8月 -12

RMAN> recover datafile 6;

最后打开数据库查看t_test_nolog01表的数据没有丢失。

SQL> select count(*) from t_test_nolog01;

COUNT(*)

----------

72143

从上面的测试中,发现了如果使用了nologging方式插入数据,由于redo不记录数据库的改变到重做日志记录中,此时如果数据文件意外丢失,而利用之前的备份集进行恢复时,这部分数据是无法还原的,也提醒我们生产库中不要一味的讲究效率,nologging方式插入需要用到特定的环境中,例如大批量插入数据非归档环境,数据可以轻易抽取生成、中间表等,nologging是可以为系统提高效率的。

不过第二个测试中我们发现了增量备份的好处,差异增量备份备份上级或同级以来发生变化的数据块,正好可以把nologging那部分的数据块备份起来用于正常恢复。我们需要非常清楚对数据库的相应的操作,不然有时候一味的求取效率,往往失去了数据的稳定性和安全性。

[@more@]

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

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662967