管理表空间和数据文件
表空间是数据库的逻辑组成部分。物理上讲,数据库数据存放在数据文件中。从逻辑上讲,数据库则是存放在表空间中的,表空间由一个或多个数据文件组成。
数据库的逻辑结构
表空间-段-区-块
表空间用于从逻辑上组织数据库的数据。数据库逻辑上是由一个或多个表空间组成的。通过表空间可以控制数据库占用的磁盘空间;dba可以将不同数据类型部署到不同的位置,这样有利于提高i/o性能,同时有利于备份和恢复等管理操作。
建立表空间,特权用户或者dba执行,具有create tablespace的系统权限
create tablespace data01
datafile ‘d:\test\data01.dbf’ size 20muniform size 128k
建立名为data01的表空间,为该表空间建立data01.dbf的数据文件,区大小为128k
create table mytest(deptno number(4),dnamevarchar2(20),loc varchar2(20))
tablespace data01;
改变表空间的状态
建立表空间时,表空间是联机状态,此时该表空间可以访问,可读写,可查询该表空间的数据,而且还可以在表空间执行各种语句,但是进行系统维护时,需要改变表空间的状态,一般是特权用户或dba操作。
使表空间脱机
alter tablespace 表空间名 offline;
使表空间联机
alter tablespace 表空间名 online;
只读表空间
如果不希望表空间进行update|delete|insert,可将其修改为只读
alter tablespace表空间名read only;
可读表空间
alter tablespace表空间名read write;
显示表空间下所有表
select * from all_table wheretablespace_name=’ 表空间名’
显示表所属表空间
select tablespace,table_name fromuser_tables where table_name=’ 表名’
删除表空间特权用户或dba操作或具有drop tablespace系统权限
drop tablespace 表空间名 including contents anddatafiles;
including contents 删除表空间时,删除该空间的所有数据库对象
datafiles表示将数据库文件也删除
扩展表空间
表空间由数据文件组成,表空间大小实际就是数据文件大小的总和。
假设表emp建立在表空间data01上,初始大小为2m,当2m空间满后,再插入数据会提示空间不足的错误
案例:
建立表空间 sp01
在该表空间建立与dept表结构一样的表mydept
向表中插入数据 insertinto mydept select * from dept;
当一定时候出现无法扩展的问题,怎么解决?
扩展表空间三种方法:
增加数据文件
alter tablespace表空间名add datafile ‘d:\test\sp01.dbf’size 20m
增加数据文件大小
alter database datafile ‘d:\test\sp01.dbf’resize 20m;
数据文件大小不要超过500m
设置文件自动增长
alter database datafile ‘d:\test\sp01.dbf’autoextend on next 10m maxsize 500m;
移动数据文件
当数据文件所在磁盘损坏时,数据文件不能使用,为了能够重新使用,需要将这些文件的副本移动到其它磁盘,然后恢复
移动sp01.dbf
确定数据文件所在的表空间
select tablespace_name from dba_data_fileswhere file_name=’d:\test\sp01.dbf’;
使表空间脱机
确保文件一致性,将表空间转变为offline
alter tablespace sp01 offline;
使用命令移动数据文件到指定目标位置
host move d:\test\sp01.dbf c:\test\sp01.dbf
alter tablespace命令执行
物理移动数据后,altertablespace命令对数据库文件进行逻辑修改
alter tablespace sp01 rename datafile ‘d:\test\sp01.dbf’to ‘c:\test\sp01.dbf’
使表空间联机
移动数据文件后,为了使用户可以访问该表空间,必须将其转换为online状态
alter tablespace sp01 online;
显示表空间信息
dba_tablespace
select tablespace_name fromdba_tablespaces;
显示表空间所包含的数据文件
dba_data_files
select file_name,bytes from dba_data_fileswhere tablespace_name=’表空间名’;