可以使用CREATE TABLESPACE语句创建表空间.
大多数情况, 只需使用一些本地区(extent)的分配管理功能和段(segment)空间自动管理功能. 下面的展示了创建具备大多数常用功能的表空间的方法:
create tablespace tools
datafile '/u01/dbfile/o12c/tools01.dbf'
size 100m
extent management local
uniform size 128k
segment space management auto;
image.png
应根据不同的环境要求, 调整字典路径、数据文件尺寸和每个区的尺寸.
使用EXTENT MANAGEMENT LOCAL子句可以创建本地管理的表空间. 本地管理的表空间使用数据文件中的位图(bitmap), 高效确定区是否可用.
在本地管理的表空间中, 存储参数NEXT、PCTINCREASE、MINEXTENTS、MAXEXTENTS和DEFAULT不是合法的区选项.
注意:
具有统一区大小的本地管理表空间中, 每个区必须至少有5个数据块.
ORA-03249: Uniform size for auto segment space managed tablespace should have atleast 5 blocks
image.png
当向表空间中的对象添加数据时, Oracle会根据需要, 为相关的表空间数据文件分配更多的区, 适应数据的增长. 可以使用UNIFORM SIZE[size]子句, 为每个区分配相同大小的空间. 如果没有设定统一的大小, 那么就会使用区的默认统一大小: 1MB.
区的统一尺寸会随表和索引的不同存储要求变化. 在某些情况中, 为特定的应用创建不同的区尺寸. 例如, 可以为较小的对象创建统一区尺寸为512KB的表空间, 可以为中等对象创建统一区尺寸为4MB的表空间, 可以为较大的对象创建统一区尺寸为16MB的表空间, 等等.
还可以使用AUTOALLOCATE子句设定区的尺寸. Oracle中可以设定的区尺寸有64KB、1MB、8MB 和64MB. 当一个表空间中含有不同尺寸的对象时应该使用AUTOALLOCATE子句.
使用SEGMENT SPACE MANAGEMENT AUTO子句可以管理表空间中的段空间. 在使用该子句时, 无需设定PCTUSED、FREELISTS和FREELIST GROUPS之类的参数. 与AUTO空间管理方式相对的是MANUAL方式. 在使用MANUAL选项时, 可以根据自己应用的需求调整该选项的参数. 建议使用AUTO选项. 使用AUTO选项可以大幅减少配置和管理的参数数量.
可以使用AUTOEXTEND功能在数据文件装满后, 自动增加数据文件的尺寸. 不建议使用这项功能. 与之相应, 应该监控表空间的增长并根据需要增加空间. 对于可能意外增加表空间的SQL进程来说. 手动增加空间的方式更为可取. 如果在不注意时装满了含有控制文件或Oracle程序的挂载点, 数据库就会被挂起.
如果一定要使用AUTOEXTEND功能, 应随时设置相应的MAXSIZE参数, 这样意外失控的SQL进程就不会用光表空间和挂载点的空间了. 下面的例子创建了一个带最大尺寸限额的自动扩展表空间:
create tablespace tools
datafile '/u01/dbfile/o12c/tools01.dbf'
size 100m
autoextend on maxsize 1000m
extent management local
uniform size 128k
segment space management auto;
image.png
当在不同环境中使用CREATE TABLESPACE脚本时, 在该脚本中使用一些参数会有帮助.
使用"与"符号(&)变量可以使CREATE TABLESPACE脚本适用于不同的环境.
下面的代码中, 顶部定义了&变量, 这些变量可以决定为表空间创建的数据文件尺寸:
define tbsp_large=500M
define tbsp_med=100M
define tbsp_large_name=reg_data01
define tbsp_med_name=reg_med01
--
create tablespace reg_data
datafile '/u01/dbfile/o12c/&&tbsp_large_name..dbf'
size &&tbsp_large
extent management local
uniform size 128k
segment space management auto;
--
create tablespace reg_index
datafile '/u01/dbfile/o12c/&&tbsp_med_name..dbf'
size &&tbsp_med
extent management local
uniform size 128k
segment space management auto;
image.png
使用&变量只需修改一次脚本, 就可以让这些变量在整个脚本中重用. 可以在脚本中使用参数, 比如设置数据文件挂载点和范围尺寸.
还可以通过SQL*Plus命令行将&变量的值传入CREATE TABLESPACE脚本. 这样做可以避免在脚本中使用硬编码方式设定尺寸, 从而能够在运行时设置尺寸. 要做到这一点, 应先在该脚本的顶部定义用来接收传入值的&变量:
define tbsp_large=&1
define tbsp_med=&2
define tbsp_large_name=&3
define tbsp_med_name=&4
--
create tablespace reg_data02
datafile '/u01/dbfile/o12c/&&tbsp_large_name..dbf'
size &&tbsp_large
extent management local
uniform size 128k
segment space management auto;
--
create tablespace reg_index02
datafile '/u01/dbfile/o12c/&&tbsp_med_name..dbf'
size &&tbsp_med
extent management local
uniform size 128k
segment space management auto;
image.png
这样就可以通过SQL*Plus命令行向脚本中传人变量值了. 下面的例子执行了脚本create_tablespace. sql, 并向该脚本中传入了两个值, 分别将&变量设置为500和100M:
SQL> @create_tablespace02.sql 500M 100M reg_data01 reg_index01
image.png
创建和管理表空间的实用方法
实用方法 | 理由 |
---|---|
为使用同一数据库的多个应用程序创建不同的表空间 | 在需要脱机使用表空间时, 仅会影响到一个应用程序 |
应为每个应用程序创建独立的表数据表空间和索引数据表空间 | 表数据和索引数据可能会有不同的存储要求 |
不应对数据文件使用AUTOEXTEND功能. 如果使用了AUTOEXTEND选项, 则应设定最大尺寸上限 | 设定最大尺寸上限可以防止失控的SQL语句耗光存储设备的可用空间 |
将表空间创建为本地化管理方式. 不应将表空间创建为数据字典管理方式 | 这样做可以提高性能和可管理性 |
应使用惯例命名表空间的数据文件, 可在数据文件的名称中包含表空间的名称, 后面加上能够与该表空间中其他数据文件区分的两个数字 | 这样能减少需要管理的数据文件 |
应尽量将与表空间关联的数据文件数量降至最低 | 这样能减少需要管理的数据文件 |
在创建表空间的脚本中, 可以使用&变量定义各种参数, 如存储特性 | 这样做可以使脚本在各种环境中都具有更好的可重用性 |
当需要检查重新创建已经存在的表空间的SQL语句时, 可以使用DBMS_METADATA软件包. 首先, 将LONG变量设置为较大的值:
SQL> set long 1000000
使用DBMS_METADATA软件包, 显示数据库中所有表空间的CREATE TABLESPACE DDL(数据定义语言):
提示:
还可以使用数据泵提取数据库对象的DDL.
SQL> select dbms_metadata.get_ddl('TABLESPACE',tablespace_name) from dba_tablespaces;
image.png