1. 程式人生 > >Oracle 11gR2 active datagurad temproray tablespace同步問題

Oracle 11gR2 active datagurad temproray tablespace同步問題

公司業務系統的資料庫磁碟空間告急,無奈採購的磁碟沒到貨。經過商討制定了臨時方案

先來看一下主備庫磁碟狀態。

#主庫磁碟資訊
[[email protected] db]$              df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/data-lv_root
                       50G  5.1G   42G  11% /
tmpfs                 127G  172K  127G   1% /dev/shm
/dev/mapper/data-lv_app
                       41G   11G   28G  29% /app
/dev/sda2             190M   39M  141M  22% /boot
/dev/sda1             200M  264K  200M   1% /boot/efi
/dev/mapper/ssddata-oradata
                      733G  537G  159G  78% /oradata
/dev/mapper/data-redo
                      9.8G  5.6G  3.7G  60% /redo
/dev/mapper/data-arch
                      148G  8.9G  132G   7% /arch

#備庫磁碟資訊
[
[email protected]
temp]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/data-root 50G 6.5G 41G 14% / tmpfs 127G 92K 127G 1% /dev/shm /dev/sda2 186M 66M 111M 38% /boot /dev/sda1 200M 268K 200M 1% /boot/efi /dev/mapper/oradata-oradata 549G 471G 51G 91% /oradata /dev/mapper/data-redo 9.7G 5.6G 3.7G 61% /redo /dev/mapper/data-arch 99G 32G 63G 34% /arch /dev/mapper/data-app 50G 22G 26G 46% /app /dev/mapper/temp-temp 197G 389M 187G 1% /oradata/dbdg/temp

場景:db表空間使用率超過95%,需要新增資料檔案。而dbdg磁碟空間無法支撐此次表空間擴容操作。兩臺資料庫均使用本地磁碟。擴容只能採購。

方案:dbdg新增一塊臨時的機械磁碟,遷移TEMP表空間。為資料表空間騰出容量。

這就涉及到oracle dataguard架構配置TEMP的操作。具體操作如下:

#db

SQL>  create temporary tablespace temp01  tempfile '/oradata/db/temp/temp_01.dbf' size 50m autoextend on  next 50m maxsize 32767m extent management local;

Database altered.

SQL>   alter database default temporary tablespace temp01;

Database altered.

SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME		       PROPERTY_VALUE
------------------------------ ------------------------------------------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP01

SQL> select file_name,tablespace_name,autoextensible,maxbytes/1024/1024 MAX_MB from dba_temp_files;

FILE_NAME							   TABLESPACE_NAME		  AUT	  MAX_MB
------------------------------------------------------------------ ------------------------------ --- ----------
/oradata/db/temp/temp_01.dbf				   TEMP01			  YES	   32767
/oradata/db/tmp01.dbf					   TMP				  YES 32767.9844

此時資料庫的預設表空間已經切換為TEMP了。

#dbdg
SQL> select name,db_unique_name,open_mode from v$database;

NAME	  DB_UNIQUE_NAME		         OPEN_MODE
--------- ------------------------------ --------------------
DB	      dbdg			                 READ ONLY WITH APPLY

SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME		       PROPERTY_VALUE
------------------------------ ------------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP01 

SQL> select file_name,tablespace_name,autoextensible,maxbytes/1024/1024 MAX_MB from dba_temp_files;

FILE_NAME							   TABLESPACE_NAME		  AUT	  MAX_MB
------------------------------------------------------------------ ------------------------------ --- ----------
/oradata/dbdg/tmp01.dbf					   TMP				  YES 32767.9844

預設表空間配置已經同步到備庫中的資料字典,但tempfile並沒有建立成功。

核驗作業系統檔案

#db
[[email protected] temp]$ pwd
/oradata/db/temp
[[email protected] temp]$ ls
temp_01.dbf  

#dbdg
[[email protected] temp]$ pwd
/oradata/dbdg/temp
[[email protected] temp]$ ls
lost+found  

備庫資料字典中已經同步到配置了,但系統中卻沒有TEMP的資料檔案。

#db&dbdg
SQL> show parameter standby_file

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
standby_file_management 	     string	 AUTO

standby_file_management也是自動的,主庫建立檔案的操作應該可以同步到備庫,併成功執行的。然而事實並非如此。

通過查閱資料,需要手動在備庫中新增TEMP資料檔案

#dbdg
SQL> select name,db_unique_name,open_mode from v$database;

NAME	  DB_UNIQUE_NAME		 OPEN_MODE
--------- ------------------------------ --------------------
DB	  dbdg			 READ ONLY WITH APPLY

SQL> alter tablespace temp01 add  tempfile '/oradata/dbdg/temp/temp_01.dbf' size 50m autoextend on  next 50m maxsize 32767m;
alter tablespace temp01 add  tempfile '/oradata/dbdg/temp/temp_01.dbf' size 50m autoextend on  next 50m maxsize 32767m
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-06512: at line 62

返回錯誤,資料庫為只讀狀態。

苦查資料無果的情況下,無意間查看了一下作業系統目錄。發現備庫的/oradata/dbdg/temp中竟然出現了temp_01.dbf的檔案。

#dbdg
SQL> select file_name,tablespace_name,autoextensible,maxbytes/1024/1024 MAX_MB from dba_temp_files;

FILE_NAME							   TABLESPACE_NAME		  AUT	  MAX_MB
------------------------------------------------------------------ ------------------------------ --- ----------
/oradata/dbdg/temp/temp_01.dbf				   TEMP01			  YES	   32767
/oradata/dbdg/tmp01.dbf					   TMP				  YES 32767.9844

備庫中的dba_temp_files也增加了一條資料記錄,新建臨時表空間的檔案資訊。此時測試了備庫查詢也不在報無法找到臨時表空間的錯誤了。

總結

tempfile和datafile、redologfile不同,tempfile和temp tablespace在DG環境下同步效果不好。在這次事件中甚至出現了沒有檔案對應的臨時表空間。而在備庫以read only with apply模式開啟後,執行檔案新增命令。雖然報錯,但檔案系統中確實出現了對應的tempfile。其中原理還需進一步研究。