管理表空间
在管理表空间时应遵循以下原则:
1)使用多重表空间。采用多重表空间可使数据库操作更灵活。主要体现在以下方面:
·将用户数据与数据字典数据相分离,并将不同表空间的数据文件分别存储在不同磁盘上可以降低I/O竞争。
·将一个应用的数据与其他应用相分离,可以避免表空间脱机时多个应用受到影响。
·可根据需要将单个表空间脱机,从而获得较好的可用性。
·通过为不同类型的数据库预留表空间,以达到优化表空间的目的,如更新较高的或只读,或临时段存储等。
·备份单个表空间。
2)为用户指定表空间限额。要创建、管理与使用表空间,必须首先以sys用户并以as sysdba身份登录数据库。与Oracle9i不同,在Oracle 10g中,启动SQL*Plus时的帐户和口令不需加引号。命令格式是:
sqlplus sys/as sysdba
在Oracle 10g中,创建和管理表空间所使用的数据字典和权限及语句可归纳如下。
1.与表空间有关的数据字典
查询和使用与表空间有关的元数据均可从下列数据字典中获得。主要包括:dba_tablespaces、dba_users、dba_ts_quotas、user_tablespaces、user_ts_quotas、user_extents、user_segments、user_free_space、dba_data_files、dba_extents、dba_free_space、dba_segments、dba_temp_files、dba_undo_extents、dba_rollback_segs、dba_data_files、v_$backup_datafile、v_$database_block_corruption、v_$datafile、v_$datafile_copy、v_$datafile_header、v_$rollstat、v_$segment_statistics、v_$undostat等。以v_$开头的数据字典均保存为动态信息。
2.与使用表空间有关的系统权限
与表空间有关的主要系统权限有:create tablespace、alter tablespace、drop tablespace、manage tablespace和unlimited tablespace等。
其中,unlimited tablespace是允许用户无限制地访问所有表空间。出于安全考虑,在授予该权限给用户时应慎重。如果用户不需要该系统权限,最好撤销该权限,否则用户会利用该权限蓄意创建大量对象或复制数据,从而塞满表空间导致数据库服务器崩溃。
3.创建永久性的表空间
命令格式:
SQL>create[undo]tablespace tablespace
[datafile filespec[autoextend_clause][,filespec[autoextend_clause]]...]
[{minimum extent integer[ k|m]|blocksize integer[k]|{logging|nologging}
|default storage_clause|{online|offline}
|{permanent|temporary}|extent_management_clause|segment_management_clause
}
[ minimum extent integer[k|m]|blocksize integer[k]
|{logging|nologging}|default storage_clause|{online|offline}
|{permanent|temporary}|extent_management_clause|segment_management_clause
]...
];
【例2-1】创建一个名为dalianren的表空间
SQL>create tablespace dalianren nologging
datafile′D:\oracle\product\10.2.0\oradata\dalianren\dalianren01.ora′size 50m blocksize 8192
extent management local uniform size 256k
segment space management auto;
4.使一个表空间脱机
命令格式:
SQL>alter tablespaceoffline;
【例2-2】将表空间dalianren脱机
SQL>alter tablespace dalianren offline;
注意 system表空间不能脱机。
5.使一个表空间联机
命令格式:
SQL>alter tablespaceonline;
【例2-3】将表空间dalianren联机
SQL>alter tablespace dalianren online;
6.使表空间只读
命令格式:
SQL>alter tablespaceread only;
【例2-4】将表空间dalianren更改为只读
SQL>alter tablespace dalianren read only;
7.使表空间可读可写
命令格式:
SQL>alter tablespaceread write;
【例2-5】将表空间dalianren更改为可读写
SQL>alter tablespace dalianren read write;
8.创建临时表空间
命令格式:
SQL>create temporary tablespace
tempfile′′
sizem autoextend
extent management local uniform size;
【例2-6】创建临时表空间temp
SQL>create temporary tablespace temp
tempfile ′D:\ oracle\product\10.2.0\oradata dalian\temp01.ora′
size 500m autoextend off
extent management local uniform size 512k;
注意虽然语句alter tablespace中带有temporary关键字,但不能使用带有temporary关键字的alter tablespace语句将一个本地管理的永久表空间转变为本地管理的临时表空间。必须使用create temporary tablespace语句直接创建本地管理的临时表空间。
9.添加临时表空间的数据文件
命令格式:
SQL>alter tablespaceadd tempfile ′′sizem;
【例2-7】为临时表空间temp_ren添加数据文件
SQL>alter tablespace temp_ren add tempfile ′D:\oracle\product\10.2.0\oradata\dalian\temp_ren.dbf′size 100m;
10.调整临时表空间的数据文件
命令格式:
SQL>alter database tempfile ′′resizem;
【例2-8】调整临时表空间的数据文件大小
SQL>alter database tempfile ′D:\oracle\product\10.2.0\oradata\test \temp_ren.ora′ resize 20m;
11.将表空间的数据文件或临时文件脱机
命令格式:
SQL>alter database datafile′′ offline;
或
SQL>alter database tempfile ′′ offline;
【例2-9】将表空间的数据文件或临时文件脱机
SQL>alter database datafile ′D:\oracle\product\10.2.0\oradata\dalian\temp_ren.ora′ offline;
或
SQL>alter database tempfile ′D:\oracle\product\10.2.0\oradata\dalian\temp_ren.ora′offline;
12.将临时表空间联机
命令格式:
SQL>Alter database tempfile ′′online;
【例2-10】将临时表空间联机
SQL>Alter database tempfile ′D:\oracle\product\10.2.0\oradata\dalian\temp_ren.ora′ online;
13.删除表空间,但不删除其文件
命令格式:
SQL>drop tablespace;
【例2-11】删除表空间dalianren,但不删除其文件
SQL>drop tablespace dalianren;
14.删除包含目录内容的表空间
命令格式:
SQL>drop tablespaceincluding contents;
【例2-12】删除表空间dalianren及其包含的内容
SQL>drop tablespace dalianren including contents;
15.删除包含目录内容和数据文件在内的表空间
命令格式:
SQL>drop tablespaceincluding contents and datafiles;
【例2-13】删除表空间dalianren及其包含的内容以及数据文件
SQL>drop tablespace dalianren including contents and datafiles;
16.当含有参照性约束时,删除包含目录内容和数据文件在内的表空间
命令格式:
SQL>drop tablespaceincluding contents and datafiles cascade constraints;
【例2-14】将表空间dalianren及其包含的内容、数据文件以及相关约束一同删除
SQL>drop tablespace dalianren including contents and datafiles cascade constraints;
17.表空间更名
Oracle9i中不能直接将表空间更名。在Oracle 10g可直接更名永久表空间和临时表空间。但是,system和sysaux表空间不能更名。
命令格式:
SQL>alter tablespacerename to;
【例2-15】将表空间users更改为newusers
SQL>alter tablespace users rename to newusers;
在Oracle 10g中,如果一个撤销表空间通过使用pfile的实例被更名,则警告日志文件中将写入一个信息,提醒用户更改undo_tablespace的参数值。
注意当使用drop tablespace误删除了表空间之后,通过查看alert文件可以确定误操作的时间。该文件位于Oracle_Home\admin\\bdump目录下,名为alert_.log,如:D:\oracle\product\10.2.0\admin\test\bdump目录下的alert_test.log文件。
18.多重临时表空间
在Oracle 10g中增加了一个表空间组的概念,通过使用表空间组用户可以使用一个以上的表空间存储临时段。表空间组是在第一个表空间被指定给该组时,由系统自动隐式创建的。例如:
通过添加现有的表空间创建表空间组。
SQL>alter tablespace temp tablespace group temp_ts_group;
添加一个新的表空间给该已经创建的表空间组。
SQL>create temporary tablespace temp2
tempfile ′D:\oracle\product\10.2.0\oradata\test\temp201.dbf ′ size 20m tablespace group temp_ts_group;
被指定给组的表空间可在视图中查询得到。
SQL>select*from dba_tablespace_groups;
group_nametablespace_name
------------------------------------------------------------
temp_ts_grouptemp
temp_ts_grouptemp2
2 rows selected.
SQL>
一旦创建了表空间组,就可以将其指定给用户或作为默认的临时表空间,就像一个表空间一样。
·将表空间组指定给用户,作为临时表空间。
SQL>alter user scott temporary tablespace temp_ts_group;
·将表空间组作为默认的临时表空间。
SQL>alter database default temporary tablespace temp_ts_group;
·表空间也可以从表空间组中移出。
SQL>alter tablespace temp2 tablespace group;
·查询表空间组。
SQL>select*from dba_tablespace_groups;
group_nametablespace_name
------------------------------------------------------------
temp_ts_grouptemp
1 row selected.
SQL>
理论上,一个表空间组包含多少表空间是没有最大限制的,但必须至少包含一个表空间。当最后一个表空间被删除后,该表空间组也被隐式地删除。若该表空间组仍然被指定做临时表空间,则不可以删除该组中的最后一个表空间成员。同时,表空间组不能与表空间同名。
2.1.4表空间的相关查询
列出表空间、表空间的文件、分配的空间、空闲空间以及下一个空闲分区,如下所示。
set linesize 132
set pagesize 60
col tablespace_name format a12
col file_name format a38
col tablespace_kb heading ′TABLESPACE|TOTAL KB′
col kbytes_free heading ′TOTAL FREE|KBYTES′
select ddf.tablespace_name tablespace_name,ddf.file_name file_name,ddf.bytes/1024 tablespace_kb,
sum(fs.bytes)/1024 kbytes_free,max(fs.bytes)/1024 next_free
from sys.dba_free_space fs,sys.dba_data_files ddf
where ddf.tablespace_name=fs.tablespace_name
group by ddf.tablespace_name,ddf.file_name,ddf.bytes/1024
order by ddf.tablespace_name,ddf.file_name;
列出数据文件,表空间名以及大小,如下所示。
col file_name format a50
col tablespace_name format a10
select file_name,tablespace_name,round(bytes/1024000) MB
from dba_data_files
order by file_name;
列出表空间、大小、空闲空间以及空闲空间的百分比,如下所示。
select ddf.tablespace_name,sum(ddf.bytes) total_space,sum(dfs.bytes) free_space,
round(((nvl(sum(dfs.bytes),0)/sum(ddf.bytes))*100),2) pct_free
from dba_free_space dfs,dba_data_files ddf
where ddf.tablespace_name=dfs.tablespace_name (+)
group by ddf.tablespace_name
order by ddf.tablespace_name;
计算表空间每个数据文件实际的最小空间以及对应的文件名,其大小与磁盘操作系统中显示的不同,如下所示。该语句运行需要较长时间。
Select substr(df.file_name,1,70) filename,max(de.block_id*
(de.bytes/de.blocks)+de.bytes)/1024 min_size
from dba_extents de,dba_data_files df
where de.file_id=df.file_id
group by df.file_name;