通過move tablespace來完成resize datafile
HWM的概念就不在此闡述了
測試環境為Oracle
g for Linux
其它版本的一樣
我們先創建兩個表空間
分別為t_tbs和t_tbs
分別有一個數據文件
大小都是
M
再創建一個test_user用戶
給這個用戶上述兩個表空間的無限限額
並且設置默認表空間是t_tbs
[zhangleyi@as zhangleyi]$ sqlplus / as sysdba
SQL*Plus: Release
Production on Tue Apr
:
:
Copyright (c)
Oracle
All rights reserved
Connected to:
Oracle Database
g Enterprise Edition Release
Production
With the Partitioning
OLAP and Data Mining options
SYS at orcl
>alter user test_user default tablespace t_tbs;
User altered
SYS at orcl
>alter user test_user quota unlimited on t_tbs;
User altered
SYS at orcl
>alter user test_user quota unlimited on t_tbs
;
User altered
用test_user登錄
創建表
TEST_USER at orcl
>create table t_obj as select * from dba_objects where rownum<
;
Table created
TEST_USER at orcl
>insert into t_obj select * from t_obj;
rows created
TEST_USER at orcl
>/
rows created
TEST_USER at orcl
>/
insert into t_obj select * from t_obj
*
ERROR at line
:
ORA
: unable to extend table TEST_USER
T_OBJ by
in tablespace T_TBS
TEST_USER at orcl
>commit;
Commit complete
TEST_USER at orcl
>select sum(blocks)
Total Blocks
sum(bytes)
Total Size
from dba_extents where owner=
TEST_USER
and segment_name=
T_OBJ
;
Total Blocks Total Size
好
上面我們創建了一個表
並且插入了很多數據
通過dba_extents視圖我們可以看到總共用的block數和總共的大小
下面我們用delete刪除全部數據
並且插入新的
條數據
TEST_USER at orcl
>delete from t_obj;
rows deleted
TEST_USER at orcl
>insert into t_obj select * from dba_objects where rownum<
;
rows created
TEST_USER at orcl
>commit;
Commit complete
TEST_USER at orcl
>select sum(blocks)
Total Blocks
sum(bytes)
Total Size
from dba_extents
where owner=
TEST_USER
and segment_name=
T_OBJ
;
Total Blocks Total Size
再次查看dba_extents視圖
發現占用的空間並沒有減少
我們嘗試resize這個數據文件
file#為
的是t_tbs表空間下面的數據文件
SYS at orcl
>alter database datafile
resize
M;
alter database datafile
resize
M
*
ERROR at line
:
ORA
: file contains used data beyond requested RESIZE value
SYS at orcl
>alter database datafile
resize
;
Database altered
我們發現想resize到
M不可以
但是resize到
就可以了
因為上面查看出來的Total Size是
這個值大於
M而小於
然後我們move這張表到t_tbs
表空間
這個表空間下面的數據文件file#是
EST_USER at orcl
>alter table t_obj move tablespace t_tbs
;
Table altered
TEST_USER at orcl
>select sum(blocks)
Total Blocks
sum(bytes)
Total Size
from dba_extents
where owner=
TEST_USER
and segment_name=
T_OBJ
;
Total Blocks Total Size
我們檢查dba_extents視圖
發現Total Size已經變化了
此時已經可以說明move表是會重新進行block的整理的
同時也重置了HWM
下面我們resize這個數據文件
SYS at orcl
>alter database datafile
resize
M;
Database altered
SYS at orcl
>host
[zhangleyi@as ORCL
]$ cd /oracle/oradata/ORCL
/datafile/
[zhangleyi@as datafile]$ ls
l
總用量
rw
r
zhangleyi dba
月
:
cattbs
dbf
rw
r
zhangleyi dba
月
:
o
_mf_example_
p
gpoj_
dbf
rw
r
zhangleyi dba
月
:
o
_mf_sysaux_
p
kny_
dbf
rw
r
zhangleyi dba
月
:
o
_mf_system_
p
kno_
dbf
rw
r
zhangleyi dba
月
:
o
_mf_temp_
p
fzsd_
tmp
rw
r
zhangleyi dba
月
:
o
_mf_undotbs
_
p
kog_
dbf
rw
r
zhangleyi dba
月
:
o
_mf_users_
p
kqv_
dbf
rw
r
zhangleyi dba
月
:
TEST
DBF
rw
r
zhangleyi dba
月
:
test
dbf
可以看到我們的目的已經達到了
在真實應用中
我們可以將一個表空間中的所有object
全部move到一個新的表空間中
然後drop掉原來的表空間
再從磁盤上刪除原來表空間中的數據文件
至於如何得知HWM
我們可以通過analyze之後的數據字典得到
那麼如果不進行analyze的話
我們也可以運行下面這個腳本
這個腳本可以用於檢查一個object占有的總共block數和處於HWM之上的block數
這當然也就知道了HWM是在什麼位置
DECLARE
v_total_blocks NUMBER;
v_total_bytes NUMBER;
v_unused_blocks NUMBER;
v_unused_bytes NUMBER;
v_last_used_extent_file_id NUMBER;
v_last_used_extent_block_id NUMBER;
v_last_used_block NUMBER;
BEGIN
dbms_space
unused_space(
SCOTT
BIGEMP
TABLE
v_total_blocks
v_total_bytes
v_unused_blocks
v_unused_bytes
v_last_used_extent_file_id
v_last_used_extent_block_id
v_last_used_block);
dbms_output
put_line(
Total Blocks:
||TO_CHAR(v_total_blocks));
dbms_output
put_line(
Blocks above HWM:
||TO_CHAR(v_unused_blocks));
END;
/
Total Blocks:
Blocks above HWM:
PL/SQL procedure successfully completed
Executed in
seconds
From:http://tw.wingwit.com/Article/program/Oracle/201311/18020.html