在进入正题之前,我们先搞清楚一个问题,什么是数据库,什么是数据库实例。
数据库——物理操作系统文件的集合;
实 例——数据库进程+SGA(Shared Global Area)。
它们的关系是,一个数据库可以被多个实例安装(mount)和打开(open)。由于大多数情况下,一个数据库上只有一个在其上运行的实例,因此实例和数据库经常被混为一谈。我们可以看一张图来加深理解。
数据库与实例Oracle实例在启动时,即申请了一大块的内存,称为SGA 。一个实例中的所有进程运行所需的内存,都将从SGA中分配。对比PostgreSQL9.6.3(在PG中,通过memory来管理内存,所有需要用到的内存会在需要用的时候才分配,然后挂到memory中,在调用的地方使用完再释放)这种方式有很大的好处:
1.内存大小在使用过程中是可控的。在Oracle中,在任意时刻使用的内存大小都会在SGA的大小范围之内。而在PG9.6.3中,内存的使用是不可控的,根据运行不同的场景,可能导致内存急速膨胀。
2.使用时的速度更快。在实例启动时即一次性申请内存,使用的时候就不需要malloc(这也降低了对操作系统接口的依赖)。而PG9.6.3在用的时候才去调用malloc(PG中malloc无处不在),这个过程的耗时相对来说还是挺多的。
PG的内存不好控制,这也是其无法作为OLTP数据库商用的很大一个原因。
文件
组成Oracle数据库和实例的文件主要有5种:
参数文件——告诉我们在哪里寻找控制文件;
数据文件——用户数据库存储数据;
redo日志文件——记录事务日志;
控制文件——告诉我们数据文件在什么地方及其状态信息;
临时文件——用于磁盘上的分类和临时的存储。
其中前2中类型的文件最重要,因为它们包含了我们工作中所积累的数据。如果丢失了redo日志文件,可能会开始丢失一些数据。但是如果丢失了数据文件及其备份,则永远丢失掉那些数据。
这边我们主要看下开发过程中主要关注的redo日志文件。Oracle有两种redo日志文件,及联机重做日志和归档重做日志。对于数据库来说,这些是事务日志,只是用来恢复;如果实例或者介质出现故障时才会用到这些日志。如果运行数据库的计算机停电导致实例失败,那么为了把系统恢复到停电时的状态,需要使用联机重做日志。如果硬盘出现故障,为了及时地把备份恢复到正确的状态,需要使用到归档重做日志和联机重做日志。
每个Oracle数据库至少有2个联机重做日志文件,这些文件在系统运行过程中被重复使用。比如,刚开始往文件1中写日志,当写满时,转到文件2开始写。当写满文件2,又转回文件1开始写(如果有文件3则写到文件3中)。归档重做日志只是复制旧的、写满了的联机重做日志文件。当系统写满日志文件时,ARCH进程会把联机重做日志文件复制到另一个位置备份起来。当硬盘出现故障或其他一些物理故障,这些归档日志用来实现介质恢复。归档日志其实就是数据库事务的历史记录。
redo日志是数据库的主要特性,是数据库区别于文件系统的一个主要组成部分。
内存管理
数据库中的内存管理采用的是段页式管理方式。
段(segment)就是数据库对象(如表、索引、回滚段等),它消耗存储空间。当创建表时,将创建一个表段,当创建分区表时,则为每个分区创建一个段,创建索引则将创建一个索引段。
段本身是由一个或多个盘区(extent)组成。盘区是文件中一个连续分配的空间。每个段至少有一个盘区。
每个盘区由块(block)(或页(page))组成。块是空间分配的最小单元。通常一个盘区由8个连续分配的块组成,每个块的大小通常是8KB。块上保留的信息有:块类型(表或索引等),磁盘上块的位置,事务信息(itl),行目录(row dir),行记录(row)等。
下面我们看下什么是表空间(tablespace)。表空间是一个逻辑存储容器。表空间的存在应该是为了更方便管理和数据的移动。我们会在表空间中创建段。
现在,内存中存储的管理层次结构就很清楚了:
1.数据库由一个或多个表空间构成。
2.表空间由一个或多个数据库文件组成。一个表空间包含段。
3.段有一个或多个盘区组成。
4.盘区是在磁盘上连续分配的块的组合。
5.块是数据库中最小的分配单元。
网友评论