玩命加载中 . . .

Oracle表空间管理


与表空间相关的视图

段类型 说明
V$TABLESPACE 控制文件中保存的所有表空间的名称和数量
DBA_TABLESPACES 所有表空间的描述信息
USER_TABLESPACES 所有用户可访问表空间的描述信息
DBA_TABLESPACE_GROUPS 所有表空间组及其所属的表空间信息
DBA_SEGMENTS 所有表空间中的区间信息
USER_SEGMENTS 所有用户表空间中的区间信息
DBA_FREE_SPACE 所有表空间中的空闲区间信息
USER_FREE_SPACE 所有用户表空间中的空闲区间信息
V$DATAFILE 所有数据文件信息
V$TEMPFILE 所有临时文件信息
DBA_DATA_FILES 显示所有属于表空间的数据文件信息
DBA_TEMP_FILES 显示所有属于临时表空间的临时文件信息
V$TABLESPACE 控制文件中保存的所有表空间的名称和数量
DBA_TABLESPACES 所有表空间的描述信息

创建表空间

CREATE TABLESPACE tablespace_name 
DATAFILE  '/path/filename' SIZE integer [K|M] REUSE 
[,'/path/filename' SIZE integer [K|M] REUSE] 
[AUTOEXTEND [ OFF | ON  NEXT integer [ K | M ]  ] [ MAXSIZE [ UNLIMITED | integer [ K | M ] ] ]  ]
[ MINIMUM  EXTENT  integer [ K | M ]  ]
[DEFAULT STORAGE storage ]
[ ONLINE | OFFLINE ]
[ LOGGING | NOLOGGING ]
[ PERMANENT | TEMPORARY ]
[EXTENT MANAGEMENT
[ DICTIONARY | LOCAL [ AUTOALLOCATE | UNIFORM SIZE integer [ K | M ] ]  ]
 ]

解释:

1、一个表空间可以拥有多个数据文件,create tablespace时,各个数据文件使用英文状态下的逗号分隔;

2、数据文件是否自动扩展,默认off

3、minimum

4、default storeage 设置默认存储

        default storage(
        initial 192K
        next 192K
        minextents 1
        pctincrease 0)

5、数据文件在线还是脱机,默认online

6、Logging与nologging,区别在于是否忽略日志记录

7、 EXTENT MANAGEMENT,表空间管理方式,分为数据字典管理和本地管理

字典管理方式的表空间

表空间中所有存储空间的管理信息都保存在数据字典中,在进行存储空间管理时会产生回退和重做记录

本地管理方式的表空间

表空间中所有存储空间的管理信息都保存在数据文件头部的位图中

本地管理方式的表空间具有如下优点:

1、在存储分配过程中不需要访问数据库,可以提高存储分配操作的速度

2、能够避免在表空间的存储管理操作中产生的递归现象

3、不会产生重做和撤销记录

4、简化DBA对表空间的管理操作

5、降低用户对数据字典的依赖性

大文件表空间

Bigfile与smallfile文件

这种类型的表空间只能有一个数据文件,且该数据文件允许有4G的数据快,即如果db_block_size=8k的话,最大容量为4G*8K=32T,当然,这个还要看操作系统的限制了。

一般应该不会这样的用的。

理论上的 BFT 可以达到下面所列的值:

数据块大小(单位:K)   BFT 最大值(单位:T) 
         2k                    8T 
         4k                    16T 
         8k                    32T 
         16k                   64T 
         32k                  128T 

查询网关默认数据文件类型

select property_name,property_value from database_properties where property_name='DEFAULT_TBS_TYPE';

修改数据库默认的表空间类型为smallfile,就可以为表空间创建多个数据文件了。

SQL> alter database set default smallfile tablespace;

Database altered

也可以在创建表空间时,指定表空间类型:create smallfile/bigfile tablespace …

重命名表空间

SQL> select * from v$tablespace;
       TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
         0 SYSTEM                         YES NO  YES
         1 SYSAUX                         YES NO  YES
         2 UNDOTBS1                       YES NO  YES
         3 TEMP                           NO  NO  YES
         4 USERS                          YES NO  YES
         5 MMSG                           YES NO  YES
         6 MMSG_TMP                       NO  NO  YES
         7 YJH                            YES NO  YES
         8 YJH_TMP                        NO  NO  YES
         9 WYZ                            YES NO  YES
        10 WYZ_TMP                        NO  NO  YES
       TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
        11 WYZTEST                        YES NO  YES
        12 WYZTESTTEMP                    NO  NO  YES
已选择13行。
SQL> alter tablespace wyztest rename to wyztest0;
表空间已更改。
SQL> select * from v$tablespace;
       TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
         0 SYSTEM                         YES NO  YES
         1 SYSAUX                         YES NO  YES
         2 UNDOTBS1                       YES NO  YES
         3 TEMP                           NO  NO  YES
         4 USERS                          YES NO  YES
         5 MMSG                           YES NO  YES
         6 MMSG_TMP                       NO  NO  YES
         7 YJH                            YES NO  YES
         8 YJH_TMP                        NO  NO  YES
         9 WYZ                            YES NO  YES
        10 WYZ_TMP                        NO  NO  YES
       TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
        11 WYZTEST0                       YES NO  YES
        12 WYZTESTTEMP                    NO  NO  YES
已选择13行。
SQL> 

本地管理表空间

在ALTER TABLESPACE语句中使用ADD DATAFILE子句,可以在本地管理表空间中增加数据文件,代码如下:

SQL> alter tablespace wyztest 
add datafile '/opt/oracle/oradata/mmsgdb/wyztest01.dbf‘
size 10m
autoextend on next 10m maxsize 100m
表空间已更改。
SQL>

重置表空间大小

在ALTER database语句中使用resize子句,可以在本地管理表空间中修改数据文件大小,代码如下:

改变数据文件大小

SQL> alter database datafile '/opt/oracle/oradata/mmsgdb/wyztest01.dbf' resize 15m;
数据库已更改。

修改数据文件增长方式

在ALTER database语句中使用autoextend子句,可以在本地管理表空间中修改数据文件(不)自动扩展,代码如下:

修改数据文件的增长方式

SQL> alter database datafile  '/opt/oracle/oradata/mmsgdb/wyztest.dbf' 
 2  autoextend on next 15m maxsize 150m; 
数据库已更改。
SQL>

关闭自动表空间自动扩展

SQL> alter database datafile '/opt/oracle/oradata/mmsgdb/wyztest.dbf' 
  2  autoextend off;
数据库已更改。
SQL> 

改变数据文件的名称和位置

场景一 数据文件属于同一个表空间

1;将包含数据文件的表空间置为脱机状态

SQL> alter tablespace wyztest offline normal;
表空间已更改。

2:os level级重命名表空间下的数据文件名称

oracle@mmsg37:~/oradata/mmsgdb> mv wyztest01.dbf wyztest00.dbf 

3:在数据库内部修改数据文件的名称或者改变数据文件的位置

alter tablespace tablespace_name 
rename datafile  ‘xxxxx’ to ‘xxxx’;
改变名称
SQL> alter tablespace wyztest 
  2  rename datafile 
  3  '/opt/oracle/oradata/mmsgdb/wyztest01.dbf' to
  4  '/opt/oracle/oradata/mmsgdb/wyztest00.dbf';
alter tablespace wyztest     //这里报错,是因为当初没有执行o slevel的命名操作,必须要执行第二步的重命名操作。
*
第 1 行出现错误:
ORA-01525: 重命名数据文件时出错
ORA-01141: 重命名数据文件 7 时出错 - 未找到新文件
'/opt/oracle/oradata/mmsgdb/wyztest00.dbf'
ORA-01110: 数据文件 7: '/opt/oracle/oradata/mmsgdb/wyztest01.dbf'
ORA-27037: 无法获得文件状态
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
SQL> /
表空间已更改。

更改位置

 alter tablespace wyztest 
Rename datafile '/opt/oracle/oradata/mmsgdb/wyztest01.dbf’ to
‘/home/oradata/mmsgdb/wyztest02.dbf’   //前提条件是/home/oradata/mmsgdb/目录存在,且oracle对该目录具有可操作权限

4:将表空间置为联机状态

SQL> alter tablespace wyztest online;
表空间已更改。
SQL> 

5:备份控制文件

场景二 要改变的数据文件属于多个表空间

1:关闭数据库

2:os level级重命名或者移动数据文件

3:加载数据库到mount状态 startup mount

4:在数据库内部更改数据文件名称或者位置(alter datafile rename datafile ‘xxxxx01 ‘xxxx02’ to ‘yyyy01’ ‘yyyy02’;) //to 之后的文件必须存在,也就是 os level级的操作是必须做的

5:open数据库 alter database open;

6:备份控制文件

设置只读表空间

ALTER TABLESPACE…READ ONLY语句设置只读表空间

【例】将表空间wyztest设置为只读表空间:

SQL> alter tablespace  wyztest read only;

ALTER TABLESPACE…READ WRITE语句可以将只读表空间设置为可读写状态

【例】将表空间wyztest设置为可读写状态:

SQL> alter tablespace  wyztest read  write;

删除表空间

删除表空间的时候可以清除表空间的内容以及表空间对应的数据文件

适用情况
1:不小心给不需要的表空间增加了数据文件;
2:设置的数据文件较大,想删除后重新创建;

   drop tablesapce tablespacename  including contents;
   drop tablespace tablespacename including contents and datafiles;

A:所在表空间只有一个数据文件

只要简单地删除表空间即可:

drop tablespace tablespace_name including contents;

B:如果表空间有多个数据文件

1、不再需要表空间中的内容,或者可以很容易重新产生表空间的内容,可以使用

drop tablespace tablespace_name including contents; 命令来从Oracle数据字典删除表空间、数据文件和表空间的内容。

Oracle不会再访问该表空间中的任何内容, 然后重新创建表空间并重新导入数据。

2、需要保留该表空间中的其它数据文件中的内容

必须首先export导出该表空间中的所有内容。为了确定表空间中包含哪些内容,运行:

select owner,segment_name,segment_type 
from dba_segments 
where tablespace_name='<name of tablespace>'

export出你想保留的内容。如果export结束,就可以使用drop tablespace tablespace_name including contents; ,这样永久删除表空间的内容,使用操作系统命令物理删除数据文件,按所需数据文件重新创建表空间,把数据import至表空间。

这里要区别于alter databade datafile ‘/opt/oracle/oradata/mmsgdb/wyztest.dbf’offline drop 操作。
Offline drop 将数据文件脱机,而不是删除对应的数据文件,数据库不会再访问这部分数据文件的内容,但它仍然是表空间的一部分。这个数据文件在控制文件中标记为offline状态,在数据库启动时不会将它与控制文件中的SCN比较,跳过对offline 的数据文件的读取操作,这里控制文件保留这个数据文件的入口,方便后续的介质恢复(归档模式下)


文章作者: Gavin Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gavin Wang !
  目录