表空间的管理
--简要语法:
CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace name
DATAFILE datafile spec | TEMPFILE tempfile spec
[MINIMUM EXTENT minimum extent size]
[BLOCKSIZE blocksize]
[[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)]
[LOGGING|NOLOGGING]
[FORCE LOGGING]
[ONLINE|OFFLINE]
[EXTENT MANAGEMENT DICTIONARY | LOCAL [AUTOALLOCATE|UNIFORM SIZE size]]
[SEGMENT SPACE MANAGEMENT MANUAL|AUTO]
[FLASHBACK ON|OFF]
注意标红的部分,EXTENT管理,也就是所谓的表空间管理;而SEGMENT管理就是所谓的段空间管理。我们稍后会做一个段空间收缩的实验。
字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT),DMT是指oracle的空间分配或回收是通过数据库中的数据字典表来记录和管理的,用于管理的两个数据字典表分别是:UET$(used extents)和FET$(freeextents) 。其工作方式是:当建立一个新的段或者段在表空间时,oracle通过一系列的SQL语句来完成这个工作; 且和前面的两个字典表有关,在繁忙的系统中会造成竞争和等待(另一个DMT会带来的问题是空间碎片)(DMT已经废弃了)
本地管理(LMT): 在9i的R2版本后成了默认的选项
LMT在表空间的数据文件头部加入了一个位图区域,在其中记录每个extent的使用状况
当extent被使用或者被释放,oracle会更新头部的记录来反映这个变化,不产生回滚信息
因为仅仅操作数据文件头部的几个数据块,不用操作数据字典,LMT比DMT要快,尤其是在繁忙的时候更明显
在每个表空间的数据文件的头部加入了一个位图区域
一个段的第一个区的第一个块是first level bitmap block
第二个块是second level bitmap block
第三个块才是段头块
这两个块是用来管理freeblock
如果选择统一尺寸,还可以详细指定每个区间的大小
dba_extents这个视图可以看到哪些对象分配了多少区间
段空间管理:
从9i开始,段空间管理有两种:
①MSSM:由你设置freelists、freelistgroups、pctused、pctfree、initrans等参数来控制如何分配、使用段中的空间
②ASSM:你只需控制一个参数pctfree,其他参数即使建了也将被忽略
(1)freelist和freelistgroup
使用MSSM表空间管理时,Oracle会在freelist中为有自由空间的对象维护HWM以下的块
freelist和freelistgroup在ASSM表空间中根本不存在,仅在MSSM表空间使用这个技术
(2)pctfree和pctused
pctfree告诉Oracle:块上应该保留多大的空间来完成将来的更新
对于MSSM,她控制着块何时放入freelist中,以及何时从freelist中取出。 如果大于pctfree,则这个块会一直在freelist上
对于ASSM,因为ASSM根本不使用freelist。在ASSM中,pctused也将被忽略。
但她仍然会限制能否将一个新行插入到一个块中 .
适当的设置pctfree有助于减小行迁移 .
⑶initrans
无论是ASSM or MSSM这个参数仍然有效
块头的事务槽的初始化大小有对象的initrans指定
实验:shrink命令完成段收缩
从10g开始,oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理 (ASSM),就可以使用这个特性缩小段,即降低HWM.这里需要强调一点,10g的这个新特性,仅对ASSM表空间有效,否则会报ORA-10635: Invalid segment or tablespace type.
在这里,我们来讨论如和对一个ASSM的segment回收浪费的空间.同样,我们用系统视图all_objects来在tablespace ASSM上创建测试表my_objects,这一小节的内容,
实验环境为oracle11.2.0.3:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
[oracle@lyg ~]$ sqlplus "/as sysdba"
SQL*Plus: Release 11.2.0.3.0 Production on Thu Apr 10 14:31:45 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
创建测试表空间:
SQL> CREATE TABLESPACE ASSMTESTDATAFILE '/u01/app/oracle/oradata/test/assmtest01.dbf' size 50m 2 ;
Tablespace created.
SQL> create user assmtest identified by assm default tablespace ASSMTEST;
User created.
SQL> grant connect,resource to assmtest;
Grant succeeded.
创建测试用户:
SQL> grant dba to assmtest;
Grant succeeded.
SQL> conn assmtest/assm
Connected.
SQL> create table my_objects as select * from dba_objects;
Table created.
查看表空间管理状态:
select TABLESPACE_NAME,BLOCK_SIZE,EXTENT_MANAGEMENT,ALLOCATION_TYPE, SEGMENT_SPACE_MANAGEMENT
from dba_tablespaces where TABLESPACE_NAME = 'ASSMTEST';
SQL>select count(*) from my_objects;
COUNT(*)
----------
74582
27523 rows deleted.
6632 rows deleted.
10828 rows deleted.
现在我们使用show_space和show_space_assm来看看my_objects的数据存储状况:
SQL>exec show_space('MY_OBJECTS','ASSMTEST');SQL> exec show_space('MY_OBJECTS','ASSMTEST');
Unformatted Blocks .................... 0
FS1 Blocks (0-25) .................... 0
FS2 Blocks (25-50) .................... 330
FS3 Blocks (50-75) .................... 270
FS4 Blocks (75-100) .................... 398
Full Blocks .................... 65
Total Blocks ........................... 1,152
Total Bytes ........................... 9,437,184
Total MBytes ........................... 9
Unused Blocks........................... 63
Unused Bytes ........................... 516,096
Last Used Ext FileId.................... 8
Last Used Ext BlockId.................. 1,152
Last Used Block......................... 65
PL/SQL procedure successfully completed.
SQL> exec show_space_assm('MY_OBJECTS','ASSMTEST');
free space 0-25% Blocks:................0
free space 25-50% Blocks:...............330
free space 50-75% Blocks:...............270
free space 75-100% Blocks:..............398
Full Blocks:............................65
Unformatted blocks:.....................0
PL/SQL procedure successfully completed.
这里,table my_objects的HWM下有1151个block,其中,free space为25-50%的block有330个,free space为50-75%的block有270个,free space为75-100%的block有398个,full space的block只有65个,这种情况下,我们需要对这个table的现有数据行进行重组.
要使用assm上的shink,首先我们需要使该表支持行移动,可以用这样的命令来完成:SQL>alter table my_objects enable row movement;
现在,就可以来降低my_objects的HWM,回收空间了,使用命令:SQL> alter table my_objects shrink space;
表已更改.
我们具体的看一下实验的结果:
SQL> exec show_space('MY_OBJECTS','ASSMTEST');Unformatted Blocks .................... 0
FS1 Blocks (0-25) .................... 0
FS2 Blocks (25-50) .................... 1
FS3 Blocks (50-75) .................... 1
FS4 Blocks (75-100) .................... 0
Full Blocks .................... 427
Total Blocks ........................... 448
Total Bytes ........................... 3,670,016
Total MBytes ........................... 3
Unused Blocks........................... 3
Unused Bytes ........................... 24,576
Last Used Ext FileId.................... 8
Last Used Ext BlockId................... 512
Last Used Block......................... 61
PL/SQL 过程已成功完成.
SQL> exec show_space_assm('MY_OBJECTS','ASSMTEST');
free space 0-25% Blocks:................0
free space 25-50% Blocks:...............1
free space 50-75% Blocks:...............1
free space 75-100% Blocks:..............0
Full Blocks:.........................................427
Unformatted blocks:.....................0
PL/SQL 过程已成功完成.
在执行完shrink命令后,我们可以看到,table my_objects的HWM现在降到了447的位置,而且HWM下的block的空间使用状况,full space的block有249个,free space 为25-50%Block只有1个.