[20191206]隱含參數_db_always_check_system_ts.txt

来源:https://www.cnblogs.com/lfree/archive/2019/12/06/11993512.html
-Advertisement-
Play Games

[20191206]隱含參數_db_always_check_system_ts.txt--//今年年頭我做tab$刪除恢復時,遇到的問題,就是遇到延遲塊清除的問題.參考鏈接:http://blog.itpub.net/267265/viewspace-2564716/http://blog.itp ...


[20191206]隱含參數_db_always_check_system_ts.txt

--//今年年頭我做tab$刪除恢復時,遇到的問題,就是遇到延遲塊清除的問題.參考鏈接:
http://blog.itpub.net/267265/viewspace-2564716/
http://blog.itpub.net/267265/viewspace-2564717/

--//當時測試如果發生延遲塊清除,修複刪除記錄的塊,再讀取時如果是系統表空間時報錯,一般用戶的表空間是沒有問題.
--//一直想知道系統表空間有什麼隱含參數可以繞過這個問題,畢竟修複資料庫如果錯誤太多,無法一塊一塊來修複.
--//昨天才知道有一個隱含參數_db_always_check_system_ts可以繞過這個錯誤.今天測試看看.

1.環境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SYS@book> @ hide _db_always_check_system_ts
NAME                       DESCRIPTION                                                   DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
-------------------------- ------------------------------------------------------------- ------------- ------------- ------------ ----- ---------
_db_always_check_system_ts Always perform block check and checksum for System tablespace TRUE          TRUE          TRUE         FALSE IMMEDIATE
--//預設_db_always_check_system_ts=true.

2.測試:
SYS@book> create table t tablespace system as select rownum id,'test' name from dual connect by level<=2;
Table created.

SYS@book> select rowid,t.* from t;
ROWID                      ID NAME
------------------ ---------- ----
AAAWEgAABAAAAl5AAA          1 test
AAAWEgAABAAAAl5AAB          2 test

SYS@book> @ rowid AAAWEgAABAAAAl5AAA
    OBJECT       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
     90400          1       2425          0   0x400979           1,2425               alter system dump datafile 1 block 2425
-//建立在system表空間.

SYS@book>  delete from t where id=1;
1 row deleted.

SYS@book>  alter system flush buffer_cache;
System altered.

SYS@book>  alter system flush buffer_cache;
System altered.

SYS@book> @ bh 1 2425
HLADDR              DBARFIL     DBABLK      CLASS CLASS_TYPE         STATE             TCH CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ BA               OBJECT_NAME
---------------- ---------- ---------- ---------- ------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- --------------------
0000000084DEACF8          1       2425          1 data block         free                0          0          0          0          0          0 00000000772C2000 T
0000000084DEACF8          1       2425          1 data block         free                0          0          0          0          0          0 00000000772C4000 T
--//確定該塊不在資料庫緩存.

SYS@book> commit ;
Commit complete.
--//這個時候不會寫塊提交到塊中,因為數據塊已經不在數據緩存了.

3.使用bbed修複該記錄看看:
BBED> set dba   1,2425
        DBA             0x00400979 (4196729 1,2425)

BBED> x /rnc *kdbr[1]
rowdata[0]                                  @8166
----------
flag@8166: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8167: 0x00
cols@8168:    2

col    0[2] @8169: 2
col    1[4] @8172: test


BBED> x /rnc *kdbr[0]
rowdata[11]                                 @8177
-----------
flag@8177: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
lock@8178: 0x02
cols@8179:    0

--//第1條記錄已經刪除,flag=0x3c.

BBED> assign offset 8177 =0x2c;
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
ub1 rowdata[0]                              @8177     0x2c

BBED> x /rnc *kdbr[0]
rowdata[11]                                 @8177
-----------
flag@8177: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8178: 0x02
cols@8179:    2

col    0[2] @8180: 1
col    1[4] @8183: test
--//ok,現在已經恢復.lock=0x02,使用itl槽1(從0開始)

BBED> sum apply
Check value for File 1, Block 2425:
current = 0xff20, required = 0xff20

BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/system01.dbf
BLOCK = 2425

Block Checking: DBA = 4196729, Block Type = KTB-managed data block
data header at 0x7f344dbba274
kdbchk: the amount of space used is not equal to block size
        used=44 fsc=9 avsp=8028 dtl=8072
Block 2425 failed with check code 6110
--//註:這個報錯不必理會在select讀取時.

BBED> p ktbbh.ktbbhitl[1]
struct ktbbhitl[1], 24 bytes                @68
   struct ktbitxid, 8 bytes                 @68
      ub2 kxidusn                           @68       0x000a
      ub2 kxidslt                           @70       0x0013
      ub4 kxidsqn                           @72       0x00004d92
   struct ktbituba, 8 bytes                 @76
      ub4 kubadba                           @76       0x00c00288
      ub2 kubaseq                           @80       0x0f0a
      ub1 kubarec                           @82       0x0e
   ub2 ktbitflg                             @84       0x0002 (NONE)
   union _ktbitun, 2 bytes                  @86
      sb2 _ktbitfsc                         @86       9
      ub2 _ktbitwrp                         @86       0x0009
   ub4 ktbitbas                             @88       0x00000000

--//可以發現ktbitflg=0x0002,表示沒有提交.有點奇怪為什麼是0x0002,應該是0x0001(因為我僅僅刪除1條記錄)
--//註:關於這點我在以前blog提到參考鏈接http://blog.itpub.net/267265/viewspace-2564779/,視乎使用表空間類型是mssm就能看到
--//這樣的情況.
--//ktbitbas=0x00000000,也就是沒有scn相關信息寫入.

--//如果我這時讀取該塊就會遇到鏈接測試遇到的情況:鏈接http://blog.itpub.net/267265/viewspace-2564717/
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [kdBlkCheckError], [1], [2537], [6110], [], [], [], [], [], [], [], []
--//註意錯誤號6110,與bbed的錯誤號一致.

--//因為延遲塊清除,在讀取該塊時要寫入itl槽scn號.設置提交標識.這樣對於system表空間這樣的塊就會報錯(bbed verify沒有通過)
--//現在修改參數:
SYS@book> alter system set "_db_always_check_system_ts"=false scope=memory ;
System altered.

SYS@book> @ hide "_db_always_check_system_ts"
NAME                       DESCRIPTION                                                   DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
-------------------------- ------------------------------------------------------------- ------------- ------------- ------------ ----- ---------
_db_always_check_system_ts Always perform block check and checksum for System tablespace TRUE          FALSE         FALSE        FALSE IMMEDIATE

--//按照介紹該參數是立即生效ISSYS_MOD=IMMEDIATE.保險起見還是退出會話在登錄看看.

SYS@book> select rowid,t.* from t;
ROWID               ID NAME
------------------ --- -----
AAAWEgAABAAAAl5AAA   1 test
AAAWEgAABAAAAl5AAB   2 test

--//OK,現在讀取就沒有問題.再次通過bbed觀察:

BBED> set dba   1,2425
        DBA             0x00400979 (4196729 1,2425)

BBED> p ktbbh.ktbbhitl[1]
struct ktbbhitl[1], 24 bytes                @68
   struct ktbitxid, 8 bytes                 @68
      ub2 kxidusn                           @68       0x000a
      ub2 kxidslt                           @70       0x0013
      ub4 kxidsqn                           @72       0x00004d92
   struct ktbituba, 8 bytes                 @76
      ub4 kubadba                           @76       0x00c00288
      ub2 kubaseq                           @80       0x0f0a
      ub1 kubarec                           @82       0x0e
   ub2 ktbitflg                             @84       0xa000 (KTBFUPB, KTBFCOM)`
   union _ktbitun, 2 bytes                  @86
      sb2 _ktbitfsc                         @86       3
      ub2 _ktbitwrp                         @86       0x0003
   ub4 ktbitbas                             @88       0x17600426

--//可以發現ktbitflg=0xa000(KTBFUPB, KTBFCOM),表示提交.
--//ktbitbas=0x17600426,也就是scn相關信息已經寫入.

BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/system01.dbf
BLOCK = 2425

Block Checking: DBA = 4196729, Block Type = KTB-managed data block
data header at 0x1f09e74
kdbchk: the amount of space used is not equal to block size
        used=44 fsc=0 avsp=8037 dtl=8072
Block 2425 failed with check code 6110

--//還是報6110錯誤.但是該塊的讀取是沒有問題的.

SYS@book> alter system set "_db_always_check_system_ts"=true scope=memory ;
System altered.

SYS@book> select rowid,t.* from t;
ROWID                      ID NAME
------------------ ---------- ----
AAAWEgAABAAAAl5AAA          1 test
AAAWEgAABAAAAl5AAB          2 test

--//讀取沒有問題,如果修改該記錄現在就會報錯(註意"_db_always_check_system_ts"=true),驗證看看.

SYS@book> update t set name='TEST' where id=2;
update t set name='TEST' where id=2
       *
ERROR at line 1:
ORA-00600: internal error code, arguments: [kdBlkCheckError], [1], [2425], [6110], [], [], [], [], [], [], [], []

SYS@book> alter system set "_db_always_check_system_ts"=false scope=memory ;
System altered.

SYS@book> update t set name='TEST' where id=2;
update t set name='TEST' where id=2
       *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 1, block # 2425)
ORA-01110: data file 1: '/mnt/ramdisk/book/system01.dbf'

SYS@book> alter system flush buffer_cache;
System altered.

SYS@book> update t set name='TEST' where id=2;
1 row updated.
--//ok現在沒有問題.

SYS@book> commit ;
Commit complete.

SYS@book> select rowid,t.* from t;
ROWID               ID NAME
------------------ --- -----
AAAWEgAABAAAAl5AAA   1 test
AAAWEgAABAAAAl5AAB   2 TEST

--//實際上這個時候使用bbed verify檢查還是報錯.
BBED> set dba   1,2425
        DBA             0x00400979 (4196729 1,2425)

BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/system01.dbf
BLOCK = 2425

Block Checking: DBA = 4196729, Block Type = KTB-managed data block
data header at 0x7f756ceee274
kdbchk: the amount of space used is not equal to block size
        used=44 fsc=0 avsp=8037 dtl=8072
Block 2425 failed with check code 6110

4.總結:
--//設置_db_always_check_system_ts=false,可以繞過一些資料庫塊錯誤,實際上遇到這樣的情況,最佳的方式設置read only.
--//採用exp或者expdp方式儘快取出數據重新建庫.

5.補充如何修複該塊:
BBED> verify dba 1,2425
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/system01.dbf
BLOCK = 2425

Block Checking: DBA = 4196729, Block Type = KTB-managed data block
data header at 0x15b9e74
kdbchk: the amount of space used is not equal to block size
        used=44 fsc=0 avsp=8037 dtl=8072
Block 2425 failed with check code 6110

--//avsp= dtl-used-fsc = 8072-0 -44 = 8028

BBED> assign kdbh.kdbhavsp=8028
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
sb2 kdbhavsp                                @126      8116

BBED> assign kdbh.kdbhavsp=8028
sb2 kdbhavsp                                @126      8028

BBED> sum apply
Check value for File 1, Block 2425:
current = 0x8014, required = 0x8014

BBED> verify dba 1,2425
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/system01.dbf
BLOCK = 2425

Block Checking: DBA = 4196729, Block Type = KTB-managed data block
data header at 0x16d5e74
kdbchk: space available on commit is incorrect
        tosp=8039 fsc=0 stb=0 avsp=8028
Block 2425 failed with check code 6111

--// tosp = avsp+stb+fsc= 8028+0+0 = 8028
BBED> assign kdbh.kdbhtosp=8028
sb2 kdbhtosp                                @128      8028

BBED> sum apply
Check value for File 1, Block 2425:
current = 0x802f, required = 0x802f

BBED> verify dba 1,2425
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/system01.dbf
BLOCK = 2425

--//現在設置"_db_always_check_system_ts"=true,在執行dml就不錯報錯了.

SYS@book> alter system set "_db_always_check_system_ts"=true scope=memory ;
System altered.

SYS@book> update t set name='Tttt' where id=2;
1 row updated.

SYS@book> commit ;
Commit complete.

SYS@book> select rowid,t.* from t;
ROWID                      ID NAME
------------------ ---------- ----
AAAWEgAABAAAAl5AAA          1 test
AAAWEgAABAAAAl5AAB          2 Tttt


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...