1、内存结构:
关于之前SGA,PGA的介绍我就不多说了,在我的博客里有专门的介绍:
http://blog.csdn.net/changyanmanman/article/details/7256255
我们看看各个区域的介绍吧,这是官方的文档,准确性和权威性不言而喻。
2、数据缓存区:
一个新的点,数据缓存区在逻辑上被分成了好几个组,这种分组的内存管理方式减少了多处理器系统中的资源竞争。(共享SQL区也是这样的)
数据缓存区内的缓冲区(buffer)通过两个列表来管理:待写列表(write list) 和最近最少使用列表(LRU)
待写列表中记录的是脏缓冲区(dirty buffer) 即其中的数据已被修改,但是没有被写入磁盘;
最近最少列表(LRU)记录的是可用的缓冲区(free buffer)还有被锁定的缓冲区(pinned buffer)以及 还没有来得及被移入待写列表的脏缓冲区。
可用缓冲区内的数据无需继续保留,可以为后来的数据继续使用,锁定的缓冲区就是正在被锁定访问操作的数据。
当某个 Oracle 进程访问一块缓冲区时,就会将其移动到 LRU 列表的最近使用(most recently used,MRU)端。随着更多被访问的缓冲区移动到 LRU 列表的 MRU 端,较早前被访问过的脏缓冲区就会逐渐向 LRU 列表的 LRU 端移动。
用户进程将数据块读入数据缓存区之前首先要准备好可用缓冲区。用户进程从 LRU 列表的 LRU 端开始对其进行搜索。这个搜索过程将一直持续,直到找到可用缓冲区或达到缓存搜索操作的预设限定值为止。
当用户进程在对 LRU 列表的搜索过程中遇到脏缓冲区时,她会先将此类缓冲区移入待写列表,之后再继续搜索。当用户进程找到了可用缓冲区时,就会将数据块从磁盘写入缓冲区,并将此缓冲区移到 LRU 列表的 MRU 端。
如果 Oracle 用户进程对 LRU 列表的搜索操作达到了预设的限定值而仍旧没有找到可用缓冲区,那么进程将停止搜索并通知 DBW0 后台进程将部分脏缓冲区写入磁盘。
LRU算法和全表扫描:
本来我没有往这里想,全表扫描怎么会和lru算法扯上关系呢?顶多是全表扫描了,把数据都存到LRU列表中就是了,(哦,其实有关系,xiangguan)
当用户进程(user process)执行全表扫描(full table scan)时,她会将存储表数据的数据块读入缓冲区,并将这些缓冲区移动到 LRU 列表的 LRU 端(而不是 MRU 端)。这是因为全表扫描得到的数据通常只是暂时需要的,因此这些缓冲区应当被尽快地移出数据缓存区,为其他使用频率更高的数据块腾出空间。
户可以针对每个表而设定全表扫描时缓冲区的使用方式。具体做法是,在创建(create)或修改(alter)表或簇(cluster)时使用 CACHE 子句,设定在对此表进行全表扫描时将其数据块读入 LRU 列表的 MRU 端。用户可以对数据量较小的检索表(lookup table)或数据量较大的静态历史表(static historical table)进行此项设定,以避免访问此类表导致额外的 I/O 操作。
3、oracle工具:
1、data pump 导入导出工具:
用户在 Data Pump 中可以设定部分或全部地迁移数据及元数据。这个功能是通过数据过滤器(data filter)及元数据过滤器(metadata filter)实现的,这两个过滤器可以在导入及导出工具的参数中进行设定。
数据泵导出工具(data pump export ):他的功能是将数据库的数据及源数据导出。导出到一个叫转储文件集(dump file set)的操作系统文件中,这个转储文件集可以被移动到其他数据库系统中,用数据泵导入工具导入到新的数据库中。
转储文件集由一个或者多个磁盘文件组成,这些文件中包含了表数据,数据库对象元数据,控制信息这三个: 这些文件是二进制的,只有在导入到数据库中才能看到。
数据泵导入工具(data pump import):导入工具(Import)还能够直接从源数据库(source database)向目标数据库进行加载,而无需借助于中间文件(intervening file)。这使导出导入工作能够并行进行,最大限度地缩短了数据迁移所需的时间。这项功能被称为网络导入(network import)。
4、个别进程介绍:
作业队列进程(job queue process)的功能是进行批处理(batch processing)。这种进程用于运行用户的作业(job)。这种进程能够提供作业调度服务(scheduler service),在 Oracle 实例中调度 PL/SQL 语句及存储过程。用户只需提供作业的开始时间及调度间隔,作业队列进程就能够按用户的设定调度作业。
作业队列进程可以被动态地管理。这样当用户需要时就能够使用更多的作业队列进程。当一个作业队列进程进入空闲状态(idle)后,其使用的资源将被释放。
动态的作业队列进程可以按指定的时间间隔运行大量的作业。用户的作业是由CJQ 进程交给作业队列进程执行的。具体步骤如下:
- 名为 CJQ0 的协调进程(coordinator process)从系统的 JOB$ 表中定期地查询需要运行的作业。被选出的作业将按照时间排序。
- CJQ0 进程动态地生成新的作业队列进程(J000 ... J999)来运行作业。
- 作业队列进程执行一个由 CJQ 进程选出的作业。每个工作队列进程每次只能执行一个进程。
- 当一个工作队列进程执行完一个作业后,就能够接受下一个作业。如果此时系统中已经没有需要被调度的作业了,此进程将进入休眠状态(sleep state);此进程还会定期地苏醒(wake up)等待分配其他作业。如果在预设的时间内没有新的作业,此进程将终止。
进程监控进程(PMON)
当一个用户进程(user process)失败后,进程监控进程(process monitor,PMON)将对其进行恢复。PMON 进程将清除相关的数据缓存区(database buffer cache)并释放被此用户进程使用的资源。例如,PMON 进程将重置活动事务表(active transaction table),释放锁,并从活动进程列表(list of active process)中删除出错进程的 ID。PMON 进程会周期性地对调度器(dispatcher)和服务进程(server process)进行检查,重新启动停止运行的进程(不包括 Oracle 有意停止的进程)。PMON 进程还负责将实例和调度器进程的信息注册到网络监听器(network listener)。
同 SMON 进程一样,PMON 进程也会定期地检查系统中是否有问题需要处理,当系统内的其他进程需要服务是也能够调用 PMON 进程。
MMON进程负责执行多种和可管理性相关(manageability-related)的后台任务,例如:
- 当某个测量值(metrics)超过了预设的限定值(threshold value)后提交警告
- 创建新的 MMON 隶属进程(MMON slave process)来进行快照(snapshot)
- 捕获最近修改过的 SQL 对象的统计信息
MMAN 进程负责执行数据库系统的内部任务。
在使用了自动存储管理(Automatic Storage Management)的实例中,RBAL 进程负责协调磁盘组间的负载平衡工作。她可以使多个实例同时访问一个 ASM 磁盘(global open)。最终由 ORBn 进程实际执行数据扩展的负载均衡。实例中可以运行多个 ORBn 进程,分别为 ORB0,ORB1,以此类推。
数据库实例使用 ASM 磁盘组时,还要启动 OSMB 进程。此进程负责和 ASM 实例(Automatic Storage Management instance)通信。