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) 创建索引
第二个案例要验证在先备份数据文件,再发生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/