oracle学习笔记buffer_cache作⽤概述oracle学习笔记  buffer_cache作⽤概述
从这节课开始讲buffercache
对oracle数据库来讲最重要的内存结构是buffercache
buffercache的合理使⽤它直接关系到数据库运⾏的性能
对DBA来讲数据库的性能是⾮常重要的
和性能即对⽴⼜相附的是安全
oracle数据库的数据安全性⼀致性有时会出现问题
我们掌握基本的⼀些概念和⼿法可以避免
当然有好多知识需要去学习
oracle数据库的⼀致性⼀旦出问题就是灾难性的
很多时候把数据搞得不⼀致了⽼师也没有很好的办法
只能⼀点点的验证,很⿇烦
不⼀致简单讲就是数据库中数据的值和真实值不⼀样了
可⼈为造成,也可是数据库运⾏时由软件或硬件造成
就是数据出错了
对⼀个⼤型的库来讲想排除⼀个这样的错误是⾮常⿇烦的,
因为你可能根本不知道它已经出错了
或者根本不知道它错在哪⾥
即使到了地⽅也有可能根本不知道正确的值是什么
对于⼀些不稳定的配置是极易出现这种问题的
如⼀些"先进"的软硬件配置
因为先进设备带来的最⼤副作⽤就是不稳定也就是说经常出错
尽管⼀些对软硬件的修改未必是什么新的技术,说成是先进很勉强
但作⽤是肯定有的,原软件稳定性差了
想保证⼀个数据库系统的安全⾸要的任务是使⽤安全的软硬件设施
这样数据的⼀致才有最好的保证
但是我们平时⼯作中最主要的时间和精⼒花费在oracle数据库的优化上
优化是让数据库运⾏的更快更稳定
优化是从⼀个很⾼的⾼度来设置数据库
但我们⾸要的任务应该是得到⼀个安全稳定的基础
我们在优化过程中⾮常注意关注的⼀个地⽅就是buffercache
这节课主要讲⼀下buffercache的⼯作机制和⼯作原理
当然我们后⾯会给⼤家讲⼀些操作和sql语句
让⼤家更深⼀步的去理解这些概念和原理
今天我们就从buffercache最基本的讲起
⼀)buffer_cache作⽤概述
先讲⼀个最基础的东西
段、区、块的概念
1)数据库基本功能和结构
我们需要数据库是因为它可以
1、存储数据
但并不是我们最终使⽤的⽬的
对oracle数据库来讲它存储数据的同时我们可以很⽅便的
2、检索和处理数据
处理⾥⾯包括
增加数据、删除数据、修改数据
举个很简单的例⼦
假设有个公司有⼗万个员⼯
我们把⼗万个员⼯所有的信息全部存储在数据库⾥⾯去
将来要检索要某个员⼯信息的时候⾮常容易
数据库⾥⾯⼀条sql语句⼀下就出来啦
但如果说你不⽤数据库你⽤别的格式的⽂档去存储这个信息的话
你的时候要翻半天
但数据库不是
它以存储数据为⼿段
最主要的是要检索以及处理数据
这是我们处理数据库的⽬的
数据库⾥⾯存储的数据其实就是表
表是⼀个有⾏列的⼆维结构
⽐如说⼀个关于⼈员的⼀个表,员⼯employee表
表⾥有员⼯编号、员⼯姓名、性别、出⽣⽇期,
还有些别的信息如家庭住址、电话号码等等
这就是⼀张表
oracle数据库⾥⾯就是存储着⼏⼗张⼏百张表
⼀般⽼师做的数据库⾥⾯多是四五百张以上
可以这么认为oracle数据库⾥⾯存储着表
平时可以检索表数据,同时也可以对表数据进⾏处理
当然了我们为了检索处理数据
除了表以外在数据库⾥⾯还建了⼀堆索引、存储过程、函数、视图、序列包括物化视图等等都是为了配合我们对数据库的数据的检索以及处理⽽产⽣的⼀些对象
但是对数据库来讲最基础的我们最关⼼的最关注的就是表
数据库⾥⾯存储的是表
表就是实实在在的这么⼀张表
oracle数据库的体系结构⾥有
控制⽂件、redolog⽂件、dbf数据⽂件
数据⽂件⾥⾯放的很简单是表
dbf⽂件有它的结构组织
只要这个dbf⽂件属于oracle数据库就被分成⼀个⼀个⼤⼩相等的块⼤⼩可以是通常的8K
可以是4K、2K也可以是16K、32K
⼀般的都是8K
可以看⼀下我们使⽤的数据库块的⼤⼩
⽼师在课程中使⽤了
export NLS_LANG=american_america.zhs16gbk
是因为它的环境中参数NLS_LANG设置有问题
导致很多字符输出的乱码,
⽽我的环境变量已设置正确不会出现字符输出乱码
如果已经设置正确了不⽤去理会。
前⾯在软件安装准备⼯作中讲过
oracle⽤户此环境变量可在此⽤户的 .bash_profile⽂件中设置
关于数据库块的环境变量
SQL> show parameter block
NAME                                TYPE        VALUE
------------------------------------ ----------- ------------------------------db_block_buffers                    integer    0
db_block_checking                    string      FALSE
db_block_checksum                    string      TRUE
db_block_size                        integer    8192
db_file_multiblock_read_count        integer    16
有这么⼀⾏
db_block_size                        integer    8192
说明当前数据块的⼤⼩是8K
oracle数据库⾥⾯dbf⽂件被分割成了⽆数个8K⼤⼩的块
在dbf拿出⼀个来时就是⼀个block
oracle的块block是oracle的io的最⼩单位
2)段、区、块的概念
段可以这样认为:⼀个表就是⼀个段
建⼀个表
SQL> create table t2(id int,name varchar2(20)); Table created.
对oracle数据库来讲建⽴了⼀个表t2
在oracle数据库⾥它⾃然给你建⼀个段,段名t2
我们讲分区表会有很多段现在不要想这么多
现在姑且认为⼀个表⼀个段
然后可以插⼊数据
SQL> insert into t2 values(1,'xkj');
1 row created.
SQL> insert into t2 values (2,'jiagulun');
1 row created.
SQL> commit;
Commit complete.
刚才给演⽰的过程在oracle数据库⾥⾯的体现
⾸先来讲建了⼀个表t2
oracle数据库建了⼀个段t2
在dbf⽂件⾥⾯
oracle为t2分配⼀个区
⼀个表就是⼀个段
你建了⼀个表同时建了⼀个段
段⼀旦建了以后
oracle做的第⼀件事情给⼀个段分配⼀个区
区的英⽂extent(区域)
区的概念是物理上连续的多个块
这⾥⽐如8个块做为⼀个区给t2这个段
这个区是8个连续的oracle块全部属于t2这个段
建完以后我们开始插⼊数据
段的前⼏个块被段⾃⼰使⽤了,数据部分从后⾯开始
insert into开始插⼊⼀⾏⾏数据
插⼊数据时oracle会
⼀个空块然后把数据⼀⾏⾏的写进去
写满了这个块以后
接着写第⼆个块、第三个块
第⼋个块写满了的时候
我们给它分配的区已经⽤满了
区既然都⽤完了oracle接着再分配⼀个区
还是⼋个块
这时候这个段⼜有了新的⼀个区⼜有了8个块可⽤
接着再插⼊数据
再⽤完了再给它分配⼀个区
建表⾃然就建了⼀个段
接着给这个段分配⼀个区
oracle就可以使⽤区⾥⾯的⼀些空块
⽤完后再分配新区
区是oracle给段分配空间的最⼩单位
也就是oracle给段分配空间的时候⼀次性分配⼀个区
不是分配⼀个块是⼀次性分配⼀个区
3)
块是oracle I/O的最⼩单位
dbf⽂件上有好多块
表t2在这些块⾥⾯
现在我要访问t2
要访问t2⾥⾯的某个块
块⾥⾯放的是数据⾏
原则上来讲⼀个块⾥⾯放多个⾏
⼀般的情况不会出现⼀个⾏在多个块⾥⾯
但在发⽣了⾏链接、⾏迁移⾏为和保存数据类型为long或lob的情况下可能会出现⼀个⾏
提交更改是内存条吗
在⼀个块⾥⾯有点在另外⼀个块⾥也有点
到⽬前为⽌就认为⼀个块⾥⾯有多个⾏

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。