Kiến thức chung

ĐỌC THÔNG TIN TRONG DATA BLOCK

Hôm nay mình chia sẻ một bài lab chuyên sâu để mọi người hiểu hơn về kiến trúc lưu trữ của Oracle.
Đọc thông tin trong Data Block
Phần kiến trúc tổng quan của Oracle các bạn có thể tìm hiểu ở các Video đã chia sẻ của mình.
Các bạn có thể xem lại tại đây!

Các bước để đọc thông tin trong Data Block

Bản chất các dữ liệu được lưu trữ ở Data Block, việc quét dữ liệu từ Disk lên Data Buffer cache cũng là quét các data block dữ liệu.
Vậy trong Data Block thực sự lưu thông tin như thế nào.
Tôi thực hiện demo gồm các bước sau
Bước 1: Tạo một table chứa dữ liệu.
Bước 2: Xác định block chứa dữ liệu của table đã tạo ở bước 1
Bước 3: Thực hiện dump block dữ liệu này để xem các thông tin chi tiết
Bước 4: Phân tích thông tin

Tôi thường sử dụng kỹ thuật này trong các trường hợp sự cố nghiệm trọng hoặc những bài toán tối ưu cần xử lý mức block.
Demo được thực hiện trên phiên bản Oracle 12cR2, hệ điều hành Oracle Linux 6.
Chúng ta cùng bắt đầu!

Bước 1: Tạo Table cho việc Test

SQL> create table test_block(id number, name varchar2(10))tablespace USERS;
Table created.

SQL> insert into test_block values(1,’Huy’);
1 row created.

SQL> insert into test_block values(2,’Wecommit’);
1 row created.

SQL> commit;
Commit complete.

Bước 2: Kiểm tra xem dữ liệu đang nằm trên block nào.

SQL> select ROWID,id, name from test_block where id=2;

ROWID ID NAME
—————— ———- ———-
AAASVxAAHAABJ1rAAB 2 Wecommit

SQL> select DBMS_ROWID.ROWID_BLOCK_NUMBER(‘AAASVxAAHAABJ1rAAB’) “Block number” from DUAL;

Block number
————
302443

# Kiểm tra block size của datafile đang chứa dữ liệu bảng test
SQL> select f.FILE#, f.NAME “File”, t.NAME “Tablespace” from V$DATAFILE f, V$TABLESPACE t where t.NAME=’USERS’ and f.TS# = t.TS#;
FILE# File Tablespace
———- —————————— ——————————
7 /data/LAB/users01.dbf USERS

SQL> select block_size from v$datafile where file#=7;

BLOCK_SIZE
———-
8192

-> Chúng ta đã biết dữ liệu nằm ở Block 302443 sử dụng các block 8K

Bước 3: Thực hiện dump block để kiểm tra thông tin.

SQL> alter session set tracefile_identifier =’TEST_BLOCKDUMP_WITHHUY’;
Session altered.

SQL> alter system dump datafile 7 block 302443;
System altered.

— Kiểm tra thông tin đường dẫn Dump file

SQL> select value from v$diag_info where name=’Diag Trace’;

VALUE
——————————————————————————————————————————————————
/u01/app/oracle/diag/rdbms/lab/lab/trace

Bước 4: Đọc thông tin đã dump đươc

[oracle@lab-oracle ~]$ cd /u01/app/oracle/diag/rdbms/lab/lab/trace
[oracle@lab-oracle trace]$ ls |grep TEST_BLOCKDUMP_WITHHUY.trc
lab_ora_3424_TEST_BLOCKDUMP_WITHHUY.trc
-> Đây là file trace chứa thông tin.

Full nội dung dump file bạn có thể xem ở cuối bài, tại đây tôi sẽ nếu 1 số thông tin mà các bạn dễ tiếp cận nhất khi đọc.

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.000.00001b73 0x00000000.0000.00 C— 0 scn 0x00000000006d9571
-> Trong đây:
Xid: Là Transaction ID
Uba: Undo Byte Address
Flag: C -> Đã Commit
Lck: Số lượng row đang bị block -> Ở đây đang không có Row bị block
SCN: Số SCN của hệ thống (System Change Number)

Ngoài ra bạn cũng có thể thấy được nội dung trong Block này.
7F7EF6855FE0 2C000000 C1020200 65570803 6D6D6F63 […,……Wecomm] 7F7EF6855FF0 002C7469 02C10202 79754803 957E0601 [it,……Huy..~.]

Tại đây một số câu hỏi gợi mở để mọi người tự nghiên cứu:
1. Ta có thể thấy được trực tiếp dữ liệu trong các block -> Có phương án nào mã hóa dữ liệu trong các data file không ?

Thông tin chi tiết của DUMP FILE

[oracle@lab-oracle trace]$ more lab_ora_3424_TEST_BLOCKDUMP_WITHHUY.trc
Trace file /u01/app/oracle/diag/rdbms/lab/lab/trace/lab_ora_3424_TEST_BLOCKDUMP_
WITHHUY.trc
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 – 64bit Production
Build label: RDBMS_12.2.0.1.0_LINUX.X64_170125
ORACLE_HOME: /u01/app/oracle/product/11.2.0/dbhome_1
System name: Linux
Node name: lab-oracle
Release: 4.1.12-37.4.1.el6uek.x86_64
Version: #2 SMP Tue May 17 07:23:38 PDT 2016
Machine: x86_64
Instance name: lab
Redo thread mounted by this instance: 1
Oracle process number: 33
Unix process pid: 3424, image: oracle@lab-oracle (TNS V1-V3)

*** 2020-04-04T08:34:35.789853+07:00
*** SESSION ID:(32.16981) 2020-04-04T08:34:35.789912+07:00
*** CLIENT ID:() 2020-04-04T08:34:35.789945+07:00
*** SERVICE NAME:(SYS$USERS) 2020-04-04T08:34:35.789976+07:00
*** MODULE NAME:(sqlplus@lab-oracle (TNS V1-V3)) 2020-04-04T08:34:35.790008+07:0
0
*** ACTION NAME:() 2020-04-04T08:34:35.790052+07:00
*** CLIENT DRIVER:(SQL*PLUS) 2020-04-04T08:34:35.790091+07:00

04/04/2020 08:14:47 04/04/2020 08:14:48
Start dump data blocks tsn: 4 file#:7 minblk 302443 maxblk 302443
Block dump from cache:
Dump of buffer cache at level 4 for pdb=0 tsn=4 rdba=29662571
BH (0x6aff57f8) file#: 7 rdba: 0x01c49d6b (7/302443) class: 1 ba: 0x6af3c000
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 0,0
dbwrid: 0 obj: 75121 objn: 75120 tsn: [0/4] afn: 7 hint: f
hash: [0x64643090,0x64643090] lru: [0x6a7faf78,0x6a7fab58] ckptq: [NULL] fileq: [NULL] objq: [0x6afdeb40,0x749f76c8] objaq: [0x6afde890,0x749f76b8] st: XCURRENT md: NULL fpin: ‘kdswh11: kdst_fetch’ fscn: 0x6d957e tch: 1
flags: only_sequential_access block_written_once
LRBA: [0x0.0.0] LSCN: [0x0] HSCN: [0x6d957e] HSUB: [1] Printing buffer operation history (latest change first):
cnt: 2
01. sid:02 L192:kcbbic2:bic:FBD 02. sid:02 L191:kcbbic2:bic:FBW
03. sid:02 L602:bic1_int:bis:FWC 04. sid:02 L822:bic1_int:ent:rtn
05. sid:02 L832:oswmqbg1:clr:WRT 06. sid:02 L930:kubc:sw:mq
07. sid:02 L913:bxsv:sw:objq 08. sid:02 L608:bxsv:bis:FBW
09. sid:02 L607:bxsv:bis:FFW 10. sid:14 L464:chg1_mn:bic:FMS
11. sid:14 L614:chg1_mn:bis:FBD 12. sid:14 L922:klbc:sw:cq
13. sid:14 L778:chg1_mn:bis:FMS 14. sid:14 L327:chg1:set:MEXCL
15. sid:14 L145:zib:mk:EXCL 16. sid:14 L122:zgb:set:st
Block dump from disk:
buffer tsn: 4 rdba: 0x01c49d6b (7/302443)
scn: 0x6d957e seq: 0x01 flg: 0x04 tail: 0x957e0601
frmt: 0x02 chkval: 0xba61 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F7EF6854000 to 0x00007F7EF6856000
7F7EF6854000 0000A206 01C49D6B 006D957E 04010000 [….k…~.m…..] 7F7EF6854010 0000BA61 00000001 00012571 006D957E [a…….q%..~.m.] 7F7EF6854020 00008000 00320003 01C49D68 00000002 [……2.h…….] 7F7EF6854030 00001B73 00000000 00000000 00008000 [s……………] 7F7EF6854040 006D9571 00000000 00000000 00000000 [q.m………….] 7F7EF6854050 00000000 00000000 00000000 00000000 […………….] Repeat 1 times
7F7EF6854070 00000000 00000000 00000000 00020100 […………….] 7F7EF6854080 0016FFFF 1F511F67 00001F51 1F760002 [….g.Q.Q…..v.] 7F7EF6854090 00001F67 00000000 00000000 00000000 [g……………] 7F7EF68540A0 00000000 00000000 00000000 00000000 […………….] Repeat 499 times
7F7EF6855FE0 2C000000 C1020200 65570803 6D6D6F63 […,……Wecomm] 7F7EF6855FF0 002C7469 02C10202 79754803 957E0601 [it,……Huy..~.] Block header dump: 0x01c49d6b
Object id on Block? Y
seg/obj: 0x12571 csc: 0x00000000006d957e itc: 3 flg: E typ: 1 – DATA
brn: 0 bdba: 0x1c49d68 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.000.00001b73 0x00000000.0000.00 C— 0 scn 0x00000000006d9571
0x02 0x0000.000.00000000 0x00000000.0000.00 —- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 —- 0 fsc 0x0000.00000000
bdba: 0x01c49d6b
data_block_dump,data header at 0x7f7ef685407c
===============
tsiz: 0x1f80
hsiz: 0x16
pbl: 0x7f7ef685407c
76543210
flag=——–
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f67
avsp=0x1f51
tosp=0x1f51
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1f76
0x14:pri[1] offs=0x1f67
block_row_dump:
tab 0, row 0, @0x1f76
tl: 10 fb: –H-FL– lb: 0x0 cc: 2
col 0: [ 2] c1 02
col 1: [ 3] 48 75 79
tab 0, row 1, @0x1f67
tl: 15 fb: –H-FL– lb: 0x0 cc: 2
col 0: [ 2] c1 03
col 1: [ 8] 57 65 63 6f 6d 6d 69 74
end_of_block_dump
End dump data blocks tsn: 4 file#: 7 minblk 302443 maxblk 302443


Trong bài viết sau,  mình sẽ demo để chứng minh data block lưu trữ cả các thông tin chưa COMMIT nhé. Mời các bạn đón xem!

Cách thức trở thành một Oracle DBA

Leave a Reply

avatar
  Subscribe  
Notify of

Địa chỉ: Tầng 6, tòa nhà Việt Á, Số 9 Phố Duy Tân, Dịch Vọng Hậu, Cầu Giấy, Hà Nội