成为MySQL DBA后,再看ORACLE数据库(六、存储结构及表空间管理)

数据库的逻辑存储结构也可以叫做存储层次体系,ORACLE的存储层次体系按照层次从高到低分为:表空间(tablespace)、段(segment)、区(extent)、块(block)。熟悉数据库的逻辑存储结构可以帮助我们分析与定位数据库的空间容量问题。

一、段

段是表空间的主要组织结构。段就是占用存储空间的数据库对象,比如创建表时,会创建一个表段;创建索引时,会创建一个索引段;创建分区表时,会为每个分区创建一个段。此外还有回滚段、临时段等。通过查询dba_segments视图可以查看数据库中段的大小,进而知道表、索引等对象的大小。

 二、区

段由一个或多个区组成,区是文件中一个逻辑上连续分配的空间。在ORACLE中有“延迟段”的概念,即当你创建对象时,ORACLE不会为段分配一个新的区,而是当数据真正写入时,ORACLE才会为这个段分配第一个区,当初始的区不足以容纳新增数据时,ORACLE就会为它再分配一个区。这两个区在物理上不一定是连续的,但是在逻辑上是连续的。区的大小可能只是一个数据块,也可能大到几GB。

三、块

区进一步由块组成,块也是ORACLE中最小的空间分配单位,行数据就存储在块中。块也是磁盘IO的基本单位,ORACLE中常见的块有2kb、4kb、8kb、16kb。在ORACLE中,db_block_size参数指定了数据库的默认块大小,其值取决于操作系统,一般是8kb。此外,也可以在创建表空间时自定义数据块大小。

 四、表空间

表空间是一个容器,一个表空间中可能有多个段。前面说到的段、区、块都是不同层次的逻辑存储单位,但从物理上看数据库的数据看是放在数据文件中,在ORACLE中通过表空间管理数据文件,一个表空间可由一个或多个数据文件组成。可以看到在数据目录下,*.dbf文件就是表空间中的数据文件,有system和sysaux两个系统表空间,users用户表空间,undotbs回滚表空间,temp临时表空间,这也是系统中默认创建的几个表空间。

在实际生产应用中,我们一般会额外创建表空间存放应用数据,并且在创建用户时指定该用户的默认表空间,如果不指定表空间那么数据库对象则会创建在users表空间下。一般常用的创建表空间的语句如下:

create tablespace app_data_tbs datafile '/u01/oracle/oradata/orcl/app_data_tbs01.dbf' size 8g autoextend on next 100m;
create tablespace app_idx_tbs datafile '/u02/oradata/tyzh/app_idx_tbs01.dbf' size 8g autoextend on next 100m;

该语句定义了表空间的大小,并且设置该表空间以100M的幅度自动增长。那么表空间最大可以增长到多少呢?这和表空间中数据文件的容量有关,通常ORACLE的物理文件最大只允许4194303个数据块(由操作系统决定),那么表空间数据文件的最大值为4194303×DB_BLOCK_SIZE/1024M,当DB_BLOCK_SIZE为8k时,这个表空间数据文件的最大值为32G。我们在数据库中创建一个33G的表空间,可以看到该语句报错超过了最大的block数量4194303。所以,当表空间达到最大值时,我们只能通过增加数据文件的方法对表空间进行扩容。

alter tablespace app_data_tbs add datafile '/u01/oracle/oradata/orcl/app_data_tbs02.dbf' size 1g  autoextend on next 100m;

查询表空间的使用信息可以通过dba_tablespaces、dba_data_files、dba_free_space等数据字典视图查询,以下是几个常用的查询表空间使用情况的脚本:

#查看表空间大小
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name;
#查看表空间数据文件大小
select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
#查看表空间剩余容量
select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name
#查看表空间使用率
select total.tablespace_name,round(total.MB, 2) as Total_MB,round(total.MB - free.MB, 2) as Used_MB,round((1-free.MB / total.MB)* 100, 2) || '%' as Used_Pct
from (select tablespace_name, sum(bytes) /1024/1024 as MB from dba_free_space group by tablespace_name) free,(select tablespace_name, sum(bytes) / 1024 / 1024 as MB
from dba_data_files group by tablespace_name) total where free.tablespace_name = total.tablespace_name order by used_pct desc;

 五、总结

在MySQL中,逻辑存储结构分为:表空间、段、区、页,同样也是分为四层。但是在MySQL8.0中,innodb存储引擎会为每个表创建一个表空间,可以说表即表空间,对表创建的二级索引也存在这个表空间内,大大简化了对表空间的管理,所以在MySQL中很少听到表空间这个概念。此外,MySQL逻辑存储和磁盘IO的最小单位是页,通常默认设置为16kb。

posted @ 2024-06-03 22:41  海布里_MySQL  阅读(5)  评论(0编辑  收藏  举报