暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C入门到精通之表空间与数据文件

ITPro进化论 2023-12-20
517

在Oracle中,表空间中的数据存储在磁盘的数据文件中,所以对表空间的管理操作与对数据文件的管理操作密切相关。通过使用表空间,可以有效地部署不同类型的数据,加强数据管理,从而提高数据库的运行性能。

1. 表空间与数据文件的关系

在Oracle数据库中,表空间与数据文件之间的关系非常密切,两者之间相互依存。创建表空间时必须创建数据文件,增加数据文件时也必须指定表空间。

Oracle磁盘空间管理中的最高逻辑层是表空间,它的下一层是段,并且一个段只能驻留在一个表空间内。段的下一层是盘区,一个或多个盘区可以组成一个段,并且每个盘区只能驻留在一个数据文件中。如果一个段跨越多个数据文件,它就只能由多个驻留在不同数据文件中的盘区构成。盘区的下一层就是数据块,它也是磁盘空间管理中逻辑划分的最底层,一组连续的数据块可以组成一个盘区。

下图展示了数据库、表空间、数据文件、段、盘区、数据块及操作系统块之间的相互关系;

如果要查询表空间与对应的数据文件的相关信息,可以从dba_data_files数据字典中获得;

在system模式下,从dba_data_files数据字典中查询表空间及其包含的数据文件,代码如下:

col tablespace_name for a10

col file_name for a50

col bytes for 999,999,999

select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;

从查询所列的结果来看,一个数据库包括多个表空间,如SYSTEM表空间、USERS表空间等。每一个表空间又包含一个或多个数据文件,如USERS表空间包括一个数据文件USERS01.DBF。表空间可以看作Oracle数据库的逻辑结构,而数据文件可以看作Oracle数据库的物理结构。

2. Oracle的默认表空间

默认表空间是指在创建Oracle数据库时,系统自动创建的表空间,这些表空间通常用于存储Oracle系统内部数据和提供样例所需要的逻辑空间,Oracle默认的表空间及其说明如下表所示;

2.1. SYSTEM表空间

Oracle数据库的每个版本都使用SYSTEM表空间存储内部数据和数据字典,SYSTEM表空间主要存储sys用户的各个对象和其他用户的少量对象。可以从dba_segments数据字典中查询到某个表空间所存储的数据对象及其类型(如索引、表、簇等)和拥有者。

查询USERS表空间内存储的数据对象及其类型和拥有者,代码如下:

--设置显示格式
col owner for a10;
col segment_name for a30;
col segment_type for a20;
--查询USERS表空间内存储的数据对象及其类型和拥有者
select segment_type,segment_name,owner from dba_segments where tablespace_name='USERS';

2.2. SYSAUX表空间

SYSTEM表空间主要用于存储Oracle系统内部的数据字典,而SYSAUX表空间则充当SYSTEM的辅助表空间,主要用于存储除数据字典以外的其他数据对象,它在一定程度上降低了SYSTEM表空间的负荷。

查询SYSAUX表空间所存储的用户及其所拥有的对象数量,代码如下:

select owner as 用户,count(segment_name) as 对象数量 from dba_segments where tablespace_name='SYSAUX' group by owner;

注意:可以对SYSAUX表空间进行增加数据文件和监视等操作,但不能对其执行删除、重命名或设置只读(READ ONLY)等操作。

3. 创建表空间

为了简化表空间的管理并提高系统性能,Oracle建议将不同类型的数据对象存储到不同的表空间中。在创建表空间时必须要考虑以下几点:

  • 是创建小文件表空间,还是大文件表空间(默认是小文件表空间)。
  • 是使用局部盘区管理方式,还是使用传统的目录盘区管理方式(默认为局部盘区管理)。
  • 是手动管理段空间,还是自动管理段空间(默认为自动管理段空间)。
  • 是否是用于临时段或撤销段的特殊表空间。

3.1. 创建表空间的语法

CREATE [SMALLFILE/BIGFILETABLESPACE tablespace_name
DATAFILE '/path/filename' SIZE num[k/m] REUSE
[,'/path/filename' SIZE num[k/m] REUSE]
[,…]
[AUTOEXTEND [ON | OFFNEXT num[k/m]
[MAXSIZE [UNLIMITED | num[k/m]]]]
[MININUM EXTENT num[k/m]]
[DEFAULT STORAGE storage]
[ONLINE | OFFLINE]
[LOGGING | NOLOGGING]
[PERMANENT | TEMPORARY]
[EXTENT MANAGEMENT DICTIONARY | LOCAL [AUTOALLOCATE | UNIFORM SIZE num[k/m]]]]

1. 语法中的关键字

  • SMALLFILE/BIGFILE:表示创建的是小文件表空间还是大文件表空间。
  • AUTOEXTEND [ON | OFF] NEXT:表示数据文件为自动扩展(ON)或非自动扩展(OFF),如果是自动扩展,则需要设置NEXT的值。
  • MAXSIZE:表示当数据文件自动扩展时,允许数据文件扩展的最大字节数,如果指定UNLIMITED关键字,则不需要指定字节长度。
  • MININUM EXTENT:指定最小的长度,由操作系统和数据库的块决定。
  • ONLINE | OFFLINE:创建表空间时可以指定为在线或离线。
  • PERMANENT|TEMPORARY:指定创建的表空间是永久表空间或临时表空间,默认为永久表空间。
  • LOGGING | NOLOGGING:指定该表空间内的表在加载数据时是否产生日志,默认为产生日志(LOGGING)。即使设置为NOLOGGING,但在进行INSERT、UPDATE和DELETE操作时,Oracle仍会将操作信息记录到Redo Log Buffer中。
  • EXTENT MANAGEMENT DICTIONARY | LOCAL:指定表空间的扩展方式是使用数据字典管理还是本地化管理,默认为本地化管理。Oracle不推荐使用数据字典管理表空间。
  • AUTOALLOCATE | UNIFORM SIZE:如果采用本地化管理表空间,在表空间扩展时,指定每次盘区扩展的大小是由系统自动指定还是按照等同大小进行。若是按照等同大小进行,则默认每次扩展的大小为1MB。

2. 语法中的参数

  • tablespace_name:该参数表示要创建的表空间的名称。
  • '/path/filename':该参数表示数据文件的路径与名字。REUSE表示若该文件存在,则清除该文件再重新创建该文件;若该文件不存在,则直接创建该文件。
  • DEFAULT STORAGE storage:指定以后要创建的表、索引及簇的存储参数值,这些参数将影响以后表等对象的存储参数值。

3.2. 通过本地化管理方式创建表空间

本地化表空间管理使用位图跟踪表空间所对应的数据文件的自由空间和块的使用状态,位图中的每个单元对应一个块或一组块。当分配或释放一个扩展时,Oracle会改变位图的值以指示该块的状态。这些位图值的改变不会产生回滚信息,因为它们不更新数据字典的任何表。所以,本地化管理表空间具有以下优点:

  • 使用本地化的扩展管理功能(包括自动大小和等同大小两种),可以避免发生重复的空间管理操作。
  • 本地化管理的自动扩展(AUTOALLOCATE)能够跟踪临近的自由空间,这样可以消除结合自由空间的麻烦。本地化的扩展大小可以由系统自动确定(AUTOALLOCATE),也可以选择所有扩展有同样的大小(UNIFORM)。通常使用EXTENT MANAGEMENT LOCAL子句创建本地化的可变表空间。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为等同的256 KB,代码如下:

create tablespace tbs_test_1 datafile '/opt/oracle/oradata/ORCLCDB/datafile1.dbf'
size 10extent management local uniform size 256K;

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,代码如下:

create tablespace tbs_test_2 datafile '/opt/oracle/oradata/ORCLCDB/datafile2.dbf'
size 10extent management local autoallocate;

在上述两个例子中,由于创建的都是本地化管理方式的表空间,因此都是用EXTENT MANAGEMENT LOCAL子句。当创建扩展大小等同的表空间时,使用UNIFORM关键字,并指定每次扩展的大小;当创建扩展大小为自动管理的表空间时,使用AUTOALLOCATE关键字,并且不需要指定扩展的大小。

3.3. 通过段空间管理方式创建表空间

段空间管理方式是建立在本地化空间管理方式基础之上的,即只有本地化管理方式的表空间,才能在其基础上进一步建立段空间管理方式。它使用SEGMENT SPACE MANAGEMENT MANUAL/LOCAL语句,段空间管理又可分为手动段和自动段两种空间管理方式。

3.3.1. 手动段空间管理方式

手动段空间管理方式是为了向后兼容而保留的,它使用自由块列表和PCT_FREE与PCT_USED参数来标识可供插入操作使用的数据块。

在每个INSERT或UPDATE操作后,数据库都会比较该数据块中的剩余自由空间与该段的PCT_FREE设置。如果数据块的剩余自由空间少于PCT_FREE自由空间(也就是说剩余空间已经进入系统的下限设置),则数据库就会从自由块列表上将其取下,不再对其进行插入操作。剩余的空间保留给可能会增大该数据块大小的UPDATE操作。而在每个UPDATE操作或DELETE操作后,数据库会比较该数据块中的已用空间与PCT_USED设置,如果已用空间少于PCT_USED已用空间(也就是已用空间未达到系统的上限设置),则该数据块会被加入自由列表中,供INSERT操作使用。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为手动,代码如下:

create tablespace tbs_test_3 datafile '/opt/oracle/oradata/ORCLCDB/datafile3.dbf'
size 20
extent management local autoallocate
segment space management manual;


3.3.2. 自动段空间管理方式

如果采用自动段空间管理方式,那么数据库会使用位图而不是自由列表来标识哪些数据块可以用于插入操作,哪些数据块需要从自由块列表上将其取下。此时,表空间段的PCT_FREE和PCT_USED参数会被自动忽略。由于自动段空间管理方式比手动段空间管理方式具有更好的性能,因此它是创建表空间时的首选方式。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为自动,代码如下:

create tablespace tbs_test_4 datafile '/opt/oracle/oradata/ORCLCDB/datafile4.dbf'
size 20m
extent management local autoallocate
segment space management auto;

在使用自动段空间管理方式时,需要注意以下两种情况:

  • 自动段空间管理方式不能用于创建临时表空间和系统表空间。
  • Oracle本身推荐使用自动段空间管理方式管理永久表空间,但其默认情况下却是MANUAL(手动)管理方式,所以在创建表空间时需要将段空间管理方式明确指定为AUTO。

3.4. 创建非标准块表空间

在Oracle数据库中,通常的块大小为8192 B,即8 KB,但Oracle允许创建块大小与基本块不同的表空间。块大小可由创建表空间时的BLOCKSIZE参数指定,这样有利于存储不同大小的对象,但需要注意以下3点:

  • 表空间的非标准块的大小为基本块的倍数,如大小为16 KB、64 KB、128 KB。
  • Oracle通常使用SGA自动共享内存管理,因此需要设置初始化参数DB_16K_CACHE_ SIZE=16 KB。
  • 这种块较大的表空间通常用来存储大对象(LOB)类型。

创建一个非标准块的表空间,块的大小为标准块的2倍,代码如下:

alter system set db_16k_cache_size = 16scope=both;

create tablespace tbs_test_5 datafile '/opt/oracle/oradata/ORCLCDB/datafile5.dbf'
size 64reuse
autoextend on next 4maxsize unlimited
blocksize 16k
extent management local autoallocate
segment space management auto;

注意:若不设置初始化参数DB_16K_CACHE_SIZE,则Oracle会显示“ORA-29339:表空间块大小16384与配置的块大小不匹配”这样的提示信息。

3.5. 建立大文件表空间

Oracle中的大文件(BIGFILE)与最多可由1022个文件组成的表空间不同,大文件表空间被存储在一个单一的数据文件中,并且它需要更大的磁盘容量来存储数据。大文件表空间可以根据选择的块的大小而变化,从32TB增至128 TB。

大文件表空间是为超大型数据库而设计的。当一个超大型数据库具有上千个读/写数据文件时,必须更新数据文件头部(如检查点),但此操作可能会花费相当长的时间。如果降低数据文件的数量,那么完成此操作的速度可能会快很多。创建一个大文件表空间,只需要在CREATE语句中使用BIGFILE关键字即可。

创建一个大文件表空间,指定一个数据文件,并且数据文件的大小为2 GB,代码如下:

create bigfile tablespace tbs_test_big datafile '/opt/oracle/oradata/ORCLCDB/datafilebig.dbf' size 2g;

注意:在创建大文件表空间时,由于指定的数据文件都比较大,因此其创建速度通常都比较慢,用户要耐心等待,不要急于结束操作。

大文件表空间主要被使用在存储区域网络(SAN)、磁盘阵列、自动存储管理(ASM)和类似的提供禁止数据访问多设备的存储解决方案上。

由于大文件表空间只有一个数据文件,因此当需要重新设置其大小时不需要标识数据文件的具体路径和名称,只需要使用ALTERTABLESPACE命令指定大文件表空间的名称,即可很方便地修改其大小。另外,需要注意的是,在创建表空间的语法中使用SIZE来标识数据文件的大小,而在修改表空间时,要使用RESIZE关键字来重置数据文件的大小。

修改大文件表空间tbs_test_big,将其空间大小由2 GB改变为1 GB,代码如下:

alter tablespace tbs_test_big resize 1g;

与大文件表空间不同的是,传统表空间可能包含多个数据文件,如果要改变其大小,则需要在ALTER DATABASE语句后面指定完整的操作系统路径和数据文件名称或内部文件号,以辨别每个数据文件,然后再重新设置它们的大小。

把数据文件datafile3.dbf的大小由原来的20 MB修改为100 MB,代码如下:

alter database datafile '/opt/oracle/oradata/ORCLCDB/datafile3.dbf' resize 100m;

今天的文章就到这里,如果对你有用,记得点个【赞】【在看】,感谢阅读~

文章转载自ITPro进化论,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论