HWM&&碎片整理之move操作

針對ASSM segment管理方式的HWM的降法:impdp/expdp,exp/imp,ctas,insert into,move,shrink,在線重定義等方法;
前面已經討論過在線重定義,impdp/expdp的用法,這裏不作討論,至於ctas,不作討論;
前面,已經用tom大師的工具來做hwm的判定了;
這裏主要說明move用法
move操作:
SQL> create table hwm as select * from dba_objects where 0=1;
Table created.

SQL> begin
  2  for i in 1..10 loop
  3  insert into hwm select * from dba_objects order by i;
  4  commit;
  5  end loop;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> EXEC SHOW_SPACE('HWM','T','AUTO','Y',NULL,'TRSEN');
Total Blocks............................11264======>hwm=11264
Total Bytes.............................92274688
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................4
Last Used Ext BlockId...................64640
Last Used Block.........................1024
################################
The segment is analyzed
0% -- 25% free space_blocks.............0
0% -- 25% free space_bytes..............0
25% -- 50% free space_blocks............0
25% -- 50% free space_bytes.............0
50% -- 75% free space_blocks............0
50% -- 75% free space_bytes.............0
75% -- 100% free space_blocks...........187
75% -- 100% free space_bytes............1531904
full_blocks.............................10674
full_bytes.............................87441408
Unused Blocks...........................256
Unused Bytes............................2097152
Total Blocks............................10674
Total bytes.............................87441408

PL/SQL procedure successfully completed.

SQL> select count(1) from hwm;
  COUNT(1)
----------
    753000

SQL> delete hwm where rownum<=50000;
50000 rows deleted.

SQL> commit;
Commit complete.

SQL> select count(1) from hwm;
  COUNT(1)
----------
    703000
    

SQL> EXEC SHOW_SPACE('HWM','T','AUTO','Y',NULL,'TRSEN');
Total Blocks............................11264==>HWM沒有變化
Total Bytes.............................92274688
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................4
Last Used Ext BlockId...................64640
Last Used Block.........................1024
################################
The segment is analyzed
0% -- 25% free space_blocks.............0
0% -- 25% free space_bytes..............0
25% -- 50% free space_blocks............0
25% -- 50% free space_bytes.............0
50% -- 75% free space_blocks............0
50% -- 75% free space_bytes.............0
75% -- 100% free space_blocks...........894
75% -- 100% free space_bytes............7323648
full_blocks.............................9967
full_bytes.............................81649664
Unused Blocks...........................256
Unused Bytes............................2097152
Total Blocks............................9967
Total bytes.............................81649664

PL/SQL procedure successfully completed.


==>move HWM表,後再看HWM
alter table HWM move;

SQL> EXEC SHOW_SPACE('HWM','T','AUTO','Y',NULL,'TRSEN');
Total Blocks............................10240===>HWM=10240-90+1=10150,高水位降了
Total Bytes.............................83886080
Unused Blocks...........................90
Unused Bytes............................737280
Last Used Ext FileId....................4
Last Used Ext BlockId...................74752
Last Used Block.........................934
################################
The segment is analyzed
0% -- 25% free space_blocks.............0
0% -- 25% free space_bytes..............0
25% -- 50% free space_blocks............0
25% -- 50% free space_bytes.............0
50% -- 75% free space_blocks............0
50% -- 75% free space_bytes.............0
75% -- 100% free space_blocks...........0
75% -- 100% free space_bytes............0
full_blocks.............................10007
full_bytes.............................81977344
Unused Blocks...........................0
Unused Bytes............................0
Total Blocks............................10007
Total bytes.............................81977344

PL/SQL procedure successfully completed.

那麼這裏需要問問move到底做了什麼動作呢?
我們通常使用這個命令,將一個table segment從一個tablespace移動到另一個tablespace。
Move實際上是在block之間物理的copy數據,那麼,我們可以通過這種方式來降低table的HWM。
table裏rowid構造,是16進制編碼格式
例如:
AAAS6P AAE AAAQFv AAW
分別
數據對象號
文件號
數據塊號
行號
查看對象號:
SQL> col object_name for a15;
SQL> col owner for a25;
SQL> SELECT od.object_name, od.owner
  2    FROM dba_objects od
  3   WHERE od.DATA_OBJECT_ID =
  4         (SELECT dbms_rowid.rowid_object('AAAS6PAAEAAAQFvAAW') FROM dual) ;
OBJECT_NAME     OWNER
--------------- -------------------------
HWM             TRSEN

一般情況下,object_id=data_object_id,但是如果做過truncate,move等動作更改塊的動作,data_object_id值發生了變化,所以匹配object_id
就定位不到對象,通過data_object_id來處理

查看文件號:
SQL> set linesize 110;
SQL> col file_name for a80;
SQL> col tablespace_name for a15;
SQL> col AUTOEXTENSIBLE for a10
SQL> SELECT ddf.file_name,ddf.tablespace_name,ddf.AUTOEXTENSIBLE
  2    FROM dba_data_files ddf
  3   WHERE ddf.FILE_ID =
  4         (SELECT dbms_rowid.rowid_relative_fno('AAAS6PAAEAAAQFvAAW') FROM dual);
FILE_NAME                                                                        TABLESPACE_NAME AUTOEXTENS
-------------------------------------------------------------------------------- --------------- ----------
/u01/app/oacle/oradata/orcl/users01.dbf                                          USERS           YES

塊號及行號
dbms_rowid.rowid_block_number
dbms_rowid.rowid_row_number

我們現在來看看做了move動作後,數據存放的變化
SQL> create table hwm1 (id int,name char(2000));
Table created.

SQL> insert into hwm1 values(1,'a');
1 row created.

SQL> insert into hwm1 values(1,'aa');
1 row created.

SQL> insert into hwm1 values(3,'df');
1 row created.

SQL> insert into hwm1 values(6,'eeee');
1 row created.

SQL> commit;
Commit complete.

SQL> select rowid from hwm1;
ROWID
------------------
AAAS6RAAEAAAAINAAA
AAAS6RAAEAAAAINAAB
AAAS6RAAEAAAAINAAC
AAAS6RAAEAAAAIOAAA
4條數據分別存放在AAAAIN和AAAAIO兩個塊上

做move動作
alter table HWM1 move;

SQL> select rowid from hwm1;
ROWID
------------------
AAAS6TAAEAAAAILAAA
AAAS6TAAEAAAAILAAB
AAAS6TAAEAAAAILAAC
AAAS6TAAEAAAAIMAAA

4條數據分別存放在AAAAIL一個塊上

move對索引的影響
SQL>  create index idx_hwm1 on hwm1 (id);
Index created

SQL> alter table my_objects move;
Table altered

SQL> select index_name,status from user_indexes where index_name='IDX_HWM1';
INDEX_NAME                     STATUS
------------------------------ --------
IDX_HWM1                   UNUSABLE

該table上的inedx的狀態爲UNUSABLE,這時,我們可以使用alter index IDX_HWM1 rebuild online的命令,對IDX_HWM1進行在線rebuild。


move時對table的鎖定
當我們對錶HWM進行move操作時,查詢v$locked_objects視圖可以發現,在表HWM上加了exclusive lock:
SQL>select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects;
 OBJECT_ID SESSION_ID ORACLE_USERNAME    LOCKED_MODE
---------- ---------- ------------------ -----------
     77455          11 DLINGER                      6
     
SQL> select object_id from user_objects where object_name = 'HWM';
 OBJECT_ID
----------
     77455

對table進行move操作時,我們只能對它進行select的操作;
反過來說,當我們的一個session對table進行DML操作且沒有commit時,在另一個session中是不能對這個table進行move操作的,
否則oracle會返回這樣的錯誤信息:ORA-00054: 資源正忙,要求指定 NOWAIT。

SQL> alter table hwm1 move;
alter table hwm1 move
            *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

使用alter table move來降低table的HWM時,有一點是需要注意的,這時,當前的tablespace中需要有1倍於table的空閒空間以供使

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章