Oracle高性能自动化运维
上QQ阅读APP看书,第一时间看更新

第1章

Linux下的Oracle

众所周知,Oracle数据库与Linux操作系统是行业内使用最为广泛、功能最为强大的数据库/操作系统之一。随着企业业务的不断发展,越来越多的Oracle数据库被部署在Linux环境中,以提供核心业务数据的支撑。

与此同时,随着人们对Oracle运维管理经验的不断积累,大部分数据库管理员对Linux环境下的Oracle认识也越来越深刻,然而也有部分数据运维人员对于Linux环境下的Oracle内存分配存在疑惑。本章就Oracle与Linux内存关系进行讲解,帮助读者更为深入地理解Linux环境下的Oracle内存体系。

1.1 Linux简介

我们知道,Unix是一个功能强大、性能全面的多用户、多任务操作系统,可以应用到小至普通PC,大至巨型计算机等多种平台上,是应用面最广、影响力最大的操作系统之一。

作为Unix的延续,Linux是一种界面和性能与Unix相似甚至更好的操作系统,但Linux不源于任何Unix,因此Linux不是Unix,而是一个类似于Unix的产品。Linux成功地模仿和延续了Unix的基本体系结构和设计风格,换言之,Linux是一套兼容于System V以及BSD Unix的操作系统。对于System V来说,把程序源代码放到Linux重新编译之后就可以运行;而对于BSD Unix来说,它的可执行文件可以直接在Linux环境下运行。

通俗地讲,Linux是一种遵从可移植操作系统环境标准规范(POSIX)的操作系统,它能够在普通PC上实现全部的Unix特性。Linux受到广大计算机爱好者青睐的另一个原因是:它继承了Unix的优秀功能,同时还弥补了Unix跨平台通用性的缺陷,使得Linux操作使用起来更为灵活、便捷。

1.2 Oracle简介

早期是没有数据库这一说法的,这是因为在早期可以直接在内存中使用变量、数组之类的内存结构来存放数据,但是这些数据仅仅贮存在内存中,一旦内存释放,数据就会丢失。

后来人们觉得可以尝试使用平面文件(Flat File)的方式来永久存放数据,将数据记录在文件中,这样就可以在需要的时候将数据从平面文件中读取出来,这种数据存储模式被称为简单文件存储模式。

随着时代的发展,越来越多的文件需要存储在操作系统,导致从大量文件中检索特定的文件就变得非常困难,效率也极其低下。与此同时,人们对数据存储的需求日益增长,对数据存储的要求也越来越高,在这样的环境下,Oracle应运而生。

作为市面上最优秀的数据库之一,Oracle数据库系统是美国Oracle公司(甲骨文)提供的以分布式数据库为核心的软件产品,是目前最流行、应用最广泛的数据库之一。

Oracle数据库主要特点有:

❑ 稳定性强;

❑ 可用性强;

❑ 可扩展性强;

❑ 数据安全性强。

当我们将Oracle部署在Linux平台后,就可以很好地发挥Oracle与Linux的功能特点:稳定、高效、灵活。接下来我们就Oracle与Linux内存体系进行介绍。

1.3 Linux内存体系的优势

许多接触过Oracle的朋友可能会有一些感慨,在Windows操作系统和Linux操作系统下管理Oracle是完全不一样的。其实不尽然,Windows下的Oracle在服务中只能看见一个类似ORCL的服务,同时在Windows任务管理器中也只能看见一个Oracle进程,而数据库后台进程则不可见。

Windows下的Oracle服务,如图1-1所示。

图1-1 Windows下的Oracle服务

Windows任务管理器中的Oracle进程,如图1-2所示。

图1-2 Windows任务管理中的Oracle

提示

Windows环境下的Oracle后台进程以线程方式存在,因此在Windows环境无法详细查看后台进程信息,这对数据库故障排查带来诸多不便。

在Linux体系中,使用操作系统命令就可以精准地定位Oracle后台进程,还可以看见Oracle实例中内存段分配的信息等,为数据库的维护和故排提供了便捷的通道。

Linux下的Oracle,如下所示:

Linux下的Oracle共享内存段,如下所示:

不难看出,相对于Windows来说,Linux下的Oracle数据库管理更为便捷,数据库信息的获取也更为直观、有效。

1.4 Linux内存体系与Oracle内存空间

1.4.1 Linux用户空间与内核空间

一般来说,Linux操作系统把虚拟地址空间划分为用户空间和内核空间。例如x86架构下的32位Linux虚拟地址空间是4GB(0x00000000~0xffff ffff),其中大致将前3GB(0x00000000~0xbfff ffff)划分为用户空间,后1GB(0xc0000000~0xffff ffff)划分为内核空间。

用户程序只能在用户模式(用户空间)下执行,而不能访问特权模式(内核空间)的数据,也不能跳转到内核代码执行,这样的设计可以保护内核,最主要的原因是当一个用户进程访问了非法地址,最坏的情况是该进程崩溃,而不会影响到内核和其他进程正常运行。

CPU在产生中断或异常时会自动切换模式,由用户模式切换到特权模式,这时就可以允许跳转到内核代码中执行中断或异常服务程序。事实上,所有内核代码的执行都是从中断或异常服务程序开始的,整个Linux内核就是由各种中断处理和异常处理程序组成的。

Linux下的Oracle内存分配如图1-3、图1-4所示。

图1-3 Linux下的Oracle内存(10g)

图1-4 Linux下的Oracle内存(11g)

提示

Oracle10g中的SGA与PGA在Linux中是独立分配的,但是在11g中,默认情况下SGA内存区域包含了PGA的内存空间。

1.4.2 Linux下的Oracle内存体系结构

我们知道,Oracle主要是由内存结构和物理结构组成的,如图1-5所示。

图1-5 Oracle体系结构

可以看出,Oracle内存结构存在于操作系统的用户空间,因此我们在部署Oracle前,就必须事先在Linux操作系统层面配置好Oracle内存地址空间,这样才能成功地配置SGA与PGA,从而避免在安装Oracle的时候出现类似“ORA-27102:out of memory”的错误。

1.4.3 Linux下的Oracle内存分配

Oracle内存结构处于Linux操作系统的用户空间,因此需要通过设置Linux操作系统内核参数来对Oracle内存进行分配。由于Linux延续了SystemV IPC以及后来的POSIX IPC通信标准,因此Linux下的内存分配主要由以下参数决定,如表1-1所示。

表1-1 Linux内存分配参数

提示

SHMALL在很多系统上是用页面数而不是字节数来计算的。对于一般的Linux来说,Page页的大小一般为4096。

参数SHMMAX是Oracle最重要的Linux内核参数之一,该参数以字节为单位限制单个共享内存段的最大值。与此同时,参数SHMALL用于限制共享内存总数(字节或者Page页)。对于Oracle而言,必须保证这个数值足够大,建议值为超过数据库共享内存与其他共享内存的总和。Oracle官方文档对Linux参数限制描述如图1-6所示。

图1-6 Oracle官方Linux内核参数

我们可以通过以下示例来验证Linux下的Oracle(10g)内存分配:

1)查看Oracle SGA与PGA分配情况,如图1-7所示。

图1-7 Oracle SGA与PGA分配

2)查看Linux系统共享内存分配情况,如图1-8所示。

图1-8 共享内存段

可以看到,Linux系统分配了3个共享内存段,每个共享内存段的大小为2GB。

3)查看Linux环境中的sysctl.conf配置,如图1-9所示。

图1-9 sysctl.conf配置

结合前面内容,不难看出:

❑ 单个共享内存段最大值为kernel.shmmax=2147483648B=2GB,与图1-10一致;

图1-10 Linux下的Oracle内存分配(10g)

❑ SGA=3(共享内存段数量)× 2GB(单个内存段最大值)=6GB;

❑ PGA=2GB;

❑ Linux共享内存大小=kernel.shmall=2097152× 4096/1024/1024/1024=8GB=SGA(6GB)+PGA(2GB)。

上述内容可以概括如图1-10所示。

结合前面内容,我们可以得出以下结论:

❑ 参数kernel.shmmax决定了单个共享内存段的最大值为2GB,即在Linux操作系统层面能分配的单个共享内存段的最大值为2GB。如果所需共享内存大于该值,则需要分配多个共享内存段,以最大共享内存段(2GB)为阈值对所需共享内存段进行拆分分配。

❑ 参数kernel.shmall(8GB)决定了Linux操作系统能够提供给Oracle共享内存的上限值,SGA与PGA总和不能超过该阈值。

❑ 当sga_target设置为6GB时,kernel.shmmax(2GB)决定了Linux系统分配的单个共享内存段上限值,因此需要分配3(6GB/2GB)个共享内存段来提供给SGA。Oracle推荐1个Instance使用1个共享内存段,那么当上述3个共享内存段被分配时,将会在共享内存段之间产生内存地址断层(GAP)。所以当数据库进行IPC通信时,可能存在跨共享内存段的内部数据交互,这样会降低共享内存段间的数据交互效率。因此,建议Linux环境中的Oracle使用1个共享内存段,这样可以减少跨内存段的数据交互,从而提升数据库性能。

提示

图1-10是以Oracle 10g为例进行讲解的,有兴趣的读者可以结合图1-4对Oracle11g进行扩展。

1.5 小结

本章主要介绍了Linux环境下Oracle用户空间与系统空间的关系,结合Oracle SGA与PGA分配规则,着重对Linux内核参数kernel.shmall和kernel.shmmax进行介绍,帮助读者规划Linux环境下Oracle内存分配的同时,还提供了Oracle内存优化的一个重要途径。

参考文档

[1] Database Installation Guide for Linux(Oracle Corporation)