Nologging对恢复的影响(二)

Nologging在提高性能的同时,会给恢复带来一定的影响。下面通过两个案例来说明它是怎么影响恢复的。

第二个案例要验证在先备份数据文件,再发生nologging操作的情况下,是否可以完全恢复数据。
[@more@] 1. 建表

CREATE TABLE SUK.PLOGGING
( A NUMBER,
B NUMBER
)
PARTITION BY LIST (A)
(PARTITION P1 VALUES (1) TABLESPACE SUK ,
PARTITION P2 VALUES (2) TABLESPACE SUK ) ;

CREATE TABLE SUK.PNOLOGGING
( C NUMBER,
D NUMBER
)
PARTITION BY LIST (C)
(PARTITION P1 VALUES (1) TABLESPACE SUK ,
PARTITION P2 VALUES (2) TABLESPACE SUK ) ;

2. 用普通的方式写入数据
SQL> insert into plogging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> insert into pnologging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> commit;

Commit complete


3. 此时备份表所在的表空间


RMAN> backup tablespace suk;

启动 backup 于 21-11月-10
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00007 name=E:ORACLEPRODUCT10.2.0ORADATASUK.DBF
通道 ORA_DISK_1: 正在启动段 1 于 21-11月-10
通道 ORA_DISK_1: 已完成段 1 于 21-11月-10
段句柄=E:ORACLEPRODUCT10.2.0DB_1DATABASEDLTJFGA_1_1 标记=TAG20101121T2224
10 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:07
完成 backup 于 21-11月-10

4. 继续往表写数据,其他一个用nologging方式写

SQL> insert into plogging select 1,1 from dba_tables;

963 rows inserted

SQL> insert /*+ append */ into pnologging select 1,1 from dba_tables;

963 rows inserted

SQL> commit;

Commit complete

5. 再次用普通方式往表写数据
SQL> insert into plogging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> insert into pnologging select mod(rownum,2)+1,mod(rownum,2)+1 from dba_objects;

10500 rows inserted

SQL> commit;

Commit complete

SQL> delete from test where rownum<=99;

99 rows deleted

SQL> commit;

Commit complete

SQL> select count(1) from test;

COUNT(1)
----------
8901

SQL> select count(1) from plogging;

COUNT(1)
----------
21963

SQL> select count(1) from pnologging;

COUNT(1)
----------
21963

6. 此时模拟数据库还原恢复

RMAN> restore tablespace suk;

启动 restore 于 21-11月-10
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=156 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00007恢复到E:ORACLEPRODUCT10.2.0ORADATASUK.DBF
通道 ORA_DISK_1: 正在读取备份段 E:ORACLEPRODUCT10.2.0DB_1DATABASEDLTJFGA_
1_1
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = E:ORACLEPRODUCT10.2.0DB_1DATABASEDLTJFGA_1_1 标记 = TAG20101121T
222410
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:08
完成 restore 于 21-11月-10

RMAN> recover tablespace suk;

启动 recover 于 21-11月-10
使用通道 ORA_DISK_1

正在开始介质的恢复
介质恢复完成, 用时: 00:00:02

完成 recover 于 21-11月-10

RMAN> alter database open;


7. 验证数据

SQL> select count(1) from test;

COUNT(1)
----------
8901

SQL> select count(1) from plogging;

COUNT(1)
----------
21963

SQL> select count(1) from pnologging;

select count(1) from pnologging

ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 3186)
ORA-01110: 数据文件 7: 'E:ORACLEPRODUCT10.2.0ORADATASUK.DBF'
ORA-26040: 数据块是使用 NOLOGGING 选项加载的


SQL> select count(1) from pnologging partition(p1);

select count(1) from pnologging partition(p1)

ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 3186)
ORA-01110: 数据文件 7: 'E:ORACLEPRODUCT10.2.0ORADATASUK.DBF'
ORA-26040: 数据块是使用 NOLOGGING 选项加载的

SQL> select count(1) from pnologging partition(p2);

COUNT(1)
----------
10500


可以,没有发生过nologging操作的表都可以完全恢复,发生过nologging的表的数据不能完全恢复。

结论:

如果备份后再发生nologging操作,则

1. 产生nologging操作的表不能被完全恢复。
2. nologging操作只会影响与之发生联系的表,不会影响其他表。
3. 如果表是非分区表,则会影响全表。如果nologging影响的表是分区表,nologging操作只会影响受该操作影响的数据对应的分区,而不影响其他分区。
例如T有两个分区P1和P2,在备份后对T发生了nologging操作,但只影响了P1的数据,则恢复时,可以正常访问P2的数据,而访问P1时会报错。
4. 即使nologging操作后的操作都是logging方式,也不能恢复后面的数据 。
5. nologging虽然可以提高性能,但是可能会造成数据无法恢复,因此使用这一特性时要非常谨慎。一般在如下情况下才建议使用:
1) 临时表
2) 中间表
3) 数据可轻易重新生成的表
4) 创建索引

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

转载于:http://blog.itpub.net/231499/viewspace-1041839/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值