Oracle笔记整理
对于启动数据库而言,在10G上先是启动监听(lsnrctl start),再是启动数据库(sqlplus / as sysdba startup;),接着启动EM(emctl startdbconsole); 在11G上安装GRID后默认是动态注册数据库实例的。
数据库具体的启动过程这里必须说道SGA和PGA 一个是系统全局区,一个是程序全局区。数据库启动的时候会在内存中划出一部分给oracle,然后启动一些进程,那么就将划分的内存区以及进程称作实例。这个也是最今本的概念了。
SGA:主要分成六部分,(shared pool,Database buffer cache,large pool,java pool,redo log buffer, Streams Pool,还有一些其他的结构)
以下是从网络寻找的资源:
SharedPool :主要由三部分组成,库缓存区,数据字典缓存区,用户全局区。
库缓存区:用来存放一些sql语句,pl/sql的过程包,还有一些系统控制的各种内存结构如锁(lock)机制,库缓存机制执行计划等。这里还涉及到软硬解析,硬解析:指的是在library cachae 中没有缓存。软解析:找到了缓存在library cache。还有一种是软软解析:主要是由于设置了session_cursor_cache Cursor被直接Cache在当前Session的PGA中的,在解析的时候只需要对其语法分析、权限对象分析之后就可以转到PGA中查找了,如果发现完全相同的Cursor,就可以直接去取结果了,也就就是实现了 Soft Soft Parse.;
数据字典缓存区:用来存放一些表的结构以及列定义等,权限等。
用户全局区:主要用来作为用户会话信息以及游标信息。
Buffercache :主要用来缓存一些sql语句要处理的数据,首先oracle会在buffer cache中查找是否存在自己要找的东西,如果没有的话则会去硬盘读出要找的数据,当达到一定条件时(发生checkpoint 时,当free buffer不够时,),最后通过dbwn进程将脏的缓冲区写入到磁盘保证数据的一致性。
Redo logbuffer : 数据库只要发生DMl 或者DDl 或者管理员对数据库做的一些结构性变化时,都会将这些变化记录到redo LOG buffer中的,
当达到一定的条件(redo log buffer 超过三分之一或者1M,距离上一次redo log 写入经过了三秒,用户进行commit命令,dbwn在写入数据之前会先触发lgwn ),数据库会将redo log buffer 中的数据通过LGwn 进程将其写入到 redo log 中。当数据库文件遭遇意外删除,或者数据库实例崩溃后,oracle 则会通过redo log 进行恢复。
Larger pool :并行处理时,会用到。在进行rman的一些操作用于磁盘Io 缓冲区。共享服务器模式的时候会将 UGA分配到larger pool。
Java pool:用到编译java 语言的时候。
Streamspool :供给oracle流分配的内存,流是用来复制数据库的。
1:vmstat 1 10 查看b (资源等待队列长度)的值判断系统I/O
2:sar �Cb 1 10 tps: 每秒向磁盘设备请求数据的次数,包括读、写请求,为rtps与wtps的和。出于效率考虑,每一次IO下发后并不是立即处理请求,而是将请求合并(merge),这里tps指请求合并后的请求计数。rtps: 每秒向磁盘设备的读请求次数。wtps: 每秒向磁盘设备的写请求次数。bread: 每秒从磁盘读的bytes数量。bwrtn: 每秒向磁盘写的bytes数量
3:iostat 1 10 查看那个盘到底出现了io 性能阻塞。
这里在谈一谈RAID :对于RAID1就是指的镜像盘,那么我们通常选用Raid10 需要四块盘。
客户端输入sql语句,通过网络到达数据库实例,server process 接收到sql语句分配pga,sql解析之后进行执行计划,然后才能执行。
那现在我们来谈谈关于shared pool的内存组成结构:shared pool 物理层面上由许多内存块组成,每个内存块叫做chunk,如果该chunk被存放sql语句,或者执行计划那就被叫做librarycache,如果该chunk存放表的结构那就被叫做directory cache。
这些chunk 被分为四类:
free :这种类型的chunk的不包含有效对象,可以不受限制的分配。
Recr : recreatable,这类chunk里面包含的对象在任何时候都可以被临时移走,并且在需要的时候重新创建。(共享的sql,便是这类型的)
Freeabl:这类chunk包含的对象都曾被session使用过,并且随后被完全或者部分的释放。这种chunk不可被临时从内存移走,因为他们是在处理过程中间产生的,如果移走的话就无法被重建。
Perm:这类包含永久的对象,大型的permanent类型的chunk也可能含有可用空间,这部分可用空间可以在需要的时候被释放回shared pool。
Shared pool 中可用的chunk(free)被串起来成为可用的链表(free list)或者可以叫做bucket。那么在这个bucket上串着的chunk他的大小是不一样的,由小到大的排列顺序,同时每个bucket都有一个size字段,记录该bucket上所能连接的可用chunk大小尺寸。当某个进程需要shared pool 里的chunk,则会到符合空间大小的bucket上扫描,找到一个合适尺寸的chunk。扫描一直找到bucket的最末端,如果找到的chunk必须要的大,那么就会把该chunk拆成两个chunk,不用的那个就称为free的chunk 被挂在当前的bucket上。如果该bucket上找不到需要尺寸的chunk,那么就从下一非空bucket上获得一个最小的chunk。如果剩下的bucket也找不到,那么就扫描已经使用的recreatable类的chunk,从该链表上释放一部分chunk。在这里值得一提的是关于oracle――4031错误,事实上当我们查看v$sgastat可用的shared pool 还是足够的,那是由于发生4031错误的时候已经释放了不少recreatable 的chunk,因此会产生不少可用的内存,但是这些可用的chunk中,没有一个chunk能够以连续的物理内存提供所需的内存空间。
那么写几条常用的sql吧在这里:select count(*) from x$ksmsp ;计算chunk总数。清空shared pool 释放出更多的 free chunk : alter system flush shared pool;
先整理到这吧。