我是靠谱客的博主 懦弱小松鼠,最近开发中收集的这篇文章主要介绍聊聊Data Guard环境下Temp表空间和Temp文件管理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

Oracle表空间和数据文件里面,Temp表空间和文件是比较特殊的。除了Temp表空间对应的临时段(temp segment)是由Oracle自动进行管理之外,稀疏文件的特性也是我们需要注意的一个方面。

常规情况下,我们创建一个数据文件,即使使用OMF特性,也需要指定初始文件大小。创建数据文件之后,磁盘空间被明确的占用,我们从操作系统层面是可以看到空间的。但是,对于临时表空间文件而言,新创建出的文件也许只能看到操作系统层面的文件大小,但是却没有空间占用。我们称这个特性为“稀疏文件”。

从实现层面,稀疏文件意味着更少的redo log生成。那么,在DG环境下,Temp文件的特性和普通文件有什么差异呢?下面我们通过一系列的实验来证明。

 

1、实验环境介绍

 

我们在Oracle 11gR2环境下的Dataguard中进行测试。具体版本为11.2.0.4。当前Primary情况如下:

 

--Primary名称ora11g

SQL> select DATABASE_ROLE, open_mode from v$database;

 

DATABASE_ROLE    OPEN_MODE

---------------- --------------------

PRIMARY          READ WRITE

 

当前数据库中只有一个临时文件,对应表空间TEMP

 

SQL> select file_name, tablespace_name from dba_temp_files;

 

FILE_NAME                                                    TABLESPACE_NAME

------------------------------------------------------------ ------------------------------

/u01/app/oradata/ORA11G/datafile/o1_mf_temp_9mnjxpk4_.tmp    TEMP

 

Dataguard而言,最重要的文件管理参数为standby_file_management。如果保持为AUTO,就可以保证数据文件同步创建。

 

SQL> show parameter standby_file

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

standby_file_management              string      AUTO

 

Standby端情况也比较简单,处在mount状态。文件自动创建管理。

 

 

SQL> select DATABASE_ROLE, open_mode from v$database;

DATABASE_ROLE    OPEN_MODE

---------------- --------------------

PHYSICAL STANDBY MOUNTED

 

 

SQL> select name, file# from v$tempfile;

 

NAME                                                                                  FILE#

-------------------------------------------------------------------------------- ----------

/u01/app/oradata/ORA11GSY/datafile/o1_mf_temp_9pcqbdd6_.tmp                               1

 

SQL> show parameter standby_file

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

standby_file_management              string      AUTO

 

2Primary端临时表空间操作

 

我们首先实验在Primary端进行表空间操作。

 

primary

SQL> alter tablespace temp add tempfile size 100m autoextend off;

Tablespace altered

 

SQL> select file_name, tablespace_name from dba_temp_files;

 

FILE_NAME                                                    TABLESPACE_NAME

------------------------------------------------------------ ------------------------------

/u01/app/oradata/ORA11G/datafile/o1_mf_temp_9mnjxpk4_.tmp    TEMP

/u01/app/oradata/ORA11G/datafile/o1_mf_temp_9pm3ct62_.tmp    TEMP

 

SQL> alter system switch logfile;

System altered

 

切换之后,正常redo log信息应该已经传递到standby端。Standby端启动redo apply过程,查看临时文件是否创建。

 

 

SQL> alter database recover managed standby database using current logfile disconnect from session;

 

Database altered

 

SQL> select name, file# from v$tempfile;

 

NAME                                                                                  FILE#

-------------------------------------------------------------------------------- ----------

/u01/app/oradata/ORA11GSY/datafile/o1_mf_temp_9pcqbdd6_.tmp                               1

 

启动redo apply之后,standby端依然只有一个临时文件,也就是说明临时文件没有联动的传递过来。至此,PrimaryStandby文件结构出现差异。

此时是否可以在standby端直接添加文件呢?mount状态下,是拒绝的。

 

 

SQL> alter tablespace temp add tempfile size 100m autoextend off;

 

altertablespace temp add tempfile size 100m autoextend off

 

ORA-01109: 数据库未打开

 

与数据文件对应的临时表空间,如果我们在Primary端进行创建时,会不会联动创建呢?

 

(主库)

SQL> create temporary tablespace temp1 tempfile size 10m autoextend off

2  extent management local uniform size 1m;

 

Tablespace created

 

SQL> select file_name, tablespace_name from dba_temp_files;

 

FILE_NAME                                                    TABLESPACE_NAME

------------------------------------------------------------ ------------------------------

/u01/app/oradata/ORA11G/datafile/o1_mf_temp_9mnjxpk4_.tmp    TEMP

/u01/app/oradata/ORA11G/datafile/o1_mf_temp_9pm3ct62_.tmp    TEMP

/u01/app/oradata/ORA11G/datafile/o1_mf_temp1_9pm3mv8b_.tmp   TEMP1

 

此时再观察Standby端,TEMP1表空间也没有连带的传导到standby端。

 

 

SQL> select name, file# from v$tempfile;

 

NAME                                                                                  FILE#

-------------------------------------------------------------------------------- ----------

/u01/app/oradata/ORA11GSY/datafile/o1_mf_temp_9pcqbdd6_.tmp                               1

 

结论:当我们Standby端处在mount状态(Read Only也相同),Primary端涉及到的临时表空间创建维护、临时文件创建的操作是不会传导到standby端的。处在mount状态的standby端也不能进行文件手工创建动作。

 

3SwitchoverTemp的影响

 

如果我们进行switchover,让原来的standby切换到Primary状态,那么临时文件是否有变化呢?

首先是primary进行切换。

 

 

SQL> alter database commit to switchover to physical standby with session shutdown;

Database altered

 

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup nomount

ORACLE instance started.

 

Total System Global Area  313860096 bytes

Fixed Size                  1364340 bytes

Variable Size             272633484 bytes

Database Buffers           33554432 bytes

Redo Buffers                6307840 bytes

SQL> alter database mount standby database;

 

Database altered.

 

--角色切换成功

SQL> select DATABASE_ROLE, open_mode from v$database;

 

DATABASE_ROLE    OPEN_MODE

---------------- --------------------

PHYSICAL STANDBY MOUNTED

 

standby端,切换为Primary

 

 

SQL> select DATABASE_ROLE, open_mode from v$database;

 

DATABASE_ROLE    OPEN_MODE

---------------- --------------------

PHYSICAL STANDBY MOUNTED

 

SQL>alter database commit to switchover to primary with session shutdown;

 

Database altered

 

SQL> select DATABASE_ROLE, open_mode from v$database;

 

DATABASE_ROLE    OPEN_MODE

---------------- --------------------

PRIMARY          MOUNTED

 

SQL> alter database open;

Database altered

 

此时,角色切换过来。但是新Primary端的临时文件还是1个,没有带过来。

 

SQL> select name, file# from v$tempfile;

 

NAME                                                     FILE#

-------------------------------------------------------------------------------- ----------

/u01/app/oradata/ORA11GSY/datafile/o1_mf_temp_9pcqbdd6_.tmp          1

 

虽然没有,但是切换为Primary之后,我们可以手工进行临时添加。注意下面的现象!

 

SQL> create temporary tablespace temp1 tempfile size 10m autoextend off

2  extent management local uniform size 1m;

 

create temporary tablespace temp1 tempfile size 10m autoextend off

extent management local uniform size 1m

 

ORA-01543: 表空间 'TEMP1' 已存在

 

刚刚在Primary创建TEMP1的时候,Standby中并没有临时文件加入!我们查看一下新Primary的表空间情况。

 

 

SQL> select tablespace_name, contents from dba_tablespaces;

 

TABLESPACE_NAME                CONTENTS

------------------------------ ---------

SYSTEM                         PERMANENT

SYSAUX                         PERMANENT

UNDOTBS1                       UNDO

TEMP                           TEMPORARY

USERS                          PERMANENT

TEMP1                          TEMPORARY

 

6 rows selected

 

 

SQL> select file_name, tablespace_name from dba_temp_files;

 

FILE_NAME                                                                        TABLESPACE_NAME

-------------------------------------------------------------------------------- ------------------------------

/u01/app/oradata/ORA11GSY/datafile/o1_mf_temp_9pcqbdd6_.tmp                      TEMP

/u01/app/oradata/ORA11GSY/datafile/o1_mf_temp_9pm43j4j_.tmp                      TEMP

 

我们看到了没有临时文件对应的临时表空间TEMP1。也就是说:当我们在Primary端添加一个临时表空间,Standby端虽然不能创建出临时文件,但是临时表空间的信息是联动的带入的!

这也就意味着我们需要谨慎对待!

 

4、结论

 

Data FileRedo Log不同,Temp文件和Temp表空间在DG环境下同步的效果不好。在我们的试验中甚至出现了没有文件对应的临时表空间现象。

对于这个现象,笔者猜想会不会只要真正使用了一下临时表空间,就会有文件生成。留待以后实验来确定吧。


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

转载于:http://blog.itpub.net/17203031/viewspace-1159201/

最后

以上就是懦弱小松鼠为你收集整理的聊聊Data Guard环境下Temp表空间和Temp文件管理的全部内容,希望文章能够帮你解决聊聊Data Guard环境下Temp表空间和Temp文件管理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部