oracle表空间操作详解

oracle表空间操作详解 (2012-04-15 19:47)
分类: Oracle


1.创建表空间:

create tablespace <tablespace_name> datafile '<filepath>' size filesize autoextend on next <autosize> maxsize <maxsize [unlimited]>

eg:

create tablespace sales datafile 'c:\1.txt' size 10m autoextend on next 1m maxsize 100m

2.为表空间增加数据文件:

alter tablespace <tablespace_name> add datafile 'filepath' size <filesize> autoextend on next <autosize> maxsize filemaxsize[unlimited];

eg:

alter tablespace users add datafile '/opt/oracle/oradata/ge01/users06.dbf'  size 100m autoextend on next 10m maxsize unlimited;

3.调整表空间:

alter database datafile 'filepath' resize <filesize>;--重置表空间的大小

eg:

alter database datafile 'c:\2.txt' resize 10m

在实际使用中我们经常会遇到oracle某个表空间占用了大量的空间而其中的数据量却只占用了少量空间,此时我们可以用ALTER DATABASE DATAFILE '***.dbf' RESIZE nnM的命令来收缩表空间,但在收缩的过程中会遇到ora-03297错误,表示在所定义的空间之后有数据存在,不能收缩,此时的解决办法有:

(1). 先估算该表空间内各个数据文件的空间使用情况:

SQL>select file#,name from v$datafile;

SQL>select max(block_id) from dba_extents where file_id=11;

MAX(BLOCK_ID)
-------------
13657

SQL>show parameter db_block_size

NAME TYPE VALUE
----------------------------- ------- ----------- db_block_size integer 8192
SQL>select 13657*8/1024 from dual;

13657*8/1024
-----------
106.695313

这说明该文件中最大使用块位于106M与107M之间,

SQL> alter database datafile '/ora_data/cninsite/insitedev02.dbf' resize 100M;
alter database datafile '/ora_data/cninsite/insitedev02.dbf' resize 100M
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value

SQL> alter database datafile '/ora_data/cninsite/insitedev02.dbf' resize 107M;

Database altered.

(2).如果某些表占用了数据文件的最后一些块,则需要先将该表导出或移动到其他的表空间中,然后删除表,再进行收缩。不过如果是移动到其他的表空间,需要重建其索引。

SQL> alter table t_obj move tablespace t_tbs1;

4.关闭表空间的自动扩展属性:

alter database datafile 'filepath' autoextend off

eg:

alter database datafile 'c:\2.txt' autoextend off

5.打开表空间的自动扩展属性:

alter database datafile 'filepath' autoextend on

eg:

alter database datafile 'c:\2.txt' autoextend on

6.使表空间脱机:

alter tablespace tablespace_name offline

7.使表空间联机:

alter tablespace tablespace_name online

8.设置表空间为只读:

alter tablespace tablespace_name read only

9.设置表空间为读写:

alter tablespace tablespace_name read write

11.删除表空间:

drop tablespace <tablespace_name>

12.删除表空间的同时,删除数据文件
drop tablespace tablespace_name including contents and datefiles
使用offline数据文件的方法
非归档模式使用:alter database datafile '...' offline drop;
归档模式使用:  alter database datafile '...' offline;
说明:
1)         以上命令只是将该数据文件OFFLINE,而不是在数据库中删除数据文件。该数据文件的信息在控制文件种仍存在。查询v$datafile,仍显示该文件。
2)         归档模式下offline和offline drop效果是一样的
3)         offline后,存在此datafile上的对象将不能访问
4)         noarchivelog模式下,只要online redo日志没有被重写,可以对这个文件recover后进行online操作

Oracle 10G R2开始,可以采用:Alter tablespace tablespace_name drop datafile file_name;来删除一个空数据文件,并且相应的数据字典信息也会清除:
确认表空间文件信息:
SQL> select file_name,file_id from dba_data_files where tablespace_name='USERS';
确认表空间未被存储占用:
SQL> select segment_name,file_id,blocks from dba_extents where file_id=5;
no rows selected

alter tablespace users drop datafile '/opt/oracle/oradata/ge01/users04.dbf';

oracle 10g可以删除临时表空间的文件
alter database tempfile '/home/oracle/temp01.dbf' drop including datafiles

13.查看每个表空间占用空间的大小:

select tablespace_name,sum(bytes)/1024/1024 from dba_segments group by tablespace_name

10.oracle中如何移动控制文件,数据文件,日志文件

oracle9i/10G-xG中移动控制文件,数据文件,日志文件

ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成。
windows环境中用: host copy 或 host move 其它均相同。
以下是unix或linux环境中,

一.移动数据文件:

ALTER TABLESPACE方法(联机状态):
用此方法,要求此数据文件既不属于SYSTEM表空间,也不属于含有ACTIVE回滚段或临时段的表空间。
$ sqlplus '/as sysdba'
#把需要移动的数据文件对应的表空间offline
SQL> alter tablespace ipas_acct_data offline
#把数据文件cp到想要放的目录下。
SQL> !mv /opt/oracle/wacosdata/ipas_acct_data001.dbf /opt/oracle/nms/oradata/ipas_acct_data001.dbf
#修改表空间中数据库文件的位置。
SQL> alter tablespace ipas_acct_data rename datafile '/opt/oracle/wacosdata/ipas_acct_data001.dbf' to '/opt/oracle/nms/oradata/ipas_acct_data001.dbf'
#把表空间online。
SQL> alter tablespace ipas_acct_data online
#查看修改结果。
SQL> select file_name from dba_data_files where tablespace_name = 'IPAS_ACCT_DATA';

ALTER DATABASE方法(脱机状态):
用此方法,可以移动任何表空间的数据文件。
$ sqlplus '/as sysdba'
SQL> shutdown immediate
SQL> !mv /opt/oracle/oradata/wacos002.dbf /ora10g/oradata/wacos002.dbf
SQL> startup mount
SQL> alter database rename file '/opt/oracle/oradata/wacos002.dbf' to '/ora10g/oradata/wacos002.dbf';
SQL> alter database open;
SQL> set head off
SQL> SELECT file_name from dba_data_files where tablespace_name = 'WACOS';

二. 移动控制文件:

$ sqlplus '/as sysdba'
#我是用的spfile启动的,spfile文件不能修改,所以要做这一步。
SQL> create pfile from spfile
#关闭数据库。
SQL> shutdown immediate
#cp控制文件到目标位置。
SQL>cp /opt/oracle/oradata/control* /opt/oracle/oratest/
修改$ORACLE_HOME/dbs/init$ORACLE_SID.ora 文件中的控制文件的位置。
#启动数据库指定参数文件。
SQL> startup pfile='/opt/oracle/product/9.2.0.4/dbs/init$ORACLE_SID.ora'
#下次启动数据库是直接就可以用startup启动了。
SQL> create spfile from pfile;

三. 移动重做日志文件:

$ sqlplus '/as sysdba'
#关闭数据库。
SQL> shutdown immediate
#cp日志文件到目标位置。
SQL> !cp /opt/oracle/oradata/redo* /opt/oracle/oratest/
#让数据库以mount模式启动。
SQL>startup mount;
#修改数据库中日志文件的位置。
SQL> alter database rename file '/opt/oracle/oradata/redo01.log' to '/opt/oracle/oratest/redo01.log'
SQL> alter database rename file '/opt/oracle/oradata/redo02.log' to '/opt/oracle/oratest/redo02.log'
SQL> alter database rename file '/opt/oracle/oradata/redo03.log' to '/opt/oracle/oratest/redo03.log'
#修改数据库的状态。
SQL> alter database open;
#查看修改结果。
SQL> select * from v$logfile;

增加重做日志文件
alter database add logfile 'D:\oracle\oradata\ge01\redo04.log' size 100M;

====================================================================================
注意:TEMP数据文件不能移动,只能通过重建临时表空间来重建,方法如下:
尤其值得注意:重建临时表空间的大小一定要足够大,一定要大于或等于现有临时表空间的大小,否则会出现:提示:无法通过128(在表空间temp中)扩展 temp段。
====================================================================================
Oracle9i为我们提供了一个全局的临时表空间。有的时候我们会发现在做了大量的排序操作后,temp表空间并没有去释放,而且在更大的程度上面占用了我们的磁盘空间,其实我们可以通过重建或者切换的手段来使我们的temp表空间得到重生。

首先我们可以先看一下,当前用户所属的临时表空间有那些
SQL> select username ,temporary_tablespace from dba_users;

USERNAME                       TEMPORARY_TABLESPACE
------------------------------ ------------------------------
SYS                            TEMP
SYSTEM                         TEMP
DBSNMP                         TEMP
HUJINPEI                       TEMP
ALAN1                          TEMP
PERFUSER                       TEMP
ALAN2                          TEMP
MYUSER                         TEMP
OUTLN                          TEMP
WMSYS                          TEMP

已选择10行。

查看当前有那些临时文件
SQL> select name from v$tempfile;

NAME
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ICMNLSDB\TEMP_01.DBF
D:\ORACLE\ORADATA\ICMNLSDB\TEMP_02.DBF

为了切换这个临时文件,我们可以重新建立一个临时表空间
SQL> create temporary tablespace temp2 tempfile 'D:\ORACLE\ORADATA\ICMNLSDB\TEMP01.DBF' size 10M ;

表空间已创建。

SQL> alter tablespace temp2 add tempfile 'D:\ORACLE\ORADATA\ICMNLSDB\TEMP02.DBF' size 10M;

表空间已更改。

这个时候我们就可以将刚刚建好的TEMP表空间设置为我们数据库默认的临时表空间:
SQL> alter database default temporary tablespace temp2;

数据库已更改。

SQL> select username,temporary_tablespace from dba_users;

USERNAME                       TEMPORARY_TABLESPACE
------------------------------ ---------------------------
SYS                            TEMP2
SYSTEM                         TEMP2
DBSNMP                         TEMP2
HUJINPEI                       TEMP2
ALAN1                          TEMP2
PERFUSER                       TEMP2
ALAN2                          TEMP2
MYUSER                         TEMP2
OUTLN                          TEMP2
WMSYS                          TEMP2

已选择10行。

当然我们还可以选择DROP掉以前旧的TEMP的表空间
SQL> drop tablespace temp including contents ;

表空间已丢弃。

11.查询表空间的信息:

select tablespace_name,bytes/1024/1024  file_size_mb,file_name from DBA_DATA_FILES--注意数据库中的实体都是以大写表示

12 如果在数据库创建期间没有指定默认表空间,它将默认为 SYSTEM。但您如何才能知道现有的数据库的默认表空间是哪一个?发出以下查询:
SELECT PROPERTY_VALUE  FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE';
DATABASE_PROPERTIES 视图显示默认表空间之外,还显示一些非常重要的信息 — 例如默认临时表空间、全局数据库名、时区等

13 在 Oracle Database 10g 中,您可以类似地为用户指定一个默认表空间。在数据库创建期间,CREATE DATABASE 命令可以包含子句 DEFAULT TABLESPACE 。在创建之后,您可以通过发出以下命令来使一个表空间变成默认表空间:

ALTER DATABASE DEFAULT TABLESPACE <tsname>;
14 重命名一个表空间

在数据仓库环境中(典型地,对于数据中心体系结构),在数据库之间传输表空间是很常见的。但源数据库和目标数据库必须不存在拥有相同名称的表空间。如果存在两个拥有相同名称的表空间,则目标表空间中的段必须转移到一个不同的表空间中,然后重新创建这个表空间— 这个任务说起来容易做起来难。

Oracle Database 10g 提供了一个方便的解决方案:您可以用以下命令来简单地重命名一个现有的表空间(SYSTEM 和 SYSAUX 除外) — 无论是永久表空间还是临时表空间:

ALTER TABLESPACE <oldname> RENAME TO <newname>;

Oracle 10g临时表空间组
Oracle 10g 引进了临时表空间组(temporary tablespace group)的概念,它允许用户在不同的会话中同时利用多个临时表空间。

1. 临时表空间组的主要特征

n          一个临时表空间组必须由至少一个临时表空间组成,并且无明确的最大数量限制。

n          如果删除了一个临时表空间组的所有成员,该组也自动被删除。

n          临时表空间的名字不能与临时表空间组的名字相同。

n          在给用户分配一个临时表空间时,可以使用临时表空间组的名字代替实际的临时表空间名;在给数据库分配默认临时表空间时也可以使用临时表空间组的名字。

2. 临时表空间组的优点

使用临时表空间组而非普通的临时表空间,有如下好处:

n          由于SQL查询可以并发使用几个临时表空间进行排序操作,因此SQL查询很少会出现排序空间超出,避免当临时表空间不足时所引起的磁盘排序问题。

n          可以在数据库级指定多个默认临时表空间。

n          一个并行操作的并行服务器将有效地利用多个临时表空间。

n          一个用户在不同会话中可以同时使用多个临时表空间。

3. 管理临时表空间组

临时表空间组是在创建临时表空间时通过指定GROUP字句创建的。可以将一个表空间从一个组移动另一个组,或是从一个组中删除临时表空间,或是往组里添加新的表空间。

1). 创建临时表空间组

创建临时表空间时指定GROUP:

CREATE SMALLFILE
TEMPORARY TABLESPACE "TEMP01"
TEMPFILE
'/opt/oracle/oradata/ge01/temp_tbs_01a.dbf' SIZE 5M REUSE
AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
UNIFORM. SIZE 1M
TABLESPACE GROUP TBS_GROUP_1
GO

CREATE SMALLFILE
TEMPORARY TABLESPACE "TEMP02"
TEMPFILE
'/opt/oracle/oradata/orcl/temp_tbs_02a.dbf' SIZE 5M REUSE
AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
UNIFORM. SIZE 1M
TABLESPACE GROUP TBS_GROUP_1
GO

CREATE SMALLFILE
TEMPORARY TABLESPACE "TEMP03"
TEMPFILE
'/u01/app/oracle/oradata/orcl/temp_tbs_03a.dbf' SIZE 5M REUSE
AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
UNIFORM. SIZE 1M
TABLESPACE GROUP TBS_GROUP_2
GO

CREATE SMALLFILE
TEMPORARY TABLESPACE "TEMP04"
TEMPFILE
'/u01/app/oracle/oradata/orcl/temp_tbs_04a.dbf' SIZE 5M REUSE
AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
UNIFORM. SIZE 1M
TABLESPACE GROUP TBS_GROUP_2
GO

2)、修改数据库默认临时表空间

alter database default temporary tablespace TBS_GROUP_1;

3)、临时表空间组无法显式创建,当第一个临时表空间分配给该组时自动创建,当组内所有临时表空间被移除时自动删除

注意:从Oracle10gR2开始,使用RMAN恢复数据库之后,Oracle会自动重新创建临时文档,由于临时文档是Sparse File,所以创建会很迅速,通常您不会感觉得到。

一个重要的包DBMS_SPACE_ADMIN:

这个包为本地管理的所有表空间提供带有故障诊断和修复功能的管理程序。    

包含的管理程序有:

SEGMENT_VERIFY:验证该段盘区映射的一致性

SEGMENT_CURRUPT:标注该段为损坏或有效,以便执行恰当的错误恢复

SEGMENT_DROP_CORRUPT:取消一个当前标注为损坏的段(不回收空间)

SEGMENT_DUMP:卸下一个给定段的段头部和盘区映射

TABLESPACE_VERIFY:验证该表空间中段的位图和盘区映射是否同步

TABLESPACE_REBUILD_BITMAPS: 重建适当的位图

TABLESPACE_FIX_BITMAPS:在位图中标注适当的数据块地址范围为空闲或已用

TABLESPACE_REBUILED_QUOTAS:为给定表空间重建限额

TABLESPACE_MIGERATE_FROM_LOCAL:将一个本地管理的表空间移植为字典管理的表空间

TABLESPACE_MIGRATE_TO_LOCAL:将一个字典管理的表空间移植为本地管理的表空间

TABLESPACE_RELOCATE_BITMAPES:将位图重定位到指定的目的地

TABLESPACE_FIX_SEGMENT_STATES:修改移植被放弃的表空间中数据段的状态

一些有关表空间信息的表或视图:

V$TABLESPACE:来自控制文件的所有表空间的名称和编号

DBA_TABLESPACE,USER_TABLESPACE:所有用户的表空间说明

DBA_SEGMENTS,USER_SEGMENTS:所有用户表空间种段的信息

DBA_EXTENTS,USER_EXTENTS:所有用户表空间中数据盘区的信息

DBA_FREE_SPACE,USER_FREE_SPACE:所有用户表空间中的空闲盘区的信息

V$DATAFILE:关于所有数据文件的信息,包括所属表空间和表空间号

V$TEMPFILE:关于所有临时文件的信息,包括所属表空间和表空间号

DBA_DATA_FILES:显示属于表空间的数据文件

DBA_TEMP_FILES:显示属于表空间的临时文件

V$TEMP_EXTENT_MAP:所有本地管理的临时表空间中所有盘区的信息

V$TEMP_EXTENT_POOL:由每个实例缓存和使用临时表空间(本地管理的)的状态

V$TEMP_SPACE_HEADER:显示每个临时文件的已用/空闲空间

DBA_USERS:所有用户默认的和临时表空间

DBA_TS_QUOTAS:列出所有用户表空间限额

V$SORT_SEGMENT:关于一个给定实例的每个排序段的信息,只有在表空间是TEMPOARY:类型时更新

V$SORT_USER:用户使用的临时排序空间和临时的/永久的表空间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值