Oracle数据库管理基础中,表空间操作是基础中的基础。其中,表空间Offline是我们经常接触的一个知识点。同数据文件Offline一起,构成了Oracle维护数据一致性的重要体系结构。
一般我们比较常接触到的,就是直接的alter tablespace xxx offline操作。但是在实际中,针对表空间对应数据文件的不同情况,我们是有三种参数操作相对应的。同数据库关闭shutdown对应的若干种参数一样,不同的offline参数对应Oracle不同的行为,更引出后续不同的处理方法。
本篇从原理入手,分别详细介绍表空间Offline、数据文件Offline、日志归档模式和备份还原之间的关系。
1、Offline简说
Oracle Offline表空间是一种对表空间对象和数据的“关闭访问”。在正常Online情况下,一个表空间中若干个数据文件是维持在动态的一致状态中,文件头上的SCN根据DBWR和CKPT维持一致或者不一致的状态。
我们将表空间Offline的目的无非有如下三类:
ü 实现部分数据的不可访问。如果使用表空间进行多个系统数据模块的划分,可以使用offline方法,将一部分的数据不可访问;
ü 当进行前端应用程序进行升级维护的时候,可以使用offline方法对部分数据访问进行屏蔽;
ü 对数据文件进行改名和重定位(转移到其他位置上);
在进行数据库管理的时候,留足备份、慎删数据是非常重要的原则。没有绝对把握的时候,绝对不要动手删除数据。这里谈到的offline tablespace和lock user都是非常好的屏蔽数据访问的手段。
一个表空间可以有一个或者多个数据文件。如果一个表空间被offline,那么对应的数据文件也就被offline。
并不是所有表空间都可以被offline。System、Undo和Temporary表空间是不允许进行Offline操作的。一般只有非系统表空间,也就是业务数据表空间才会进行Offline操作。
另一个重要点是如果要进行offline操作的表空间是一个用户的Default表空间,那么最好要将其默认表空间修改一下,防止操作错误出现。
将表空间进行Offline的命令很简单,就是alter tablespace xxx offline;根据不同的情况,我们是可以使用三种参数进行命令修饰,分别为normal、temporary和immediate。三个命令分别对应了Offline过程的不同行为。在下面的步骤中,我们通过实验来查看三种命令参数的行为特征。
2、实验环境介绍
实验选择在Oracle 11gR2上进行,数据库处在归档模式archive log mode。注意:是否归档模式对于数据表空间和文件Offline行为至关重要!
SQL> select * from v$version;
BANNER
------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
归档模式数据库。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 21
Next log sequence to archive 23
Current log sequence 23
--数据库在open状态
SQL> select status from v$instance;
STATUS
------------
OPEN
--Oracle支持命名管理OMF
SQL> show parameter db_create_file;
NAME TYPE VALUE
------------------------- ----------- ------------------------------
db_create_file_dest string /u01/app/oradata
创建实验表空间testtbs。为了更加明显进行试验,我们设计它是由两个数据文件构成。
SQL> create tablespace testtbs datafile size 10m extent management local uniform. size 1m segment space management auto;
Tablespace created
SQL> alter tablespace testtbs add datafile size 10m autoextend off;
Tablespace altered
SQL> select tablespace_name, status from dba_tablespaces where tablespace_name='TESTTBS';
TABLESPACE_NAME STATUS
------------------------------ ---------
TESTTBS ONLINE
SQL> select file_name, status, online_status from dba_data_files where tablespace_name='TESTTBS';
FILE_NAME STATUS ONLINE_STATUS
-------------------- --------- -------------
/u01/app/oradata/ORA AVAILABLE ONLINE
11G/datafile/o1_mf_t
esttbs_94hpygrx_.dbf
/u01/app/oradata/ORA AVAILABLE ONLINE
11G/datafile/o1_mf_t
esttbs_94hq0dgm_.dbf
注意三个Online状态,我们的实验就在这个过程中展开。最后再添加一个数据表,用于空间分配过程。
SQL> create table test tablespace testtbs as select * from dba_objects;
Table created
SQL> select tablespace_name from dba_segments where wner='SYS' and segment_name='TEST';
TABLESPACE_NAME
------------------------------
TESTTBS
SQL> select count(*) from test;
COUNT(*)
----------
75223
3、归档模式下数据文件offline normal
offline normal是我们最常用的表空间offline方法,也是默认的offline方法。如果数据表空间和数据文件状态都是online,我们是可以直接offline normal的。
--Offline数据表空间
SQL> alter tablespace testtbs offline normal;
Tablespace altered
--alert log中内容
Sun Sep 29 15:35:18 2013
alter tablespace testtbs offline normal
Completed: alter tablespace testtbs offline normal
此时,数据表空间和数据文件状态如下:
SQL> select tablespace_name, status from dba_tablespaces where tablespace_name='TESTTBS';
TABLESPACE_NAME STATUS
------------------------------ ---------
TESTTBS OFFLINE
SQL> select file_name, status, online_status from dba_data_files where tablespace_name='TESTTBS';
FILE_NAME STATUS ONLINE_STATUS
-------------------- --------- -------------
/u01/app/oradata/ORA AVAILABLE OFFLINE
11G/datafile/o1_mf_t
esttbs_94hpygrx_.dbf
/u01/app/oradata/ORA AVAILABLE OFFLINE
11G/datafile/o1_mf_t
esttbs_94hq0dgm_.dbf
数据文件一个很重要的内容就是文件头的SCN编号。我们知道,如果完全关闭数据库或者check point的时候,Oracle是要保证控制文件和文件头的SCN一致。
SQL> select file#, status, recover, fuzzy, CHECKPOINT_CHANGE# from v$datafile_header;
FILE# STATUS RECOVER FUZZY CHECKPOINT_CHANGE#
---------- ------- ------- ----- ------------------
1 ONLINE NO YES 1054312
2 ONLINE NO YES 1054312
3 ONLINE NO YES 1054312
4 ONLINE NO YES 1054312
5 ONLINE NO YES 1054312
6 OFFLINE 0
7 OFFLINE 0
7 rows selected
SQL> select file#, CHECKPOINT_CHANGE#, OFFLINE_CHANGE# from v$datafile;
FILE# CHECKPOINT_CHANGE# OFFLINE_CHANGE#
---------- ------------------ ---------------
1 1054312 787896
2 1054312 787896
3 1054312 787896
4 1054312 787896
5 1054312 819012
6 1059175 1058506
7 1059175 1058506
7 rows selected
在offline normal的时候,数据文件头的SCN是一致的。
alter log中信息里面,Data Recovery Advisor显示出信息。
--有报错内容
Sun Sep 29 15:53:04 2013
Checker run found 2 new persistent data failures
RMAN> list failure all;
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
122 HIGH OPEN 29-SEP-13 One or more non-system datafiles are offline
128 HIGH OPEN 29-SEP-13 Tablespace 7: 'TESTTBS' is offline
如果是正常的offline normal,是可以直接online回正常的。
SQL> alter tablespace testtbs online;
Tablespace altered
在数据库正常情况下,出于性能考虑数据文件头SCN号是不能维持一致的。我们使用offline normal之后,各个文件头SCN相同。所以,offline normal特性是在offline的时候,要在表空间所有文件上打check point,只要能够打上SCN号,offline normal是可以正常完成的。也就是说,offline normal是表空间各个文件一致性的关闭。
Datafile在很多时候,是不能保证一致性的。这个时候就需要使用Temporary和Immediate两个参数了。下面我们继续讨论。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-773628/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-773628/