Oracle 数据库是由若干个表空间构成的。任何数据库对象在存储时都必须存储在某个 表空间中。表空间对应于若干个数据文件,即表空间是由一个或多个数据文件构成的。
系统表空间 (system tablespace) 是每个 Oracle 数据库都必须具备的。其功能是在系统表空 间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统 表空间的名称是不 可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必 要条件。因此,系统表空间 是不能脱机的。
(1)系统表空间包括数据字典、存储过程等信息。为避免系统表空间产生存储碎片以及争用 系统资 源的问题,应创建一个独立的表空间用来单独存储用户数据。
SYSTEM 表空间建议不存放用户数据,应当为系统设定缺省的默认表空间来避免用户创 建时使用系统表空间
SQL> select property_name,property_value from database_properties where property_name like 'DEFAULT%';
测试 SYSTEM 表空间不能脱机、不能置为只读、不能重命名、不能删除
(2) SYSAUX 表空间
SYSAUX 表空间是随着数据库的创建而创建的,它充当SYSTEM 的辅助表空 间,主要存储除数据字典以外的其他对象。SYSAUX 是数据库的默认表空间,使 用SYSAUX 表空间,降低了SYSTEM 表空间的负荷。
• 不能删除
• 不能重命名
• 不能置为read only
(3) 临时表空间
临时表空间 (temp tablespace) 主要用于存储Oracle 数据库运行期间所产 生的临时数据。主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要 原因是需要对查询的中间结果进行排序。当数据库关闭后,临时表空间中所有数 据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。
临时表空间的主要作用:
索引create 或rebuild
Order by 或group by
Distinct 操作
Union 或intersect 或minus
Sort-merge joins
analyze
(4) 撤销表空间 (undo tablespace)
撤销表空间用于保存Oracle 数据库撤销信息,即保存用户回滚段的表空间 称之为回滚表空间 (或简称为撤销表空间) 。UNDO 表空间用于存入数据修改后 的旧值。
Update t set id=3 where id=9;
undo 表空间的大小,直接影响到flashback query 的查询能力, 因为多版 本查询所依赖的undo 数据都存储在undo表空间中,该表空间越大,所能够存储 的undo数据自然也越多,如果该表空间可用空间非常小,别说flashback了,恐 怕正常查询都有可能出错。
初始化参数UNDO_RETENTION,该参数用来指定undo记录保存的最长时间,以 秒为单位,是个动态参数,完全可以在实例运行时随时修改,通常默认是900秒, 也就是15分钟。
一定要注意,undo_retention只是指定undo数据的过期时间,并不是说undo 中的数据一定会在undo表空间中保存15分钟, 比如说刚一个新事务开始的时候, 如果undo表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而 不管这些数据是否已过期,因此,当你创建一个自动管理的undo表空间时,还要 注意其空间大小,要尽可能保证undo表空间有足够的存储空间。
同时还要注意,并不是说,undo_retention中指定的时间一过,已经提交事 务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它仍然会存 在,并可随时被flashback特性引用。如果你的undo表空间足够大,而数据库又 不是那么繁忙,那么其实undo_retention参数的值并不会影响到你,哪怕你设置 成1,只要没有事务去覆盖undo数据,它就会持续有效。因此,这里还是那句话, 要注意undo表空间的大小,保证其有足够的存储空间。
只有在一种情况下,undo表空间能够确保undo中的数据在undo_retention 指定时间过期前一定有效,就是为undo表空间指定retention guarantee,指定 之后,oracle对于undo表空间中未过期的undo数据不会覆盖。
SQL> Alter tablespace undotbs1 retention guarantee;
如果想禁止undo 表空间retention guarantee,
SQL> Alter tablespace undotbs1 retention noguarantee;
一个事务执行必须获得足够的undo空间来存储事务产生的undo信息,如果事 务不提交,则undo信息被保留,如果事务提交了,则undo信息不一定会保留,因 为undo循环使用。
例:一定能闪回查询1天之内发生的变化,即要求undo保留1天。需启动 guaranteeing undo retention强制保留属性。
SQL> show parameter undo_retention
900秒=15分钟
SQL> alter system set undo_retention=86400;
强制保留undo类型表空间
SQL> desc dba_TABLESPACEs
SQL> select tablespace_name,retention from dba_tablespaces where contents='UNDO';设置强制保留,undo信息在undo表空间至少存储1天,不到1 天,是不能被覆盖的,所以一定可以完成1天闪回查询
SQL> alter tablespace undotbs1 retention guarantee;
如果设置强制的时候,undo表空间不够呢?事务如果拿不到足够的空间,又 不能去重用,则事物会失败。
例子
SQL>create undo tablespace undo02 datafile
'/u01/app/oracle/oradata/orcl/undo02.dbf' size 5M;
SQL>alter system set undo_tablespace=undo02;
SQL>alter tablespace undo02 retention guarantee;
SQL>select tablespace_name,retention from dba_tablespaces where contents='UNDO';
SQL>show parameter undo
SQL>create table big as select * from all_objects;
SQL>delete from big;
提示错误:ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDO02'
分批删除:
SQL>delete from big where rownum<=500;
失败--》如果拿不到足够的空间,事务无法执行
SQL>delete from big where rownum<=100;
成功删除
还原undo
SQL>alter system set undo_tablespace=undotbs1;
SQL>delete from big;
成功删除
1、查看数据库有哪些表空间
1) 包含数据库中所有表空间的描述信息 select * from dba_tablespaces; select name from v$tablespace;
2) 包含当前用户的表空间的描述信息 select * from user_tablespaces;
3) 包含从控制文件中获取的表空间名称和编号信息
select * from v$tablespace;
select name from v$tablespace;
2、查看表空间对应的数据文件
1) 包含数据文件以及所属的表空间的描述信息 select * from dba_data_files;
select file_name,tablespace_name from dba_data_files;
2) 包含临时数据文件以及所属的表空间的描述信息 SELECT * FROM DBA_TEMP_FILES;
3) 包含从控制文件中获取的数据文件的基本信息,包括所属的表空间名称、 编号等
SELECT * FROM V$DATAFILE;
SELECT name,file#,status,bytes,checkpoint_change# last_scn FROM v$datafile;
4) 包含所有临时数据文件的基本信息 select * from v$tempfile;
3、查看默认的TEMP表空间
1) 数据库级别
select property_name, property_value from database_properties
where property_name='DEFAULT_TEMP_TABLESPACE';
2) 用户级别
select username, default_tablespace from dba_users;
4、查看默认的永久表空间,如果创建用户时,不指定其永久表空间,则会使用 默认的表空间。
select property_name, property_value from database_properties;
5、查看默认的表空间类型,如果不指定表空间类型,就会默认使用 DEFAULT_TBS_TYPE参数指定的表空间类型。
select property_name, property_value from database_properties where property_name='DEFAULT_TBS_TYPE';
7、查看表空间的数据文件
1) 永久表空间/UNDO表空间
SELECT * FROM DBA_DATA_FILES;
2) 临时表空间
SELECT * FROM V$TEMPFILE;
3)查询数据文件的基本信息
SELECT name,file#,status,bytes,checkpoint_change# last_scn FROM v$datafile;
7、查看表空间的大小及已用大小
SQL> select tablespace_name,bytes/1024/1024
cur_size,user_bytes/1024/1024 as user_bytes,status,online_status from dba_data_files;
8、查看表空间的剩余空间
select tablespace_name,sum(bytes/1024/1024) from dba_free_space group by tablespace_name;
使用DBA_FREE_SPACE 视图查询所有表空间的自由空间
SELECT tablespace_name, count(*),max(blocks), sum(blocks) FROM dba_free_space GROUP BY tablespace_name;
9、查看已用空间的百分比
select a.tablespace_name,round((sizea-sizeb),2) as used_space, round(sizeb,2) | |'MB' as free_space,round((sizea-sizeb)/sizea*100,2) | |'%' as used_percent from (select tablespace_name,bytes/1024/1024 sizea from dba_data_files) a inner join (select
tablespace_name,sum(bytes/1024/1024) sizeb from dba_free_space group by tablespace_name) b on a.tablespace_name = b.tablespace_name order by a.tablespace_name;
查询表空间users 的大小
select sum(bytes) from dba_data_files where tablespace_name='users'; 使用DBA_EXTENTS 视图,检查给定段的区的信息
select extent_id,file_id,block_id,blocks from dba_extents where owner = 'SCOTT' AND segment_name='EMP';
通过DBA_SEGMENTS 视图,查看段的区和块的数目,查询分配给EMP 段的区和块的 数目
select segment_name,extents,blocks,bytes from dba_segments where owner = 'SCOTT' AND segment_name='EMP';
查询scott 用户拥有的段类型和个数。
select segment_type,count(*) seg_count from dba_segments where owner='SCOTT' GROUP BY SEGMENT_TYPE;
使用DBA_FREE_SPACE 视图,查询所有表空间的自由空间
SELECT tablespace_name, count(*),max(blocks), sum(blocks) FROM dba_free_space GROUP BY tablespace_name;
查看表空间的段的管理方式,区的分配
select
tablespace_name,block_size,extent_management,segment_space_management, allocation_type,bigfile from dba_tablespaces;
查看表空间的自动扩展
select file_name,autoextensible,tablespace_name from dba_data_files; 查看数据库的特性
select * from database_properties;
查看临时表空间组
select * from dba_tablespace_groups;
查询数据库包含的表空间信息
select name from v$tablespace;
查询表空间及数据文件的信息
select file_name,tablespace_name from dba_data_files;
查询数据文件的基本信息
SELECT name,file#,status,bytes,checkpoint_change# last_scn FROM v$datafile;
查询表空间users 的大小
SELECT sum(bytes) FROM dba_data_files WHERE tablespace_name='users'; 查看表空间的名称、状态、区的管理方式、段的管理方式、初始区的大小、下一个分配区的 大小、块的大小的信息
SQL> set linesize 200
SQL> select TABLESPACE_NAME,STATUS,EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT,INITIAL_EXTEN T/1024 KB,NEXT_EXTENT/1024 KB,BLOCK_SIZE from dba_tablespaces ;
查看表空间名称、表空间对应的数据文件、数据文件 (表空间) 的大小、数据文件的状态、 数据文件是否自动扩展、数据文件最大大小、使用的大小
SQL> col TABLESPACE_NAME format a10
SQL> col file_NAME format a50
SQL> select TABLESPACE_NAME,FILE_NAME,BYTES/1024/1024 MB,STATUS,AUTOEXTENSIBLE,MAXBYTES,USER_BYTES/1024/1024 MB from dba_data_files ;
SQL> select TABLESPACE_NAME, FILE_NAME,BYTES/1024/1024
MB,STATUS,AUTOEXTENSIBLE,MAXBYTES,USER_BYTES/1024/1024 MB from dba_temp_files ; 查看数据文件的编号,数据文件的名称,数据文件的状态,数据文件的大小
SQL> col name format a50
SQL> select FILE#,NAME,STATUS,BYTES/1024/1024 MB from v$datafile ; SQL> select FILE#,NAME,STATUS,BYTES/1024/1024 MB from v$tempfile ; 查看表空间的空闲空间
SQL> select TABLESPACE_NAME,FILE_ID,BYTES/1024/1024 MB from dba_free_space ; 查看 TEMP 表空间的空闲空间
SQL> select TABLESPACE_NAME,TABLESPACE_SIZE/1024/1024 MB,FREE_SPACE/1024/1024 MB from dba_temp_free_space ;
ORACLE允许使用自定义的表空间作为默认永久性表空间,使用下面SQL语句 查看数据库的默认永久表空间和默认临时表空间。
select * from database_properties where property_name = 'DEFAULT_PERMANENT_TABLESPACE';
使用alter database default tablespace语句可以设置数据库的默认永久 性表空间,这样建立用户时,默认将使用指定的表空间。
数据库级别:
1) 永久表空间
alter database default tablespace users;
2) 临时表空间
alter database default temporary tablespace temp;
用户级别
1) 永久表空间
alter user user_name default tablespace new_tablespace_name; 2) 临时表空间
alter user user_name temporary tablespace new_tablespace_name;
查看用户对应的默认表空间
select username, default_tablespace from dba_users;
11、创建表空间
1) 创建mytbs8 并设置数据文件为自动扩展
CREATE TABLESPACE mytbs8 DATAFILE
'/u01/app/oracle/oradata/orcl/mytbs08.dbf' SIZE 5M AUTOEXTEND ON NEXT 1M MAXSIZE 50M;
2) 查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND
SELECT FILE_NAME,AUTOEXTENSIBLE FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='MYTBS8';
3) 设置自动段空间管理
CREATE TABLESPACE mytbs10 DATAFILE '/u01/app/oracle/oradata/orcl/ mytbs10.dbf ' SIZE 5M extent management local uniform size 64K segment space management auto;
select tablespace_name,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;
本地管理表空间有自动分配(autoallocate)和统一大小分配(uniform)两种 空间分配方式,自动分配方式(AUTOALLOCATE)是由系统来自动决定extents大小, 而统一大小分配(UNIFORM)则是由用户指定extents大小。这两种分配方式都提高 了空间管理效率。uniform:默认为1M大小,在temp表空间里为默认的,但是不 能被应用在undo表空间。
extent management local autoallocate + segment space management auto
create tablespace 名称 datafile '路径' size 大小;
create tablespace 名称 datafile '路径' size 大小,'路径' size 大小; create tablespace 名称 datafile '路径' size 大小 autoextend on; create tablespace 名称 datafile '路径' size 大小 autoextend on next 大 小 maxsize 大小|unlimited;
create tablespace 名称 datafile '路径' size 大小 extent management local autoallocate;
create tablespace 名称 datafile '路径' size 大小 extent management local autoallcocate segment space management auto;
locally managed + ASSM + allocate uniform
create tablespace 名称 datafile '路径' size 大小 segment space management auto extent management local uniform size 大小;
create tablespace 名称 datafile '路径' size 大小 extent management local uniform size 大小;
locally managed + MSSM + autoallcocate
create tablespace 名称 datafile '路径' size 大小 segment space management manual extent management local autoallcocate;
locally managed + MSSM + allocate uniform
create tablespace 名称 datafile '路径' size 大小 segment space management manual extent management local uniform size 大小 ;
4) 创建一个2K 块大小的表空间mytbs2k,并验证
设置初始化参数DB_2K_CACHE_SIZE, 重新启动使参数设置生效 ALTER SYSTEM SET DB_2k_CACHE_SIZE=16M SCOPE=SPFILE; 创建表空间
create tablespace mytbs2k datafile
'/u01/app/oracle/oradata/orcl/mytbs2k_1.dbf' size 10M blocksize 2K; 验证
SELECT tablespace_name,block_size FROM dba_tablespaces WHERE tablespace_name='MYTBS2K';
12、删除表空间
删除表空间时,ORACLE仅仅是在控制文件和数据字典中删除与表空间和数据 文件相关的信息。默认情况下,ORACLE并不会在操作操作系统中删除相应的数据 文件,因此在成功执行删除表空间的操作后,需要手动删除该表空间在操作系统 中对应的数据文件。
如果在删除表空间的同时要删除对应的数据文件,则必须显示的指定 INCLUDING CONTENTS AND DATAFILES子句。
注意:当前数据库级的默认表空间不能删除,用户级的可以删除。
语法如下:
DROP TABLESPACE 表空间名 [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]
1)在表空间mytbs8上创建表
CREATE TABLE test (name varchar(20)) TABLESPACE mytbs8; 2)删除表空间mytbs8
DROP TABLESPACE mytbs8;
删除表空间mytbs8,增加选项,表空间mytbs8 中包含一个表段, 因此必须 带INCLUDING CONTENTS 子句
DROP TABLESPACE mytbs8 INCLUDING CONTENTS AND DATAFILES; 3)删除表空间system
drop tablespace system INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
使用DROP TABLESPACE 命令须遵守如下原则:
• 如果表空间中包含数据段,必须使用INCLUDING CONTENTS 选项。
• 删除表空间后,其数据将不再包含在数据库内。
• 在删除表空间时,只删除关联数据库控制文件内的文件指针。操作系统文
件仍然存在,如果未使用AND DATAFILES 子句或数据文件是OMF,则必须使用适 当的操作系统命令明确删除这些文件。
• 即使将表空间切换到只读状态,仍可以删除该表空间以及其中的段。
• 删除表空间之前,建议将表空间脱机, 以确保没有事务处理访问该表空间 内的任何段。
• 不能删除下列表空间:SYSTEM 表空间和具有活动段的表空间。
删除空的表空间,不会删除表空间所对应的数据文件
drop tablespace 名称;
删除非空的表空间,不会删除表空间所对应的数据文件
drop tablespace 名称 including contents;
删除非空的表空间, 同时删除表空间所对应的数据文件
drop tablespace my12 including contents and datafiles;
13、调整表空间
1)增加数据文件
如发现某个表空间存储空间不足时,可以为表空间添加新的数据文件,扩展 表空间大小。但是一般建议预先估计表空间所需的存储空间大小,然后为它建立 若干适当大小的数据文件。
2)调整数据文件大小
3) 开启自动扩展
4) 关闭自动扩展
14、删除数据文件
ALTER TABLESPACE 表空间名称 DROP DATAFILE '位置';
ALTER TABLESPACE 表空间名称 DROP TEMPFILE '位置';
删除数据文件
使用 ALTER TABLESPACE … DROP DATAFILE 或 DROP
或临时数据文件
删除数据文件和临时文件的限制:
数据库必须处于打开 (open) 状态。 只能删除空的数据文件。
不能删除表空间中的第一个或唯一数据文件。 不能删除 SYSTEM 表空间中的数据文件。 本地管理的表空间中的数据文件处于脱机状态,
TEMPFILE 语句删除单个数据文件
则不能将其删除。
例:
SQL> alter tablespace users drop datafile 'D:\ORCL\APP\PC\ORADATA\ORCL\USERS09.DBF' ;
alter tablespace users drop datafile 'D:\ORCL\APP\PC\ORADATA\ORCL\USERS09.DBF' *
第 1 行出现错误:
ORA-03261: 表空间 USERS 只有一个文件
SQL> create tablespace my datafile 'd:\my.dbf' size 10M,'d:\my1.dbf' size 20M; SQL> select tablespace_name,file_name from dba_data_files ;
SQL> alter tablespace my dropdatafile 'D:\MY1.DBF' ;
SQL> select tablespace_name,file_name from dba_data_files ;
另例:
SQL> create temporary tablespace temp1 tempfile 'd:\temp1.dbf' size 10M,'d:\temp2.dbf' size 20M;
SQL> select tablespace_name,file_name from dba_temp_files ;
SQL> alter tablespace temp1 drop tempfile 'D:\TEMP2.DBF' ;
SQL> select tablespace_name,file_name from dba_temp_files ;
15、重命名和重定位数据文件
1、重命名和重定位在线 (数据库 OPEN,表空间是联机) 数据文件
使用 alter database move datafile 重命名或重定位在线数据文件。该语句可以在数
据库打开且用户正在访问数据文件时重命名或重定位数据文件。
重命名或重定位在线数据文件时,数据库控制文件中记录的指向数据文件的指针会更 改。还会在操作系统级别进行物理重命名或重定位。
当运行 ALTER DATABASE MOVE DATAFILE 语句并且目标位置中存在一个具有相同名称的 文件时,可以指定 REUSE 用于覆盖现有文件的选项。如果 REUSE 没有指定,并且具有相同名 称的文件中的目标位置存在,现有文件不会被覆盖,并且该语句返回一个错误。
默认情况下,当运行 ALTER DATABASE MOVE DATAFILE 语句并为数据文件指定新位置时, 该语句将移动数据文件。但是,可以指定将 KEEP 数据文件保留在旧位置并将其复制到新位 置的选项。在这种情况下,当语句成功完成时,数据库仅在新位置中使用数据文件。在 Windows平台上重定位数据文件时,即使 KEEP 省略了该选项,原始数据文件也可能保留在 旧位置。在这种情况下,当语句成功完成时,数据库仅在新位置中使用数据文件。操作完成 后,可以根据需要手动删除旧数据文件。
当使用 ALTER DATABASE MOVE DATAFILE 语句重命名或重定位数据文件时,Oracle 数据 库在执行操作时会创建该数据文件的副本。在操作过程中,请确保有足够的磁盘空间用于原
始数据文件和副本。
例:
重命名数据文件
SQL> select tablespace_name,file_name,AUTOEXTENSIBLE,bytes/1024/1024 Mb,MAXBYTES from dba_data_files ;
SQL> alterdatabasemovedatafile 'D:\ORCL\APP\PC\ORADATA\ORCL\USERS01.DBF' to 'D:\ORCL\APP\PC\ORADATA\ORCL\USERS091.DBF' ;
SQL> select tablespace_name,file_name,AUTOEXTENSIBLE,bytes/1024/1024 Mb,MAXBYTES from dba_data_files ;
重定位数据文件
SQL> select tablespace_name,file_name,AUTOEXTENSIBLE,bytes/1024/1024 Mb,MAXBYTES from dba_data_files ;
SQL> alter database move datafile 'D:\ORCL\APP\PC\ORADATA\ORCL\USERS091.DBF' to 'D:\ORCL\APP\PC\ORADATA\USERS091.DBF' ;
SQL> select tablespace_name,file_name,AUTOEXTENSIBLE,bytes/1024/1024 Mb,MAXBYTES from dba_data_files ;
复制在线数据文件
SQL> alter database move datafile 'D:\ORCL\APP\PC\ORADATA\USERS091.DBF' to 'D:\ORCL\APP\PC\USERS091.DBF' keep ;
重定位数据文件且覆盖存在的数据文件
SQL> alter database move datafile 'D:\ORCL\APP\PC\USERS091.DBF' to
'D:\ORCL\APP\PC\oradata\USERS091.DBF' reuse ;
1) 重命名单个表空间中的脱机数据文件
表空间脱机
ALTER TABLESPACE users OFFLINE NORMAL ;
利用操作系统命令重命名数据文件
使用 ALTER TABLESPACE …. RENAME DATAFILE 改变文件
alter tablespace users rename datafile 'D:\USER02.DBF' TO 'D:\USER07.DBF ' ; 备份数据库(可选,强烈建议要备份数据库)
表空间联机
alter tablespace users online
2) 在单个表空间中重定位脱机数据文件
查看表空间信息
SELECT FILE_NAME, BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'USERS' ; 表空间脱机
ALTER TABLESPACE users OFFLINE NORMAL ;
利用操作系统命令复制数据文件到新的位置
使用 ALTER TABLESPACE …. RENAME DATAFILE 改变文件
ALTERTABLESPACEusersRENAMEDATAFILE 'D:\USER02.DBF' TO 'D:\pc\USER07.DBF ' ;
或
ALTERDATABASERENAMEFILE '/u02/oracle/rbdb1/sort01.dbf',
'/u02/oracle/rbdb1/user3.dbf'
TO '/u02/oracle/rbdb1/temp01.dbf',
'/u02/oracle/rbdb1/users03.dbf' ;
备份数据库
表空间联机
ALTER TABLESPACE users ONLINE
3) 重命名和重定位多个表空间中的脱机 (数据库mount) 数据文件
1、查看数据文件位置
SQL> select name from v$datafile ;
2、关闭数据库
SQL> shutdown immediate
3、使用操作系统命令复制数据文件到新的位置或新的名字
4、数据库 mount SQL> startup mount
5、使用 ALTER DATABASE 修改
SQL> alterdatabaserenamefile 'D:\ORCL\APP\PC\ORADATA\SYSTEM01.DBF' to 'D:\ORCL\APP\PC\ORADATA\orcl\SYSTEM01.DBF' ;
6、打开数据库
SQL> alter database open ;
SQL> select name from v$datafile ;
7、备份数据库 (可选,建议做)
16、数据文件脱机
将数据文件/u01/app/oracle/mytbs08.dbf改为脱机状态 (注:归档模式下) SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/mytbs08.dbf' OFFLINE;
17、数据文件联机
再改为联机状态
recover datafile '/u01/app/oracle/oradata/orcl/mytbs08.dbf'
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/mytbs08.dbf' ONLINE;
18、维护表空间
表空间状态有下面几种状态:online、offline、read only、read write, 通过SQL语句查看表空间的状态。
SELECT TABLESPACE_NAME, CONTENTS, STATUS FROM DBA_TABLESPACES; SELECT FILE#, STATUS, ENABLED FROM V$DATAFILE;
1) 表空间脱机
设置脱机状态,可以使用下面4个参数来控制脱机方式
NORMAL 该参数表示将表空间以正常方式切换到脱机状态,在进入脱机状态过程 中,ORACLE会执行一次检查点,将SGA区中与该表空间相关的脏缓存块写入数据 文件中,然后再关闭表空间的所有数据文件。如果在这过程中没有发生任何错误, 则可以使用NORMAL参数,这也是默认的方式。
TEMPORARY 该参数将表空间以临时方式切换到脱机状态。这时ORACLE在执行检查 点时并不会检查各个数据文件的状态,即使某些数据文件处于不可用状态, ORACLE也会忽略这些错误。这样将表空间设置为联机状态时,可能需要进行数据 恢复。
IMMEDIATE 该参数将表空间以立即方式切换到脱机状态,这时ORACLE不会执行检 查点,也不会检查数据文件是否可用。而是直接将属于表空间的数据文件设置为 脱机状态。下一次将表空间恢复为联机状态时必须进行数据库恢复。
FOR RECOVER 该参数将表空间以用于恢复方式切换到脱机状态,如果要对表空间 进行基于时间的恢复,可以使用这个参数将表空间切换到脱机状态。
如果数据库运行在非归档模式下(NOARCHIVELOG), 由于无法保留恢复表空间所需 要的重做数据,所以不能将表空间以立即方式切换到脱机状态。
注意:脱机 (offline) 一般用于数据库的联机备份,数据恢复等维护操作。有 些表空间不能OFFLINE,如:SYTEM,UNDO等
SYTEM 不能offline,也不能read only
当前的UNDO表空空间,不能offline,也不能read only
当前的临时表空间不能offline,也不能read only
SYSAUX可以offline 不能read only
如:
SQL> CREATE TABLE test (name varchar(20)) TABLESPACE mytbs8; 测试: 向表中插入一条数据
SQL> INSERT INTO test VALUES ('SHEN');
SQL> commit;
将mytbs8 表空间改为脱机状态,并向test 表中插入一条数据进行验证 SQL> ALTER TABLESPACE mytbs8 OFFLINE NORMAL;
SQL> SELECT * FROM test;
2) 表空间联机
将mytbs8 表空间改为联机状态,并向test 表中插入一条数据进行验证。 ALTER TABLESPACE mytbs8 ONLINE;
INSERT INTO test VALUES('SHEN');
3) 表空间只读
在表空间mytbs8 中创建表test,将mytbs8 表空间更改为只读状态,验证能 否插入数据,能否删除表。
CREATE TABLE test (name varchar(20)) TABLESPACE mytbs8; 将表空改为只读状态
ALTER TABLESPACE mytbs8 READ ONLY;
测试: 向表中插入一条数据
SQL> INSERT INTO test VALUES ('SHEN');
SQL> ALTER TABLESPACE mytbs8 REAd write;
SQL> INSERT INTO test VALUES ('SHEN');
只读下能否删除表
SQL> ALTER TABLESPACE mytbs8 READ ONLY;
SQL> DROP TABLE test;
表空间只读时,其中的表不能进行任何DML操作,可以删除表。
4) 表空间读写
ALTER TABLESPACE TBS_DM_DAT READ WRITE;
可以延迟打开只读表空间的数据文件,直到访问它们时才打开。当非常大的数据库存储
在慢速访问设备或分层存储中的只读表空间中时,考虑将 READ_ONLY_OPEN_DELAYED 初始化 参数设置为 TRUE。使只读表空间中的数据文件在尝试读取存储在其中的数据时才首次访问, 从而加快某些操作 (主要是打开数据库) 的速度。
设置 READ_ONLY_OPEN_DELAYED=TRUE 具有以下副作用:
在打开时未检测到丢失或错误的只读文件。仅在尝试访问它时才发现它。 ALTER SYSTEM CHECK DATAFILES 不检查只读文件。
ALTER TABLESPACE...ONLINE 并且 ALTER DATABASE DATAFILE...ONLINE 不检查只读文
件。仅在首次访问时才检查它们。
V$RECOVER_FILE,V$BACKUP 和 V$DATAFILE_HEADER 不访问只读文件。只读文件在结果
列表中显示为错误“ DELAYED OPEN” ,其他列的值则为零。
V$DATAFILE 不访问只读文件。只读文件的大小为“ 0”。
V$RECOVERY_LOG 不访问只读文件。
ALTER DATABASE NOARCHIVELOG 不访问只读文件。即使存在需要恢复的只读文件,它也
会继续进行。
例:
show parameter read_only_open_delayed
SQL> alter system set read_only_open_delayed=true scope=spfile ;
重启数据库后,参数生效
SQL> shutdown immediate
SQL> startup
show parameter read_only_open_delayed
19、表空间改名
alter tablespace 旧名称 rename to 新名称;
使用的 RENAME TO 子句 ALTER TABLESPACE,可以重命名永久或临时表空间。重命名表 空间时,数据库会更新对数据字典,控制文件和 (在线) 数据文件头中表空间名称的所有引 用。数据库不会更改表空间 ID,因此,如果该表空间是用户的默认表空间,则重命名的表
空间将在 DBA_USERS 视图中显示为用户的默认表空间。
以下会影响重命名表空间的操作:
SYSTEM 表空间或 SYSAUX 表空间,不会被重命名,并且会引发错误。
表空间中的数据文件处于脱机状态,或者表空间处于脱机状态,那么该表空间不会重命
名,并且会引发错误。
表空间是只读的,则不会更新数据文件头。它将产生一条消息并写入警报日志,该消息
指示尚未重命名数据文件头。数据字典和控制文件已更新。
表 空 间 是 默认 的 临 时表 空 间 , 则 数据库 属 性表 中的相应 条 目将 更新 , 并且 该
DATABASE_PROPERTIES 视图将显示新名称。
如果表空间是 UNDO 表空间,并且满足以下条件,则表空间名称将在服务器参数文件
(SPFILE) 中更改为新的表空间名称。
使用服务器参数文件启动数据库。
如果使用传统的初始化参数文件 (PFILE) ,则会向警报日志中写入一条消息,指
出必须手动更改初始化参数文件。
例:
ALTER TABLESPACE 语句中使用RENAME子句,修改表空间的名称。
create tablespace tbs_dm_dat atafile 'tbs_dm_dat.dbf' size 50m extent
management local segment space management auto online
alter tablespace tbs_dm_dat rename to tbs_dm_data
SELECT TABLESPACE NAME FROM DBA TABLESPACES WHERE TABLESPACE NAME =
_ _ _
'TBS_DM_DATA';
20、表空间配额
表空间不足与用户配额不足是两种不同的概念。表空间的大小是指实际的用 户表空间的大小,而配额大小指的是用户指定使用表空间的的大小。
1) 查看用户的表空间配额
查看所有用户表空间的配额情况
SELECT * FROM DBA_TS_QUOTAS;
注:MAX_BYTES=-1表示没有配额限制
查看当前用户表空间的配额情况
SELECT * FROM USER_TS_QUOTAS;
2) 管理用户表空间配额
令 创建用户时,指定限额
create user test identified by test default tablespace users temporary tablespace temp quota 3m on users password expire;
更改用户的表空间限额
A:不对用户做表空间限额控制:
查看是否没有表空间限额限制
B:取消限额
这种方式是全局性的
grant unlimited tablespace to scott;
或者针对特定的表空间的.
alter user test quota unlimited on users;
SELECT * FROM SESSION_PRIVS WHERE PRIVILEGE='UNLIMITED TABLESPACE';
REVOKE UNLIMITED TABLESPACE FROM SCOTT;
C:制定配额
令 可以分配自然也可以回收了:
revoke unlimited tablespace from test;
或者
alter user test quota 0 on users;
更改本地管理的临时表空间
可以添加临时文件,使临时文件脱机或使临时文件联机。
向临时表空间增加数据文件
ALTER TABLESPACE lmtemp ADD tempfile '/u02/oracle/data/lmtemp02.dbf' SIZE 18M REUSE ;
例:
SQL> select tablespace_name,file_name from dba_temp_files ;
SQL> alter tablespace temp add tempfile 'd:\temp011.dbf' size 10M;
SQL> select tablespace_name,file_name from dba_temp_files ;
临时表空间脱机
ALTER TABLESPACE lmtemp tempfile offline ;
例:
SQL> select TABLESPACE_NAME,FILE_NAME,STATUS from dba_temp_files ; SQL> alter tablespace temp01 tempfile offline ;
临时表空间联机
ALTER TABLESPACE lmtemp TEMPFILE ONLINE ;
例:
SQL> alter tablespace temp01 tempfile online ;
SQL> select TABLESPACE_NAME,FILE_NAME,STATUS from dba_temp_files ;
临时表空间中的数据文件脱机
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' OFFLINE ;
例:
SQL> select TABLESPACE_NAME,FILE_NAME,STATUS from dba_temp_files ;
SQL> alter database tempfile 'D:\ORCL\APP\PC\ORADATA\ORCL\TEMP01.DBF' offline ;
临时表空间中的数据文件联机
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' ONLINE ;
例:
SQL> alter database tempfile 'D:\ORCL\APP\PC\ORADATA\ORCL\TEMP01.DBF' online ; SQL> select TABLESPACE_NAME,FILE_NAME,STATUS from dba_temp_files ;
调整临时表空间数据文件大小
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' RESIZE 18M; 例:
SQL> select tablespace_name,file_name,bytes/1024/1024 MB from dba_temp_files ; SQL> alter database tempfile 'D:\ORCL\APP\PC\ORADATA\ORCL\TEMP01.DBF' resize 64M;
alter database tempfile '/u02/oracle/data/lmtemp02.dbf' drop including datafiles ; 例:
SQL> alter database tempfile 'D:\TEMP001.dbf' drop including datafiles ;
SQL> select tablespace_name,file_name,bytes/1024/1024 MB from dba_temp_files ;
5、缩小本地管理的临时表空间
可以缩小本地管理的临时表空间并释放未使用的空间。
数据库执行的大型排序操作可能会导致临时表空间增加并占用大量磁盘空间。排序操作完成 后,多余的空间不会释放;它只是被标记为 free,并可以重复使用。因此,一个大的排序 操作可能会导致分配的大量临时空间在排序操作完成后仍未使用。因此,数据库能够缩小本 地管理的临时表空间并释放未使用的空间。
ALTER TABLESPACE lmtemp1 SHRINK SPACE KEEP 20M;
例:
SQL> SELECT TABLESPACE_NAME,BYTES/1024/1024 MB from dba_temp_files ; SQL> alter tablespace temp shrink space keep 20M;
SQL> SELECT TABLESPACE_NAME,BYTES/1024/1024 MB from dba_temp_files ;
ALTER TABLESPACE lmtemp2 SHRINK TEMPFILE '/u02/oracle/data/lmtemp02.dbf' ;
例:
SQL> alter tablespace temp shrink tempfile 'D:\ORCL\APP\PC\ORADATA\ORCL\TEMP01.DBF' ;
SQL> SELECT TABLESPACE_NAME,BYTES/1024/1024 MB from dba_temp_files ;
21、临时表空间收缩
大量的排序操作可能会导致临时表空间大量增长,如:用户执行imp/exp导 入导出操作时、重建索引时、移动用户下的数据到别的表空间时、执行create table ...... as 语句时。
收缩临时表空间
alter tablespace tablespace_name shrink space
收缩临时文件
alter tablespace tablespace_name shrink tempfile
使用DBA_TEMP_FREE_SPACE查看表空间级别的临时表空间使用率信息 select
tablespace_name,tablespace_size/1024/1024| |'m',allocated_space/1024/1 024| |'m',free_space/1024/1024| |'m' from dba_temp_free_space;
allocated_space 已分配表空间 (以字节为单位) ,包括当前以分配并在使 用 中的和当前以分配并可重用的空间
free_space 总剩余可用空间 (以字节为单位) ,包括当前以分配但可以重 用的以及未分配的空间
1) temp 表空间的online shrink 操作:
alter tablespace temp shrink space keep 25M;
select
tablespace_name,tablespace_size/1024/1024| |'m',allocated_space/1024/1 024| |'m',free_space/1024/1024| |'m' from dba_temp_free_space;
2) shrink 数据文件:如果有多个temp 数据文件,也可以直接指定某个特 定的temp 数据文件来进行shrink。
col file_name for a50
select file_name from dba_temp_files;
alter tablespace temp shrink tempfile
'/u01/app/oracle/oradata/orcl/temp01.dbf' keep 30M;
select
tablespace_name,tablespace_size/1024/1024| |'m',allocated_space/1024/1 024| |'m',free_space/1024/1024| |'m' from dba_temp_free_space;
KEEP 选项用来指定压缩时表空间或者数据文件shrink 的最小值,如果没有 执行该命令,那么表空间或数据文件将被压缩到最小值,Temp 表空间过小对性能 是有影响的,所以在shrink时,还是建议使用keep 指定最小值。
alter tablespace temp shrink space;
select
tablespace_name,tablespace_size/1024/1024| |'m',allocated_space/1024/1 024| |'m',free_space/1024/1024| |'m' from dba_temp_free_space;
22、创建临时表空间组:
SQL> create temporary tablespace tempts1 tempfile '/home/oracle/temp1_02.dbf' size 2M tablespace group group1;
SQL> create temporary tablespace tempts2 tempfile '/home/oracle/temp2_02.dbf' size 2M tablespace group group2;
查询临时表空间组
SQL> select * from dba_tablespace_groups;
将表空间从一个临时表空间组移动到另外一个临时表空间组: SQL> alter tablespace tempts1 tablespace group GROUP2 ; SQL> select * from dba_tablespace_groups;
把临时表空间组指定给用户
SQL> alter user scott temporary tablespace GROUP2;
SQL> select username,temporary_tablespace from dba_users where username='SCOTT';
在数据库级设置临时表空间
SQL> alter database
SQL> alter tablespace tempts1 tablespace group GROUP1;
SQL> drop tablespace tempts1 including contents and datafiles; SQL> select * from dba_tablespace_groups;
SQL> alter user scott temporary tablespace temp;
SQL> alter database orcl default temporary tablespace temp; SQL> drop tablespace tempts2 including contents and datafiles; SQL> select * from dba_tablespace_groups;
23、UNDO表空间
1) 查看undo
show parameter undo
2) 修改undo
用ALTER SYSTEM更改初始化参数UNDO_RETENTION为1200
3) 创建undo表空间 ( 自动扩展)
CRE... UNDO TAB... my_undo DATAFILE ..... SIZE ... autoextend on;
4) 查看undo表空间信息 (dba_tablespaces,dba_data_files)
select tablespace_name,file_name,bytes/1024/1024 MB,autoextensible from dba_data_files where tablespace_name='MY_UNDO';
5) undo表空间重命名
alter tablespace my_undo rename to wl_undo;
6) undo表空间增加数据文件
alter tablespace wl_undo add datafile
'/u01/app/oracle/oradata/orcl/my_undo1.dbf' size 100M;
select tablespace_name,file_name,bytes/1024/1024 MB,autoextensible from dba_data_files where tablespace_name='WL_UNDO';
7) 数据文件修改自动扩展
alter database datafile '/u01/app/oracle/oradata/orcl/my_undo1.dbf' autoextend on;
select tablespace_name,file_name,bytes/1024/1024 MB,autoextensible from dba_data_files where tablespace_name='WL_UNDO';
8) 切换undo表空间
show parameter undo
alter system set undo_tablespace=wl_undo;
show parameter undo
9) 删除undo表空间
create undo tablespace undotbs2 datafile
'/u01/app/oracle/oradata/orcl/undotbs2.dbf' size 10m autoextend on maxsize 100m retention guarantee;
retention guarantee 保证在给定时间内还原记录一定会存在,不会被覆盖。 另开会话:
create table t(id number,name varchar2(20));
insert into t values (1,'wl');
没有提交事物 在另一会话切换undo表空间
alter system set undo_tablespace=undotbs2;
show parameter undo
删除旧的表空间
drop tablespace WL_UNDO;
报错,到另一个会话提交事务
commit;
再删除,依然报错
drop tablespace WL_UNDO;
因在undo_retention参数数值范围内,oracle依旧保留旧的undo记录 ALTER SYSTEM SET UNDO_RETENTION=0 SCOPE=BOTH;
drop tablespace WL_UNDO;
10) 使用dba_undo_extents看UNDO记录在那个表空间
insert into t values (2,'name');
不提交
select a.username,b.name,c.used_ublk from v$session a,v$rollname b,v$transaction c where a.saddr=c.ses_addr and b.usn=c.xidusn;
USERNAME NAME USED UBLK
_
------------- --------------------- ----------
SYS _SYSSMU27_345542384$ 1
select segment_name,tablespace_name,extent_id from dba_undo_extents where segment_name='_SYSSMU27_345542384$';
23、大文件表空间
Oracle表空间是逻辑结构的最高层次,其它分别为段segment、区extent和 块block。而物理层面的Oracle数据库是通过一系列的文件构成的,其中数据文 件是与表空间进行对应的对象。
表空间与数据文件的关系是一对多的关系。一个表空间可以对应多个数据文
件,数据文件则是只能归属在一个表空间里。传统的Oracle管理概念中,倡导一 个表空间中创建多个数据文件,特别是创建分布在多个存储磁盘上,以达到分散 I/O的目的。但是,Oracle10g以后推出的大文件表空间,将这个概念有所变化。 表空间从Oracle 10g以后就分两个类型,smallfile tablespace和bigfile tablespace。一个表空间对应多个数据文件称为Smallfile Tablespace。
所谓大文件表空间最显著的差别就是一个表空间只能对应一个数据文件。大 文件表空间虽然只对应一个数据文件,但数据文件对应的最大体积大大增加。 传统的small datafile每个文件中最多包括4M个数据块,按照一个数据块8K的大 小核算,最大文件大小为32G。每个Small Tablespace理论上能够包括1024个数 据文件,这样计算理论的最大值为32TB大小。而Bigfile Datafile具有更强大 的数据块容纳能力,最多能够包括4G个数据块。同样按照数据块8K计算,Bigfile
Datafile大小为32KG=32TB。理论上small tablespace和big tablespace总容量 相同。
理论上的大文件表空间可以达到下面所列的值,在实际环境中,还受到操作
系统的文件系统的限制。
数据块大小(单位:K)
2k
4k
8k
16k
32k
BFT 最大值(单位:T)
8T
16T
32T
64T
128T
大文件表空间允许用户创建只有一个文件的表空间。使用大文件表空间的必 要条件是,用户必须结合使用本地管理的表空间和自动段空间管理(ASSM),不允 许使用字典管理的表空间,段空间管理也不能使用手动,不过这两个条件在Undo 或者临时大文件表空间的时候,是允许例外的。
大文件表空间和自动存储管理一起实现,可以极大地简化存储系统的管理工 作。此外,大文件表空间只有相当少的数据文件,因此可以改进数据库管理操作 (例如检查点)的性能,但需要注意的是,如果发生数据文件破坏,则恢复操作将 需要较长的时间。
如果我们创建表空间的时候不指定类型,那么默认创建的都是 SMALLFILE 类型的表空间。
SQL> select * from database_properties where property_name = 'DEFAULT_TBS_TYPE';
可以通过 ALTER DATABASE 命令来修改数据库默认的表空间类型: SQL> ALTER DATABASE SET DEFAULT bigfile TABLESPACE;
SQL> SELECT * FROM database_properties WHERE property_name = 'DEFAULT_TBS_TYPE';
SQL> ALTER DATABASE SET DEFAULT smallfile TABLESPACE;
创建 BIGFILE 类型的表空间,只需指定额外的一个参数 BIGFILE 即可,其他和
原有创建表空间语法类似:
SQL>CREATE BIGFILE TABLESPACE bf_test DATAFILE
'/u01/app/oracle/oradata/orcl/bf_test01.dbf' SIZE 5M;
通过视图查看大文件表空间的相关信息。
SQL> SELECT tablespace_name, bigfile FROM dba_tablespaces;
大文件表空间的属性 1、每个表空间只能包含一个数据文件。如果试图添加新的文件,则会报告错误: SQL>ALTER TABLESPACE bf_test ADD DATAFILE
'/u01/app/oracle/oradata/orcl/bf_test02.dbf' SIZE 5M;
错误信息:ORA-32771: cannot add file to bigfile tablespace
2、只有自动段空间管理的本地表空间(locally managed tablespaces ) 支持大 文件表空间
SQL> CREATE BIGFILE TABLESPACE bf_test01 DATAFILE
'/u01/app/oracle/oradata/orcl/bf_test03.dbf' SIZE 5M EXTENT MANAGEMENT DICTIONARY;
错误信息:ORA-12913: Cannot create dictionary managed tablespace SQL> CREATE BIGFILE TABLESPACE bf_test01 DATAFILE
'/u01/app/oracle/oradata/orcl/bf_test03.dbf' SIZE 5M SEGMENT SPACE MANAGEMENT MANUAL;
错误信息:ORA-32772: BIGFILE is invalid option for this type of tablespace 3、相对文件号(RELATIVE_FNO)为1024, 因为大文件表空间只有一个数据文件, 所以其相对文件号也是固定的1024
SQL> SELECT tablespace_name, file_id, relative_fno FROM dba_data_files; 每个文件都包括两个编号,一个是绝对文件编号file_id,另一个是相对文件编 号relative_fno。在文件数量较少,或者创建删除文件比较少情况下的数据库, file_id和relative_fno是相同的。Relative_fno是一个循环周期, 以1024为一 个循环。 当file_id依次递增到1024整数倍之后,file_id会继续增加,而 relative_fno会形成一个内部循环。
这种机制让我们联想起了Oracle Small Tablespace的数据文件上限限制,也是
1023个文件。我们设想一种极端的情况,如果一个表空间中的数据文件个数超过 了1024,也就是一个表空间内的数据文件中,存在相同的relative_fno。这种情 况首先是不被允许的。
设置1024的relative_fno是进行Oracle数据寻址的需要。这里我们要关注到 Oracle定位数据行的rowid信息,rowid是Oracle内部唯一标注一行记录的地址。 Rowid包括四部分组成,对象号+文件号+块号+slot行号。Rowid长度固定,所以 四部分的长度都是固定的,这里的文件号fno是相对文件编号。这里的查找顺序 是,对象号获取所在表空间的编号,在表空间内部使用相对文件号来定位到文件。 如果一个表空间内出现相同的relative_fno文件,定位就不可能了。所以,small tablepsace的内部文件上限必然是1023。
但是,Bigfile Tablespace存在一些不同之处。如果一个表空间只有一个数据文 件且只能拥有一个数据文件,那么relative_fno就失去了存在的意义。所以在 dba_data_files中的relative_fno列上,bigfile tablespace对应的datafile 是直接1024。
Bigfile Tablespace和Small Tablespace两者理论上最大容量值是一样的, 只是Bigfile的单个文件容量上限很大。
首先,实际生产环境下,Bigfile Tablespace在应对大数据量存储的时候略 有优势。因为Small Tablespace在实现相同的存储大小时,要消耗大量的多文件 管理开销。 同时控制文件为了维护多位置上的文件,协同检查点和文件头SCN等 内容,要消耗很大精力。
其次,Small Tablespace的存储量只是理论,很少有系统真的建立上千个文 件在一个表空间中。从这个角度看,Bigfile吸引力是不小的。
最后,Oracle对于Bigfile Tablespace支持是全面的。存储层面上,ASM、Logical Volumn Manager/RAID和OMF都提供了比较全面的支持。
但是,Bigfile是Oracle层面的Bigfile,并不涉及到OS层面的支持。使用 Bigfile的时候,要选择合适的底层存储系统提供支持。此外,Bigfile的理念违 背了我们过去宣称的I/O分散理论。所以,最好在有底层强大存储支持 (如ASM) 的情况下使用Bigfile,达到最优的性能平衡点。