10.1 Các cấu trúc l−u trữ chính của Oracle
• Cấu trúc l−u trữ
Ch−ơng tr−ớc đã trình bày cấu trúc l−u trữ trong Oracle. Cấu trúc l−u trữ bao gồm hai mức physical và logic. ở mức logic, database bao gồm nhiều tablespaces. Mỗi tablespace lại tiếp tục đ−ợc chia thành nhiều segments. Phần này sẽ giới thiệu chủ yếu về các segments.
• Thông tin về cấu trúc l−u trữ
Thông tin về cấu trúc l−u trữ đ−ợc l−u giữ trong từ điển dữ liệu. Ta có thể dùng câu lệnh SQL để lấy đ−ợc các thông tin này. Các thông tin này có thể lấy đ−ợc từ các view: DBA_TABLESPACES, DBA_SEGMENTS, DBA_DATà_FILES, DBA_EXTENTS, DBA_FREE_SPACE.
Ví dụ:
• Xem số l−ợng extents và blocks cấp phát cho một segment
SQL> SELECT segment_name,tablespace_name,extents,blocks 2 FROM dba_segments
3 WHERE owner=’SCOTT’;
SEGMENT_NAME TABLESPACE_NAME EXTENTS BLOCKS
--- --- --- --- EMP DATA01 5 55 DEPT DATA01 1 5 BONUS DATA01 1 5 SALGRADE DATA01 1 5 5 rows selected.
ALTER DATABASE
RENAME FILE ’/DISK1/system_01.dbf’ TO ’/DISK2/system_01.dbf’;
Cách làm:
- Tắt database
- Di chuyển file dữ liệu t−ơng ứng bằng hệ điều hành
- Mount lại với hệ điều hành
- Thực hiện câu lệnh ở trên
- Mở lại database
• Các thông tin từ điển dữ liệu
Để có thể có các thông tin cần thiết ta có thể tham khảo một số view sau:
• Thông tin về tablespace: DBA_TABLESPACES, V$TABLESPACE
• Thông tin về data files: DBA_DATA_FILES, V$DATAFILE
• Thông tin về các file trung gian: DATA_TEMP_FILES, V$TEMPFILE
10 Cấu trúc l−u trữ
10.1 Các cấu trúc l−u trữ chính của Oracle
• Cấu trúc l−u trữ
Ch−ơng tr−ớc đã trình bày cấu trúc l−u trữ trong Oracle. Cấu trúc l−u trữ bao gồm hai mức physical và logic. ở mức logic, database bao gồm nhiều tablespaces. Mỗi tablespace lại tiếp tục đ−ợc chia thành nhiều segments. Phần này sẽ giới thiệu chủ yếu về các segments.
• Thông tin về cấu trúc l−u trữ
Thông tin về cấu trúc l−u trữ đ−ợc l−u giữ trong từ điển dữ liệu. Ta có thể dùng câu lệnh SQL để lấy đ−ợc các thông tin này. Các thông tin này có thể lấy đ−ợc từ các view: DBA_TABLESPACES, DBA_SEGMENTS, DBA_DATà_FILES, DBA_EXTENTS, DBA_FREE_SPACE.
Ví dụ:
• Xem số l−ợng extents và blocks cấp phát cho một segment
SQL> SELECT segment_name,tablespace_name,extents,blocks 2 FROM dba_segments
3 WHERE owner=’SCOTT’;
SEGMENT_NAME TABLESPACE_NAME EXTENTS BLOCKS
--- --- --- --- EMP DATA01 5 55 DEPT DATA01 1 5 BONUS DATA01 1 5 SALGRADE DATA01 1 5 5 rows selected.
• Xem thông tin về các extents trong một segment
SQL> SELECT extent_id,file_id,block_id,blocks 2 FROM dba_extents
3 WHERE owner=’SCOTT’ 4 AND segment_name=’EMP’;
EXTENT_ID FILE_ID BLOCK_ID BLOCKS --- --- --- --- 0 4 2 5 1 4 27 5 2 4 32 10 3 4 42 15 4 4 57 20 5 rows selected.
SQL> SELECT tablespace_name, count(*), 2 max(blocks), sum(blocks)
3 FROM dba_free_space
4 GROUP BY tablespace_name;
TABLESPACE_NAME COUNT(*) MAX(BLOCKS SUM(BLOCKS
--- --- --- --- DATA01 2 1284 1533 RBS 3 2329 2419 SORT 1 1023 1023 SYSTEM 1 5626 5626 TEMP 1 2431 2431 5 rows selected.
10.2 Segments - phân loại segments
• Segments (phân đoạn)
Là vùng không gian l−u trữ các đối t−ợng trong CSDL. Segments sử dụng vùng không gian trong các data files để l−u giữ đối t−ợng. Segments có thể phân ra làm nhiều kiểu khác nhau.
• Table segment
Table là nơi l−u giữ dữ liệu của database. Một table có thể đ−ợc chia thành các table segment. Trong mỗi table segment, dữ liệu đ−ợc tập hợp lại nh−ng vẫn tách biệt nhau. Các dữ liệu trong một table segment đ−ợc l−u trên cùng một tablespace.
• Index segment
Index đ−ợc l−u giữ trong index segment. Mỗi một index ứng với một index segment. Mục đích sử dụng segment này là để tìm (lookup) vị trí dòng dữ liệu trong bảng dựa trên một tr−ờng khoá.
• Rollback segment
Rollback segment đ−ợc sử dụng bởi các giao dịch có làm thay đổi database. Tr−ớc khi thay đổi dữ liệu hay index blocks, các giá trị cũ sẽ đ−ợc l−u vào các rollback segment. Phục vụ cho việc undo dữ liệu.
Trong một vài thao tác (ví dụ: CREATE INDEX, SELECT DISTINCT, SELECT GROUP BY, …) Oracle Server thực hiện việc sắp xếp dữ liệu. Việc sắp xếp cần có khoảng không gian dùng làm trung gian, temporary segment đ−ợc sử dụng làm vùng trung gian đó.
• LOB segment
Trong một vài tr−ờng hợp, một cột của Table có thể dùng để chứa các đối t−ợng lớn (large objects - LOBs) ví dụ: đoạn văn bản text, hình ảnh, video, …Oracle Server l−u giữ các dữ liệu này trên một segment riêng biệt gọi là LOB segment.
• LOB index
Khi một LOB segment đ−ợc tạo, theo ngầm định, Oracle Server cũng sẽ tạo t−ơng ứng một LOB index. LOB index đ−ợc sử dụng để có thể dễ dàng tìm đ−ợc dữ liệu trên LOB segment.
• Bootstrap segment
Bootstrap segment có chức năng nh− một cache segment. Nó đ−ợc tạo khi database đ−ợc tạo lập, giúp ích cho việc khởi tạo từ điển dữ liệu khi database đ−ợc mở bởi instance.
10.3 Quản lý bộ nhớ đối với segment
• Cấp phát và thu hồi vùng trống
Các vùng trống đ−ợc cấp phát khi segment đ−ợc tạo mới (created), mở rộng (extended), thay đổi (altered). Ng−ợc lại, segment sẽ bị thu hồi vùng trống khi nó bị huỷ (drop), thay đổi (altered), cắt bớt (truncated), hay tự động thay đổi kích th−ớc.
ở mức vật lý, các segment là các phần thuộc data file. Trong một data file, block đâu tiên là header block. Dữ liệu có thể ghi vào data file bắt đầu từ block thứ 2 trở đi tạo nên các vùng sử dụng (used extents) và vùng rỗi (free extents).
• Blocks
Một block gồm có ba phần chính:
• Vùng header: chứa các thông tin data block address, table directory, row directory, và các transaction slots (vùng l−u giữ thông tin về các transactions làm thay đổi dữ liệu trong block) khi các transaction thay đổi các dòng dữ liệu trong block. Vùng header đ−ợc mở rộng từ trên xuống.
• Vùng dữ liệu: chứa các dòng dữ liệu. Dữ liệu đ−ợc nạp vào block theo chiều từ d−ới lên.
• Vùng trống: nằm ở giữa của block.
Đối với một block, ta cần quan tâm tới một vài thông số chính sau:
• INITRANS: số l−ợng transaction slots trong block lúc khởi tạo. Mặc định là 1 đối với data segment, là 2 đối với index segment.
• MAXTRANS: số l−ợng transaction slots tối đa trong block. Mặc định là 255.
• PCTFREE: phần trăm dung l−ợng dự trữ trong block để có thể đáp ứng đ−ợc sự tăng tr−ởng dữ liệu trong block (thay đổi các dữ liệu dẫn đến thay đổi kích th−ớc của dữ liệu). Mặc định là 10%.
• PCTUESD: phần trăm dung l−ợng tối thiểu trong block mà d−ới mức này thì có thể insert dòng dữ liệu vào trong block đó. Mặc định là 40%.
Ví dụ: PCTFREE = 20% và PCTUESD = 40%, ta xem xét 4 tr−ờng hợp sau.
• Các dòng dữ liệu vẫn có thể insert vào trong block cho tới khi phần trăm dung l−ợng rỗi nhỏ hơn hay bằng 20%
• V−ợt quá số l−ợng này, block đó sẽ không thể insert thêm đ−ợc dữ liệu. Tuy nhiên vẫn có thể updata dữ liệu và việc updata dữ liệu này vẫn có thể làm cho dung l−ợng sử dụng của block tăng lên.
• Sau khi PCTUSED của block lớn hơn 80%, dữ liệu trong block có thể đ−ợc update và làm cho PCTUSED < 80%. Tuy nhiên, lúc này vẫn không thể insert thêm dòng dữ liệu vào block đó.
• Trong tr−ờng hợp dữ liệu trong block tiếp tục đ−ợc cập nhật và làm cho PCTUSED tiếp tục giảm xuống d−ới 40%. Lúc này block lại có thể insert đ−ợc dữ liệu vào.
• Phân đoạn dữ liệu trong các segments
Khi segment đ−ợc tạo, nó đ−ợc cấp phát không gian trong tablespace. Khi segment giải phóng, nó sẽ trả lại vùng trống cho tablespace. Cứ nh− vậy, sau một thời gian sẽ xảy ra hiện t−ợng phân đoạn trong các data file của tablespace.
D−ới đây là phân loại mức độ phân đoạn dữ liệu trong database:
Tablespace Usage Fragmentation
SYSTEM Data dictionary Zero
TOOLS Applications Very low
DATA n Data segments Low
INDEX n Index segments Low
RBS n Rollback segments High
TEMP n Temporary segments Very high*