ORACLE体系结构逻辑结构-表空间、段、区和数据块

实例

实例是指在内存中分配的一块共享内存区域(SGA)和一组后台进程(或线程),它们用于访问和控制数据库。3实例是Oracle数据库的运行时环境,它是数据库的动态部分,它可以启动和关闭,也可以有多个实例同时运行。

实例的名称是由实例名(Instance Name)决定的,它也叫做系统标识符(SID),它是实例的唯一标识,一般与数据库名相同。4实例名是由参数instance_name决定的,它会写入参数文件中,也会影响到数据库的连接和访问。

数据库和实例的关系

数据库和实例是Oracle数据库的两个重要组成部分,它们之间有着密切的关系。5一般来说,一个数据库只能被一个实例访问,这种模式叫做单实例数据库(Single Instance Database)。但是,在某些情况下,一个数据库可以被多个实例访问,这种模式叫做多实例数据库(Multi Instance Database),也叫做Oracle Real Application Clusters(RAC)。RAC是Oracle数据库的一种高可用性和高性能的解决方案,它可以实现数据库的负载均衡和故障转移。

Oracle的逻辑结构

Oracle的逻辑结构是一种层次结构。主要由:表空间、段、区和数据块等概念组成。逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系。

数据块(Data Blocks)

数据块是Oracle最小的存储单位,Oracle数据存放在"块"中。一个块占用一定的磁盘空间。特别注意的是,这里的"块"是Oracle的"数据块",不是操作系统的"块"。

Oracle每次请求数据的时候,都是以块为单位。也就是说,Oracle每次请求的数据是块的整数倍。如果Oracle请求的数据量不到一块,Oracle也会读取整个块。所以说,"块"是Oracle读写数据的最小单位或者最基本的单位。

块的标准大小由初始化参数DB_BLOCK_SIZE指定。具有标准大小的块称为标准块(Standard Block)。块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block)。

操作系统每次执行I/O的时候,是以操作系统的块为单位;Oracle每次执行I/O的时候,都是以Oracle的块为单位。

数据块的大小是通过kb字节个数来指定的,默认为8KB。相关参数为db_block_size

sql 复制代码
SQL> show parameter db_block_size
​
NAME                                 TYPE        VALUE
----------------------- --------------------- ---------
db_block_size                        integer     8192

数据区(Extent)

数据区表示一系列连续的数据块集合。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。一个数据区不能跨越多个文件,因为它包含连续的数据块。使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。一个Oracle对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。

在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。

举个例子来说,当我们创建一个表时,首先ORACLE会分配一区的空间给这个表,随着数据不断地增长,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给这个表,而不是多少个块.

视图dba_extents(或者all_extents、user_extents)是我们研究分区结构和存储构成的重要手段。

段(Segment)

段是由多个数据区构成的,它是为特定的数据库对象(如表段、索引段、回滚段、临时段)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件。使用段的目的是用来保存特定对象。

数据段是与数据库对象相对应,一般一个数据库对象对应一个数据段。

多个extent是对应一个数据段,每个数据段实际上就是数据库一个对象的代表。

一般来说, 当创建一个对象时(表,索引),就会分配一个段给这个对象.

一个Oracle数据库有4种类型的段:   数据段:数据段也称为表段,它包含数据并且与表和簇相关。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。   索引段:包含了用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。   回滚段:包含了回滚信息,并在数据库恢复期间使用,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。系统有个默认的回滚段,其管理方式既可以是自动的,也可以是手工的。   临时段:它是Oracle在运行过程中自行创建的段。当一个SQL语句需要临时工作区时,由Oracle建立临时段。一旦语句执行完毕,临时段的区间便退回给系统。

从dba_segments、user_segments视图中,可以比较清楚看清数据段的结构。

表空间(tablespace)

是数据库的逻辑划分。任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。

TableSpace是存储结构中的最高层结构。建立一个表空间的时候,是需要指定存储的文件。一个表空间可以指定多个数据文件,多个文件可以在不同的物理存储上。也就是说,表空间是可以跨物理存储的。

一个数据库实例可以有N个表空间,一个表空间下可以有N张表。

系统表空间(system tablespace)

是每个Oracle数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。

系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。 系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。

SYSAUX表空间

是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle 数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷。

临时表空间

相对于其他表空间而言,临时表空间(temp tablespace)主要用于存储Oracle数据库运行期间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。

撤销表空间

用于保存Oracle数据库撤销信息,即保存用户回滚段的表空间称之为回滚表空间(或简称为RBS撤销表空间(undo tablespace))。在Oracle8i中是rollback tablespace,从Oracle9i开始改为undo tablespace。在Oracle 10g中初始创建的只有6个表空间sysaux、system、temp、undotbs1、example和users。其中temp是临时表空间,undotbs1是undo撤销表空间。

USERS表空间

用户表空间,用于存放永久性用户对象的数据和私有信息。每个数据块都应该有一个用户表空间,以便在创建用户是将其分配给用户。

创建表空间

csharp 复制代码
create [temporary] tablespace "TBS"           -- '表空间类型及名称', 默认 '永久',temporary 临时表空间
datafile 'D:\Oracle\TBS.dbf' size 10m                -- '数据文件的位置及大小'
[autoextend off] | [autoextend on next n maxsize m]  -- '是否自动扩展',默认 'off'
[loggin | nologgin]                                  -- '是否产生日志',默认 'loggin'
[segment space management auto]                      -- '段空间自动管理',默认 'auto', 建议默认
[extent management local [uniform size n]]           -- '表空间管理方式',dictionary | local(默认,推荐)
​
sql 复制代码
--查看表空间 SELECT TABLESPACE_NAME, STATUS, CONTENTS FROM DBA_TABLESPACES;
​
--删除表空间 DROP TABLESPACE db_test INCLUDING CONTENTS AND DATAFILES;

用户

用户是数据库的访问者和使用者,它是一种数据库对象,用于标识数据库的登录者和拥有者。用户可以拥有自己的数据库对象,也可以访问其他用户的数据库对象,这取决于用户的权限和角色。用户是数据库的安全和控制的基础,它可以实现数据库的身份认证和访问控制。

用户的名称是由用户名(User Name)决定的,它是用户的唯一标识,可以由用户自定义。用户的创建和管理是由SQL语句实现的,例如:

--创建用户 CREATE USER utest IDENTIFIED BY utestpwd DEFAULT TABLESPACE db_test TEMPORARY TABLESPACE temp;

--查看用户 SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS;

--删除用户 DROP USER utest CASCADE;

表是数据库的基本对象,它是一种二维的数据结构,用于存储数据。表由行和列组成,每一行代表一条记录,每一列代表一个属性。表是数据库的数据源和目标,它是数据库操作的对象和结果。

表的名称是由表名(Table Name)决定的,它是表的唯一标识,可以由用户自定义。表的创建和管理是由SQL语句实现的,例如:

--创建表 CREATE TABLE emp ( empno NUMBER(4) PRIMARY KEY, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) REFERENCES dept(deptno) );

--查看表 SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES;

--删除表 DROP TABLE emp;

表空间、用户和表的关系

总结

一个数据库有很多表空间,一个表空间有多个段组成,一个段由多个区组成,一个区由连续的数据块组成。表空间不是表,段是用来存储数据库对象的(如表、所以、过程等),一个区用来存储特定类型的数据的(如字符、日期、数字、其他类型)。

表空间、用户和表是数据库的三个重要对象,它们之间有着密切的关系。一般来说,一个用户可以拥有多个表空间,一个表空间可以包含多个表,一个表只能属于一个表空间和一个用户。

相关推荐
Adolf_19931 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
叫我:松哥1 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
海里真的有鱼1 小时前
Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能
开发语言·后端·rabbitmq
工业甲酰苯胺2 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
mqiqe2 小时前
PostgreSQL 基础操作
数据库·postgresql·oracle
新知图书2 小时前
Rust编程的作用域与所有权
开发语言·后端·rust
一心只为学3 小时前
Oracle密码过期问题,设置永不过期
数据库·oracle
wn5313 小时前
【Go - 类型断言】
服务器·开发语言·后端·golang
ggdpzhk3 小时前
Mybatis 快速入门(maven)
oracle·maven·mybatis
希冀1233 小时前
【操作系统】1.2操作系统的发展与分类
后端