表空间是Oracle数据库中最大的逻辑存储单位,同事也是数据库的存储空间单位,系统通过表空间存储模式对象。
Oracle 9i R1之前的版本可以使用数据字典管理表空间和本地管理表空间两种方式去管理,前者存在存储参数难管理,以及磁盘磁盘碎片等问题,已经被淘汰。从下图的extent_management可以看出,表空间都是使用得本地管理方式进行管理:
表空间的创建
1手动创建
- CREATE [TEMPORARY | UNDO] TABLESPACE tablespace_name
- [ DATAFILE datafile_tempfile_spacification ]
- [ BLOCKSIZE number K ]
- [ ONLINE | OFFLINE ]
- [ LOGGIN | NOLOGGING ]
- [ FORCE LOGGING ]
- [ DEFAULT STORAGE storage ]
- [ PERMANENT | TEMPORARY ]
- [ EXTENT MANAGEMENT DICTIONARY | LOCAL | [ AUTOALLOCATE | UNIFORM SIZE number K | M ] ]
- [ SEGMENT SPACE MANAGEMENT AUTO | MANUAL ];
【2】指定了表空间文件路径、初始大、如何扩展,完整语句如下:
DATAFILE | TEMPFILE 'filename' SIZE K | M REUSE
[ AUTOEXTEND OFF | ON [ NEXT number K | M MAXSIZE UNLIMITED | number K|M] ]
REUSE表示如果该文件已经存在,则清楚该文件并重新创建;如果未使用REUSE关键字,则当文件存在时会报错。AUTOEXTEND指该文件是否为自动扩展。如果指定自动扩展则通过NEXT语句可以指定数据每次扩展的大小。MAXSIZE表示当前数据文件为自动扩展时,允许数据文件扩展的最大限度。
例如:
SQL> create tablespace temp01
2 default 'E:\oracledata\user01_tbs.dbf' size 100m
3 autoextend on next 10m maxsize unlimited;
【3】BLOCKSIZE为创建非标准数据块表空间时使用这个选项。
【4】LOGGING或NOLOGGING 指定是否记录表空间中对象的操作记录。选择LOGGING,将生成表空间一个日志记录项,记录该表空间中数据库对象的任何操作。
【5】FORCE LOGGING:迫使Oracle生成表空间中数据库对象任何创建和更改记录日志,无需考虑LOGGING和NOLOGGING选项
【】COMPRESS或NOCOMPRESS:该选项通知Oracle压缩数据段中的数据。数据段压缩发生在数据块层次中,以便压缩数据块内德夯,消去列中重复值。当检索数据时,oracle会自动对数据进行解压缩。但如果选择了COMPRESS则会影响到数据的更新和删除,好处是节省了空间。
【6】DEFAULT STORAGE:该选项用于设置保存在表空间中的数据库对象的默认存储器参数。该选项尽在数据字典管理的表中有效,在LOCAL管理的表空间中虽然可用但是已经不起作用。
【7】ONLINE或OFFLINE:设置成ONLINE时,则创建的该表空间立即可用,设置OFFLINE选项则创建的表空间不可用。默认是ONLINE
【8】PERMENENT或TMEPORARY:前者表示持久保存表空间中的数据库对象;后者表示临时保存数据对象。
【9】EXTENT MANAGEMENT:11g中不再支持数据字典管理的表空间,所以只有LOCAL;UNIFORM和AUTOALLOCATE两个关键字前者表示表空间中所有盘区的大小相同,后者表示盘区大小由Oracle自动分配,这个也是默认值
【10】SEGMENT SPACE MANAGEMENT选项AUTO和MANUAL,设置如何管理段的存储,主要是指Oracle用来管理段中已用数据块和空闲数据块。选择AUTO这是Oracle使用位图来管理已用的数据块和空闲数据块。
2、OEM方式创建
后面就按照步骤走下去,很简单。
修改表空间
1、为表空间增加数据文件(新增的文件可以和原来的文件不在一个磁盘上)
alter tablespace temp01 [ REUSE ]
add datafile 'f:\oracldata\user01_02.dbf' size 100m;
注意:如果文件已经存在则需要使用reuse子句
2、修改数据文件的大小
resize的值如果大于当前的大小则扩展表空间的数据文件;如果小于则压缩,但是如果压缩的空间超过了未使用得空间,则会出现ORA-03297的错误:文件包含在请求的RESIZE值意外使用的数据。
alter databse
datafile 'xxxxxxxxxxxxxxxxxxx'
resize 1024m;
在这里DBA可以通过查询数据字典视图DBA_FREE_SPACE了解表空间空闲分区。其中,bytes表示该空间空闲空间的大小,“BLOCKS”表示一数据块数据的形式列出空闲的空间大小。
另外需要查看当先的数据文件的大小和路径
3、修改数据文件的自动扩展属性
首先看一下如何查看当前文件的扩展属性,即当时新建表空间时的autoextend属性为on还是off。
那么我们可以使用alter database语句进行修改,顺便还可以修改maxsize以防止数据库文件无休止的增长下去而把磁盘撑爆;
alter database
datafile ‘xxxxxxxxxxxx’
autoextend ON
maxsize 200m;
4、修改表空间状态
表空间有ONLINE, OFFLINE, READ ONLY, READ WRITE状态,正常情况为READ WRITE、ONLINE。
alter tablespace temp01 offline;
此时如果在该表空间内新建表则会收到ORA-01542的错误:表空间'TMEP01'脱机,无法在其中分配空间。
alter tablespace temp01 read only;
此时如果在该表空间内新建表则会收到ORA-01674的错误:表空间'TMEP01'是只读,无法在其中分配空间。
数据字典DBA_TABLESPACE中的status列记录了表空间的状态:
系统表空间SYSTEM, UNDO, SYSAUX, TEMP无法设置成为OFFLINE或者READ ONLY状态,如果尝试这么做,会收到系统错误ORA-01541:系统表空间无法脱机;如果有必要请关闭。
5、移动数据文件
移动数据包括4步:首先修改表空间为offline,以防止有其他用户进行操作;接下来复制数据文件到另外一个磁盘;然后使用ALTER TABLESPACE RENAME语句修改数据文件的名称;最后切换表空间的状态为ONLINE。
ALTER TABLESPACE temp01
rename datafile 'd:\oracledata\user01_tbs.dbf'
to 'g:\oracledata\user01_tbs.dbf';
6、删除表空间
DROP TABLESPACE tablespace_name
| [ INCLUDING CONTENTS ]
| [ INCLUDING CONTENTS AND DATAFILES ]
如果表空间还存在数据库对象,那么则需要使用 INCLUDING CONTENTS进行删除。
删除表空间仅删除控制文件和数据字典中与表空间相关信息,而表空间对应的数据文件并不删除。如果要一并删除文件,那么要使用INCLUDING CONTENTS AND DATAFILES子句。
表空间还有临时表空间(临时表控件组)、撤销表空间、大文件表空间的概念。
撤销(UNDO)表空间
传统上,Oracle一直使用回滚段作为撤销存储空间。对于DBA而言,利用回滚段进行撤销空间的管理是非常繁琐的,而且也难以获得较高的效率。因此,从Oracle 9i之后,提供了一中全新的撤销空间管理方式,即“自动撤销管理”,于此相对利用回滚段进行撤销空间管理的方式被称为“手工撤销管理”。
1、自动撤销管理
该方式也称为SMU(System Manged UNDO);而回滚段管理方式称为RBU(Rollback Managed Undo)。在ORACLE 11G中默认采用前者进行自动撤销表空间的管理。由参数UNDO_MANAGEMENT确定,如果设置为auto则使用SMU,如果设置为manual,则采用RMU方式。
在数据库实例启动时,Oracle会自动搜索是否存在一个可用的UNDO表空间。如果没有找到,则Oracle会使用SYSTEM表空间中的回滚段来保存撤销记录。也就是说Oracle将对撤销空间使用RMU管理。正常情况下,应该避免这种方式。
可以使用UNDO_TABLESPACE的方法来为实例启动分配UNDO表空间:
undo_tablespace=undotbs01;
在设置自动撤销管理时,需要设置的个参数如下:
UNDO_MANAGEMENT:上面所说的auto和manual
UNDO_TABLESPACE:为数据库指定所使用得UNDO表空间,可以在实例运行的过程中修改
UNDO_PETENTION:决定撤销数据的保留时间,可以在实例运行的过程中修改
通过show parameter undo命令查询UNDO设置的状态: