我的编程空间,编程开发者的网络收藏夹
学习永远不晚

[20191206]隐含参数_db_always_check_system_ts.txt

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

[20191206]隐含参数_db_always_check_system_ts.txt

[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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

[20191206]隐含参数_db_always_check_system_ts.txt

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

[20191206]隐含参数_db_always_check_system_ts.txt

[20191206]隐含参数_db_always_check_system_ts.txt--//今年年头我做tab$删除恢复时,遇到的问题,就是遇到延迟块清除的问题.参考链接:http://blog.itpub.net/267265/viewspace-256
2021-06-05

shell脚本如何获取隐含参数

这篇文章给大家分享的是有关shell脚本如何获取隐含参数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。脚本涉及:gethidpar.sql 获取隐含参数 gettrcname.sql 获取当前t
2023-06-06

Python 含参构造函数

本篇博文主要介绍在Python3中如何构造含参构造函数样例如下:class MyOdlHttp: username = '' password = '' def __init__(self, username, passw
2023-01-31

php参数怎么隐藏

这篇文章主要介绍“php参数怎么隐藏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php参数怎么隐藏”文章能帮助大家解决问题。什么是参数隐藏?参数隐藏是指在函数或方法中,隐藏某些参数,使之在调用时不
2023-07-05

Scala隐式转换和隐式参数详解

Scala隐式转换和隐式参数是两个非常强大的功能,它们可以让我们编写更灵活和优雅的代码,但也需要注意一些潜在的问题和风险,这篇文章主要介绍了Scala隐式转换和隐式参数,需要的朋友可以参考下
2023-05-14

Log4j ConversionPattern参数的格式含义

Log4j的ConversionPattern参数用于定义日志输出格式的模式。它由一个或多个转换符和可选的修饰符组成。常用的ConversionPattern参数格式含义如下:- %d:输出日志的日期时间,默认格式为ISO8601格式(例如
2023-09-28

使用response.sendRedirect()传递隐藏参数

在使用`response.sendRedirect()`方法重定向到另一个页面时,无法直接传递隐藏参数。但是可以通过在URL中附加查询字符串参数的方式来传递参数。例如,假设我们想要重定向到`newPage.jsp`页面,并传递一个名为`hi
2023-09-27

Scala隐式转换和隐式参数怎么定义

本篇内容介绍了“Scala隐式转换和隐式参数怎么定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Scala隐式转换和隐式参数隐式转换隐式转
2023-07-05

shell脚本传参中包含有空格的参数

本文主要介绍了shell脚本传参中包含有空格的参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-22

Java中的隐式参数和显示参数实例详解

在学习Java的过程中,我们会遇到许多的问题。下面我们就来看看什么是隐式参数和显示参数。 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数。 隐式参数,是在类的方法中调用了类
2023-05-31

编程热搜

目录