浅谈Oracle存储管理(一):存储结构

目录

概述

Oracle逻辑存储结构

数据块(data block)

区(extent)

段(segment)

表空间(tablespace)

Oracle物理存储结构

数据文件

本篇总结 


概述

        一句大白话,数据库最基本的功能是存储数据。所以Oracle数据库最重要的一块功能以及很多的维护、管理工作是围绕着存储展开的。关于存储这块的内容比较多,所以计划写3篇文章来和各位朋友一起聊聊Oracle的存储及管理:

(一):Oracle的存储结构

(二):Oracle的空间管理(上)

(三):Oracle的空间管理(下)

        存储系列文章的思路也是先了解存储结构是什么,再聊怎么去管理存储此外,本次只聊Oracle的基本存储结构和管理,Oracle的可插拔数据库、ASM存储等不在本次讨论范围内,后续会专门出对应的文章和各位朋友一起分享与学习。

        Oracle的存储结构分为逻辑结构和物理结构两块,二者是紧密联系的,它们之间的关系如下图所示。所以本篇文章也会从逻辑结构和物理结构两块分开进行描述。

Oracle存储结构

Oracle逻辑存储结构

         Oracle数据库的存储结构包括数据块(data block)、区(extent)、段(segment)、表空间(tablespace)、数据库(databse)。

数据块(data block)

1、基本概念

        数据块是由多块磁盘块(文件系统块,例如ext4文件系统)组成的。块大小可以调整为2k、4k、8k、16k、32k,默认大小是8k。

        数据块的结构在逻辑上分为Block header(块头)、Free space(可用空间)、Row data(行数据)三部分。

块头:包含段类型(表、索引、undo、临时段等)、数据块地址、表目录、行目录、事务槽(ITL),在对块中的行数据进行事务修改时会使用到,块头从顶部向下增长。

行数据:是数据块中行的实际数据,行数据空间从数据块的底部开始向上增长。行数据如果太大,可以跨多个连续的块存储。

可用空间:逻辑上位于数据块的中间,在必要时可以使块头和行数据空间增加。当插入新行或者使用更大的值更新现有行时,行数据 会占用可用空间;并根据实际操作发生行迁移或者行链接。可用空间的默认大小为块的20%。

块中的可用空间是连续的。

但是删除和更新可能会使得块中的可用空间碎片化。必要时,Oracle会合并块中的可用空间。

2、数据块相关查询

2.1、查看表所在的表空间、数据文件及对应的数据块号

SELECT tablespace_name,file#, block# FROM dba_extents WHERE segment_name = 'table_name';

2.2、查询数据文件对应的数据块信息

SELECT * FROM v$datafile

区(extent)

        区是数据块的集合,一个数据块块只属于一个区。区的大小的决定因素有两个:统一分配、自动分配。

1、区的相关信息查看:

SELECT * FROM dba_extents

2、 区的分配

        表在创建的时候会分配空间,这个空间叫做初始区extent。在Oracle10g之前,刚刚建立的空表也有初始区extent;但在11g之后,只有插入第一条数据后才会分配空间。(可以建立一张表后,查下dba_extents数据就会发现此情况)

3、区的管理

        可以通过字典管理或者本地管理的方式进行管理。

段(segment)

        段是区的集合,一个区只属于一个段。段≠表,因为段的类型有很多,包括:表、索引、UNDO、临时段等。

1、段的类型

数据段:也称为表段,当创建一张表时,Oracle自动创建一个以该表名字命名的表段。

索引段:当创建索引时,Oracle自动创建一个以该索引名字命名的索引段。

回滚段:也称undo段当事务发生时,Oracle会自动为其分配一个回滚段。修改表中数据时,数据修改的前镜像会存储在回滚段中;当回滚时,Oracle利于回滚段的数据进行恢复。

临时段: Oracle在运行过程中自动创建的段。当一个SQL语句查询结果集较大,且涉及到排序、JOIN连接或者其他复杂操作时,需要用到临时段;当语句执行完毕后,临时段自动消除

LOB段:表中含有CLOB、BLOB等大字段时,Oracle会创建LOB段存储相应的大型对象数据。

2、 段的查询

--查看所有类型段的描述信息

SELECT * FROM dba_segments

--查看回滚段的描述信息

SELECT * FROM dba_rollback_segs

3、段的管理模式

手动管理与自动管理 ,可以使用下面的语句查询段空间的管理模式

SELECT tablespace_name, segment_space_management FROM dba_tablespaces;

表空间(tablespace)

        在逻辑上表空间是段的集合,一个段只属于一个表空间;在物理上表空间可以有一个或者多个数据文件,但每个数据文件只能属于一个表空间。

1、默认自带表空间 

1.1、SYSTEM

系统表空间。存储了数据字典、动态性能视图、已经编译的存储过程和包等核心内容;并且如果Oracle开启了  审计,那么审计数据也会默认存储在SYSTEM表空间中。SYSTEM表空间非常重要!

1.2、SYSAUX:

SYSTEM的辅助表空间

1.3、USERS

用户表空间。Oracle推荐的供用户存储数据的表空间;但在生产上用户基本上都是使用自己创建的表空间,因为自己创建表空间名字可以见文知意,操作比较灵活。

1.4、UNDOTBS1

回滚表空间。存储在事务执行过程中被修改、删除的前镜像数据。在未提交时。可以用于数据的回滚;在提交后,在UNDO保留时间未到或UNDO表空间未满的情况下,可以用于数据闪回。

1.5、TEMP

临时表空间。存储Oracle在进行排序、JOIN连接等操作时产生的临时中间数据,且只有在进行非常复杂、大量的情况下,才会使用临时表空间。操作执行完成后,临时表空间会自动清空。

1.6、EXAMPLE

工具表空间(19C中已经不再默认自带)。

2、表空间分类 

2.1、按文件大小

        可以分为大文件表空间和小文件表空间。小文件表空间,数据文件最大是32G。大文件表空间,数据文件最大是128TB(基于块大小是32K);如果块大小是8K,那么数据文件最大就是32TB;朋友们记住这个逻辑关系。

2.2、按数据特性

        可以分为临时表空间、永久表空间、回滚表空间。临时表空间就是TEMP表空间。回滚表空间就是UNDO表空间。除了临时和UNDO,其他的表空间就是永久表空间了;存放的就是永久性数据,例如表、索引等;我们平时自己创建一个针对业务的表空间,这本身就是永久表空间。

可以通过以下语句来查询表空间是属于永久、临时、UNDO:

SELECT tablespace_name,contents FROM dba_tablespaces;

2.3、按用途

        除了上面提到的默认表空间已经介绍过用途外,我们自己创建的表空间,就是专门用来存储实际业务数据的表空间。

3、表空间查看

--查询数据库所有表空间的描述信息 

SELECT * FROM dba_tablespaces;

--查询数据文件以及所属表空间的描述信息 

SELECT * FROM dba_data_files;

--查询临时数据文件以及所属表空间的描述信息

SELECT * FROM dba_temp_files;

--查询表空间名称、编号、是否大文件等信息

SELECT * FROM v$tablespace

4、表空间创建

CREATE TABLESPACE test1 DATAFILE '/u01/app/oracle/oradata/ORCL/test01.dbf' SIZE 50M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

5、表空间删除

语法:

DROP TABLESPACE tablespace_name 
      [ INCLUDING CONTENTS ] 
      [ AND DATAFILES [CASCADE|KEEP]];

例1:删除表空间及其包含的数据库对象(表、索引),数据文件

DROP TABLESPACE test1 INCLUDING CONTENTS AND DATAFILES

例2:只删除表空间,但保持数据库对象,数据文件不变

DROP TABLESPACE test1

例3:删除表空间,但保留数据文件

DROP TABLESPACE test1 AND DATAFILES KEEP;

例4:删除表空间并将其使用的所有数据文件级联删除

DROP TABLESPACE test1 INCLUDING CONTENTS AND DATAFILES CASCADE;

例5:删除表空间并同时删除所有的对象和数据

DROP TABLESPACE test1 INCLUDING CONTENTS;

总结:

1、当表空间非空时,不可以使用例2、例3的写法;会报ora-01549,需要先清空其中数据。

2、当表空间非空时,可以使用例1、例4、例5的写法。

附加说明:

        如果您在删除表空间时,忘记删除数据文件。如果在操作系统层面删除的话,是需要关闭数据库才可以进行;我们不可能为了删个数据文件就让数据库停止运行。那么朋友们可以采用以下方法进行重新删除:

--先创建表空间,不要对数据文件做任何指定
CREATE TABLESPACE test1 DATAFILE '/u01/app/oracle/oradata/ORCL/test01.dbf'

--增加删除数据文件选项,就可以再次删除了
DROP TABLESPACE test1 INCLUDING CONTENTS AND DATAFILES

6、表空间修改

6.1、给表空间添加数据文件,即增加表空间容量

ALTER TABLESPACE test1 ADD DATAFILE '/u01/app/oracle/oradata/ORCL/test01.dbf'  SIZE 50M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED

 6.2、开启自动扩展,这次注意语法,是ALTER DATABASE,而不是ALTER TABLESPACE.

ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/test01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

 6.3、调整数据文件大小(这个其实没有必要,一般都是开启自增无限制的)

ALTER TABLESPACE test1 RESIZE DATAFILE '/u01/app/oracle/oradata/ORCL/test01.dbf' SIZE 200M;

6.4、表空间重命名 

ALTER TABLESPACE test1 RENAME TO test2;

 6.5、表空间脱机

        可以使联机表空间脱机,以使数据库此部分暂不可用以读写使用。数据库其他部分不受影响,可以继续供用户访问数据。需要脱机使用时,可以使用以下选项:

正常脱机。如果表空间的任何数据文件都没有错误条件,则该表空间可以正常脱机。Oracle数据库通过在表空间的所有数据文件脱机时,为其设置检查点,来确保将所有数据写入磁盘。正常脱机语句如下:

ALTER  TABLESPACE  test1 OFFLINE;

临时脱机。即使目标表空间的一个或者多个数据文件存在错误,也可以使得该表空间暂时脱机。Oracle数据库使尚未脱机的数据文件脱机,从而对它们执行检查点。如果没有文件处于脱机状态,但是您使用Temporary子句,则不需要介质恢复就可以使表空间恢复联机状态。但是如果目标表空间的一个或者多个文件由于写入错误而脱机,并且您使该表空间暂时脱机,则目标表空间需要恢复,然后才能重新联机。

ALTER  TABLESPACE  test1 OFFLINE TEMPORARY;

立即脱机。表空间可以立即脱机,而数据库无需在任何数据文件上设置检查点。当指定立即时,必须先恢复表空间的介质,然后才能使得表空间联机。如果数据库以非归档模式运行,那么是不能使用立即脱机的。 立即脱机语句如下:

ALTER  TABLESPACE  test1 OFFLINE IMMEDIATE;

注意:

SYSTEM表空间、UNDO表空间,临时表空间是不能脱机的。

重新联机语句 

ALTER TABLESPACE test1 ONLINE;

 7、默认表空间

在创建表时,如果不在建表语句后面加上表空间名称,那么该表会建到当前用户的默认表空间下。

默认表空间查询:

SELECT default_tablespace,username FROM dba_users;

Oracle物理存储结构

        Oracle存储在磁盘上的物理文件有很多,包括数据文件、控制文件、在线redo日志文件、归档热动日志文件、参数文件、备份文件、 密码文件、告警日志文件。这次存储系列的文章主要是针对Oracle存数据这个行为展开。所以在此只提及数据文件

数据文件

        一个数据文件只属于一个表空间,但一个表空间可以拥有多个数据文件。数据文件的保存形式是“xxxxxx.dbf”。

1、数据文件查看 

select * from v$datafile
SELECT * FROM dba_data_files;
select * from dba_temp_files

2、数据文件大小 

(1)大小数据文件

小文件:数据文件最大大小是32G

大文件:数据文件大小基于数据块大小,数据块为8K时,数据文件最大是32T;数据块为32K时,数据文件最大是128T;同理其他大小的数据块对应的数据文件最大大小,按照这个逻辑类推。

(2)数据文件大小限制

        数据文件可以限制大小,也可以不限制大小;当不指定大小时,数据文件大小默认为32G(小数据文件),实际生产业中,推荐是不限制数据文件最大大小

限制数据文件最大大小为20G:

ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/user02.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE 20G 

不限制数据文件最大大小: 

ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/user03.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED

3、数据文件扩展 

        数据文件可以设置自动扩展,也可以不设置自动扩展。实际生产中,还是推荐自动扩展;但当扩展到32G时,需要添加新的数据文件。

自动扩展,每次扩展100M:

ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/user02.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED 

不自动扩展:

ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/user02.dbf' SIZE 100M

 将已添加的数据文件改为自动扩展:

ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/user01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

4、数据文件添加 

        在前文中的数据文件大小、数据文件扩展其实已经描述了添加数据文件的语法,下面再对添加数据文件的语句做下全面的描述

ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/user02.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED 
添加数据文件描述

5、数据文件删除

语法:

ALTER TABLESPACE tablespace_name DROP DATAFILE file_id;

或者

ALTER TABLESPACE tablespace_name DROP DATAFILE '/u01/app/oracle/oradata/ORCL/user02.dbf'

注意:

(1)该语句会删除磁盘上的文件,并更新控制文件和数据字典中的信息;删除之后的原数据文件序列号可以重用 ;

(2)该语句只能是在目标数据文件处于ONLINE时,才可以使用; 如果数据文件处于OFFILNE,那么仅仅针对字典管理的表空间才可以使用;对于本地管理的表空间,不能使用;

(3)不能删除表空间的第一个数据文件,会报错“ORA-03263” (4)如果表空间只有1个数据文件,不能删除该文件 ;

(5)数据文件必须为空 ;

(6)不能删除SYSTEM表空间

本篇总结 

        上述的所有描述,只是分享了关于Oracle存储结构的基本知识,可以让人对Oracle的存储有个基本的概念和了解。其实其中的每个存储结构都可以拿出来单独写一篇大型文章,但这次只是浅谈,受限于时间精力(最近加班真的很严重),只能落笔于此。但我前段时间决定写开始写技术文章的目的是为了自我提升、与人分享。所以后面肯定会继续将深入篇写下去,也感谢各位朋友的阅读。如果有错误,欢迎朋友指正;他日见张禄,绨袍怀旧恩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜豆豆耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值