代码改变世界

Oracle表空间基础(4)

2016-06-24 12:37  magnes  阅读(272)  评论(0编辑  收藏  举报

一、创建非标准块的表空间

在数据库中可以创建不同于数据库标准块大小的表空间,这个特征可以在两个具有不同块大小的数据库之间传输表空间。在创建非标准块表空间之前,必须保证设置了DB_CACHE_SIZE和至少一个DB_nK_CACHE_SIZE初始化参数,DB_nK_CACHE_SIZE即为非标准块表空间的块大小。

# 查看参数db_16k_cache_size系统默认值,默认值为0,表示未启用。
show parameter db_16k_cache_size

NAME                  TYPE                 VALUE
--------------------- -------------------- -------------------
db_16k_cache_size     big integer          0

# 创建非标准块的缓存区,在测试过程中,即使指定的非标准块大小是4M,系统会自动给出一个最小的32M大小。
alter system set db_16k_cache_size=4M scope=both;
System altered.

show parameter db_16k_cache_size

NAME                 TYPE                 VALUE
-------------------- -------------------- --------------------
db_16k_cache_size    big integer          32M

# 添加数据库块为16K的非标准块表空间
create tablespace test_spc datafile '/u01/app/oracle/oradata/orcl/test01.dbf' size 100M uniform size 1M blocksize 16K;

  

二、控制重做记录的产生

对于数据库的一些操作,我们可以控制重做记录的产生,当然,如果没有重做记录,介质恢复将无法进行。然而不生产重做记录可以提高性能,并且对于某些容易恢复的操作来说这种方式可能是适当的。例如这样的语句:create table ... as select 。默认情况下,对表空间内的任何对象上进行操作都会产生重做记录。但是,在创建表空间时,使用nologging子句将阻止重做记录的产生。不管是否指定nologging祖居,在临时段或者临时表空间从来都不会产生重做记录。

如果对表空间设置为不产生重做日志,而表空间上的对象则设置为产生重做日志,例如:create table ... logging ,则对象上的设置覆盖表空间上的设置;如果在表空间上使用force logging(强制产生重做记录),则在表空间级的设置将覆盖在任何对象级进行的设置,即:如果在表空间上设置强制产生重做记录,那么在表空间内的对象上再设置nologging是无效的。

注意:如果force logging模式的表空间传输到另外的数据库,那么force logging模式将会失效。

 

三、调整表空间的可用性

对于普通用户来说,如果表空间离线(offline),则意味着表空间及其对象将无法访问,但此时数据库内的其他数据时可以访问的;同样的,也可以让表空间在线(online),使用户恢复对其的访问。修改表空间的在线或离线状态时,数据库必须处于打开状态。通过使用alter tablespace ... online/offline语句调整表空间的在线或离线状态。

1、何时需要进行表空间离线的操作

  • 数据库内部分数据不可用时,为了保证用户可以正常访问其他数据,这时可以使相关表空间离线。
  • 执行表空间离线备份时,可以设置相关表空间离线。
  • 在应用程序维护或更新时,可以设置该应用的相关表空间离线。
  • 重命名(修改存储位置)数据文件数,可以设置相关表空间离线。

2、以下表空间无法进行离线操作

  • 系统表空间,system
  • 撤销表空间,undo
  • 临时表空间,temporary

3、表空间离线方式

# for recover 的作用同immediate类似,10g以后不建议使用
alter tablespace <tablespace_name> offine normal  | temporary | immediate | for recover; 

下表为表空间离线方式中有关参数的说明:

参数 作用描述
normal 表空间正常离线,在所有表空间的所有数据文件上执行检查点操作,当表空间online,不需要进行介质恢复
temporary 对表空间在线的数据文件进行检查点操作,离线数据文件不进行检查点,当表空间online,执行检查点的数据文件不需要进行介质恢复
immediate 在所有数据文件上不执行检查点,表空间online,需要执行检查点,无法在noarchivelog上使用immediate方式offline表空间

 以下内容为测试结果:

SQL> alter tablespace test_tbs01 offline normal;
Tablespace altered.

SQL> alter tablespace test_tbs01 online;
Tablespace altered.

SQL> alter tablespace test_tbs01 offline temporary;
Tablespace altered.

SQL> alter tablespace test_tbs01 online;
Tablespace altered.

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     1
Current log sequence           2

SQL> alter tablespace test_tbs01 offline immediate;
alter tablespace test_tbs01 offline immediate
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled

 

四、只读表空间

所有的表空间在创建时默认都是可读写的(read write),同时使用read only选项可以讲表空间置为只读状态。只读表空间可以阻止对表空间内数据文件的写操作,其主要目的是为了避免对大型数据库的静态部分执行备份和恢复操作。另外,只读表空间提供了一种历史数据的保存方法,在只读表空间内,任何对象都无法修改,而不论用户是否有更新的权限。粗体部分的阐述和实验结果冲突

有关只读表空间的操作限制:

# 只读表空间不允许创建对象。
SQL> create table t3 (rec_id number,name varchar(4)) tablespace ro_tbs;
create table t3 (rec_id number,name varchar(4)) tablespace ro_tbs
*
ERROR at line 1:
ORA-01647: tablespace 'RO_TBS' is read only, cannot allocate space in it

# 只读表空间不允许修改记录。
SQL> update t2 set name='Blank' where id=2002;
update t2 set name='Blank' where id=2002
       *
ERROR at line 1:
ORA-00372: file 7 cannot be modified at this time
ORA-01110: data file 7: '/u01/app/oracle/oradata/stdb/read_only.dbf'

# 只读表空间不允许删除记录。
SQL> delete from t2 where id=2002;
delete from t2 where id=2002
            *
ERROR at line 1:
ORA-00372: file 7 cannot be modified at this time
ORA-01110: data file 7: '/u01/app/oracle/oradata/stdb/read_only.dbf'

# 只读表空间允许删除表。
SQL> drop table t2;
Table dropped.

# 只读表空间允许修改对象。
SQL> alter table t3 modify (name varchar(10));
Table altered.

在将表空间置为只读之前应考虑如下的前提条件:

1、表空间必须在线,而且必须确保没有要应用到表空间上的撤销信息。(表空间上的事务都应被提交)

SQL> alter tablespace test_tbs01 offline normal;
Tablespace altered.

SQL> alter tablespace test_tbs01 read only;
alter tablespace test_tbs01 read only
*
ERROR at line 1:
ORA-01539: tablespace 'TEST_TBS01' is not online

2、不能将活动事务的撤销表空间和系统表空间置为只读。

3、如果当前表空间正在联机备份,不能将该表空间置为只读状态,因为在备份结束后会更新表空间上所有数据文件的文件头信息。 

当执行alter tablespace ... read only语句之前,在该表空间上有一事务挂起或未被提交,该语句将等待表空间上的事务提交或回滚后才会返回;如果在执行alter tablespace ... read only语句之前,表空间上的事务挂起或未被提交,但某一时刻该事务回滚到了一个保存点(savepoint),则此时将执行事务的回滚,alter tablespace ... read only语句不再等待该事务。如果发现alter tablespace ... read only语句长时间无法返回,则需要判断是否有事务阻止了该语句的完成,并通知事务的所有者,必要时,中断这些事务。

SQL> select sql_text,saddr from v$sqlarea,v$session
  2  where v$sqlarea.address=v$session.sql_address
  3  and sql_text like 'alter tablespace%';
SQL_TEXT                                           SADDR
-------------------------------------------------- ----------------
alter tablespace test_tbs01 read only              0000000070F6FE40 -->  //这是将表空间置为只读语句的会话地址

SQL> select ses_addr,start_scnb from v$transaction order by start_scnb;
SES_ADDR         START_SCNB
---------------- ----------
0000000070F829F0     643505   -->  //这是将表空间置为只读状态之前的操作
0000000070F6FE40     643536   -->  //这是将表空间置为只读的语句

SQL> select t.ses_addr,s.username,s.machine from v$session s,v$transaction t
  2  where t.ses_addr=s.saddr
  3  order by t.ses_addr;
SES_ADDR         USERNAME                       MACHINE
---------------- ------------------------------ --------------------
0000000070F6FE40 SYS                            stdb.localdomain
0000000070F829F0 SYS                            stdb.localdomain   --> //需要中断这个操作表空间才能被置为只读