文章版权所有Jusin Hao(luckyfriends),支持原创,转载请注明。
1. 表空间相关管理 明确表空间和数据文件的目的
表空间和数据文件:从逻辑上来讲,Oracle将数据存储在表空间中,实际上存储在数据文件中;
表空间:能属于仅仅一个数据库,包括一个或更多数据文件,更进一步被划分成为存储的逻辑单元;
数据文件:能属于仅仅一个表空间和一个数据库,模式对象(表、索引)数据的一个储存处; 使用dbca创建数据库中的的表空间构成
system:系统表和系统回滚段;
sysaux:某些系统标位置;
temp:临时段;
undotbs1:回滚段;
users:用户数据所在
example:示例模式的位置; 表空间概念
表空间类型:永久表空间、临时表空间、还原表空间;
表空间的定义的管理方式:
1) 本地管理的表空间:自由的盘区信息在表空间中被管理;
用位图来记录自由盘区信息
每一点映射一个块或若干块;
点的值表明自由或者已被使用;
2) 词典管理的表空间:自由盘区信息在数据词典中被管理(内部管理)
当空间分配获得释放时,适当的系统表被更新;
注意:如果系统表空间(system表空间)是本地管理方式则后续创建的表空间要都是本地管理的表空间;如果系统表空间是字典管理的表空间则后续创建的表空间可以是字典管理的也可以是本地管理的;
本地表空间的盘区管理有两种方式:统一管理方式、自动管理方式; 使用命令创建表空间
创建普通表空间例子:
create tablespace user_data datafile 'F:\oracle\product\10.2.0\oradata\test\userdata01.dbf' size 10M extent management local segment space management auto;
create temporary tablespace temp_data tempfile 'F:\oracle\product\10.2.0\oradata\test\tempdata01.dbf' size 10M extent management local uniform size 16K;
create tablespace test01 datafile 'F:\oracle\product\10.2.0\oradata\test\test01_01.dbf' size 10M autoextend on next 1m maxsize 50m extent management local segment space management auto;
create tablespace test02 datafile 'F:\oracle\product\10.2.0\oradata\test\test02_01.dbf' size 50M extent management local uniform size 512K;
create tablespace test03 datafile 'F:\oracle\product\10.2.0\oradata\test\test03_01.dbf' size 10M autoextend on extent management local;
create tablespace test04 datafile 'F:\oracle\product\10.2.0\oradata\test\test04_01.dbf' size 10M autoextend on next 2m maxsize 50m autoallocate extent management local segment space management auto;
创建大文件表空间
create bigfile tablespace bigtbs datafile 'F:\oracle\product\10.2.0\oradata\test\bigtbs_01.dbf' size 50G;
1)segment space management{auto|manual}表明了对segment中自由空间的管理方式(manual、auto),即表明追踪segment中自由空间(表的剩余空间)是通过freelist(manual)还是bitmaps(auto),如果设为auto在此tablespace中相应的对象的pctused、freelsit、freelistgroups存储参数将被忽略;
2)segment space management 子句有一定的限制:only for permanent,local managed tablespace ,并且不能对system表空间使用;
3)Oracle 9i创建表空间默认是manual,10G默认是auto;
4)Oracle表空间由段(segment)组成,段由连续的块(block)组成,当在表空间里创建一个table、index等对象的时候,对于使用者而言称其为对象,但是对于Oracle存储的角度来说是segment;Oracle最小的读写单位是block,但是在为对象(segment)分配空间时单位是extent,这样做是为了效率;
5)uniform size 5M表示是表空间未满的情况下以5M的盘曲分配空间给段;autoallocate表示由Oracle自动分配盘区的大小(默认是自动的)
6)autoextend on next 64K表示表空间满后,以64K的盘区单位为表空间扩展空间;
7)创建大文件表空间可以指定盘区分配方式(如uniform或autoallocate)但是不能将段管理方式指定为manual;
8)创建临时表空间时盘区分配方式不能指定为autoallocate,只能uniform(默认是manual);
9)创建撤销表空间不能使用uniform指定统一的区大小; 、管理表空间 改变表空间状态
表空间状态:读写(read write)、只读(read only)、脱机(offline)
联机状态:alter tablespace test01 online;
脱机状态:alter tablespace test01 offline;
注意:表空间脱机状态下数据访问是被禁止的,system表空间和包含回滚段的表空间不能被脱机;
只读表空间就是只允许从中读取数据,而不能写数据的表空间,这类表空间通常用于保存一些不允许用户修改的数据;
alter tablespace test01 read only;
alter tablespace test01 read write; 删除表空间
删除表空间和之上的对象及表空间包含的数据文件:drop tablespace user_data including contents and datafiles;
如果表空间中有内容则删除表空间必须加上contents这项;
如果误删了某个不重要的表空间的数据文件时想要删除表空间不能或者重启数据库后只能到mount状态不能打开数据库(同时不能删除表空间),这时需要使表空间的数据文件脱机后再删除或打开数据库后删除:
alter database datafile 5 offline;
alter database datafile ‘/u01/test01.dbf’ offline drop;
如果对sysaux表空间执行了offline drop则在online的时候会提示进行介质恢复(recover database) 获得表空间信息
dba_tablespace
v$datafile
dba_data_files;
dba_temp_files;
v$tempfile 改变表空间的尺寸
> 为表空间创建新的数据文件
alter tablespace my_data add datafile ‘f:\oracle\oradata\test\test01_02.dbf’ size 200m;
> 手工改变数据文件尺寸
alter database datafile ‘f:\oracle\oradata\test\test01_02.dbf’ resize 200m;
> 使表空间自动扩展
alter database datafile ‘f:\oracle\oradata\test\test01_02.dbf’ autoextend on next 10m maxsize 500M;
alter database datafile ‘f:\oracle\oradata\test\test01_02.dbf’ autoextend off;
? 删除数据文件
alter tablespace test01 drop datafile ‘f:\oracle\oradata\test\test01_02.dbf’;
(删除表空间的数据文件前提是这个数据文件中没有数据并且该数据文件正常(没有脱机、没有坏)) 移动数据文件
方法1)
? 表空间必须脱机(此时数据库open)
? 目标数据文件必须存在(拷贝数据文件到目标位置)
? 用命令修改控制文件指向:alter tablespace my_data rename datafile ‘f:\oracle\oradata\test\test01_02.dbf’ to ‘D:\oradata\test\test01_02.dbf’;’;
? 表空间联机
这种情况下只能移动除系统表空间(system表空间)和回退表空间以外的其他数据文件;
方法2)
? 数据库要在mount状态
? 目标数据文件必须存在(拷贝数据文件到目标位置)
? alter database rename file ‘f:\oracle\oradata\test\system01.dbf’ to ‘d:\ oradata\test\system01.dbf’ ;
? alter database open;
这种情况下可以一定包括系统表空间、回退表空间在内的所有数据文件;