【限制】32G,作業系統限制?資料庫限制?
今天有同事反映,一條SQL語句執行了N長時間後異常終止了。經排查,原因是由於SQL書寫得不夠最佳化,導致耗盡了所有臨時表空間。
這個SQL執行故障最終是透過最佳化SQL得到有效處理。
不過透過這個案例引伸出了一個問題,臨時表空間資料檔案已經被設定為autoextend on,那為什麼臨時表空間擴充套件還有限制呢,是作業系統的限制,還是資料庫本身的限制呢?
整理一下思路,給出最終的原因。
1.臨時表空間無法擴充套件的錯誤提示
警告日誌中記錄了下面的資訊
ORA-1652: unable to extend temp segment by 128 in tablespace TEMP
2.確認臨時表空間屬性
sys@ora10g> col tablespace_name for a15
sys@ora10g> col file_name for a30
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes/1024/1024/1024 GB,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT GB MAXBLOCKS
--------------- --------------------------------- --- ---------- ---------
TEMP /oracle/oradata/ora10g/temp01.dbf YES 31.9999847 4194302
此時臨時表空間TEMP具有自動擴充套件屬性,此處的MMAXBYTES顯示,該臨時表空間最大可以使用到32G!這是為什麼呢?
3.第一種推測:作業系統的限制
此推測被否定。
經確認,Linux作業系統對file大小沒有大小限制。
ora10g@secDB /home/oracle$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 266239
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16384
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
4.第二種推測:資料庫的限制
推測正確。
當資料庫的db_block_size被設定為8K時,資料檔案最大可擴大到32G(比32GB小一點點)。
sys@ora10g> show parameter db_block_size
NAME TYPE VALUE
------------------ -------------------- ----------
db_block_size integer 8192
這個資料庫的限制的根源與ROWID有關,在Oracle的Rowid中,會使用22位代表Block號,因此,22位最多隻能代表2^22(4194304)個資料塊。
有關ROWID的定義可以參考Oracle官方文件有關“ROWID Pseudocolumn”的描述。
我們來做一個簡單的運算
sys@ora10g> col x for 99999999999
sys@ora10g> col y for 99999999999
sys@ora10g> select (power(2,22)-2)*8*1024 x,power(2,22)-2 y from dual;
X Y
------------ ------------
34359721984 4194302
計算出來的結果與下面的MAXBYTES和MAXBLOCKS一致。
sys@ora10g> col maxbytes for 9999999999999999
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- --------------------------------- --- ----------- ---------
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
5.增加臨時檔案擴大突破臨時表空間的32G限制
如果想要在現有基礎上使用超過32G的臨時表空間,最簡單的方法就是給臨時表空間再新增一個或幾個臨時檔案。
1)簡單新增一個臨時檔案
sys@ora10g> alter tablespace TEMP add tempfile '/oracle/oradata/ora10g/temp02.dbf' size 10m;
Tablespace altered.
2)觀察一下最大值
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- --------------------------------- --- ----------- ---------
TEMP /oracle/oradata/ora10g/temp02.dbf NO 0 0
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
3)調整為自動擴充套件
sys@ora10g> alter database tempfile '/oracle/oradata/ora10g/temp02.dbf' autoextend on;
Database altered.
4)此時臨時表空間便看可以使用近64G
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- --------------------------------- --- ----------- ---------
TEMP /oracle/oradata/ora10g/temp02.dbf YES 34359721984 4194302
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
6.建立大檔案臨時表空間突破臨時表空間的32G限制
1)建立大檔案臨時表空間
sys@ora10g> create bigfile temporary tablespace temp_big tempfile '/oracle/oradata/ora10g/temp_big01.dbf' size 10m;
Tablespace created.
2)注意觀察TEMP_BIG
sys@ora10g> col file_name for a34
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- ------------------------------------- --- ----------- ----------
TEMP /oracle/oradata/ora10g/temp02.dbf YES 34359721984 4194302
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
TEMP_BIG /oracle/oradata/ora10g/temp_big01.dbf NO 0 0
3)調整大檔案臨時表空間TEMP_BIG為自動擴充套件
sys@ora10g> alter database tempfile '/oracle/oradata/ora10g/temp_big01.dbf' autoextend on;
Database altered.
4)再次觀察最大可用大小
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- ------------------------------------- --- -------------- ----------
TEMP /oracle/oradata/ora10g/temp02.dbf YES 34359721984 4194302
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
TEMP_BIG /oracle/oradata/ora10g/temp_big01.dbf YES 35184372064256 4294967293
7.小結
實際生產環境不可將任何檔案設定為自動擴充套件,不可出現無人關注的死角。針對文章的實際情況可以透過新增臨時檔案的方式來解決。
細節之處,無限精彩。
Good luck.
secooler
10.01.29
-- The End --
這個SQL執行故障最終是透過最佳化SQL得到有效處理。
不過透過這個案例引伸出了一個問題,臨時表空間資料檔案已經被設定為autoextend on,那為什麼臨時表空間擴充套件還有限制呢,是作業系統的限制,還是資料庫本身的限制呢?
整理一下思路,給出最終的原因。
1.臨時表空間無法擴充套件的錯誤提示
警告日誌中記錄了下面的資訊
ORA-1652: unable to extend temp segment by 128 in tablespace TEMP
2.確認臨時表空間屬性
sys@ora10g> col tablespace_name for a15
sys@ora10g> col file_name for a30
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes/1024/1024/1024 GB,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT GB MAXBLOCKS
--------------- --------------------------------- --- ---------- ---------
TEMP /oracle/oradata/ora10g/temp01.dbf YES 31.9999847 4194302
此時臨時表空間TEMP具有自動擴充套件屬性,此處的MMAXBYTES顯示,該臨時表空間最大可以使用到32G!這是為什麼呢?
3.第一種推測:作業系統的限制
此推測被否定。
經確認,Linux作業系統對file大小沒有大小限制。
ora10g@secDB /home/oracle$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 266239
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16384
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
4.第二種推測:資料庫的限制
推測正確。
當資料庫的db_block_size被設定為8K時,資料檔案最大可擴大到32G(比32GB小一點點)。
sys@ora10g> show parameter db_block_size
NAME TYPE VALUE
------------------ -------------------- ----------
db_block_size integer 8192
這個資料庫的限制的根源與ROWID有關,在Oracle的Rowid中,會使用22位代表Block號,因此,22位最多隻能代表2^22(4194304)個資料塊。
有關ROWID的定義可以參考Oracle官方文件有關“ROWID Pseudocolumn”的描述。
我們來做一個簡單的運算
sys@ora10g> col x for 99999999999
sys@ora10g> col y for 99999999999
sys@ora10g> select (power(2,22)-2)*8*1024 x,power(2,22)-2 y from dual;
X Y
------------ ------------
34359721984 4194302
計算出來的結果與下面的MAXBYTES和MAXBLOCKS一致。
sys@ora10g> col maxbytes for 9999999999999999
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- --------------------------------- --- ----------- ---------
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
5.增加臨時檔案擴大突破臨時表空間的32G限制
如果想要在現有基礎上使用超過32G的臨時表空間,最簡單的方法就是給臨時表空間再新增一個或幾個臨時檔案。
1)簡單新增一個臨時檔案
sys@ora10g> alter tablespace TEMP add tempfile '/oracle/oradata/ora10g/temp02.dbf' size 10m;
Tablespace altered.
2)觀察一下最大值
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- --------------------------------- --- ----------- ---------
TEMP /oracle/oradata/ora10g/temp02.dbf NO 0 0
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
3)調整為自動擴充套件
sys@ora10g> alter database tempfile '/oracle/oradata/ora10g/temp02.dbf' autoextend on;
Database altered.
4)此時臨時表空間便看可以使用近64G
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- --------------------------------- --- ----------- ---------
TEMP /oracle/oradata/ora10g/temp02.dbf YES 34359721984 4194302
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
6.建立大檔案臨時表空間突破臨時表空間的32G限制
1)建立大檔案臨時表空間
sys@ora10g> create bigfile temporary tablespace temp_big tempfile '/oracle/oradata/ora10g/temp_big01.dbf' size 10m;
Tablespace created.
2)注意觀察TEMP_BIG
sys@ora10g> col file_name for a34
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- ------------------------------------- --- ----------- ----------
TEMP /oracle/oradata/ora10g/temp02.dbf YES 34359721984 4194302
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
TEMP_BIG /oracle/oradata/ora10g/temp_big01.dbf NO 0 0
3)調整大檔案臨時表空間TEMP_BIG為自動擴充套件
sys@ora10g> alter database tempfile '/oracle/oradata/ora10g/temp_big01.dbf' autoextend on;
Database altered.
4)再次觀察最大可用大小
sys@ora10g> select tablespace_name,file_name,AUTOEXTENSIBLE,maxbytes,maxblocks from dba_temp_files;
TABLESPACE_NAME FILE_NAME AUT MAXBYTES MAXBLOCKS
--------------- ------------------------------------- --- -------------- ----------
TEMP /oracle/oradata/ora10g/temp02.dbf YES 34359721984 4194302
TEMP /oracle/oradata/ora10g/temp01.dbf YES 34359721984 4194302
TEMP_BIG /oracle/oradata/ora10g/temp_big01.dbf YES 35184372064256 4294967293
7.小結
實際生產環境不可將任何檔案設定為自動擴充套件,不可出現無人關注的死角。針對文章的實際情況可以透過新增臨時檔案的方式來解決。
細節之處,無限精彩。
Good luck.
secooler
10.01.29
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-626441/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫限制訪問IPOracle資料庫
- 如何限制ip訪問Oracle資料庫Oracle資料庫
- 雲資料庫SQL Azure的基本限制TX資料庫SQL
- 詳解nginx的請求限制(連線限制和請求限制)Nginx
- 不同資料庫限制取前N條記錄資料庫
- 3.2.4 開啟資料庫到限制訪問模式資料庫模式
- 系統強化之控制流限制
- iOS TextFiled,TextView 長度限制,表情限制iOSTextView
- Oracle的過載保護-資料庫資源限制Oracle資料庫
- MyRockscollation限制
- Docker的資源限制Docker
- Android Intent 傳遞資料大小限制AndroidIntent
- FAT32 格式化 32G 限制是個致命錯誤
- __slot__ 限制
- linux limit限制LinuxMIT
- GBase 資料庫使用者的最大連線數限制資料庫
- Docker系列09—Docker的系統資源限制及驗證Docker
- 【TUNE_ORACLE】Oracle資料庫與HugePages(二)HugePages配置和限制Oracle資料庫
- win10系統怎麼解除寬頻限制?win10系統自動限制寬頻速度的解決方法Win10
- Nginx速度限制Nginx
- 再聊解除HiddenApi限制API
- MongoDB in 數量限制MongoDB
- Cookie 不受埠限制Cookie
- ASM磁碟組限制ASM
- PAM限制實測
- 限制併發數
- Merge語法限制
- 在kubernetes裡使用seccomp限制容器的系統呼叫
- 爬蟲爬取資料如何繞開限制?爬蟲
- 如何設定Kubernetes資源限制
- Kubernetes資源請求與限制
- 解決sqlserver限制2G記憶體限制安裝SQLServer記憶體
- mysql 8.0.11 資料庫使用者密碼修改詭異的限制MySql資料庫密碼
- Sqlserver限制賬戶在哪些ip下才可以訪問資料庫SQLServer資料庫
- 表裡不一--限制容器記憶體4G,free還是32G記憶體
- Win10系統限制OneDrive傳輸資料時佔用頻寬的方法Win10
- 解除Ubuntu系統的root登入圖形介面限制Ubuntu
- .htaccess IP訪問限制
- Envoy、gRPC和速率限制RPC