parallel rollback引數總結
fast_start_parallel_rollback
該引數是oracle 8i引入的,詳細資訊如下表所示:Version Parameter Type Modifiable 11.1.0.7 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 11.1.0.6 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 10.2.0.4 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 10.2.0.3 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 10.1.0.5 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 10.1.0.4 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 9.2.0.8 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 9.0.1.4 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE) 8.1.7.4 fast_start_parallel_rollback STRING ALTER SYSTEM (IMMEDIATE)
該引數如下3種屬性值:false --即是關閉parallel rollback功能
low --也是10g的預設值,該值含有是最大的rollback 程式為 2*cpu_count個
high --當設定為該值時,最大的rollback 程式為4*cpu_count個當然其最大值是要受引數parallel_max_servers的影響的,如果是rac環境,那麼還跟引數
parallel_threads_per_cpu有關係,這裡需要說明一點的是,該引數跟recovery_parallelism不同的,
recovery_parallelism引數是指在進行instance crash recovery時的並行恢復程式個數。關於並行rollback 操作,我們可以透過觀察幾個試圖來進行判斷其回滾的時間,如下的幾個試圖就是
我們需要進行查詢的:
v$fast_start_transactions
V$FAST_START_SERVERS
或x$ktuxe下面我們透過例子來進行說明.
SQL> show parameter rollbackNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_cleanup_rollback_entries integer 100
_corrupted_rollback_segments string
_max_cr_rollbacks integer 0
_offline_rollback_segments string
_rollback_segment_count integer 0
_rollback_segment_initial integer 1
_rollback_stopat integer 0
fast_start_parallel_rollback string LOW --10g中的預設值
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>SQL> show user
USER is "ROGER"
SQL> select count(*) from ht1;COUNT(*)
----------
999SQL> begin
2 for i in 1 .. 1000 loop
3 insert /*+ append */
4 into ht1
5 select * from ht1;
6 commit;
7 end loop;
8 end;
9 /
begin
*
ERROR at line 1:
ORA-01653: unable to extend table ROGER.HT1 by 1024 in tablespace ROGER
ORA-06512: at line 3
SQL> select count(*) from ht1;COUNT(*)
----------
1022976
SQL>
----在當前session執行全表的delete操作,如下:
SQL> delete from ht1;
1022976 rows deleted.
SQL> ---時間大約1分鐘左右----在另一視窗進行如下查詢:
SQL> show user
USER is "SYS"
SQL> set lines 200
SQL> select XIDUSN,XIDSLOT,XIDSQN,NAME,START_UBASQN,START_UBAREC from v$transaction;
XIDUSN XIDSLOT XIDSQN NAME START_UBASQN START_UBAREC
---------- ---------- ---------- ------------------------- ------------ ------------
6 31 234 221 1
SQL> select KTUXEUSN, KTUXESLT, KTUXESQN, KTUXECFL, KTUXESIZ, sysdate
2 from x$ktuxe
3 where KTUXEUSN = 6
4 and KTUXESLT = 31;
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- ---------
6 31 234 NONE 38912 07-OCT-11SQL>---下面進行rollback time計算
SQL> show user
USER is "ROGER"
SQL> set timing on
SQL>
SQL> rollback;
Rollback complete.
Elapsed: 00:00:46.53
SQL>---該rollback操作花費了46.53秒。---另外視窗
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.Elapsed: 00:00:00.04
SQL> select KTUXEUSN, KTUXESLT, KTUXESQN, KTUXECFL, KTUXESIZ, sysdate
2 from x$ktuxe
3 where KTUXEUSN = 6
4 and KTUXESLT = 31;
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
6 31 234 NONE 3616 2011-10-07 06:32:45Elapsed: 00:00:00.00
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
6 31 234 NONE 2479 2011-10-07 06:32:47Elapsed: 00:00:00.01
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
6 31 234 NONE 0 2011-10-07 06:32:52Elapsed: 00:00:00.01
SQL>
SQL> select 38912/((3616-2479)/2) from dual;
38912/((3616-2479)/2)
---------------------
68.4467898
Elapsed: 00:00:00.01
SQL>透過我計算發現,應該是需要68.44s才能完成rollback操作,但是為什麼實際上46.53s就完成了呢?#####再次進行相同的測試
SQL> delete from ht1;
1022976 rows deleted.
Elapsed: 00:01:31.96
SQL> rollback;
Rollback complete.
Elapsed: 00:00:36.51
SQL>---另一session視窗
SQL> select XIDUSN,XIDSLOT,XIDSQN,NAME,START_UBASQN,START_UBAREC from v$transaction;
XIDUSN XIDSLOT XIDSQN NAME START_UBASQN START_UBAREC
---------- ---------- ---------- ------------------------- ------------ ------------
2 13 217 207 55Elapsed: 00:00:00.01
SQL> select KTUXEUSN, KTUXESLT, KTUXESQN, KTUXECFL, KTUXESIZ, sysdate
2 from x$ktuxe
3 where KTUXEUSN = 2
4 and KTUXESLT = 13;
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 38913 2011-10-07 06:55:36Elapsed: 00:00:00.01
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 32721 2011-10-07 06:55:54Elapsed: 00:00:00.00
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 29825 2011-10-07 06:55:55Elapsed: 00:00:00.00
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 29195 2011-10-07 06:55:57Elapsed: 00:00:00.01
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 25293 2011-10-07 06:56:00Elapsed: 00:00:00.00
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 22288 2011-10-07 06:56:02Elapsed: 00:00:00.00
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 21288 2011-10-07 06:56:04Elapsed: 00:00:00.00
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 18512 2011-10-07 06:56:05Elapsed: 00:00:00.01
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 17643 2011-10-07 06:56:07Elapsed: 00:00:00.00
SQL> /
KTUXEUSN KTUXESLT KTUXESQN KTUXECFL KTUXESIZ SYSDATE
---------- ---------- ---------- ------------------------ ---------- -------------------
2 13 217 NONE 16880 2011-10-07 06:56:08Elapsed: 00:00:00.00
SQL> select * from v$fast_start_transactions;
no rows selected
Elapsed: 00:00:00.00
SQL> select * from v$fast_start_servers;
no rows selectedElapsed: 00:00:00.00
SQL> /no rows selected
Elapsed: 00:00:00.00根據前面的時間資料,我分別計算出2個值如下1238和1102,然後再根據該值取平均值,如下;
SQL> select 1238+1102 from dual;
1238+1102
----------
2340
SQL> select 2340/2 from dual;
2340/2
----------
1170
SQL> select 38913/1170 from dual;
38913/1170
----------
33.2589744
SQL>我們來看看此次的rollback時間,如下:
SQL> show user
USER is "ROGER"
SQL>
SQL> delete from ht1;
1022976 rows deleted.
Elapsed: 00:01:31.96
SQL> rollback;Rollback complete.
Elapsed: 00:00:36.51
我們可以看到,已經非常的接近了,因為前面的時間計算,其實還存在一定的誤差,從數學的角度來說,
要想更加精確,需要把時間擴大,進行多次採集然後計算平均值,那樣可能就更加接近實際值了。最後需要做一點補充的是,關於x$ktuxe大家可以參考我以前的一個筆記,簡略資訊如下:
ktuxc,其實並不神秘,跟一個x$表相關,即如下x$表:x$ktuxe
[K]ernel [T]ransaction [U]ndo transaction [E]ntry我們知道,在平常所遇到的資料庫故障中,跟undo相關的太多了,基本上ora-4xxx ~都跟undo有種很緊密的聯絡比如大家所熟知的ora-4193、ora-4000、ora-4194等等。 這裡我主要簡單的分析下ktuxe的結構,其實關於ktuxe,
還有一個很重要的地方,那就是無法透過v$tranactions查到的死事物,我們可以透過x$ktuxe來獲取。那麼ktuxe,ktuxc結構到底多大呢?換句話說,在整個block中,佔據了多個個byte呢? 如下:COMPONEN TYPE DESCRIPTION TYPE_SIZE
-------- -------- -------------------------------- ----------
S EWORD EITHER WORD 4
S EB1 EITHER BYTE 1 1
S EB2 EITHER BYTE 2 2
S EB4 EITHER BYTE 4 4
S UWORD UNSIGNED WORD 4
S UB1 UNSIGNED BYTE 1 1
S UB2 UNSIGNED BYTE 2 2
S UB4 UNSIGNED BYTE 4 4
S SWORD SIGNED WORD 4
S SB1 SIGNED BYTE 1 1
S SB2 SIGNED BYTE 2 2
S SB4 SIGNED BYTE 4 4
S BOOLEAN BOOLEAN 4
S FLOAT FLOAT 4
S DOUBLE DOUBLE 8
S SIZE_T SIZE_T 4
S DSIZE_T DSIZE_T 4
S PTR_T PTR_T 4
K KDBA DATABASE BLOCK ADDRESS 4
K KTNO TABLE NUMBER IN CLUSTER 1
K KSCN SYSTEM COMMIT NUMBER 8
K KXID TRANSACTION ID 8
K KUBA UNDO ADDRESS 8
KCB KCBH BLOCK COMMON HEADER 20
KTB KTBIT TRANSACTION VARIABLE HEADER 24
KTB KTBBH TRANSACTION FIXED HEADER 48
KTB KTBBH_BS TRANSACTION BLOCK BITMAP SEGMENT 8
KDB KDBH DATA HEADER 14
KDB KDBT TABLE DIRECTORY ENTRY 4
KTE KTECT EXTENT CONTROL 44
KTE KTECH EXTENT CONTROL 72
KTE KTETB EXTENT TABLE 8
KTS KTSHC SEGMENT HEADER 8
KTS KTSFS SEGMENT FREE SPACE LIST 20
KTS KTSPHW PAGE TABLE SEGMENT HWM 60
KTS KTSPHC PAGE TABLE SEGMENT HEADER 112
KTS KTSPFHC LEVEL 1 BITMAP BLOCK HEADER 184
KTS KTSPSHC LEVEL 2 BITMAP BLOCK HEADER 96
KTS KTSPTHC LEVEL 3 BITMAP BLOCK HEADER 88
KTU KTUBH UNDO HEADER 16
KTU KTUXE UNDO TRANSACTION ENTRY 40 ---- 跟ktuxc相關
KTU KTUXC UNDO TRANSACTION CONTROL 104 ---- 這裡是我們這裡需要關注的地方 (佔據了104個byte)
KDX KDXCO INDEX HEADER 16
KDX KDXLE INDEX LEAF HEADER 32
KDX KDXBR INDEX BRANCH HEADER 24
BBED> p ktuxc
struct ktuxc, 104 bytes @4148 (透過bbed我們可以發現,確定是佔據了104個byte)
struct ktuxcscn, 8 bytes @4148
ub4 kscnbas @4148 0x001564b5 ---scn值
ub2 kscnwrp @4152 0x0000
struct ktuxcuba, 8 bytes @4156 --UBA值 (有如下3部分組成)
ub4 kubadba @4156 0x00400181 --dba(轉換後為file 1 block 385)
ub2 kubaseq @4160 0x0068
ub1 kubarec @4162 0x0f --Last Entry in UNDO record map
sb2 ktuxcflg @4164 1 (KTUXCFSK) --表示inactive
ub2 ktuxcseq @4166 0x0068
sb2 ktuxcnfb @4168 1
ub4 ktuxcinc @4172 0x00000000
sb2 ktuxcchd @4176 30
sb2 ktuxcctl @4178 22 ---這裡的部分內容 目前我還沒搞清楚是啥意思
ub2 ktuxcmgc @4180 0x8002
ub4 ktuxcopt @4188 0x7ffffffe
struct ktuxcfbp[0], 12 bytes @4192
struct ktufbuba, 8 bytes @4192
ub4 kubadba @4192 0x00400181
ub2 kubaseq @4196 0x0068
ub1 kubarec @4198 0x0f
sb2 ktufbext @4200 2
sb2 ktufbspc @4202 4280
struct ktuxcfbp[1], 12 bytes @4204
struct ktufbuba, 8 bytes @4204
ub4 kubadba @4204 0x00000000
ub2 kubaseq @4208 0x0065
ub1 kubarec @4210 0x02
sb2 ktufbext @4212 5
sb2 ktufbspc @4214 7886
struct ktuxcfbp[2], 12 bytes @4216
struct ktufbuba, 8 bytes @4216
ub4 kubadba @4216 0x00000000
ub2 kubaseq @4220 0x003e
ub1 kubarec @4222 0x25
sb2 ktufbext @4224 2
sb2 ktufbspc @4226 464
struct ktuxcfbp[3], 12 bytes @4228
struct ktufbuba, 8 bytes @4228
ub4 kubadba @4228 0x00000000
ub2 kubaseq @4232 0x003e
ub1 kubarec @4234 0x08
sb2 ktufbext @4236 2
sb2 ktufbspc @4238 7130
struct ktuxcfbp[4], 12 bytes @4240
struct ktufbuba, 8 bytes @4240
ub4 kubadba @4240 0x00000000
ub2 kubaseq @4244 0x0000
ub1 kubarec @4246 0x00
sb2 ktufbext @4248 0
sb2 ktufbspc @4250 0
從上面資訊,我們可以發現最後一次使用的undo block是 file 1 block 385。 下面來看看ktuxe的情況下面我們來看看x$ktuxe的結構:
SQL> desc x$ktuxe
Name Null? Type
------------------ -------- ----------------------------
ADDR RAW(4)
INDX NUMBER
INST_ID NUMBER
KTUXEUSN NUMBER --undo seq number
KTUXESLT NUMBER --slot 即為事務槽號
KTUXESQN NUMBER --sequence號
KTUXERDBF NUMBER --檔案號 即為file id
KTUXERDBB NUMBER --block 號
KTUXESCNB NUMBER --SCN base for prepare/commit
KTUXESCNW NUMBER --SCN wrap for prepare/commit
KTUXESTA VARCHAR2(16) --事務狀態 (我所知道的應該是有3種 action,inaction,dead)
KTUXECFL VARCHAR2(24) --事務標誌
KTUXEUEL NUMBER --這裡根據我猜測,應該是指用於存放事務的一個列表
KTUXEDDBF NUMBER --file id
KTUXEDDBB NUMBER --block number
KTUXEPUSN NUMBER --parent usn number
KTUXEPSLT NUMBER --parent solt number
KTUXEPSQN NUMBER --parent seq#
KTUXESIZ NUMBER --用於該事務有多少個undo block(單位是block)這裡我只想說明一點的是,注意KTUXESIZ的單位是block,而不是byte。
本文的重點不是來講述這個x$表的用途,而是像詳細說明parallel rollback 的一些東西,
這裡有點要說明的是,rollback分為兩種,如下:
1. parallel rollback 即並行回滾
2. Serial rollback 即序列回滾當初始化引數fast_start_parallel_rollback設定為false以後,即為序列回滾,否則為並行回滾。
我們知道並行回滾是oracle 8i引入的一個特性,那麼必然就有它的優勢,但是我google了一下,
找到了老白的帖子,說某些情況下並行恢復會非常的慢,但是沒有說具體是那些情況下,這點較為
遺憾。我這裡由於是單表所以模擬的時候沒沒有發現parallel rollback程式,雖然說引數是預設值。
總的來說,不管是使用並行回滾還是序列回滾,我們都可以透過上面的方法來進行估算具體的回滾時間。透過所掌握的知識來看,我猜測可能在如下的情況下parallel rollback可能會更慢:
1. 相關的操作正常情況下走index,而如果是parallel,那麼將走全表掃描,所以會更慢;
2. 存在相關爭用的情況下。當時,另外我們還可以同調整_cleanup_rollback_entries來加快恢復進度,在某些情況下。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29371470/viewspace-2637209/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 引數FAST_START_PARALLEL_ROLLBACKASTParallel
- 引數FAST_START_PARALLEL_ROLLBACK(ZT)ASTParallel
- 關於fast_start_parallel_rollback引數ASTParallel
- fast_start_parallel_rollback引數的一點測試ASTParallel
- 等待事件wait for a undo record 與 fast_start_parallel_rollback引數事件AIASTParallel
- 引數fast_start_parallel_rollback調整oracle回滾的速度ASTParallelOracle
- fast_start_parallel_rollback和並行rollbackASTParallel並行
- SMON故障造成的parallel rollbackParallel
- EXPDP的parallel引數Parallel
- Table 引數總結
- oracle parallel並行_引數parameter_parallel_max_serverOracleParallel並行Server
- impdp hangs,慎用impdp parallel引數Parallel
- Table 引數總結 (ZT)
- Mybatis引數處理總結MyBatis
- 實用 JVM 引數總結JVM
- 引數調整案例總結
- Python函式引數總結Python函式
- pre_page_sga引數總結
- SpringMVC中的引數繫結總結SpringMVC
- EXPDP/IMPDP 中的並行度PARALLEL引數並行Parallel
- Flink常用的配置引數總結
- openai GPT引數(入參)使用總結OpenAIGPT
- consul配置引數大全、詳解、總結
- 歸檔日誌命令及引數總結
- Oracle11gr2新增PARALLEL_FORCE_LOCAL引數OracleParallel
- 【EXPDP】運用PARALLEL 和FILESIZE引數提高備份效率Parallel
- 資料庫異常緩慢的解決 - FAST_START_PARALLEL_ROLLBACK資料庫ASTParallel
- (4)caffe總結之視覺層及引數視覺
- (6)caffe總結之其它常用層及引數
- JVM調優引數、方法、工具以及案例總結JVM
- ajax傳遞引數給springmvc總結[轉]SpringMVC
- parallel並行度的相關操作、概念、引數解釋Parallel並行
- 命令列CALL程式時傳遞數字引數總結(轉)命令列
- MySQL中Redo Log相關的重要引數總結MySql
- SPRING實踐總結--引數註解的使用Spring
- fast_start_parallel_rollback與v$fast_start_servers和v$fast_start_transactionsASTParallelServer
- 資料庫異常緩慢的解決 - FAST_START_PARALLEL_ROLLBACK[轉帖]資料庫ASTParallel
- MySQL儲存過程in、out、inout引數示例與總結MySql儲存過程