Oracle表空间和数据文件

时间:2022-12-27 12:22:33


读书使人充实,思考使人深邃,交谈使人清醒!-----------《富兰克林》


洒一屋的芬芳,画一幕的色彩,看一书的深远。从来没有什么事情是容易的,人最难得的永远是一颗永不停歇的心。学习Oracle,就是需要学习Oracle的根本,了解它的原理。Oracle整个体系结构中,数据文件就是数据库的记忆,保存着修改的结果,所有的数据归根都要回到其中,数据文件一旦损坏就会导致数据丢失。

Oracle数据文件由表空间进行组织管理,表空间是数据文件的逻辑集合,一个表空间下面对应一个或者多个数据文件,熟悉数据文件,须先熟悉表空间(所有环境基于oracle 11g)。

Oracle表空间和数据文件

一、表空间分类

表空间分为系统表空间和非系统表空间。从Oracle10g开始,推出了Bigfile tablespace的概念。表空间Tablespace从Oracle10g以后就分为两个类型,smallfile tablespace和bigfile tablespace。过去一个表空间对应多个数据文件我们成为Smallfile Tablespace。

所谓Bigfile Tablespace最显著的差别就是一个表空间只能对应一个数据文件。Bigfile Tablespace虽只对应一个数据文件,但数据文件对应的最大体积大大增加。传统的small datafile每个文件中最多包括4M个数据块,按照一个数据块8K的大小核算,最大文件大小为32G。每个Small Tablespace理论上能够包括1024个数据文件,这样计算理论的最大值为32TB大小。而Bigfile Datafile具有更强大的数据块block容纳能力,最多能够包括4G个数据块。同样按照数据块8K计算,Bigfile Datafile大小为32KG=32TB。理论上small tablespace和big tablespace总容量相同。大表空间这里就不再讨论了,喜欢的朋友可以自己测试下。

1.1,系统表空间

1.1.1,system表空间

system表空间用来存储整个数据库的数据字典表(data dictionary table),该表空间不能被损坏,一旦损坏,数据库将无法打开。

SQL> select ts#,name from v$tablespace where name='SYSTEM';

       TS# NAME

---------- ------------------------------

         0 SYSTEM

1.1.2,sysaux表空间

从oracle 10g开始,oracle将工具放到SYSAUX,减轻system的压力。SYSAUX表空间不影响系统,但是会影响性能。

SQL> select ts#,name from v$tablespace where name='SYSAUX';

       TS# NAME

---------- ------------------------------

         1 SYSAUX

1.2,非系统表空间

1.2.1,undo

undo表空间中会自动分配undo段,这些undo段用来保存事务中的DML语句的undo信息,也就是来保存数据在被修改之前的值。undo数据用来:1)事务的回滚;2)实例恢复(回滚);3)一致性读时需要构造CR块;

查看undo表空间:

SQL> select ts#,name from v$tablespace where name='UNDOTBS1';

       TS# NAME

---------- ------------------------------

         2 UNDOTBS1


SQL> show parameter undo_tablespace;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_tablespace  

查看回滚段信息:

SQL> select * from v$rollname;

       USN NAME

---------- ------------------------------

         0 SYSTEM

        11 _SYSSMU11_3495923500$

        12 _SYSSMU12_3227503110$

        13 _SYSSMU13_3813465056$

        14 _SYSSMU14_3771977856$

        15 _SYSSMU15_3115189928$

        16 _SYSSMU16_767821622$

        17 _SYSSMU17_1964048486$

        18 _SYSSMU18_874028646$

        19 _SYSSMU19_1052114549$

        20 _SYSSMU20_2668599833$

1.2.2,temp

temp表空间,即临时表空间,用来存放用户排序,分组等操作时的数据信息。

查看temp表空间

SQL> select ts#,name from v$tablespace where name='TEMP';

       TS# NAME

---------- ------------------------------

         3 TEMP

1.2.3,users

从oracle 10g开始,oracle将用户数据信息单独存放到users表空间中。

SQL> select ts#,name from v$tablespace where name='USERS';

       TS# NAME

---------- ------------------------------

         4 USERS

1.2.4,用户表空间

SQL> select ts#,name from v$tablespace where name not in('SYSTEM','SYSAUX','TEMP','USERS','UNDOTBS1');


       TS# NAME

---------- ------------------------------

         5 DT_TPC_DAT

         6 DT_CAT_DAT

         8 DT_TEST_DAT

二、操作

2.1,表空间操作

2.1.1,创建表空间:

SQL>create tablespace DT_TPC_DAT datafile '/opt/oracle/data/tpc/DT_TPC_DAT01.DBF' size 1G autoextend on next 200M maxsize 31G;

2.1.2,删除表空间

不能删除的表空间为系统表空间,正在用的undo表空间,默认临时/永久表空间

drop tablespace talespace_name including contents and datafile;,

2.1.3,修改表空间权限

alter tablespace tablespace_name read write;

alter tablespace tablespace_name read only;

2.1.4,脱机表空间

alter tablespace tablespace_name offline;

alter tablespace tablespace_name online;

2.1.5,表空间改名

alter tablespace tablespace_name1 rename to tablespace_name2;

sysaux system不能改名

用户表空间users,undo表空间,temp表空间最好不要改名,因为系统中部分参数定义名还是以原来的表空间名,下次数据库启动会报错。

2.1.6,表空间说明

system 表空间必须online 必须是read write

sysaux 表空间可以offline 不能read only

undo 表空间不能offline 不能read only

只读表空间的对象可以删除,但是不能被update和insert

2.2,数据文件操作

2.2.1,修改数据文件自动扩展

alter database datafile '...........' autoextend on;

2.2.2,修改数据文件大小

alter database datafile '...........' resize 1M;

2.2.3,添加数据文件

alter tablespace add datafile '.......' size 200M autoextend off;

2.2.4,数据文件重命名(必须要在归档模式下)

a,alter tablespace t01 offline;(数据库在open状态)

b,ho cp /u01/oracle/oradata/orcl/t1.dbf /u01/oracle/oradata/orcl/t11.dbf

c,alter database rename file 'u01/oracle/oradata/orcl/t1.dbf' to '/u01/oracle/oradata/orcl/t11.dbf';

d,alter tablespace t01 online;

如果数据库只在mont状态,那么只要在操作系统级别移动数据文件,执行数据库文件改名,启动数据库即可

三、重点

3.1,修改数据文件注意点

ALTER DATABASE 语句修改单独的 DataFile

ALTER TABLESPACE 语句修改所有的 DataFile

3.1.1,ARCHIVRLOG  模式下的更改 DataFile

只有在 ARCHIVELOG 模式下才可使用 ALTER DATABASE 来更改DataFile

ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' ONLINE;

ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' OFFLINE;


由于在 NOARCHIVELOG 模式下,数据文件脱机后会造成数据的遗失,所以只能使用 ALTER DATABASE 语句下带有 DATAFILE 和 OFFLINE DROP 子句的选项将该 DataFile 直接取消,例如该 DataFile 只包含临时段数据,并没有备份时:

alter database datafile '/u02/oracle/rbdb1/users3.dbf' offline drop;


alter tablespace ....offline,会对数据文件进行检查点,并冻结数据文件SCN表空间 online 时,Oracle 会取得当前 SCN,解冻 offline 文件 SCN,和当前 SCN同步tablespace offline 有几种选项可供选择: normal, temporary,immediate, for recovery,而在 datafile 中则没有这些选项。

3.1.2,,数据文件reuse参数

1,如果 file 已经存在,并且在创建时指定了 file size,那么就重用原文件,并应用新的 size,如果没有指定 file size,则保留原有的大小

2,如果 file 不存在,oracle 将忽略该参数

3,如果 Oracle 使用了已经存在的 file,那么之前 file 里的数据将全部丢失


3.1.3,offline drop

offline drop 并不会 drop datafile, 仅仅是将 datafile 标记为 offline, 我们 online之后还可以 recover 回来。

alter database datafile '/usr/dt_sys_dat1.dbf' offline drop;

该命令不会删除数据文件,只是将数据文件的状态更改为recover。 offline drop命令相当于把一个数据文件至于离线状态,并且需要恢复,并非删除数据文件。 数据文件的相关信息还会存在数据字典和控制文件中

归档模式下,alter database datafile 'file_name' offline 和 offline drop 没有什么区别。 因为offline 之后多需要进行recover 才可以online。


alter database datafile '/usr/dt_sys_dat1.dbf' online;

recover datafile '/usr/dt_sys_dat1.dbf';


alter tablespace dt_sys_dat drop datafile '/usr/dt_sys_dat1.dbf';


该语句会删除控制文件和磁盘上的文件,删除之后的原数据文件序列号可以重用。该语句只能是datafile online的时候才可以使用。如果说对应的数据文件已经是offline for drop,那么仅针对 dictionary managed tablespaces 可用。

四、概述

表空间和数据文件管理基本内容介绍完成,后期将会针对其中的深入内容进行分析:包括数据文件头分析,数据文件内部数据块分析,数据文件错误解决等。

喜欢的朋友可以扫描以下二维码进行关注,公众号将每天更新文章:

Oracle表空间和数据文件





读书使人充实,思考使人深邃,交谈使人清醒!-----------《富兰克林》


洒一屋的芬芳,画一幕的色彩,看一书的深远。从来没有什么事情是容易的,人最难得的永远是一颗永不停歇的心。学习Oracle,就是需要学习Oracle的根本,了解它的原理。Oracle整个体系结构中,数据文件就是数据库的记忆,保存着修改的结果,所有的数据归根都要回到其中,数据文件一旦损坏就会导致数据丢失。

Oracle数据文件由表空间进行组织管理,表空间是数据文件的逻辑集合,一个表空间下面对应一个或者多个数据文件,熟悉数据文件,须先熟悉表空间(所有环境基于oracle 11g)。

Oracle表空间和数据文件

一、表空间分类

表空间分为系统表空间和非系统表空间。从Oracle10g开始,推出了Bigfile tablespace的概念。表空间Tablespace从Oracle10g以后就分为两个类型,smallfile tablespace和bigfile tablespace。过去一个表空间对应多个数据文件我们成为Smallfile Tablespace。

所谓Bigfile Tablespace最显著的差别就是一个表空间只能对应一个数据文件。Bigfile Tablespace虽只对应一个数据文件,但数据文件对应的最大体积大大增加。传统的small datafile每个文件中最多包括4M个数据块,按照一个数据块8K的大小核算,最大文件大小为32G。每个Small Tablespace理论上能够包括1024个数据文件,这样计算理论的最大值为32TB大小。而Bigfile Datafile具有更强大的数据块block容纳能力,最多能够包括4G个数据块。同样按照数据块8K计算,Bigfile Datafile大小为32KG=32TB。理论上small tablespace和big tablespace总容量相同。大表空间这里就不再讨论了,喜欢的朋友可以自己测试下。

1.1,系统表空间

1.1.1,system表空间

system表空间用来存储整个数据库的数据字典表(data
dictionary table),该表空间不能被损坏,一旦损坏,数据库将无法打开。

SQL> select ts#,name from v$tablespace where name='SYSTEM';

       TS# NAME

---------- ------------------------------

         0 SYSTEM

1.1.2,sysaux表空间

从oracle 10g开始,oracle将工具放到SYSAUX,减轻system的压力。SYSAUX表空间不影响系统,但是会影响性能。

SQL> select ts#,name from v$tablespace where name='SYSAUX';

       TS# NAME

---------- ------------------------------

         1 SYSAUX

1.2,非系统表空间

1.2.1,undo

undo表空间中会自动分配undo段,这些undo段用来保存事务中的DML语句的undo信息,也就是来保存数据在被修改之前的值。undo数据用来:1)事务的回滚;2)实例恢复(回滚);3)一致性读时需要构造CR块;

查看undo表空间:

SQL> select ts#,name from v$tablespace where name='UNDOTBS1';

       TS# NAME

---------- ------------------------------

         2 UNDOTBS1


SQL> show parameter undo_tablespace;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_tablespace  

查看回滚段信息:

SQL> select * from v$rollname;

       USN NAME

---------- ------------------------------

         0 SYSTEM

        11 _SYSSMU11_3495923500$

        12 _SYSSMU12_3227503110$

        13 _SYSSMU13_3813465056$

        14 _SYSSMU14_3771977856$

        15 _SYSSMU15_3115189928$

        16 _SYSSMU16_767821622$

        17 _SYSSMU17_1964048486$

        18 _SYSSMU18_874028646$

        19 _SYSSMU19_1052114549$

        20 _SYSSMU20_2668599833$

1.2.2,temp

temp表空间,即临时表空间,用来存放用户排序,分组等操作时的数据信息。

查看temp表空间

SQL> select ts#,name from v$tablespace where name='TEMP';

       TS# NAME

---------- ------------------------------

         3 TEMP

1.2.3,users

从oracle 10g开始,oracle将用户数据信息单独存放到users表空间中。

SQL> select ts#,name from v$tablespace where name='USERS';

       TS# NAME

---------- ------------------------------

         4 USERS

1.2.4,用户表空间

SQL> select ts#,name from v$tablespace where name not in('SYSTEM','SYSAUX','TEMP','USERS','UNDOTBS1');


       TS# NAME

---------- ------------------------------

         5 DT_TPC_DAT

         6 DT_CAT_DAT

         8 DT_TEST_DAT

二、操作

2.1,表空间操作

2.1.1,创建表空间:

SQL>create tablespace DT_TPC_DAT datafile '/opt/oracle/data/tpc/DT_TPC_DAT01.DBF' size 1G autoextend on next 200M maxsize 31G;

2.1.2,删除表空间

不能删除的表空间为系统表空间,正在用的undo表空间,默认临时/永久表空间

drop tablespace talespace_name including contents and datafile;,

2.1.3,修改表空间权限

alter tablespace tablespace_name read write;

alter tablespace tablespace_name read only;

2.1.4,脱机表空间

alter tablespace tablespace_name offline;

alter tablespace tablespace_name online;

2.1.5,表空间改名

alter tablespace tablespace_name1 rename to tablespace_name2;

sysaux system不能改名

用户表空间users,undo表空间,temp表空间最好不要改名,因为系统中部分参数定义名还是以原来的表空间名,下次数据库启动会报错。

2.1.6,表空间说明

system 表空间必须online 必须是read write

sysaux 表空间可以offline 不能read only

undo 表空间不能offline 不能read only

只读表空间的对象可以删除,但是不能被update和insert

2.2,数据文件操作

2.2.1,修改数据文件自动扩展

alter database datafile '...........' autoextend on;

2.2.2,修改数据文件大小

alter database datafile '...........' resize 1M;

2.2.3,添加数据文件

alter tablespace add datafile '.......' size 200M autoextend off;

2.2.4,数据文件重命名(必须要在归档模式下)

a,alter tablespace t01 offline;(数据库在open状态)

b,ho cp /u01/oracle/oradata/orcl/t1.dbf /u01/oracle/oradata/orcl/t11.dbf

c,alter database rename file 'u01/oracle/oradata/orcl/t1.dbf' to '/u01/oracle/oradata/orcl/t11.dbf';

d,alter tablespace t01 online;

如果数据库只在mont状态,那么只要在操作系统级别移动数据文件,执行数据库文件改名,启动数据库即可

三、重点

3.1,修改数据文件注意点

ALTER DATABASE 语句修改单独的 DataFile

ALTER TABLESPACE 语句修改所有的 DataFile

3.1.1,ARCHIVRLOG  模式下的更改 DataFile

只有在 ARCHIVELOG 模式下才可使用 ALTER DATABASE 来更改DataFile

ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' ONLINE;

ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' OFFLINE;


由于在 NOARCHIVELOG 模式下,数据文件脱机后会造成数据的遗失,所以只能使用 ALTER DATABASE 语句下带有 DATAFILE 和 OFFLINE DROP 子句的选项将该 DataFile 直接取消,例如该 DataFile 只包含临时段数据,并没有备份时:

alter database datafile '/u02/oracle/rbdb1/users3.dbf' offline drop;


alter tablespace ....offline,会对数据文件进行检查点,并冻结数据文件SCN表空间 online 时,Oracle 会取得当前 SCN,解冻 offline 文件 SCN,和当前 SCN同步tablespace offline 有几种选项可供选择: normal, temporary,immediate, for recovery,而在 datafile 中则没有这些选项。

3.1.2,,数据文件reuse参数

1,如果 file 已经存在,并且在创建时指定了 file size,那么就重用原文件,并应用新的 size,如果没有指定 file size,则保留原有的大小

2,如果 file 不存在,oracle 将忽略该参数

3,如果 Oracle 使用了已经存在的 file,那么之前 file 里的数据将全部丢失


3.1.3,offline drop

offline drop 并不会 drop datafile, 仅仅是将 datafile 标记为 offline, 我们 online之后还可以 recover 回来。

alter database datafile '/usr/dt_sys_dat1.dbf' offline drop;

该命令不会删除数据文件,只是将数据文件的状态更改为recover。 offline drop命令相当于把一个数据文件至于离线状态,并且需要恢复,并非删除数据文件。 数据文件的相关信息还会存在数据字典和控制文件中

归档模式下,alter database datafile 'file_name' offline 和 offline drop 没有什么区别。 因为offline 之后多需要进行recover 才可以online。


alter database datafile '/usr/dt_sys_dat1.dbf' online;

recover datafile '/usr/dt_sys_dat1.dbf';


alter tablespace dt_sys_dat drop datafile '/usr/dt_sys_dat1.dbf';


该语句会删除控制文件和磁盘上的文件,删除之后的原数据文件序列号可以重用。该语句只能是datafile online的时候才可以使用。如果说对应的数据文件已经是offline for drop,那么仅针对 dictionary managed tablespaces 可用。

四、概述

表空间和数据文件管理基本内容介绍完成,后期将会针对其中的深入内容进行分析:包括数据文件头分析,数据文件内部数据块分析,数据文件错误解决等。

喜欢的朋友可以扫描以下二维码进行关注,公众号将每天更新文章:

Oracle表空间和数据文件