oracle resize datafile,Script: 查看datafile 的HWM,估算resize 最小size

数据文件如果有2g,先create一个大表占了1G,后来建了个几M小表,再把大表drop 掉加purge选项,向把数据文件resize到100M,往往会失败,在磁盘紧张的情况下,想知道数据文件最小值是多少?就要计算datafile HWM,意义和segment的HWM是一样的。

测试一下,分享收集的script

sys@ANBOB>create tablespace tt datafile '/u01/app/oracle/oradata/anbob/tt01.dbf' size 81k;

Tablespace created.

sys@ANBOB>select bytes/1024 from dba_data_files where file_name='/u01/app/oracle/oradata/anbob/tt01.dbf';

BYTES/1024

----------

88

db version:10201

block size :8192

File header: min 1 block

Bitmap: min 64k

Segment header: min 1 block

Segment data block: min 1 block: 8k

Total: 88k

sys@ANBOB>alter database datafile '/u01/app/oracle/oradata/anbob/tt01.dbf' resize 10m;

Database altered.

sys@ANBOB>select bytes/1024 from dba_data_files where file_name='/u01/app/oracle/oradata/anbob/tt01.dbf'

2 ;

BYTES/1024

----------

10240

sys@ANBOB>create table test tablespace tt as select * from dba_objects ;

Table created.

sys@ANBOB>select bytes/1024 from dba_segments where segment_name='TEST' AND owner='SYS';

BYTES/1024

----------

7168

sys@ANBOB>insert into test select * from test;

insert into test select * from test

*

ERROR at line 1:

ORA-01653: unable to extend table SYS.TEST by 128 in tablespace TT

sys@ANBOB>select bytes/1024 from dba_segments where segment_name='TEST' AND owner='SYS';

BYTES/1024

----------

9216

sys@ANBOB>select max(block_id+blocks-1)*8192/1024 from dba_extents where segment_name='TEST' AND owner='SYS';

MAX(BLOCK_ID+BLOCKS-1)*8192/1024

--------------------------------

9240

sys@ANBOB>create table test1(id int) tablespace tt;

Table created.

sys@ANBOB>insert into test1 values(1);

1 row created.

sys@ANBOB>commit;

sys@ANBOB>select bytes/1024 from dba_segments where segment_name='TEST1' AND owner='SYS';

BYTES/1024

----------

64

sys@ANBOB>drop table test purge;

Table dropped.

sys@ANBOB>alter database datafile '/u01/app/oracle/oradata/anbob/tt01.dbf' resize 9m;

alter database datafile '/u01/app/oracle/oradata/anbob/tt01.dbf' resize 9m

*

ERROR at line 1:

ORA-03297: file contains used data beyond requested RESIZE value

sys@ANBOB>col tablespace_name for a18

sys@ANBOB>col file_name for a60

sys@ANBOB>SELECT a.tablespace_name,

file_name,

c.VALUE / 1024 "Blk. size(Kb)",

CEIL ((NVL (hwm, 1) * c.VALUE) / 1024 / 1024) "smallest(Mb) - HWM",

CEIL (blocks * c.VALUE / 1024 / 1024) "currsize(Mb)",

CEIL (blocks * c.VALUE / 1024 / 1024) - CEIL ((NVL (hwm, 1) * c.VALUE) / 1024 / 1024) "savings(Mb)"

FROM dba_data_files a,

(SELECT file_id, MAX (block_id + blocks - 1) hwm

FROM dba_extents

GROUP BY file_id) b,

(SELECT VALUE

FROM v$parameter

WHERE NAME = 'db_block_size') c

WHERE a.file_id = b.file_id(+)

and a.status !='INVALID';

TABLESPACE_NAME FILE_NAME Blk. size(Kb) smallest(Mb) - HWM currsize(Mb) savings(Mb)

------------------ ------------------------------------------------------------ ------------- ------------------ ------------ -----------

TT /u01/app/oracle/oradata/anbob/tt01.dbf 8 10 10 0

MGMT_ECM_DEPOT_TS /u01/app/oracle/oradata/anbob/mgmt_ecm_depot1.dbf 8 10 10 0

SYSAUX /u01/app/oracle/oradata/anbob/sysaux01.dbf 8 303 310 7

TBSAPP /u01/app/oracle/oradata/anbob/tbsapp1.dbf 8 1 20 19

EXAMPLE /u01/app/oracle/oradata/anbob/example01.dbf 8 69 69 0

USERS /u01/app/oracle/oradata/anbob/users01.dbf 8 19 19 0

UNDOTBS1 /u01/app/oracle/oradata/anbob/undotbs01.dbf 8 104 120 16

MGMT_TABLESPACE /u01/app/oracle/oradata/anbob/mgmt.dbf 8 438 440 2

SYSTEM /u01/app/oracle/oradata/anbob/system01.dbf 8 539 540 1

sys@ANBOB>drop table test1 purge;

Table dropped.

sys@ANBOB> SELECT a.tablespace_name,

2 file_name,

3 c.VALUE / 1024 "Blk. size(Kb)",

4 CEIL ((NVL (hwm, 1) * c.VALUE) / 1024 / 1024) "smallest(Mb) - HWM",

5 CEIL (blocks * c.VALUE / 1024 / 1024) "currsize(Mb)",

6 CEIL (blocks * c.VALUE / 1024 / 1024) - CEIL ((NVL (hwm, 1) * c.VALUE) / 1024 / 1024) "savings(Mb)"

7 FROM dba_data_files a,

8 (SELECT file_id, MAX (block_id + blocks - 1) hwm

9 FROM dba_extents

10 GROUP BY file_id) b,

11 (SELECT VALUE

12 FROM v$parameter

13 WHERE NAME = 'db_block_size') c

14 WHERE a.file_id = b.file_id(+)

15 and a.status !='INVALID';

TABLESPACE_NAME FILE_NAME Blk. size(Kb) smallest(Mb) - HWM currsize(Mb) savings(Mb)

------------------ ------------------------------------------------------------ ------------- ------------------ ------------ -----------

TT /u01/app/oracle/oradata/anbob/tt01.dbf 8 1 10 9

MGMT_ECM_DEPOT_TS /u01/app/oracle/oradata/anbob/mgmt_ecm_depot1.dbf 8 10 10 0

SYSAUX /u01/app/oracle/oradata/anbob/sysaux01.dbf 8 303 310 7

TBSAPP /u01/app/oracle/oradata/anbob/tbsapp1.dbf 8 1 20 19

EXAMPLE /u01/app/oracle/oradata/anbob/example01.dbf 8 69 69 0

USERS /u01/app/oracle/oradata/anbob/users01.dbf 8 19 19 0

UNDOTBS1 /u01/app/oracle/oradata/anbob/undotbs01.dbf 8 104 120 16

MGMT_TABLESPACE /u01/app/oracle/oradata/anbob/mgmt.dbf 8 438 440 2

SYSTEM /u01/app/oracle/oradata/anbob/system01.dbf 8 539 540 1

9 rows selected.

NOTE:

任何查询DBA_EXTENTS的代价都是非常昂贵的,在本地管理的表空间里是用x$ktfbue stucture 表现已用的extents情况,在v$lock 视图中能看到在查询dba_extents时会加TT,TO lock type,(TT:Serializes DDL operations on tablespaces;TO:Serializes DDL operations on tablespaces), 会对tablespace上的每个seg$ 进行递归查询

相关

http://www.anbob.com/?p=1259

打赏

8732971891f4ba05583674ca6b8145ac.png微信扫一扫,打赏作者吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值