首页 > 数据库 > Oracle > nologging插入需再次备份一点分析
相信经常看见文章 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那部分的数据块备份起来用于正常恢复。我们需要非常清楚对数据库的相应的操作,不然有时候一味的求取效率,往往失去了数据的稳定性和安全性。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1059121/ ,如需转载,请注明出处,否则将追究法律责任。