ORACLE空間管理實驗2:區的管理與分配
內容基於LMT管理的表空間,字典管理已經不用了。
系統分配和UNIFORM固定大小-->見實驗
2.驗證Oracle找尋可用區的方式:
從資料檔案開頭的點陣圖塊中獲得可用區的資訊,DUMP時可見FIRST:3這種,表示已經使用3個區。詳見:點選開啟連結
3.在表空間中建第一個表(注意,第一個),這個表從資料檔案的第幾個塊開始使用
11G下,LMT管理的表空間,資料檔案中0-127號塊做點陣圖區域用,第128個塊才開始存放表的資料。詳見:
4.最小的表-最小的區多大?
5個BLOCK,如果BLOCK大小是8K,則最小的表是40K。--見下面實驗
5.表空間中多個資料檔案如何分配空間?
多個資料檔案上平均分配--見下面實驗
#####################################################################
在段的前1M空間:區大小8個塊=64K,前16個區是這樣。
在段1M---64M之間:區大小1M,128個塊
在段64M之後,區大小8M。
可以在系統管理區的表空間內建立表,然後手動分配1個extent,然後依次擴充套件960K空間,1M空間,62M空間,然後再擴充套件一個extent的方式來測試。alter table a1 allocate extent (SIZE 1m);
統一區大小則由建立表空間時uniform size 40k;子句指定.
可以先建立兩個不同管理方式的表空間,再分別在此兩個表空間建立兩個表,手動擴充套件區,再通過dba_segments來檢視。
BYS@ bys3>select tablespace_name,block_size,INITIAL_EXTENT,next_extent,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where tablespace_name like 'TEST_';
TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT EXTENT_MAN ALLOCATIO SEGMEN
--------------- ---------- -------------- ----------- ---------- --------- ------
TEST1 8192 65536 LOCAL SYSTEM AUTO
TEST2 8192 40960 40960 LOCAL UNIFORM AUTO
TEST3 8192 65536 LOCAL SYSTEM AUTO
BYS@ bys3>select * from cat;
TABLE_NAME TABLE_TYPE
------------------------------ -----------
DEPT TABLE
BYS@ bys3>create table test1(aa int) tablespace test1;
Table created.
BYS@ bys3>create table test2(aa int) tablespace test2;
Table created.
BYS@ bys3>insert into test1 values(789);
BYS@ bys3>insert into test2 values(789);
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 65536 8 1 65536 1048576
TEST2 TEST2 40960 5 1 40960 40960
BYS@ bys3>alter table test1 allocate extent;
Table altered.
BYS@ bys3>alter table test2 allocate extent;
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 131072 16 2 65536 1048576
TEST2 TEST2 81920 10 2 40960 40960
BYS@ bys3>alter table test2 allocate extent (size 2m); --2M,系統自動擴充套件區,此時一個區大小是1M,所以此語句擴充套件兩個區,此時4個區
Table altered.
BYS@ bys3>alter table test1 allocate extent (size 2m);-UNIFORM SIZE 40K,2048/40=51.2,分配51個區--四捨五入。此時是54個區。
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 2228224 272 4 65536 1048576
TEST2 TEST2 2170880 265 53 40960 40960
BYS@ bys3>alter table test2 allocate extent (size 110k); --這裡的分配區間好像用的四捨五入,比如這裡的110k/40K=2.75,分配了三個區
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 2228224 272 4 65536 1048576
TEST2 TEST2 2293760 280 56 40960 40960
而一個普通堆表是一個段,一個段最少包含一個區,一個區最少包含5個塊,所以當表空間block是8K時,表至少40K。
實驗如下:
BYS@ bys3>create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 32k;
create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 32k
*
ERROR at line 1:
ORA-03249: Uniform size for auto segment space managed tablespace should have atleast 5 blocks
這一句報錯資訊可以看到,一個區需要至少5個資料塊。
BYS@ bys3>create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 40k;
Tablespace created.
BYS@ bys3>create table test16(bb int) tablespace test2 storage (initial 1k maxextents 1);
Table created.
BYS@ bys3>insert into test16 values(999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.SEGMENT_NAME,a.bytes/1024 segment_byte,a.TABLESPACE_NAME,b.INITIAL_EXTENT,b.BLOCK_SIZE,b.ALLOCATION_TYPE from dba_segments a,dba_tablespaces b where a.owner='BYS' and a.segment_name like 'TEST1_' and a.tablespace_name=b.tablespace_name;
SEGMENT_NA SEGMENT_BYTE TABLESPACE_NAME INITIAL_EXTENT BLOCK_SIZE ALLOCATIO
---------- ------------ ------------------------------ -------------- ---------- ---------
TEST15 64 USERS 65536 8192 SYSTEM
TEST16 40 TEST2 40960 8192 UNIFORM
####################################################################
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST2';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
------------------------------ ---------- ---------------------------------------- ------------
TEST2 7 /u01/oradata/bys3/test2.dbf 9.8828125
TEST2 8 /u01/oradata/bys3/test2_2.dbf 9.921875
TEST2 9 /u01/oradata/bys3/test2_3.dbf 9.921875
TEST2 10 /u01/oradata/bys3/test2_4.dbf 9.921875
BYS@ bys3>drop table test16 purge;
Table dropped.
BYS@ bys3>drop table test17 purge;
Table dropped.
BYS@ bys3>create table test17(aa int) tablespace test2 storage (initial 20m);
Table created.
BYS@ bys3>insert into test17 values(888);
1 row created.
BYS@ bys3>commit;
Commit complete.
col file_name for a30
col tablespace_name for a15
select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST2';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
------------------------------ ---------- ---------------------------------------- ------------
TEST2 7 /u01/oradata/bys3/test2.dbf 4.921875
TEST2 8 /u01/oradata/bys3/test2_2.dbf 4.921875
TEST2 9 /u01/oradata/bys3/test2_3.dbf 4.921875
TEST2 10 /u01/oradata/bys3/test2_4.dbf 4.921875
一直到兩個9M的資料檔案空間用完,再分配時,則從剩餘的一個資料檔案中分配。見實驗:
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 11 /u01/oradata/bys3/test3_1.dbf 9
TEST3 12 /u01/oradata/bys3/test3_2.dbf 19
TEST3 13 /u01/oradata/bys3/test3_3.dbf 9
BYS@ bys3>insert into test1 values(789999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 11 /u01/oradata/bys3/test3_1.dbf 1
TEST3 12 /u01/oradata/bys3/test3_2.dbf 11
TEST3 13 /u01/oradata/bys3/test3_3.dbf 1
BYS@ bys3>create table test2(aa int) tablespace test3 storage (initial 5m);
Table created.
BYS@ bys3>insert into test2 values(789999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 12 /u01/oradata/bys3/test3_2.dbf 8
本篇主要驗證了這些問題:
1.LMT管理的表空間,區的分配有兩種方法:系統分配和UNIFORM固定大小-->見實驗
2.驗證Oracle找尋可用區的方式:
從資料檔案開頭的點陣圖塊中獲得可用區的資訊,DUMP時可見FIRST:3這種,表示已經使用3個區。詳見:點選開啟連結
3.在表空間中建第一個表(注意,第一個),這個表從資料檔案的第幾個塊開始使用
11G下,LMT管理的表空間,資料檔案中0-127號塊做點陣圖區域用,第128個塊才開始存放表的資料。詳見:
4.最小的表-最小的區多大?
5個BLOCK,如果BLOCK大小是8K,則最小的表是40K。--見下面實驗
5.表空間中多個資料檔案如何分配空間?
多個資料檔案上平均分配--見下面實驗
#####################################################################
實驗一:系統管理區大小和統一區大小的區別是什麼,如何驗證這個區別?
系統管理區大小由系統自動分配擴充套件的區大小,在段的前1M空間:區大小8個塊=64K,前16個區是這樣。
在段1M---64M之間:區大小1M,128個塊
在段64M之後,區大小8M。
可以在系統管理區的表空間內建立表,然後手動分配1個extent,然後依次擴充套件960K空間,1M空間,62M空間,然後再擴充套件一個extent的方式來測試。alter table a1 allocate extent (SIZE 1m);
統一區大小則由建立表空間時uniform size 40k;子句指定.
可以先建立兩個不同管理方式的表空間,再分別在此兩個表空間建立兩個表,手動擴充套件區,再通過dba_segments來檢視。
BYS@ bys3>select tablespace_name,block_size,INITIAL_EXTENT,next_extent,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where tablespace_name like 'TEST_';
TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT EXTENT_MAN ALLOCATIO SEGMEN
--------------- ---------- -------------- ----------- ---------- --------- ------
TEST1 8192 65536 LOCAL SYSTEM AUTO
TEST2 8192 40960 40960 LOCAL UNIFORM AUTO
TEST3 8192 65536 LOCAL SYSTEM AUTO
BYS@ bys3>select * from cat;
TABLE_NAME TABLE_TYPE
------------------------------ -----------
DEPT TABLE
BYS@ bys3>create table test1(aa int) tablespace test1;
Table created.
BYS@ bys3>create table test2(aa int) tablespace test2;
Table created.
BYS@ bys3>insert into test1 values(789);
BYS@ bys3>insert into test2 values(789);
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 65536 8 1 65536 1048576
TEST2 TEST2 40960 5 1 40960 40960
BYS@ bys3>alter table test1 allocate extent;
Table altered.
BYS@ bys3>alter table test2 allocate extent;
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 131072 16 2 65536 1048576
TEST2 TEST2 81920 10 2 40960 40960
BYS@ bys3>alter table test2 allocate extent (size 2m); --2M,系統自動擴充套件區,此時一個區大小是1M,所以此語句擴充套件兩個區,此時4個區
Table altered.
BYS@ bys3>alter table test1 allocate extent (size 2m);-UNIFORM SIZE 40K,2048/40=51.2,分配51個區--四捨五入。此時是54個區。
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 2228224 272 4 65536 1048576
TEST2 TEST2 2170880 265 53 40960 40960
BYS@ bys3>alter table test2 allocate extent (size 110k); --這裡的分配區間好像用的四捨五入,比如這裡的110k/40K=2.75,分配了三個區
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 2228224 272 4 65536 1048576
TEST2 TEST2 2293760 280 56 40960 40960
實驗二:一個表至少多大?
在ASSM下,一個區最少5個塊。而一個普通堆表是一個段,一個段最少包含一個區,一個區最少包含5個塊,所以當表空間block是8K時,表至少40K。
實驗如下:
BYS@ bys3>create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 32k;
create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 32k
*
ERROR at line 1:
ORA-03249: Uniform size for auto segment space managed tablespace should have atleast 5 blocks
這一句報錯資訊可以看到,一個區需要至少5個資料塊。
BYS@ bys3>create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 40k;
Tablespace created.
BYS@ bys3>create table test16(bb int) tablespace test2 storage (initial 1k maxextents 1);
Table created.
BYS@ bys3>insert into test16 values(999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.SEGMENT_NAME,a.bytes/1024 segment_byte,a.TABLESPACE_NAME,b.INITIAL_EXTENT,b.BLOCK_SIZE,b.ALLOCATION_TYPE from dba_segments a,dba_tablespaces b where a.owner='BYS' and a.segment_name like 'TEST1_' and a.tablespace_name=b.tablespace_name;
SEGMENT_NA SEGMENT_BYTE TABLESPACE_NAME INITIAL_EXTENT BLOCK_SIZE ALLOCATIO
---------- ------------ ------------------------------ -------------- ---------- ---------
TEST15 64 USERS 65536 8192 SYSTEM
TEST16 40 TEST2 40960 8192 UNIFORM
####################################################################
實驗三:一個表空間有10個資料檔案,在此表空間中建立一個大小100M的表,表的空間將如何分配到10個資料檔案
將會平均分配到10個資料檔案中。下面我建一個表空間包含四個資料檔案,建一個表,初始化大小為20M,將平均分配到這4個資料檔案中。BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST2';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
------------------------------ ---------- ---------------------------------------- ------------
TEST2 7 /u01/oradata/bys3/test2.dbf 9.8828125
TEST2 8 /u01/oradata/bys3/test2_2.dbf 9.921875
TEST2 9 /u01/oradata/bys3/test2_3.dbf 9.921875
TEST2 10 /u01/oradata/bys3/test2_4.dbf 9.921875
BYS@ bys3>drop table test16 purge;
Table dropped.
BYS@ bys3>drop table test17 purge;
Table dropped.
BYS@ bys3>create table test17(aa int) tablespace test2 storage (initial 20m);
Table created.
BYS@ bys3>insert into test17 values(888);
1 row created.
BYS@ bys3>commit;
Commit complete.
col file_name for a30
col tablespace_name for a15
select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST2';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
------------------------------ ---------- ---------------------------------------- ------------
TEST2 7 /u01/oradata/bys3/test2.dbf 4.921875
TEST2 8 /u01/oradata/bys3/test2_2.dbf 4.921875
TEST2 9 /u01/oradata/bys3/test2_3.dbf 4.921875
TEST2 10 /u01/oradata/bys3/test2_4.dbf 4.921875
實驗四:一個包含多個大小不一資料檔案的表空間,各個資料檔案的剩餘空間一樣多嗎?為什麼
實驗使用中應該保持資料檔案大小一致。如表空間有三個資料檔案,大小分別是9M,19M,9M,在分配3M的空間時,會在每個資料檔案中各分配1M。一直到兩個9M的資料檔案空間用完,再分配時,則從剩餘的一個資料檔案中分配。見實驗:
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 11 /u01/oradata/bys3/test3_1.dbf 9
TEST3 12 /u01/oradata/bys3/test3_2.dbf 19
TEST3 13 /u01/oradata/bys3/test3_3.dbf 9
BYS@ bys3>insert into test1 values(789999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 11 /u01/oradata/bys3/test3_1.dbf 1
TEST3 12 /u01/oradata/bys3/test3_2.dbf 11
TEST3 13 /u01/oradata/bys3/test3_3.dbf 1
BYS@ bys3>create table test2(aa int) tablespace test3 storage (initial 5m);
Table created.
BYS@ bys3>insert into test2 values(789999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 12 /u01/oradata/bys3/test3_2.dbf 8
相關文章
- ORACLE空間管理實驗3:區管理之大區小區對I/O效能的影響Oracle
- Oracle 本地表空間管理與字典表空間管理Oracle
- Oracle 表空間的管理Oracle
- Oracle的表空間管理Oracle
- Oracle表空間管理Oracle
- Oracle 表空間管理Oracle
- ORACLE空間管理實驗1:探索LMT表空間管理下資料檔案頭的結構及點陣圖中區的記錄方式Oracle
- oracle本地管理的表空間Oracle
- ORACLE空間管理實驗4:塊管理之ASSM三級點陣圖結構OracleSSM
- ORACLE空間管理實驗7:塊管理之MMSM--為什麼SYSTEM/UNDO/TEMP是MMSM管理?Oracle
- Oracle undo 表空間管理Oracle
- oracle undo表空間管理Oracle
- oracle 表空間的管理方式Oracle
- ORACLE空間管理實驗5:塊管理之ASSM下高水位的影響--刪除和查詢OracleSSM
- Oracle OCP(49):表空間管理Oracle
- oracle表空間日常操作管理Oracle
- 淺說Oracle PGA空間管理Oracle
- oracle表空間管理維護Oracle
- oracle 段空間管理問題Oracle
- ORACLE空間管理實驗8:資料塊格式分析--DUMP結合BBEDOracle
- local管理的表空間下autoallocate方式extent的分配原則
- 2 Day DBA-管理Oracle例項-修改表空間-刪除表空間Oracle
- Oracle的UNDO表空間管理總結Oracle
- Oracle資料庫的空間管理技巧Oracle資料庫
- 2 Day DBA-管理Oracle例項-修改表空間-使表空間離線Oracle
- 軟體過程與管理實驗2
- Oracle 自動段空間管理(ASSM)OracleSSM
- Oracle資料庫管理 版主空間Oracle資料庫
- 函式呼叫與空間分配函式
- Oracle表空間的管理方式(LMT、DMT)--本地和字典管理Oracle
- Oracle的表空間的儲存管理與最佳化技術Oracle
- 【Oracle 恢復表空間】 實驗Oracle
- oracle表空間管理(簡單記錄)Oracle
- oracle 資料檔案表空間管理Oracle
- Go的棧空間管理Go
- 監控和管理Oracle UNDO表空間的使用Oracle
- 將字典管理表空間轉換為本地管理表空間
- 2 Day DBA-管理Oracle例項-練習:修改表空間空間使用預警闕值Oracle