仓酷云
标题:
MYSQL教程之Oracle系统布局:内存布局和历程布局
[打印本页]
作者:
兰色精灵
时间:
2015-1-16 22:29
标题:
MYSQL教程之Oracle系统布局:内存布局和历程布局
如IBM公司最近宣布让渠道合作伙伴分销其SaaS应用程序的新计划。微软认为MySQL学习教程是销售其云计算服务的重要组成部分。然而即使有这种趋势,DBaaS仍然不同于内部数据库,解决方案提供商必须认识到这一点;否则,他们不仅仅是丢失几个客户,而是要失去的更多。oracle|历程|系统(一)内存布局和历程布局Oracle数据库的整体布局以下图:
[img=513border=0style=,401alt=Oracle系统布局:内存布局和历程布局(图一)src=]http://www.ckuyun.com/[/img]
1:Oracle实例(Instance)
在一个服务器中,每个运转的Oracle数据库都与一个数据库实例相接洽,实例是我们
会见数据库的手腕。
实例在操纵体系顶用ORACLE_SID来标识,在Oracle顶用参数INSTANCE_NAME来标识,
它们两个的值是不异的。数据库启动时,体系起首在服务器内存平分配体系全局区(SGA),
组成了Oracle的内存布局,然后启动多少个常驻内存的操纵体系历程,即构成了Oracle的
历程布局,内存地区和背景历程合称为一个Oracle实例。
[img=560border=0style=,224alt=Oracle系统布局:内存布局和历程布局(图二)src=]http://www.ckuyun.com/[/img]
数据库与实例之间是1对1/n的干系,在非并行的数据库体系中每一个Oracle数据库与一个
实例绝对应;在并行的数据库体系中,一个数据库会对应多个实例,统一工夫用户只与一个
实例相接洽,当某一个实例呈现妨碍时,其他实例主动服务,包管数据库一般运转。在任何
情形下,每一个实例都只能够对应一个数据库。
2:Oracle10g静态内存办理
内存是影响数据库功能的主要要素,Oracle8i利用静态内存办理,Oracle10g利用静态
内存办理。所谓静态内存办理,就是在数据库体系中,不管是不是有效户毗连,也不管并发用
量巨细,只需数据库服务在运转,就会分派流动巨细的内存;静态内存办理同意在数据库服
务运转时对内存的巨细举行修正,读取年夜数据块时利用年夜内存,小数据块时利用小内存,读
取尺度内存块时利用尺度内存设置。
依照体系对内存利用办法的分歧,Oracle数据库的内存能够分为以下几个部分:
•体系全局区:SGA(SystemGlobalArea)
•程序全局区:PGA(ProgrameGlobalArea)
•排序池:(SortArea)
•年夜池:(LargePool)
•Java池:(JavaPool)
2-1:体系全局区SGA(SystemGlobalArea)
SGA是一组为体系分派的共享的内存布局,能够包括一个数据库实例的数据或把持信
息。假如多个用户毗连到统一个数据库实例,在实例的SGA中,数据能够被多个用户共享。
当数据库实例启动时,SGA的内存被主动分派;当数据库实例封闭时,SGA内存被接纳。
SGA是占用内存最年夜的一个地区,同时也是影响数据库功能的主要要素。
SGA的有关信息能够经由过程上面的语句查询,sga_max_size的巨细是不成以静态调剂的。
=====================================
SQL>showparametersga
NAMETYPEVALUE
-------------------------------------------------------
lock_sgabooleanFALSE
pre_page_sgabooleanFALSE
sga_max_sizebiginteger164M
sga_targetbiginteger0
SQL>altersystemsetsga_max_size=100m;
altersystemsetsga_max_size=100m
*
ERRORatline1:
ORA-02095:specifiedinitializationparametercannotbemodified
======================================
体系全局区按感化分歧能够分为:
•数据缓冲区
•日记缓冲区
•共享池
2-1-1:数据缓冲区(DatabaseBufferCache)
假如每次实行一个操纵时,Oracle都必需从磁盘读取一切数据块并在改动它以后
又必需把每块写进磁盘,明显效力会十分低。数据缓冲区寄存必要常常会见的数据,
供一切用户利用。修正数据时,起首从数据文件中掏出数据,存储在数据缓冲区中,
修正/拔出数据也存储在缓冲区中,commit或DBWR(上面有具体先容)历程的其他条
件激发时,数据被写进数据文件。
数据缓冲区的巨细是能够静态调剂的,可是不克不及凌驾sga_max_size的限定。
======================================
SQL>showparameterdb_cache_size
NAMETYPEVALUE
----------------------------------------------------------------
db_cache_sizebiginteger24M
SQL>altersystemsetdb_cache_size=128m;
altersystemsetdb_cache_size=128m
*
ERRORatline1:
ORA-02097:parametercannotbemodifiedbecausespecifiedvalueisinvalid
ORA-00384:Insufficientmemorytogrowcache
SQL>altersystemsetdb_cache_size=20m;
Systemaltered.
SQL>showparameterdb_cache_size;
NAMETYPEVALUE
----------------------------------------------------------------
db_cache_sizebiginteger20M
#此处我仅增添了1M都不可?
SQL>altersystemsetdb_cache_size=25m;
altersystemsetdb_cache_size=25m
*
ERRORatline1:
ORA-02097:parametercannotbemodifiedbecausespecifiedvalueisinvalid
ORA-00384:Insufficientmemorytogrowcache
#修正显现格局,便利检察。
SQL>columnnameformata40wrap
SQL>columnvalueformata20wrap
#上面语句能够用来检察内存空间分派情形,注重SGA各区巨细总和。
SQL>selectname,valuefromv$parameterwherenamelike%sizeandvalue0;
#先将java_pool_size调小,然后再修正db_cache_size
SQL>showparameterjava_pool_size;
NAMETYPEVALUE
----------------------------------------------------
java_pool_sizebiginteger48M
SQL>altersystemsetjava_pool_size=20m;
Systemaltered.
SQL>altersystemsetjava_pool_size=30m;
Systemaltered.
#下面申明SGA中各区巨细总和不克不及凌驾sga_max_size。
=====================================
数据缓冲区的巨细对数据库的存区速率有间接影响,多用户时尤其分明。有些应
用对速率请求很高,一样平常请求数据缓冲区的射中率在90%以上。
上面给出一种盘算数据缓冲区射中率的办法:
•利用数据字典v$sysstat
=====================================
SQL>selectname,valuefromv$sysstat
2wherenamein(sessionlogicalreads,
3physicalreads,
4physicalreadsdirect,
5physicalreadsdirect(lob))
NAMEVALUE
-----------------------------------------
sessionlogicalreads895243
physicalreads14992
physicalreadsdirect34
physicalreadsdirect(lob)0
======================================
射中率=1-(14992-34-0)/895243
可让Oracle给出数据缓冲区巨细的倡议:
======================================
SQL>altersystemsetdb_cache_advice=on;#翻开该功效
Systemaltered.
SQL>altersystemsetdb_cache_advice=off;#封闭该功效
Systemaltered.
======================================
2-1-2:日记缓冲区(LogBufferCache)
日记缓冲区用来存储数据库的修正信息。该区对数据库功能的影响很小,有关日
志前面还会有具体的先容。
查询日记缓冲区巨细:
showparameterlarge_pool_size
NAMETYPEVALUE
-----------------------------------
large_pool_sizebiginteger8M
SQL>altersystemsetlarge_pool_size=7m;
Systemaltered.
=========================================
Java池次要用于Java言语开辟,一样平常来讲不低于20M。其巨细由java_pool_size来
断定,能够静态调剂。
2-4:Oracle主动共享内存办理(AutomaticSharedMemory(SGA)Management)
在Oracle8i/9i中数据库办理员必需手动调剂SGA各区的各个参数取值,每一个区要依据
负荷轻重分离设置,假如设置不妥,好比当某个区负荷增年夜时,没有调剂该区内存巨细,则
大概呈现ORA-4031:unabletoallocate...bytesofsharedmemory毛病。
在Oracle10g中,将参数STATISTICS_LEVEL设置为TYPICAL/ALL,利用SGA_TARGET指
定SGA区总巨细,数据库会依据必要在各个组件之间主动分派内存巨细。
上面是体系主动调剂的地区:
•流动SGA区及其他•共享池•数据缓冲区•Java池•年夜池。
注重:假如不设置SGA_TARGET,则主动共享内存办理功效被克制。
==========================================
SQL>showparameterstatistics_level
NAMETYPEVALUE
--------------------------------------------
statistics_levelstringTYPICAL
SQL>altersystemsetstatistics_level=all;
Systemaltered.
#typical和all有甚么区分?
SQL>altersystemsetstatistics_level=typical;
Systemaltered.
SQL>showparametersga_target
NAMETYPEVALUE
----------------------------------
sga_targetbiginteger0
SQL>altersystemsetsga_target=170m;
altersystemsetsga_target=170m
*
ERRORatline1:
ORA-02097:parametercannotbemodifiedbecausespecifiedvalueisinvalid
ORA-00823:Specifiedvalueofsga_targetgreaterthansga_max_size
SQL>altersystemsetsga_target=20m;
Systemaltered.
#不外厥后又发明sga_target的值酿成了140M?上面是语句实行情形。
SQL>showparametersga_target
NAMETYPEVALUE
-------------------------------
sga_targetbiginteger140M
SQL>altersystemsetsga_target=0;
Systemaltered.
SQL>showparametersga_target
NAMETYPEVALUE
-----------------------------------------------------
sga_targetbiginteger0
#改成20M
SQL>altersystemsetsga_target=20m;
Systemaltered.
#显现的是140M
SQL>showparametersga_target
NAMETYPEVALUE
-----------------------------------------------------
sga_targetbiginteger140M
#不成缩减?
SQL>altersystemsetsga_target=130m;
altersystemsetsga_target=130m
*
ERRORatline1:
ORA-02097:parametercannotbemodifiedbecausespecifiedvalueisinvalid
ORA-00827:couldnotshrinksga_targettospecifiedvalue
#不成增添
SQL>altersystemsetsga_target=141m;
altersystemsetsga_target=141m
*
ERRORatline1:
ORA-02097:parametercannotbemodifiedbecausespecifiedvalueisinvalid
ORA-00823:Specifiedvalueofsga_targetgreaterthansga_max_size
3:Oracle实例的历程布局(ProcessStructure)
Oracle包括三类历程:
•用户历程(UserProcess)
•服务器历程(ServerProcess)
•背景历程(BackgroundProcess)
3-1:用户历程和服务器历程
当数据库用户哀求毗连到Oracle的服务时启动用户历程(好比启动SQLPlus时)。
•用户历程起首必需创建一个毗连。
•用户不克不及间接与Oracle服务器,必需经由过程服务器历程交互。
•服务器历程是用户历程与服务器交互的桥梁,它能够与OracleServer间接交互。
•服务器历程能够有共享和独有两种情势。
[img=527border=0style=,258alt=Oracle系统布局:内存布局和历程布局(图四)src=]http://www.ckuyun.com/[/img]
3-2:背景历程(BackgroungProcess)
数据库的物理布局与内存布局之间的交互要经由过程背景历程来完成。数据库的背景历程包
含两类,一类是必需的,一类是可选的:
•Mandatorybackgroundprocesses
<imgheight=9alt=""width=9style="cursor:pointer;"/><imgheight=1alt=""width=1style="cursor:pointer;"/><imgheight=9alt=""width=9style="cursor:pointer;"/><imgheight=1alt=""width=1style="cursor:pointer;"/><imgheight=1alt=""width=1style="cursor:pointer;"/><imgheight=9alt=""width=9style="cursor:pointer;"/><imgheight=1alt=""width=1style="cursor:pointer;"/><imgheight=9alt=""width=9style="cursor:pointer;"/>|--DBWn(DatabaseWriter):数据写进
|--PMON(ProcessMoniter):历程监控
|--LGWR(LogWriter):日记写进
|--SMON(SystemMoniter):体系监控
|--RECO(Recovery):恢复
|--CKPT(Chekpoint):反省点
•Optionalbackgroundprocesses
|--ARCn(Archiver):回档
|--LCKn(Lock):锁
|--Dnnn(Dispatcher):调剂
|--......
能够用上面的语句检察正在运转的背景历程:
=========================================
SQL>select*fromv$bgprocesswherepaddr00;
PADDRPSERIAL#NAMEDESCRIPTION
------------------------------------------------------
6B0ED0641PMONprocesscleanup
6B0ED4E41MMANMemoryManager
6B0ED9641DBW0dbwriterprocess0
6B0EDDE41LGWRRedoetc.
6B0EE2641CKPTcheckpoint
6B0EE6E41SMONSystemMonitorProcess
6B0EEB641RECOdistributedrecovery
6B0EEFE41CJQ0JobQueueCoordinator
6B0F01E41QMNCAQCoordinator
6B0F06641MMONManageabilityMonitorProcess
6B0F0AE41MMNLManageabilityMonitorProcess2
========================================
3-2-1:DBWR(DatabaseWriter,数据写进历程)
将数据缓冲区的数据写进数据文件,是卖力数据缓冲区办理的一个背景历程。
当数据缓冲区中的一数据被修正后,就标志为dirty,DBWR历程将数据缓冲区中“脏”
数据写进数据文件,坚持数据缓冲区的”洁净“。因为数据缓冲区的数据被用户修正并占
用,余暇数据缓冲区会不休削减,当用户历程要从磁盘读取数据块到数据缓冲区却没法找
到充足的余暇数据缓冲区时,DBWR将数据缓冲区内容写进磁盘,利用户历程总能够失掉足
够的余暇数据缓冲区。
DBWR的感化:
•办理数据缓冲区,以便用户历程总可以找到充足的余暇缓冲区。
•将一切修正后的缓冲区数据写进数据文件。
•利用LRU(比来起码利用)算法坚持缓冲区数据是比来常常利用的。
•经由过程提早写来优化磁盘I/0读写。
3-2-2:LGWR(LogWriter,日记写进历程)
将日记数据从日记缓冲区写进磁盘日记文件组。数据库在运转时,假如对数据库举行修
改则发生日记信息,日记信息起首发生于日记缓冲区。当日记到达必定数目时,由LGWR将
将日记数据写进到日记文件组,再经由日记切换,由回档历程(ARCH)将日记数据写进回
档历程(条件是数据库运转在回档形式下)。数据库遵守写日记优先准绳,即在写数据之前
先写日记。
复杂先容
•ARCH(Archiver,回档历程)
Oracle数据库有两种运转形式,回档(ARCHIVELOG),非回档(NOARCHIVELOG)形式。
以非回档形式运转光阴志在切换时被间接掩盖,不发生回档日记,这是数据库默许的运转模
式。数据库运转在回档形式时,在日记切换之前,由ARCH历程将日记信息写进磁盘,也就是
主动备份在线日记。
Oracle数据库的Redo文件数目是无限的,以是Oracle以轮回的体例向它们中写进。它顺
序写满每个Redo文件,当到达最初一个时,再轮回归去入手下手填写第一个Redo文件。假如为
了能恢单数据库而想保留日记文件,那末在它们被从头利用之前必要对其举行备份,回档进
程办理此事情。
•CKPT(CheckPoint,反省点历程)
运转CKPT时,体系对全体数据文件及把持文件文件头的同步旌旗灯号举行修正,以包管数据
库的同步。反省点呈现在以下情形:
|--在每一个日记切换时发生。
|--上一个查验点以后又经由了指准时间。
|--从上一个查验点以后,当预界说数目的日记块被写进磁盘以后。
|--数据库封闭。
|--DBA强迫发生。
|--当表空间设置为OFFLINE时。
•SMON(SystemMoniter,体系监控历程)
SMON在实例启动时实行实例恢复,并卖力清算不再利用的一时段。
•PMON(ProcessMonitor,历程监控)
PMON在用户历程呈现妨碍时举行恢复,卖力清算内存地区和开释该历程所利用的资本。
•RECO(Recovery,恢复历程)
RECO用于散布式数据库保持在散布式情况中的数据的分歧性。
•LCKn(Lock,锁历程)
在并行服务器顶用于多个实例间的封闭。
•Dnnn(Dispatcher,调剂历程)
Dnnn存在于多线程服务器系统布局中,卖力将用户历程毗连到服务器历程,再把了局返
回给用户历程。
只需每年花费2000到5000美元。无论你是自掏腰包来创建一个新兴公司,还是得到了风险投资商的赞助,使用MySQL都可以降低你所需要的人力成本。
作者:
乐观
时间:
2015-1-19 15:00
无法深入到数据库系统层面去了解和探究
作者:
兰色精灵
时间:
2015-1-19 15:00
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
作者:
admin
时间:
2015-1-26 11:46
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
作者:
只想知道
时间:
2015-2-4 15:13
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
作者:
小魔女
时间:
2015-2-10 02:32
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
作者:
小妖女
时间:
2015-2-28 15:43
从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。
作者:
简单生活
时间:
2015-3-10 02:05
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
作者:
精灵巫婆
时间:
2015-3-17 04:10
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2