dataguard新增臨時資料檔案的bug
有一個環境是10gR2,一主兩備,因為10g的備庫還不是active,所以有一些查詢的需求的時候,我們還是會開啟相應的視窗時間。
開發的同學需要做一個大查詢,資料只能全表,而且還有order by,勢必會消耗大量的temp空間,這個時候充分利用備庫就是好一些,有一個備庫平時也沒有用過,今天就用這個備庫來完成查詢需求。
但是過了一會,開發同事說,查詢失敗了。讓我看看什麼原因。
開發同學提供的日誌為:
2015-11-20 10:48:05,---exception: ---- StatementCallback; uncategorized SQLException for SQL [select c.cn as cn,c.uin as uin from test_bind c where enabled='Y' group by c.cn,c.uin having count(c.cn) >1]; SQL state [99999]; error code [25153]; ORA-25153: Temporary Tablespace is Empty
; nested exception is java.sql.SQLException: ORA-25153: Temporary Tablespace is Empty
看來這個問題還挺不好意思的,原來臨時表空間為空了。
SQL> select file_name,bytes from dba_temp_files;
no rows
那麼備庫中的臨時表空間怎麼沒了呢?
檢視歷史記錄發現是在前幾天的一次日誌應用後,臨時表空間清空了。
Tue Nov 17 17:48:23 CST 2015
Media Recovery Log /U01/app/oracle/admin/acctest/arch/1_21281_782846320.dbf
Recovery deleting tempfile #3:'/U03/app/oracle/oradata/acctest/temp03.dbf'
Recovery deleting tempfile #2:'/U03/app/oracle/oradata/acctest/temp02.dbf'
Recovery deleting tempfile #1:'/U03/app/oracle/oradata/acctest/temp01.dbf'
Recovery dropped temporary tablespace 'TEMP'
Media Recovery Waiting for thread 1 sequence 21282
因為臨時表空間對於資料庫來說還是一個輔助的部分,主備庫可以不同。所以簡單的分析之後決定還是手工新增臨時資料檔案。
這個時候檢視臨時表空間,發現已經是TEMP2了。
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
---------------
SYSTEM
UNDOTBS1
SYSAUX
USERS
...
TEMP2
9 rows selected.
既然是空的,那就新增一個臨時資料檔案吧。結果基本功不紮實,錯誤提示還是有些誤導。
SQL> alter tablespace temp2 add datafile /U03/app/oracle/oradata/acctest/temp01.dbf' size 32G;
alter tablespace temp2 add datafile /U03/app/oracle/oradata/acctest/temp01.dbf' size 32G
*
ERROR at line 1:
ORA-16000: database open for read-only access
簡單修改,把datafile改為tempfile繼續
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G;
alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G
*
ERROR at line 1:
ORA-01119: error in creating database file '/U03/app/oracle/oradata/acctest/temp01.dbf'
ORA-27038: created file already exists
Additional information: 1
這個時候提示檔案已經存在,好吧,確實是檔案存在,那我就reuse吧。
使用resue的方式,結果報出了ORA-27086的錯誤。
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G reuse;
alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G reuse
*
ERROR at line 1:
ORA-01119: error in creating database file '/U03/app/oracle/oradata/acctest/temp01.dbf'
ORA-27086: unable to lock file - already in use
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 8
Additional information: 19076
這個錯誤還是讓人有些摸不著頭腦。是本身就有臨時資料檔案嗎?
SQL> select file_name,bytes from dba_temp_files;
no rows
這個時候檢視檔案系統中檔案的情況。發現貌似時間戳確實是更新了,但是這個檔案就是不在資料字典裡。
$ ll temp*.dbf
total 432600976
-rw-r----- 1 oracle oinstall 32212262912 Nov 20 10:58 temp01.dbf
-rw-r----- 1 oracle oinstall 21109940224 Jan 5 2015 temp02.dbf
-rw-r----- 1 oracle oinstall 21109940224 Jan 5 2015 temp03.dbf
那麼這個問題還是很奇怪的,只能聯想到是bug了,結果一查還真有這麼一個bug,版本都完全符合。
Bug 15944809 - add tempfile at physical standby fails with ORA-1119, ORA-27086 (Doc ID 15944809.8)
這個問題的workaround 有兩個,一個就是重啟備庫
Workaround
A shutdown/startup of the standby databse will clear the DBW0's
stale file lock state, and then the new tempfile can be created.
那我先試試新增一個新的資料檔案,先不停庫。
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp04.dbf' size 10G;
Tablespace altered.
可以建立了,那就開始resize一下。
SQL> alter database tempfile '/U03/app/oracle/oradata/acctest/temp04.dbf' resize 30G;
Database altered.
這個時候,先讓開發同學去完成這個查詢任務。
然後查詢完成之後,收回環境之後,就可以嘗試重啟了。
重啟之後,再次新增臨時資料檔案,就沒有問題了。
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G reuse;
Tablespace altered.
SQL> select name,bytes from v$tempfile;
NAME BYTES
-------------------------------------------------- ----------
/U03/app/oracle/oradata/acctest/temp04.dbf 3.2212E+10
/U03/app/oracle/oradata/acctest/temp01.dbf 3.2212E+10
開發的同學需要做一個大查詢,資料只能全表,而且還有order by,勢必會消耗大量的temp空間,這個時候充分利用備庫就是好一些,有一個備庫平時也沒有用過,今天就用這個備庫來完成查詢需求。
但是過了一會,開發同事說,查詢失敗了。讓我看看什麼原因。
開發同學提供的日誌為:
2015-11-20 10:48:05,---exception: ---- StatementCallback; uncategorized SQLException for SQL [select c.cn as cn,c.uin as uin from test_bind c where enabled='Y' group by c.cn,c.uin having count(c.cn) >1]; SQL state [99999]; error code [25153]; ORA-25153: Temporary Tablespace is Empty
; nested exception is java.sql.SQLException: ORA-25153: Temporary Tablespace is Empty
看來這個問題還挺不好意思的,原來臨時表空間為空了。
SQL> select file_name,bytes from dba_temp_files;
no rows
那麼備庫中的臨時表空間怎麼沒了呢?
檢視歷史記錄發現是在前幾天的一次日誌應用後,臨時表空間清空了。
Tue Nov 17 17:48:23 CST 2015
Media Recovery Log /U01/app/oracle/admin/acctest/arch/1_21281_782846320.dbf
Recovery deleting tempfile #3:'/U03/app/oracle/oradata/acctest/temp03.dbf'
Recovery deleting tempfile #2:'/U03/app/oracle/oradata/acctest/temp02.dbf'
Recovery deleting tempfile #1:'/U03/app/oracle/oradata/acctest/temp01.dbf'
Recovery dropped temporary tablespace 'TEMP'
Media Recovery Waiting for thread 1 sequence 21282
因為臨時表空間對於資料庫來說還是一個輔助的部分,主備庫可以不同。所以簡單的分析之後決定還是手工新增臨時資料檔案。
這個時候檢視臨時表空間,發現已經是TEMP2了。
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
---------------
SYSTEM
UNDOTBS1
SYSAUX
USERS
...
TEMP2
9 rows selected.
既然是空的,那就新增一個臨時資料檔案吧。結果基本功不紮實,錯誤提示還是有些誤導。
SQL> alter tablespace temp2 add datafile /U03/app/oracle/oradata/acctest/temp01.dbf' size 32G;
alter tablespace temp2 add datafile /U03/app/oracle/oradata/acctest/temp01.dbf' size 32G
*
ERROR at line 1:
ORA-16000: database open for read-only access
簡單修改,把datafile改為tempfile繼續
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G;
alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G
*
ERROR at line 1:
ORA-01119: error in creating database file '/U03/app/oracle/oradata/acctest/temp01.dbf'
ORA-27038: created file already exists
Additional information: 1
這個時候提示檔案已經存在,好吧,確實是檔案存在,那我就reuse吧。
使用resue的方式,結果報出了ORA-27086的錯誤。
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G reuse;
alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G reuse
*
ERROR at line 1:
ORA-01119: error in creating database file '/U03/app/oracle/oradata/acctest/temp01.dbf'
ORA-27086: unable to lock file - already in use
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 8
Additional information: 19076
這個錯誤還是讓人有些摸不著頭腦。是本身就有臨時資料檔案嗎?
SQL> select file_name,bytes from dba_temp_files;
no rows
這個時候檢視檔案系統中檔案的情況。發現貌似時間戳確實是更新了,但是這個檔案就是不在資料字典裡。
$ ll temp*.dbf
total 432600976
-rw-r----- 1 oracle oinstall 32212262912 Nov 20 10:58 temp01.dbf
-rw-r----- 1 oracle oinstall 21109940224 Jan 5 2015 temp02.dbf
-rw-r----- 1 oracle oinstall 21109940224 Jan 5 2015 temp03.dbf
那麼這個問題還是很奇怪的,只能聯想到是bug了,結果一查還真有這麼一個bug,版本都完全符合。
Bug 15944809 - add tempfile at physical standby fails with ORA-1119, ORA-27086 (Doc ID 15944809.8)
這個問題的workaround 有兩個,一個就是重啟備庫
Workaround
A shutdown/startup of the standby databse will clear the DBW0's
stale file lock state, and then the new tempfile can be created.
那我先試試新增一個新的資料檔案,先不停庫。
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp04.dbf' size 10G;
Tablespace altered.
可以建立了,那就開始resize一下。
SQL> alter database tempfile '/U03/app/oracle/oradata/acctest/temp04.dbf' resize 30G;
Database altered.
這個時候,先讓開發同學去完成這個查詢任務。
然後查詢完成之後,收回環境之後,就可以嘗試重啟了。
重啟之後,再次新增臨時資料檔案,就沒有問題了。
SQL> alter tablespace temp2 add tempfile '/U03/app/oracle/oradata/acctest/temp01.dbf' size 30G reuse;
Tablespace altered.
SQL> select name,bytes from v$tempfile;
NAME BYTES
-------------------------------------------------- ----------
/U03/app/oracle/oradata/acctest/temp04.dbf 3.2212E+10
/U03/app/oracle/oradata/acctest/temp01.dbf 3.2212E+10
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1845934/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 臨時資料檔案
- Oracle資料檔案和臨時檔案的管理Oracle
- Oracle臨時表空間檢視、新增臨時表空間資料檔案、修改預設臨時表空間 方法!Oracle
- ORACLE9I RMAN恢復資料庫後需要手工新增臨時資料檔案Oracle資料庫
- EBS應用臨時檔案或資料的清理
- 檔案-臨時檔案
- datafile.sql 檢視資料檔案和臨時檔案SQL
- . 資料庫臨時表空間的資料檔案的丟失資料庫
- 臨時檔案
- 怎麼清理temp資料夾的臨時檔案?Win7系統電腦temp臨時檔案的清理方法Win7
- 臨時表空間資料檔案損壞的解決
- dataguard備庫的資料檔案的遷移
- 移動資料檔案、系統表空間檔案、臨時表空間檔案
- [20190410]dg建立臨時表檔案資料檔案.txt
- Win10臨時資料夾的路徑在哪 win10系統臨時檔案如何找到Win10
- oracle 10g R2 恢復完資料庫後自動新增臨時表空間資料檔案Oracle 10g資料庫
- dataguard備庫的資料檔案的遷移實戰
- MYSQL 5.7中臨時檔案的使用MySql
- 臨時檔案的順序和絕對檔案號
- 釋放檔案到臨時資料夾中所引發的安全問題
- dataguard之物理備庫丟失資料檔案
- 為資料庫新增控制檔案資料庫
- OpenEuler 網路卡配置檔案詳解及新增臨時路由與永久路由路由
- 表空間新增資料檔案的疑惑
- 臨時資料檔案 offline 對於匯入匯出的影響
- Yoink for Mac(臨時檔案拖放助手)Mac
- pycharm建立臨時檔案scatch filePyCharm
- oracle 10g rman duplicate target database for standby會自動新增臨時檔案Oracle 10gDatabase
- dataguard中需要注意的一些資料檔案操作
- dataguard之邏輯備庫移動資料檔案
- dataguard利用從庫的檔案恢復主庫發生異常的資料檔案。
- 錯誤新增表空間的資料檔案
- 叢集資料庫新增控制檔案資料庫
- 新增資料檔案與恢復cf
- MySQL8.0.18資料庫新增資料檔案MySql資料庫
- 【DataGuard】由於備庫引數設定不當導致資料檔案無法新增的故障分析
- Yoink for Mac(臨時檔案儲存助手)Mac
- Mac臨時檔案儲存助手:YoinkMac