文章目录
1 数据库存储结构
1.物理结构:不同类型的数据文件,数据文件是真实存在的
2.逻辑结构:数据库为数据库中的所有数据,分配逻辑数据库空间。数据库空间分配的单位是数据块、区段和段。
顺序:表空间-段-区-块
也就是说,很多数据块组成区,很多区组成段,很多段组成表空间。
-
database 数据库
Oracle数据库至少由两个称为表空间的逻辑存储单元组成,它们共同存储数据库的所有数据。必须拥有SYSTEM和SYSAUX表空间 -
tablespace 表空间
一个表空间由一个或多个名为datafiles的数据文件组成,这些文件是Oracle数据库运行的操作系统上的物理结构文件。
数据文件表 dba_data_files
数据是存储在组成数据库的每个表空间的数据文件中 -
segment 段
一个表空间对应多个段。段是数据库中的对象如表、索引等,一个段就是一张表或一个索引,段和表/索引是一对一的关系,表是数据段,索引是索引段。
-
extent 区
一个区由多个数据块组成 -
block 块
一个块的默认大小是8k -
段、区、块的关系
1)数据存储在Block数据块中,一个数据块默认大小是8K
2)区是由一个或多个连续的数据块组成,区段是分配给存储特定类型信息的特定数量的连续数据块。区不能跨段,一个区只属于一个段。
3)段对应在物理磁盘上段是一组Extents,由一个或多个区组成,其中包含表空间中特定逻辑存储结构的所有数据,所有Extents都存储在相同的tablespace表空间中。一个表或者一个索引就是一个段。
1.1 表空间
表空间是一个逻辑概念,物理上对应一个或多个数据文件 datafile 或临时文件tempfiles,逻辑上表空间是存储段的容器
表空间逻辑的把两个物理文件看作是一个整体,将一个或多个数据文件整合在一起。
1.表空间类型
permanent 永久表空间(如上SYSTEM、SYSAUX和USERS表空间)temporary 临时表空间
UNDO 回滚表空间
2.管理方式
在建立表空间时确定的,分为两种:
1)段管理方式有 AUTO(自动) 和 MANUAL(手动) 两种
2)区管理方式有本地管理(可理解为自动管理)和字典管理(已淘汰)两种。
1.1.1 SYSTEM系统表空间
系统表空间是为整个数据库提供服务
1.每个Oracle数据库都包含一个名为SYSTEM的表空间,Oracle数据库在创建数据库时会自动创建这个表空间。当数据库打开时,system表空间总是online状态。
2.当SYSTEM表空间是本地管理方式时,无法创建字典管理的表空间。
3.SYSTEM表空间包含以下信息:
1)数据字典:系统表空间总是包含整个数据库的数据字典表。
2)PL/SQL程序单元描述:代表已存储PL/SQL程序单元(即过程、函数、包和触发器)存储的所有数据都驻留在系统表空间中。如果数据库包含许多这样的程序单元,那么数据库管理员必须在系统表空间中提供这些单元所需的空间。
1.1.2 SYSAUX表空间(11g以后才有)
1.SYSAUX表空间是SYSTEM表空间的一个辅助表空间。许多数据库组件使用SYSAUX表空间作为它们存储数据的默认位置。因此,SYSAUX表空间总是在数据库创建或数据库升级期间创建的。
2.在正常的数据库操作期间,Oracle数据库不允许删除或重命名SYSAUX表空间。
3.SYSAUX表空间是记录整个数据库情况的表空间
1.1.3 UNDO表空间
1.undo 表空间是用来存储撤销信息的表空间。不能在undo表空间中创建任何其他段类型(例如表或索引)。undo表空间仅在数据库处于自动撤消管理模式(默认)时使用。一个数据库可以包含多个undo表空间,但是在任何时候只能使用一个。Undo数据在Undo表空间中使用数据库自动创建和维护的Undo段进行管理。数据前镜像在undo表空间是自动被管理的。
2.当第一个DML操作在一个事务中运行时,该事务被绑定(分配)到当前undo表空间中的撤销段(从而绑定到一个事务表)。在很少的情况下,如果实例没有指定的undo表空间,事务就绑定到系统的undo段。一个事务开始时,就会分配一个undo段,事务结束时,undo段和事务的关系就没有了。
3.每个undo表空间由一组数据文件组成,并且是本地管理的。与其他类型的表空间一样,撤销块按区段分组,每个区段的状态在位图中表示。在任何时间点,区段要么被分配给事务表(并由事务表使用),要么是空闲的。
1.1.4 Temporary表空间
1.一般排序的时候会用到temp表空间
2.在本地管理系统表空间时,在创建数据库时必须至少定义一个默认临时表空间。
3.临时文件是一个属于临时表空间的文件;它是使用TEMPFILE选项创建的。临时表空间不能包含永久数据库对象(例如表),并且通常用于排序。
4.用于缓存排序的数据(order by、group by和distinct都会产生中间结果)可以建立多个临时表空间(如果排序的数据量小),但默认的临时表空间只能有一个且不能offline和drop。temp表空间是nologing的(不记日志)。
1.1.5 temporary datafiles
本地管理的临时表空间具有临时数据文件(tempfile),与普通数据文件类似,但有以下例外:
1.Tempfiles总是设置为NOLOGGING模式。
2. 不能设置tempfile为只读状态。
3. 不能使用ALTER DATABASE语句创建tempfile。
4. 数据恢复时不识别tempfiles:
1)备份控制文件不会为tempfile生成任何信息。
2)创建控件文件不能指定关于tempfile的任何信息。
1.1.6 为数据库分配更多空间
表空间的大小,就是构成表空间的数据文件的大小。所有表空间的集合大小,就是数据库的大小。
可以通过以下三种方式扩大数据库
1.Add a datafile to a tablespace(最大就是32G,如果32G不够就只能再添加而不能resize)
2.Add a new tablespace 创建新的表空间
3. Increase the size of a datafile 将表空间设置为可自动扩展的
想单独修改最大值必须包含关键字autoextend等
1.1.7 数据文件
1.Oracle数据库中的表空间由一个或多个物理数据文件组成。数据文件只能与一个表空间和一个数据库相关联。
2.Oracle数据库通过分配指定数量的磁盘空间和文件头所需的开销,为表空间创建一个数据文件。如⽂文件很⼤大,这个过程可能会花费大量的时间。任何数据库中的第一个表空间总是SYSTEM表空间,因此Oracle数据库在创建数据库时自动为SYSTEM表空间分配,数据库的第一个数据文件。
3.数据文件大小:
可以在数据文件创建之后更改其大小。
也可以指定数据⽂文件,模式为随着表空间中的对象的增长而动态增长。
4.数据文件类型
- Small file
在一个表空间可以建立1-1024个数据文件(默认), 单个最大32G。 - Big file
在一个表空间只能建立一个数据文件 (8k 的 block 时,最大可达 32T),简化对数据文件管理。
数据块大小(单位 k) | BFT最大值(单位 T) |
---|---|
2k | 8T |
4k | 16T |
8k | 32T |
16k | 64T |
32k | 128T |
5.创建不同数据文件类型的表空间
- 创建Small file的表空间
SQL> create tablespace test datafile '/u01/app/oracle/oradata/PROD/test01.dbf' size 32G;
- 创建Big file的表空间
SQL> create bigfile tablespace big_tbs datafile '/u01/app/oracle/oradata/PROD/bigtbs01.dbf' size 5G;
- 在Big file表空间下添加一个数据文件
SQL> alter tablespace big_tbs add datafile '/u01/app/oracle/oradata/PROD/bigtbs02.dbf' size 5G;
- 查看表空间是否有使用Big file
SQL> select name,bigfile from v$tablespace;
1.1.8 查看表空间
1.查看表空间及其数据文件大小、是否为自动扩展
- autoextensible
是否可以自动扩展
2.表空间的大小,一个表空间可能对应多个数据文件
3.查看表空间空闲空间
4.查看表空间缺省选项dbms_metadata.get_ddl
metadata 元数据
select dbms_metadata.get_ddl(‘TABLESPACE’,‘A’) into v_sql FROM dual;
获取一个ddl语句(对象类型,对象名)传到v_sql里
dbms_output.put_line(v_sql);
显示这个变量(此时这里已经有这个DDL语句了)
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
数据块管理本地自动分配默认值
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
不压缩,段的管理方式是自动的
1.1.9 创建表空间
1.创建表空间,在该表空间下创建一张表,插入数据
2.表空间的大小等同它下的数据文件大小之和,默认使用 small 表空间,当发生表空间不足的问题时常用的 3 个解决办法:
1)增加原有数据文件大小(resize)
表内有数据时,如果resize为更小的内存,则会报错
2)增加一个数据文件(add datafile)
3)设置表空间自动增长(autoextend)
1.1.10 删除表空间及其数据文件
表空间的逻辑不在了,但是数据文件还存在,如果要删除文件就用rm
contents 包括控制⽂件和数据字典信息,datafiles 是物理数据⽂件。
数据库 OPEN 下不能删除的表空间是:
1.system
2.active undo tablespace
3.default temporary tablespace
4.default tablespace
1.1.11 表空间状态
- 设置read only
SQL> alter tablespace xxx read only;
SQL> alter tablespace xxx read write;
- 查看状态
checkpoint_change# 也叫SCN#号,时间点号,是自增的一串数字。如果数据库忙的时候,数字增长的非常快。
我们先记录下当前状态下两个表空间数据文件的SCN号,这个号表示表空间数据文件在Oracle数据库运行时某个时间点的状态。SCN是Oracle里面的一个序号,用来标识一个先后顺序,通常用于保护数据块的完整性或者一致性的查询。
当数据块做了修改,它的SCN值就会发⽣生相应的改变。
- 设置离线状态
system、sysaux、undo、temp表空间不可以离线
只有users、xxx等自己的表空间才可以offline
1.1.12 临时表空间
1.在本地管理系统表空间时,在创建数据库时必须至少定义一个默认临时表空间。
2.临时文件是一个属于临时表空间的文件;它是使用TEMPFILE选项创建的。临时表空间不能包含永久数据库对象(例如表),并且通常用于排序。
3.用于缓存排序的数据(中间结果) 可以建立多个临时表空间,但默认的临时表空间只能有一个且不能offline 和 drop。temp 表空间是 nologing 的(不记日志)。
4.本地管理的临时表空间具有临时数据文件(tempfile),与普通数据文件类似,但有
以下例外:
1)Tempfiles总是设置为NOLOGGING模式。
2)不能设置tempfile为只读状态。
3)不能使用ALTER DATABASE语句创建tempfile。
4)数据恢复时不识别tempfiles
5.备份控制文件不会为tempfile生成任何信息。
6.创建控件文件不能指定关于tempfile的任何信息。
7.创建临时表空间
- 建立临时表空间temp02
- 为temp02插入一个tempfile
- 删除一个tempfile
- 查看默认的temp表空间
- 切换默认临时表空间
- 指定用户使用临时表空间
1.2 段 segment
1.段是逻辑概念,对应数据库中的对象。
2.段的类型
表段、索引段、undo 段、临时段
3.创建一个表,ORACLE 为表创建一个(或多个)段,在一个段中保存该表的所有表数据(一个数据表就是一个段或多个段,但不能跨段)。
特殊情况:表分为堆表和分区表(比如将emp表中的hiredate按年份分区,此时一个分区就是一个段)
分区表在数据量庞大的时候使用,分区键值有其自己的索引,在查询时先扫落在哪个分区,然后只在分区中搜索。分区表可以对某一个分区进行truncate
- 延迟段创建
当表里没有数据时,oracle数据库不为这个表创建段,所以如果表中没有数据,就查不出段的相关信息。
4.通常段中至少有一个初始区。当这个段数据增加使得区(extent)不够时,将为这个段分配新的后续区。(11g 段空间延时分配)
5.表空间在逻辑上可以存在多个段,物理理上可以对应多个数据文件,一个段比较大时可以跨多个数据文件。(表可以跨数据文件)
6.管理方式free space空闲空间可以自动管理,也可以手动管理
空闲空间在数据库段内是自动管理的。段内空闲/使用的空间使用位图跟踪,而不是使用空闲列表。
自动分段空间管理提供了以下好处:
1)易用性
2)更好的空间利用率,特别是对于行大小差异很大的对象(因为段在被使用时,会根据表插入数据而变化。区是连续的block,但段不是连续的区。)
3)更好地对并发访问中的变化进行运行时调整(并发:一个表能被多个用户使用)
4)在性能/空间利用率方面,能更好的多实例行为在创建本地管理的表空间时,指定自动分段空间管理。然后,该规范应用于随后在这个表空间中创建的所有段。
1.3 区 extent
1.概念:
Extent是进行存储空间分配的基本单位。
一个区是由一系列逻辑上连续的数据块组成的逻辑存储结构。
段中第一个区叫初始区,随后分配的区叫后续区。
1.4 查看表空间类型、段、区管理方式
-
TS#
表空间编号 -
NAME
表空间名称 -
INCLUDED_IN_DATABASE_BACKUP
该空间是否包含在完整数据库备份中 -
BIGFILE
表空间只能由一个BIGFILE,但文件大小可以达到4GB个数据块,剩余都是普通文件 -
FLASHBACK_ON
这个表空间是否被包含在数据库的闪回操作中 -
ENCRYPT_IN_BACKUP
指定备份数据库是否被加密
1.5 数据块 block
数据块是数据库使用的最小数据单元。
标准块大小由DB_BLOCK_SIZE初始化参数指定。
数据块大小应该是操作系统块大小的倍数。
1.数据块格式
- Header 通用和变量:记录块的信息,例如块地址和段的类型(数据或索引)。
- table dir:数据块的这一部分包含关于在该块中有行表的信息。
- row dir:数据块的这一部分包含关于块中实际行(包括行数据区域中每个行块的地址rowid)的信息。
在数据块使用的行目录中分配了空间之后,删除该行时不会回收该空间。
2.数据块的空余空间
两种类型的语句可以增加一个或多个数据块的空闲空间:DELETE语句和UPDATE语句,它们将现有值更新为较小的值。这些类型的语句释放的空间可以在以下条件下用于后续插入语句:
如果INSERT语句位于同一个事务中,并且在释放空间的语句之后,那么INSERT语句可以使用可用的空间。
如果INSERT语句与释放空间的语句(可能由另一个用户运行)位于单独的事务中,那么INSERT语句只能在另一个事务提交之后使用可用的空间,并且只能在需要空间时使用。
1.5.1 行迁移和行连接
1.行链接:
insert操作,第一次插入该行时,该行太大,无法装入一个数据块。第一块里会留一个指针到第二个块。
*如果数据块里存的都是大表,每行数据都很长,那么行链接就很多,说明8k的数据块不适合,可能需要更大的数据块。
2.行迁移:
update操作,最初适合于一个数据块的行被更新,从而使整个行长度增加,并且块的空闲空间已经完全被填满。数据块将整行数据迁移到新的数据块中。
当一行被链接或迁移时,与该行关联的I/O性能会降低,因为Oracle数据库必须扫描多个数据块才能检索该行的信息。
1.5.2 PCTFREE 和 PCTUSED
1.PCTFREE参数(留给update使用)
将数据块的最小百分比设置为该块中已经存在的行可能的更新保留的空闲空间。例如,假设在CREATE TABLE语句中指定了了以下参数:
PCTFREE 20
这表明:插入数据时,数据块会为块中剩余的20% 的空间进行保留,用于对每个块中已经存在的⾏进⾏更新,以减少行迁移的产生。
2.PCTUSED(留给insert用)
PCTUSED参数设置可以用于行数据的块的最小百分比,以及在向块添加新行之前的开销。
在CREATE TABLE语句句中指定了了以下参数:
PCTUSED 40
这表明:当所有的数据减少到所使用的只占40%时,也就是说直到该块的百分比低于所使用的参数pctused时,这个数据块才能被重用,用于插入数据
3.PCTFREE和PCTUSED搭配工作
只有insert一个新的数据块时,才能写到80%,如果是用过的数据块,只有所有的数据都低于40%时,才能重新写入