0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Oracle數(shù)據(jù)庫中找出損壞索引?

電子工程師 ? 來源:未知 ? 作者:胡薇 ? 2018-10-18 14:24 ? 次閱讀

在Oracle數(shù)據(jù)庫中如何找出損壞索引呢? 下面我們?nèi)藶闃?gòu)造一個案例,將索引塊損壞。如下案例所示:

SQL> create tablespace test_data

2 datafile '/u01/app/oracle/oradata/gsp/test_data_01.dbf'

3 size 200M autoextend off

4 logging

5 segment space management auto

6 extent management local;

Tablespace created.

SQL> create tablespace test_index

2 datafile '/u01/app/oracle/oradata/gsp/test_idx_01.dbf'

3 size 200M autoextend off

4 logging

5 segment space management auto

6 extent management local;

Tablespace created.

SQL> create user kerry

2 identified by 123456

3 default tablespace test_data;

User created.

SQL> grant connect to kerry;

SQL> grant resource to kerry;

上述腳本是創(chuàng)建表空間,創(chuàng)建用戶kerry并授權(quán),然后使用kerry賬號登錄數(shù)據(jù)庫,構(gòu)造測試數(shù)據(jù),在TEST表上創(chuàng)建索引IX_TEST

SQL> show user;

USER is "KERRY"

SQL>

SQL> CREATE TABLE TEST(ID NUMBER(10), NAME VARCHAR2(64));

Table created.

SQL> DECLARE I NUMBER;

2 BEGIN

3 FOR I IN 1..1000 LOOP

4 INSERT INTO TEST VALUES(I, LPAD('T', 60));

5 END LOOP;

6 COMMIT;

7 END;

8 /

PL/SQL procedure successfully completed.

SQL> CREATE INDEX IX_TEST ON KERRY.TEST(NAME) TABLESPACE TEST_INDEX;

Index created.

然后使用下面腳本找到索引段數(shù)據(jù)庫文件ID,以及索引段的第一個塊的塊號。

SQL> show user;

USER is "SYS"

SQL> col segment_name for a32;

SQL> col header_file for 9999;

SQL> col header_block for 9999;

SQL> select segment_name

2 ,header_file

3 ,header_block

4 ,blocks

5 from dba_segments ds

6 where ds.owner='KERRY' and ds.segment_name='IX_TEST';

SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS

-------------------------------- ----------- ------------ ----------

IX_TEST 8 130 16

SQL>

構(gòu)造壞塊的方法有不少(例如BBED等),這里我們使用RMAN下面的命令clear,可以標(biāo)記數(shù)據(jù)塊為corrupt,標(biāo)記數(shù)據(jù)文件8中130號數(shù)據(jù)塊為壞塊。

[oracle@DB-Server ~]$ rman target /

Recovery Manager: Release 11.2.0.1.0 - Production on Thu Sep 13 17:41:05 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

connected to target database: GSP (DBID=644393201)

RMAN> recover datafile 8 block 130 clear;

Starting recover at 13-SEP-18

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=12 device type=DISK

Finished recover at 13-SEP-18

RMAN>

那么我們先來看看使用那些方法驗(yàn)證索引損壞了,測試驗(yàn)證一下看看是否可行。

1:使用ANALYZE分析驗(yàn)證索引結(jié)構(gòu)

[oracle@DB-Server ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 13 17:42:03 2018

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> analyze index kerry.ix_test validate structure;

analyze index kerry.ix_test validate structure

*

ERROR at line 1:

ORA-01578: ORACLE data block corrupted (file # 8, block # 130)

ORA-01110: data file 8: '/u01/app/oracle/oradata/gsp/test_idx_01.dbf'

如上截圖所示,如果索引損壞(Corrupt Index),那么使用analyze index validate structure就會報(bào)錯。要檢查整個數(shù)據(jù)庫所有的損壞索引(Corrupt Indexes)的話,就可以借助下面腳本:

spool analy_index.sql

SET PAGESIZE 50000;

SELECT

'ANALYZE INDEX ' || OWNER || '.' || INDEX_NAME|| ' VALIDATE STRUCTURE;' FROM DBA_INDEXES;

spool off;

@analy_index.sql

2:使用系統(tǒng)視圖v$database_block_corruption查看損壞索引

如下所示,我們使用這個腳本來查看出現(xiàn)壞塊的索引,發(fā)現(xiàn)這個腳本無法找出壞塊索引。

set pagesize 50 linesize 170

col segment_name format a30

col partition_name format a30

SELECT DISTINCT file#,

segment_name,

segment_type,

tablespace_name,

partition_name

FROM dba_extents a,

v$database_block_corruption b

WHERE a.file_id = b.file#

AND a.block_id <= b.block#?

AND a.block_id + a.blocks >= b.block#;

原因分析如下,視圖v$database_block_corruption中有壞塊記錄,但是我們將索引段的第一個塊標(biāo)記為壞塊后,在dba_extents中沒有該索引段的記錄了。所以這種情況下的索引損壞,這個SQL語句根本無法找出壞塊索引。

SQL> SELECT file_id,

2 segment_name,

3 segment_type

4 FROM dba_extents

5 WHERE file_id = 8 ;

no rows selected

SQL> SELECT file_id,

2 segment_name,

3 segment_type

4 FROM dba_extents

5 WHERE owner = 'KERRY';

FILE_ID SEGMENT_NAME SEGMENT_TYPE

---------- -------------------------------- ------------------

7 TEST TABLE

7 TEST TABLE

SQL>

因?yàn)橐粋€段的第一個區(qū)的第一個塊是FIRST LEVEL BITMAP BLOCK,第二個塊是SECOND LEVEL BITMAP BLOCK,這兩個塊是用來管理free block的,第三個塊是PAGETABLE SEGMENT HEADER,這個塊才是segment里的HEADER_BLOCK,再后面的塊就是用來記錄數(shù)據(jù)的。關(guān)于這些知識,可以參考我博客ORACLE關(guān)于段的HEADER_BLOCK的一點(diǎn)淺析。而我們最上面的例子,是將第一個塊構(gòu)造為壞塊,所以導(dǎo)致上面SQL無法查出。 我們重新構(gòu)造案例,如我們將索引段的數(shù)據(jù)塊構(gòu)造為壞塊,例如下面,將塊號148人為構(gòu)造壞塊。那么此時這個腳本就能找出壞塊索引了。所以綜上述實(shí)驗(yàn)可以看出,這個腳本查找壞塊索引是有條件的,要看索引段損壞的塊是什么類型

SQL> SELECT FILE_ID,

2 BLOCK_ID,

3 BLOCKS

FROM DBA_EXTENTS

4 5 WHERE OWNER ='&OWNER'

6 AND SEGMENT_NAME = '&TABLE_NAME';

Enter value for owner: KERRY

old 5: WHERE OWNER ='&OWNER'

new 5: WHERE OWNER ='KERRY'

Enter value for table_name: IX_TEST

old 6: AND SEGMENT_NAME = '&TABLE_NAME'

new 6: AND SEGMENT_NAME = 'IX_TEST'

FILE_ID BLOCK_ID BLOCKS

---------- ---------- ----------

8 144 8

8 152 8

SQL> SELECT HEADER_FILE

2 , HEADER_BLOCK

3 , BYTES

4 , BLOCKS

5 , EXTENTS

FROM DBA_SEGMENTS

6 7 WHERE OWNER='&OWNER' AND SEGMENT_NAME='&SEGMENT_NAME';

Enter value for owner: KERRY

Enter value for segment_name: IX_TEST

old 7: WHERE OWNER='&OWNER' AND SEGMENT_NAME='&SEGMENT_NAME'

new 7: WHERE OWNER='KERRY' AND SEGMENT_NAME='IX_TEST'

HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS

----------- ------------ ---------- ---------- ----------

8 146 131072 16 2

SQL>

RMAN> recover datafile 8 block 148 clear;

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Oracle
    +關(guān)注

    關(guān)注

    2

    文章

    299

    瀏覽量

    35898
  • 索引
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    10637

原文標(biāo)題:ORACLE 如何檢查找出損壞索引

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    數(shù)據(jù)庫索引技術(shù)應(yīng)用

    在對數(shù)據(jù)庫索引技術(shù)進(jìn)行討論和研究,論述如何準(zhǔn)確有效的設(shè)置數(shù)據(jù)庫索引,并結(jié)合具體的實(shí)例對數(shù)據(jù)庫索引
    發(fā)表于 11-04 11:28 ?26次下載

    提高Oracle數(shù)據(jù)庫性能

    Oracle數(shù)據(jù)庫設(shè)計(jì)中長期受到設(shè)計(jì)人員重視的是如何更好更快地提高Oracle數(shù)據(jù)庫性能的問題。其中對數(shù)據(jù)庫表現(xiàn)有較大關(guān)聯(lián)的是兩個因素,一
    發(fā)表于 11-11 18:16 ?4次下載

    oracle數(shù)據(jù)庫應(yīng)用領(lǐng)域

    Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關(guān)系數(shù)據(jù)庫管理系統(tǒng)。它是在數(shù)據(jù)庫領(lǐng)域一直
    的頭像 發(fā)表于 02-23 10:08 ?2.7w次閱讀
    <b class='flag-5'>oracle</b><b class='flag-5'>數(shù)據(jù)庫</b>應(yīng)用領(lǐng)域

    Oracle數(shù)據(jù)庫開發(fā)和管理的工具

    的路徑。 ? 數(shù)據(jù)庫設(shè)計(jì) ? 可視化編輯器的設(shè)計(jì)表 精心設(shè)計(jì)的表設(shè)計(jì)器,可以直觀地創(chuàng)建和編輯表、列、鍵、索引、關(guān)系和約束,而無需鍵入任何代碼。 在數(shù)據(jù)庫圖中繪制對象 將
    的頭像 發(fā)表于 06-19 09:54 ?915次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)-Oracle數(shù)據(jù)庫文件出現(xiàn)壞塊的數(shù)據(jù)恢復(fù)案例

    ,sysaux01.dbf文件損壞數(shù)據(jù)庫無備份,不能通過備份去恢復(fù)數(shù)據(jù)庫。用戶提供了該Oracle數(shù)據(jù)庫
    的頭像 發(fā)表于 07-18 15:10 ?934次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)-<b class='flag-5'>Oracle</b><b class='flag-5'>數(shù)據(jù)庫</b>文件出現(xiàn)壞塊的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)-oracle數(shù)據(jù)庫常見故障及數(shù)據(jù)恢復(fù)分析

    作為存儲和處理數(shù)據(jù)的系統(tǒng),oracle數(shù)據(jù)庫在使用過程不可避免會出現(xiàn)各種導(dǎo)致數(shù)據(jù)丟失和數(shù)據(jù)
    的頭像 發(fā)表于 07-27 15:01 ?843次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)-Oracle數(shù)據(jù)庫文件塊損壞數(shù)據(jù)恢復(fù)案例

    打開Oracle數(shù)據(jù)庫時報(bào)錯,報(bào)錯信息:“system01.dbf需要更多的恢復(fù)來保持一致性,數(shù)據(jù)庫無法打開”。用戶急需恢復(fù)zxfg用戶下的數(shù)據(jù)。
    的頭像 發(fā)表于 08-03 15:10 ?934次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)-<b class='flag-5'>Oracle</b><b class='flag-5'>數(shù)據(jù)庫</b>文件塊<b class='flag-5'>損壞</b>的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)-Oracle ASM故障數(shù)據(jù)恢復(fù)案例

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)環(huán)境: Oracle數(shù)據(jù)庫ASM磁盤組有4塊成員盤。 數(shù)據(jù)庫故障&分析: Ora
    的頭像 發(fā)表于 08-11 15:27 ?1692次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)-<b class='flag-5'>Oracle</b> ASM故障<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    oracle數(shù)據(jù)庫如何連接

    oracle數(shù)據(jù)庫如何連接? Oracle數(shù)據(jù)庫是目前非常流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它可以在各種平臺上運(yùn)行,因此它是企業(yè)級應(yīng)用程序的首選
    的頭像 發(fā)表于 08-28 17:09 ?1.1w次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)-oracle數(shù)據(jù)庫報(bào)錯無法打開的數(shù)據(jù)恢復(fù)案例

    oracle數(shù)據(jù)庫數(shù)據(jù)恢復(fù)環(huán)境: 一臺服務(wù)器,底層由12塊硬盤組成一組磁盤陣列,上層操作系統(tǒng)上運(yùn)行oracle數(shù)據(jù)庫。
    的頭像 發(fā)表于 10-12 14:00 ?1098次閱讀

    oracle數(shù)據(jù)庫的使用方法

    Oracle數(shù)據(jù)庫是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它由Oracle公司開發(fā)和維護(hù)。它提供了安全、可靠和高性能的數(shù)據(jù)庫管理解決方案,被廣泛應(yīng)用于企
    的頭像 發(fā)表于 12-06 10:10 ?1695次閱讀

    oracle數(shù)據(jù)庫的基本操作

    Oracle數(shù)據(jù)庫是一種關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS),廣泛應(yīng)用于企業(yè)級應(yīng)用。它具有強(qiáng)大的功能和靈活的配置選項(xiàng),可以滿足復(fù)雜的數(shù)據(jù)處理需
    的頭像 發(fā)表于 12-06 10:14 ?989次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—Oracle數(shù)據(jù)庫文件system01.dbf損壞數(shù)據(jù)恢復(fù)案例

    打開oracle數(shù)據(jù)庫報(bào)錯“system01.dbf需要更多的恢復(fù)來保持一致性,數(shù)據(jù)庫無法打開”。
    的頭像 發(fā)表于 09-21 14:25 ?919次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—<b class='flag-5'>Oracle</b><b class='flag-5'>數(shù)據(jù)庫</b>文件system01.dbf<b class='flag-5'>損壞</b>的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    Oracle數(shù)據(jù)恢復(fù)—異常斷電后Oracle數(shù)據(jù)庫報(bào)錯的數(shù)據(jù)恢復(fù)案例

    Oracle數(shù)據(jù)庫故障: 機(jī)房異常斷電后,Oracle數(shù)據(jù)庫報(bào)錯:“system01.dbf需要更多的恢復(fù)來保持一致性,
    的頭像 發(fā)表于 09-30 13:31 ?666次閱讀
    <b class='flag-5'>Oracle</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—異常斷電后<b class='flag-5'>Oracle</b><b class='flag-5'>數(shù)據(jù)庫</b>啟<b class='flag-5'>庫</b>報(bào)錯的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—ORACLE常見故障的數(shù)據(jù)恢復(fù)可行性分析

    Oracle數(shù)據(jù)庫常見故障表現(xiàn): 1、ORACLE數(shù)據(jù)庫無法啟動或無法正常工作。 2、ORACLE ASM存儲破壞。 3、
    的頭像 發(fā)表于 12-10 11:35 ?416次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品