一、 体系结构
1. 体系结构
1.1. 一张图理解Oracle体系结构
1. 客户端进程访问数据库的两种模式
- 专有服务器模式:一个客户端进程独享一个服务器进程,客户端进程退出,服务器进程消失。
- 共享服务器模式:服务端预先启动多个服务器进程,客户端进程与分发器连接,分发器随机转发客户端的请求。
2. 系统全局区(SGA)
- Database Buffer Cache: 存放最近访问的数据。
- Redo Log Buffer: 记录数据库所作的修改。
- 共享池:存放数据字典信息,以及最近访问的SQL语句。
3. 后台进程
4. 数据库文件
- 数据文件
- 控制文件
- 重做日志文件
- 参数文件
- 口令文件
- 警告文件
- 跟踪文件
1.2. 内存管理方式
1. 自动内存管理:通过设置memory_max_target
,memory_target
参数来自动管理SGA和PGA大小,默认自动管理。
2. 自动共享内存管理:通过设置sga_max_size
,sga_target
,pga_aggregate_target
来半自动管理SGA和PGA大小。
3. 手动内存管理:手工设置SGA各种缓冲区的大小。
1.3. SGA缓冲区
1.3.1. 数据库高速缓冲区(Database Buffer Cache)
内存中用于存放最近访问的数据的区域。该区域被划分成若干与数据块大小相同的缓冲区,当客户端进程发起读请求时,服务器进程会先去buffer cache中查找是否存在当前进程所需的数据,有则直接返回,没有则把数据文件中的数据块按照LRU算法调入到buffer cache。如果buffer cache中的数据块被修改,则有DBWN进程再次写入数据文件。
注: 关于LRU算法:oracle有一个LRU列表与脏缓冲区列表,LRU列表记录了个高速缓冲区各缓冲区的编号,并按照由低到高的访问频率排好了序,缓冲区的状态有三种,空闲、忙、以及脏,oracle按照LRU算法,优先选择低频空闲的缓冲区。脏缓冲区列表则记录了那些缓冲区被修改,DBWn通过读取该列表将脏缓冲区回写磁盘。
1.3.2. 重做日志缓冲区(redo log buffer)
记录事务的重做日志的区域。数据库事务都会生成重做日志,重做日志缓冲区的日志由LGWR写入到在线重做日志文件,当遭遇数据库故障需要恢复数据时,重做日志文件会对保证数据的完整性起到很关键的作业。一般情况下,数据库每天会做备份,比如当天上午10点数据库宕机,而备份的数据只存储到了昨天的3点,那么3点至10点的数据是缺失的,这时对重做日志进行回放,就能保证数据不丢失。重做日志缓冲区由log_buffer
参数指定。
1.3.3. 共享池(Shared Pool)
共享池主要包含库缓存,数据字典缓存等,其中库缓存主要用来存放SQL语句,分析代码,执行计划,这样做的好处就是提高了SQL利用效率,减少IO。一条SQL语句被执行,需要经历解析、执行、返回结果的过程,解析需要分析代码,生成执行计划,非常耗时。对于相同的SQL语句,oracle将解析的结果缓存在库缓存中,当下一次请求时,直接从库缓存中获取,无需再次解析。数据字典缓存用来存放数据库对象的信息。共享池的大小由shared_pool_size
指定。
1.4. 后台进程
1.4.1. 数据库写入进程(DBWn)
负责将数据库缓冲区中的脏块写入到数据文件中的后台进程。数据库写入进程可以有若干个,通过参数db_writer_processes
来控制。触发DBWn进程刷写脏块到数据文件有以下几种情况:第一种是当脏缓冲区的数量达到一定的数量时会触发DBWn。系统通过脏缓冲区列表统计脏块的数量,当脏块达到一定的数量后,脏列表会触发DBWn;第二种是当空闲的缓冲区很少时会触发DBWn。数据库会搜索空闲块来满足连接事务的需要,当事务越来越多,空闲的缓冲区越来越少,脏块的数量达到设置的阈值后,就会触发DBWn;第三种是通过超时时间;第四种是通过设置系统检查点事件来触发DBWn。
1.4.2. 日志写入进程(LGWR)
LGWR是负责将重做日志缓冲区的重做日志写入到重做日志文件的进程。以下三种时机发生时,LGWR开始写入。一是执行commit命令之后,二是重做日志缓冲区已满1/3,三是每隔3秒就写入,四是在DBWn触发前写入。
1.4.3. 检查点进程(CKPT)
CKPT进程负责同步数据文件、控制文件以及重做日志文件。假设一个场景,某个事务提交后,数据库发生了断电,此时SCN号只记录到了重做日志文件中,假设是1500,而之前数据文件、控制文件、以及重做日志文件的SCN号是一致的,假设是1000。发生断电后,三者的SCN号不一致,下次实例恢复时,SMON进程会检测到这一现象,并重放之前的事务,从而保证三个文件的SCN号一致。而检查点进程就是在数据库运行期间执行同步操作,以保证SCN号一致。
当发生以下几种情况时,检查点进程被触发执行:一是手工或自动切换日志,正常关闭实例,手工触发检查点以及通过一点的时间或空间间隔触发。
1.4.4. 系统监控进程(SMON)
SMON的主要功能是进行实例恢复,除此之外还负责合并表空间以及合并临时段。
1.4.5. 进程监控器进程(PMON)
PMON负责监控所有用户进程,当用户进程异常退出,PMON会执行清理工作。如回滚未提交的事务、释放锁资源以及释放其他资源。
1.4.6. 归档进程(ARCn)
ARCn进程负责将重做日志进行归档。oracle数据库一般会有几组重做日志,LOGWR循环使用重做日志文件组。当一组重做日志文件被写满后,切换到下一组,循环往复,但会出现数据丢失的问题。为了保证数据重做日志不丢失,发生日志文件组切换时,由ARCn对重做日志文件进行归档。归档进程的数量通过log_archive_max_processes
指定。
1.5. DML语句的执行过程
1.客户端进程发起执行DML语句,服务器进程检查相应的数据块是否在告诉缓冲区里面,不在则从数据文件读取相应的数据块到高速缓冲区。
2.服务器进程对相应的高速缓冲区的数据块加锁,以防止其他事务修改数据;
3.服务器进程生成重做日志同步到重做日志缓冲区;
4.服务器进程在高速缓冲区中修改数据;
1.6. Oracle物理存储结构与逻辑存储结构
1.Oracle物理存储结构:https://www.cnblogs.com/crispy-bro/p/18427239
2.Oracle逻辑存储结构:https://www.cnblogs.com/crispy-bro/p/18428424