聊聊Data Guard環境下Temp表空間和Temp檔案管理

dbhelper發表於2014-11-29

 

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/8494287/viewspace-1351120/,如需轉載,請註明出處,否則將追究法律責任。

相關文章