parallel rollback引數總結

datapeng發表於2019-02-28

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

相關文章