国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - 關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考

關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考

2020-01-07 15:33瀟湘隱者 Oracle

這篇文章主要介紹了關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

在ORACLE中,我們可以通過file_id(file#)與block_id(block#)去定位一個數據庫對象(object)。例如,我們在10046生成的trace文件中file#=4 block#=266 blocks=8,那么我可以通過下面兩個SQL去定位對象

SQL 1:此SQL效率較差,執行時間較長。

?
1
2
3
4
5
6
7
SELECT OWNER,
  SEGMENT_NAME,
  SEGMENT_TYPE,
  TABLESPACE_NAME
FROM DBA_EXTENTS
WHERE FILE_ID =&FILE_ID
  AND &BLOCK_ID BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;

SQL 2:此SQL效率較快(ORACLE 10g 中沒有CACHEHINT字段)

?
1
2
3
4
5
6
7
8
9
10
11
12
SELECT OBJD,
  FILE#,
  BLOCK#,
  CLASS#,
  TS#,
  CACHEHINT,
  STATUS,
  DIRTY
FROM V$BH
WHERE FILE# = &FILE_ID
  AND BLOCK# = &BLOCK_ID;
SELECT OWNER, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_ID=&OBJECT_ID;

下面通過一個例子來演示一下,詳情如下所示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
SQL> COL OWNER FOR A12;
SQL> COL SEGMENT_NAME FOR A32;
SQL> SELECT OWNER  ,
 2   SEGMENT_NAME ,
 3   HEADER_FILE ,
 4   HEADER_BLOCK
 5 FROM DBA_SEGMENTS  
 6 WHERE OWNER='TEST' AND SEGMENT_NAME='EMPLOYEE';
OWNER  SEGMENT_NAME      HEADER_FILE HEADER_BLOCK
------------ -------------------------------- ----------- ------------
TEST   EMPLOYEE         4   266
SQL>
SQL> SELECT OWNER,
 2   SEGMENT_NAME,
 3   SEGMENT_TYPE,
 4   TABLESPACE_NAME
 5 FROM DBA_EXTENTS
 6 WHERE FILE_ID = 4
 7   AND 266 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;
OWNER  SEGMENT_NAME      SEGMENT_TYPE  TABLESPACE_NAME
------------ -------------------------------- ------------------ -----------------
TEST   EMPLOYEE       TABLE    USERS
SQL>
SQL> SELECT OBJD,
 2   FILE#,
 3   BLOCK#,
 4   CLASS#,
 5   TS#,
 6   CACHEHINT,
 7   STATUS,
 8   DIRTY
 9 FROM V$BH
 10 WHERE FILE# = 4
 11   AND BLOCK# = 266;
  OBJD  FILE#  BLOCK#  CLASS#  TS# CACHEHINT STATUS  D
---------- ---------- ---------- ---------- ---------- ---------- ---------- -
  76090   4  266   4   4   15 cr   N
  76090   4  266   4   4   15 cr   N
  76090   4  266   4   4   15 cr   N
SQL> SELECT OWNER, OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_ID=76090;
OWNER  OBJECT_NAME
------------ ------------------------------------------------------------
TEST   EMPLOYEE
clip_image001

關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考

昨天在群里討論一個關于空閑塊的問題時,我驗證測試時,發現一個奇怪的現象,使用下面SQL找到了一個最大空閑塊。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT UPPER(F.TABLESPACE_NAME)   AS "表空間名",
  D.TOT_GROOTTE_MB     AS "表空間大小(M)",
  D.TOT_GROOTTE_MB - F.TOTAL_BYTES AS "已使用空間(M)",
  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99')
           AS "使用比",
  F.TOTAL_BYTES      AS "空閑空間(M)",
  F.MAX_BYTES      AS "最大空閑塊(M)"
FROM
 (SELECT TABLESPACE_NAME,
 ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
 ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
 FROM SYS.DBA_FREE_SPACE
 GROUP BY TABLESPACE_NAME
 ) F,
 (SELECT DD.TABLESPACE_NAME,
 ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
 FROM SYS.DBA_DATA_FILES DD
 GROUP BY DD.TABLESPACE_NAME
 ) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME;
SELECT FILE_ID,BLOCK_ID, BYTES,BLOCKS
FROM DBA_FREE_SPACE
WHERE TABLESPACE_NAME=&TABLESPACE_NAME
ORDER BY BYTES DESC;

然后我發現使用上面兩個SQL查不到對應的對象。如下截圖所示:

關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考

后面查了一下資料,發現在Oracle Database 10g引入了回收站功能后,會將回收站(RECYCLEBIN$)中的空間計算為自由空間,加入到dba_free_space字典中。在$ORACLE_HOME/rdbms/admin/catspace.sql中,你可以找到視圖DBA_FREE_SPACE的定義,腳本如下:

ORACLE 10g中DBA_FREE_SPACE的定義:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
create or replace view DBA_FREE_SPACE
 (TABLESPACE_NAME, FILE_ID, BLOCK_ID,
  BYTES, BLOCKS, RELATIVE_FNO)
as
select ts.name, fi.file#, f.block#,
  f.length * ts.blocksize, f.length, f.file#
from sys.ts$ ts, sys.fet$ f, sys.file$ fi
where ts.ts# = f.ts#
 and f.ts# = fi.ts#
 and f.file# = fi.relfile#
 and ts.bitmapped = 0
union all
select /*+ ordered use_nl(f) use_nl(fi) */
  ts.name, fi.file#, f.ktfbfebno,
  f.ktfbfeblks * ts.blocksize, f.ktfbfeblks, f.ktfbfefno
from sys.ts$ ts, sys.x$ktfbfe f, sys.file$ fi
where ts.ts# = f.ktfbfetsn
 and f.ktfbfetsn = fi.ts#
 and f.ktfbfefno = fi.relfile#
 and ts.bitmapped <> 0 and ts.online$ in (1,4) and ts.contents$ = 0
union all
select /*+ ordered use_nl(u) use_nl(fi) */
  ts.name, fi.file#, u.ktfbuebno,
  u.ktfbueblks * ts.blocksize, u.ktfbueblks, u.ktfbuefno
from sys.recyclebin$ rb, sys.ts$ ts, sys.x$ktfbue u, sys.file$ fi
where ts.ts# = rb.ts#
 and rb.ts# = fi.ts#
 and u.ktfbuefno = fi.relfile#
 and u.ktfbuesegtsn = rb.ts#
 and u.ktfbuesegfno = rb.file#
 and u.ktfbuesegbno = rb.block#
 and ts.bitmapped <> 0 and ts.online$ in (1,4) and ts.contents$ = 0
union all
select ts.name, fi.file#, u.block#,
  u.length * ts.blocksize, u.length, u.file#
from sys.ts$ ts, sys.uet$ u, sys.file$ fi, sys.recyclebin$ rb
where ts.ts# = u.ts#
 and u.ts# = fi.ts#
 and u.segfile# = fi.relfile#
 and u.ts# = rb.ts#
 and u.segfile# = rb.file#
 and u.segblock# = rb.block#
 and ts.bitmapped = 0
/
ORACLE 11g中DBA_FREE_SPACE的定義:
create or replace view DBA_FREE_SPACE
 (TABLESPACE_NAME, FILE_ID, BLOCK_ID,
  BYTES, BLOCKS, RELATIVE_FNO)
as
select ts.name, fi.file#, f.block#,
  f.length * ts.blocksize, f.length, f.file#
from sys.ts$ ts, sys.fet$ f, sys.file$ fi
where ts.ts# = f.ts#
 and f.ts# = fi.ts#
 and f.file# = fi.relfile#
 and ts.bitmapped = 0
union all
select /*+ ordered use_nl(f) use_nl(fi) */
  ts.name, fi.file#, f.ktfbfebno,
  f.ktfbfeblks * ts.blocksize, f.ktfbfeblks, f.ktfbfefno
from sys.ts$ ts, sys.x$ktfbfe f, sys.file$ fi
where ts.ts# = f.ktfbfetsn
 and f.ktfbfetsn = fi.ts#
 and f.ktfbfefno = fi.relfile#
 and ts.bitmapped <> 0 and ts.online$ in (1,4) and ts.contents$ = 0
union all
select /*+ ordered use_nl(u) use_nl(fi) */
  ts.name, fi.file#, u.ktfbuebno,
  u.ktfbueblks * ts.blocksize, u.ktfbueblks, u.ktfbuefno
from sys.recyclebin$ rb, sys.ts$ ts, sys.x$ktfbue u, sys.file$ fi
where ts.ts# = rb.ts#
 and rb.ts# = fi.ts#
 and u.ktfbuefno = fi.relfile#
 and u.ktfbuesegtsn = rb.ts#
 and u.ktfbuesegfno = rb.file#
 and u.ktfbuesegbno = rb.block#
 and ts.bitmapped <> 0 and ts.online$ in (1,4) and ts.contents$ = 0
union all
select ts.name, fi.file#, u.block#,
  u.length * ts.blocksize, u.length, u.file#
from sys.ts$ ts, sys.uet$ u, sys.file$ fi, sys.recyclebin$ rb
where ts.ts# = u.ts#
 and u.ts# = fi.ts#
 and u.segfile# = fi.relfile#
 and u.ts# = rb.ts#
 and u.segfile# = rb.file#
 and u.segblock# = rb.block#
 and ts.bitmapped = 0
/

那么在DBA_FREE_SPACE中找到的最大空閑塊是否很有可能就是回收站中曾經的一個對象呢?那么我們來測試看看。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SQL> show parameter recyclebin;
NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
recyclebin       string  on
SQL> CREATE TABLE ESCMOWNER.TTT
 2 AS
 3 SELECT * FROM DBA_OBJECTS;
Table created.
SQL> COL OWNER FOR A12;
SQL> COL SEGMENT_NAME FOR A32;
SQL> SELECT OWNER,SEGMENT_NAME, HEADER_FILE, HEADER_BLOCK
 2 FROM DBA_SEGMENTS
 3 WHERE OWNER='ESCMOWNER' AND SEGMENT_NAME='TTT' ;
OWNER  SEGMENT_NAME      HEADER_FILE HEADER_BLOCK
------------ -------------------------------- ----------- ------------
ESCMOWNER TTT          97  113025
SQL>
SQL> SELECT * FROM X$KTFBFE WHERE KTFBFEFNO=97;
ADDR     INDX INST_ID KTFBFETSN KTFBFEFNO KTFBFEBNO KTFBFEBLKS
---------------- ---------- ---------- ---------- ---------- ---------- ----------
00007F57B2388CA0  222   1   9   97  524169  120
SQL> DROP TABLE ESCMOWNER.TTT;
Table dropped.
SQL> COL ORIGINAL_NAME FOR A16;
SQL> SELECT OBJ#,OWNER#,ORIGINAL_NAME,FILE#,BLOCK# ,FLAGS,SPACE FROM RECYCLEBIN$;
  OBJ#  OWNER# ORIGINAL_NAME   FILE#  BLOCK#  FLAGS  SPACE
---------- ---------- ---------------- ---------- ---------- ---------- ----------
 805429   73 TTT      97  113025   30  896
SQL> PURGE DBA_RECYCLEBIN;
DBA Recyclebin purged.
SQL> SELECT * FROM X$KTFBFE WHERE KTFBFEFNO=97 ;
ADDR     INDX INST_ID KTFBFETSN KTFBFEFNO KTFBFEBNO KTFBFEBLKS
---------------- ---------- ---------- ---------- ---------- ---------- ----------
00007F57B2388CA0  222   1   9   97  113025   8
00007F57B2388CA0  225   1   9   97  524169  120
SQL>
clip_image003

關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考

如上所示,清空回收站對象后,你會發現X$KTFBFE中多了一條記錄,KTFBFEFNO 和 KTFBFEBNO分別為97 ,113025, 這個值顯然就是刪除對象TTT曾經的FILE_ID(97)和BLOCK_ID(113025)值。

另外,在測試過程中發現,并不是每次的測試結果都是在X$KTFBFE中多一條記錄,有時候記錄不會變化,但是X$KTFBFE中某條記錄的KTFBFEBNO會變化,而這個變化跟清空回收站是有關系的。如下案例所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SQL> show parameter recyclebin;
NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
recyclebin       string  on
SQL> CREATE TABLE TEST.TTT
 2 AS
 3 SELECT * FROM DBA_OBJECTS;
Table created.
SQL> COL OWNER FOR A12;
SQL> COL SEGMENT_NAME FOR A32;
SQL> SELECT OWNER,SEGMENT_NAME, HEADER_FILE, HEADER_BLOCK
 2 FROM DBA_SEGMENTS
 3 WHERE OWNER='TEST' AND SEGMENT_NAME='TTT' ;
OWNER  SEGMENT_NAME      HEADER_FILE HEADER_BLOCK
------------ -------------------------------- ----------- ------------
TEST   TTT          5   130
SQL> SELECT * FROM X$KTFBFE WHERE KTFBFEFNO=5 ;
ADDR     INDX INST_ID KTFBFETSN KTFBFEFNO KTFBFEBNO KTFBFEBLKS
---------------- ---------- ---------- ---------- ---------- ---------- ----------
00002BA829B19558  150   1   6   5  1280  506752
00002BA829B19558  151   1   6   5  508032  16256
SQL> DROP TABLE TEST.TTT;
Table dropped.
SQL>
SQL> COL ORIGINAL_NAME FOR A16;
SQL> SELECT OBJ#,OWNER#,ORIGINAL_NAME,FILE#,BLOCK# ,FLAGS,SPACE FROM RECYCLEBIN$;
  OBJ#  OWNER# ORIGINAL_NAME   FILE#  BLOCK#  FLAGS  SPACE
---------- ---------- ---------------- ---------- ---------- ---------- ----------
  82820   85 TTT      5  130   30  1152
SQL> SELECT * FROM X$KTFBFE WHERE KTFBFEFNO=5 ;
ADDR     INDX INST_ID KTFBFETSN KTFBFEFNO KTFBFEBNO KTFBFEBLKS
---------------- ---------- ---------- ---------- ---------- ---------- ----------
00002BA829B159D8  150   1   6   5  1280  506752
00002BA829B159D8  151   1   6   5  508032  16256
SQL> PURGE DBA_RECYCLEBIN;
DBA Recyclebin purged.
SQL> SELECT * FROM X$KTFBFE WHERE KTFBFEFNO=5 ;
ADDR     INDX INST_ID KTFBFETSN KTFBFEFNO KTFBFEBNO KTFBFEBLKS
---------------- ---------- ---------- ---------- ---------- ---------- ----------
00002BA829B159D8  150   1   6   5  128  507904
00002BA829B159D8  151   1   6   5  508032  16256
SQL>
clip_image004

關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考

如上所示,在清空回收站的表以后,你查詢X$KTFBFE,就會發現其中一條記錄的KTFBFEBNO的變化了,它們的關系為

1280 -1152 = 128

所以,你會看到KTFBFEBNO的值從1280變為了128了。此時你查看DBA_FREE_SPACE,就會看到這樣的情況。所以當清空回收站時,有可能是數據庫將這個表的空間標記為了空閑塊,也有可能是將這個空閑塊合并到其它空閑塊去了。

X$KTFBFE其實是這幾個單詞[k]ernel [t]ablespace [f]ile [b]itmapped [f]ree [e]xtents 的首字母。關于這個系統視圖最深入的介紹,莫過于這篇文章談談Oracle dba_free_space,有興趣可以驗證、測試一下。

以上所述是小編給大家介紹的關于ORACLE通過file_id與block_id定位數據庫對象遇到的問題引發的思考,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

原文鏈接:http://www.cnblogs.com/kerrycode/p/6576988.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91久久精品一区 | 国产51人人成人人人人爽色哟哟 | 欧美日韩精品免费 | 久久99精品久久久久久6194 | 五月激情综合 | 欧美日韩亚洲综合 | 中文字幕在线精品 | 日韩国产免费观看 | 台湾黄网 | 免费观看一级视频 | 视频一区二区国产 | 国产精品久久久久久亚洲调教 | 国产精品99久久久久久动医院 | 久久99综合久久爱伊人 | 欧洲一区二区在线观看 | 在线视频a| 欧美成人黄色网 | 久久国产精品无码网站 | 国产精品一区在线观看 | 中文久久| 久久久精品国产99久久精品芒果 | 亚洲精品久久久一区二区三区 | 99精品国产一区二区青青牛奶 | 欧美久久视频 | 午夜影视 | 黄色毛片在线看 | 免费视频成人国产精品网站 | 欧美成在线视频 | 国产精品免费视频一区二区三区 | 国产福利在线观看 | 99精品欧美一区二区三区 | 国产精品网站在线观看 | 亚洲欧美在线一区 | 久久精品一区二区三区不卡牛牛 | 日韩成人av电影 | 亚洲精品国产第一综合99久久 | 免费观看一级淫片 | 午夜电影网址 | 久久天天躁狠狠躁夜夜躁2014 | 激情五月婷婷av | 亚洲社区在线 |