OCP笔记3:体系结构
实例与数据库:
实例 = 内存(PGA、SGA) + 进程(SMON、PMON、DBWn、LGWR 、CKPT )
数据库 = 三大核心文件(Data files、Control files、Redo Log files)
其它:
用户内存区(每一个客户端连接)
其它文件(参数文件,密码文件,归档日志)
其它进程(RECO,ARCn,LREG,MMON,MMAN,MMNL,CJQ0,QMNC)
SAG:
保存全局数据,所有进程共享的内存。
信息视图:v$sgainfo
SGA的重要部分:
Database Buffer Cache(DBC):就是Block(页)的缓存,计算引擎无论读或写文件中的数据,先把要读写的那部分Block加载到DBC,写之前要加锁,得到锁之后,读或写的就是这个DBC,而不是数据文件,DBWR(或DBWn)会适时将DBC写到磁盘。参数db_cache_size控制其大小,如果是0表示自动管理。每个Block的大小是创建表空时设置,不可修改,从db_block_size查看块大小。
Redo Log Buffer:redo日志的缓存,参数log_buffer控制其大小,更改记录的操作,通过并发调度后,先写Redo Log Buffer,再写DBC,commit时Redo Log Buffer会部分落盘,但DBC不会。
Shared Pool:包括数据字典缓存,查询结果缓存,执行计划缓存,大小由shared_pool_size控制。
Large Pool:与Shared Pool类似,用于需要大内存的情况,以减轻Shared Pool负担。
Java Pool:专用于存储Java代码和数据。
Streams Pool:专用于存储流队列数据。
PGA:
客户端接入服务器时,在服务器端为每个连接分配一个进程和内存,这个内存就是PGA,SQL计算时(如排序、聚合)的中间数据,用户数据,cursor等,就放在PGA中,UGA在PGA中。
进程:
进程分user process、server process和background process。
user process就是sqlplus或其它客户端进程。
server process是服务端为每个连接来的客户端创建的进程,其内存就是PGA,也会访问SGA,这个进程负责这样几个重要工作:
1、SQL解析和执行计划计算。
2、从SGA的DBC读取需要的记录,用于SQL执行计划的计算,如果DBC中没有需要的数据,则从由server process从data file中读取Block到DBC中。
3、执行insert、update语句时,将更改写入DBC(但是不负责从DBC到磁盘),如果调度局阻塞它,就等待。
4、将对数据块的修改,转为变更向量,写到Redo Log Buffer(但是不负责从Redo Log Buffer到磁盘)。
background process是多个进程,服务所有客户连接的进程,访问的是SGA内存,包括下面几个主要进程:
SMON:核心进程System Monitor,负责实例恢复,释放不再使用的临时段,合并空闲资源。
PMON:核心进程Process Monitor,监控其他后台进程,并检测会话中的问题。
1、 当会话异常终止时, PMON 销毁对应服务器进程。 释放所有当前挂起的锁定。 释放服务器端使用的资源(PGA 内存等) 。 回滚正在进行的未完成的事务。
2、 监视其他后台进程, 必要时重启进程或终止实例。
3、 监控空闲会话超时。
DBWn:核心进程,负责将DBC写到磁盘,在checkpoint时会写,在其它适当时机也会写,此进程可以有多个。
考点:
1、 server process 对数据文件执行读操作, 而 dbwr 负责对数据文件执行写操作。
2、 commit 时 dbwn 有何举动?它什么也不做!
LGWR :核心进程,负责将Redo Log Buffer里的记录落盘,注意不同于DBWn进程可以有多个,LGWR进程只有一个,为了保证一致性,Redo Log Buffer落盘时必须注意顺序。
CKPT:核心进程,执行检查点操作的进程。
ARCn:写归档日志进程
检查点:
手动执行检查点操作:
alter system checkpoint
数据库会因为一些事件自动触发检查点操作。
检查点操作时,检查点信息会写到control file和数据文件的头部。
数据文件(data files):
查看数据文件信息 v$datafile,select name from v$datafile;
例如:/u01/app/oracle/oradata/CDB/pdb1/system01.dbf
dba_data_files、dba_tablespace、dba_segments、dba_extents
数据文件逻辑结构:
表空间和数据文件的关系:
表空间可以由多个数据文件组成,一个数据文件只能属于一个表空间。
一个表空间里可以存储多个表,一个表的数据可能跨多个数据文件。
段(segment)是指数据库对象,例如表、索引等,由此可见,一个段也是可以跨多个数据文件的。
PL/SQL 过程、 视图、 序列不是段,它们只是数据字典中的一条记录。
一般来讲, 一个单纯的表就分配一个段,
但往往表没那么单纯,比如表上经常会有主键约束,那么就会有索引,索引有索引段,
还有分区表,每个分区会有独立的段,再有就是 Oracle 的大对象,
如果你的表里引用 blob,clob,那么这个表就又被分出多个段来。
区(extent)包括一组连续的Block,extent包含Block个数可变。段由若干个区组成,数据字典管理的最小粒度就是extent。
Oracle以extend为单位,给段分配空间,一个extent不可以跨data file,一个extent只能属于一个data file。
块(Block)读写的最小单位,有内部结构,表记录存储在Block中,Oracle块以OS块的整数倍,例如默认Oracle块是8K,数据字典不管理块。
控制文件(control files):
control file用于存储数据库当前状态信息,这些信息,并不记录在数据字典中,因为数据字典也是表,同样受系统崩溃影响。
控制文件在mount时被实例读取。
是一个二进制小文件。
控制文件中的信息包括:
检查点、SCN、RMAN元数据、归档日志,redo日志,数据文件信息。
以下查询的是控制文件:
select name from v$datafile;
select member from v$logfile;
查看控制文件位置:
show parameter control_files 或 select name from v$controlfile
当增加、重命名、删除一个数据文件或者一个联机日志文件时,Oracle服务器进程(Server Process)会立即更新控制文件,以反映数据库结构的变化。
Oracle一般在不同的磁盘,存储多份控制文件,互为镜像,设置多镜像:
在建库时pfile中设置:
control_files='/u01/app/oracle/oradata/CDB/control01.ctl','/u01/app/oracle/oradata/CDB/control02.ctl','/u01/app/oracle/oradata/CDB/control03.ctl'
或者
alter system set control_files='/u01/app/oracle/oradata/CDB/control01.ctl','/u01/app/oracle/oradata/CDB/control02.ctl','/u01/app/oracle/oradata/CDB/control03.ctl' scope=spfile;
关库复制一份控制文件:
cp /u01/app/oracle/oradata/CDB/control02.ctl /u01/app/oracle/oradata/CDB/control03.ctl
然后开库。
控制文件的备份与恢复:
控制文件一旦损坏,系统将不能正常工作,数据库启动不了。
控制文件是可以通过脚本重建的,前提是知道有哪些数据文件和在线日志文件。
对控制文件的备份有两种方式:
一种是在一致性关库后,复制控制文件。
一种是生成重建控制文件的脚本,在控制文件损坏后,用脚本重建。
在open或mount状态下生成重建脚本:
alter database backup controlfile to trace as '/u01/app/oracle/oradata/CDB/control.trace';
恢复时,在nomount状态下执行脚本。
Redo日志(在线):
有多个文件组(最少两组),循环使用,每个文件组有多个镜像文件,redo日志应放在与数据文件不同的磁盘上,需读写速度快的磁盘。
每个组的redo日志写满,自动切换到下一组,所有组写满,则循环覆盖。
redo日志的分组是在创建数据库的命令中设置的,在数据库创建之后,
可以通过 alter database add logfile group 增加分组,
可以通过 alter database add logfile member 增加分组中的镜像,例如:
alter database add logfile group 4 '/u01/app/oracle/oradata/CDB/redo04.log' size 100m; alter database add logfile member
'/u01/app/oracle/oradata/CDB/redo01b.log' to group 1, '/u01/app/oracle/oradata/CDB/redo02b.log' to group 2, '/u01/app/oracle/oradata/CDB/redo03b.log' to group 3, '/u01/app/oracle/oradata/CDB/redo04b.log'to group 4;
在线redo日志,有四种状态:
current:LGWR正在向日志写数据,不能被覆盖
active:LGWR不再向日志写数据,但这些日志对应的Database Buffer Cache,还没有落盘,所以也不能被覆盖,如果此时崩溃,需要用来恢复。
inactive:这些日志对应的Database Buffer Cache已经落盘,可以覆盖。
unused:新添加的日志组,还没开始被使用。
强制切换日志组:
alter system switch logfile;
这个操作会导致checkpoint、日志归档、修改control file
Inactive日志组可以删除或清空:
alter database clear logfile group 3; -- 日志组3变为unused alter database drop logfile group 4; -- 删除日志组4,文件系统的文件还需手动删除
相关视图:v$log、v$logfile、v$archived_log
select group#, status, archived from v$log;
redo日志损坏的恢复:
如果是inactive,没有影响,重建日志即可:alter database add logfile group ... , alter database add logflie member ...
如果是current:
1)如果数据库没有崩溃,尝试做checkpoint,把active的日志赶紧写到数据文件,有一部分已经提交的事务,丢了就丢了吧,数据库仍是一致的,然后用
alter database clear unarchived logfile group n;
重建损坏的这个current日志。但此时归档日志已经不连续了(如果开了归档日志的话),需要重新做一次全备。
2)如果数据库崩溃了,只有做不完全恢复,再不行就强制非一致性开库。
如果是active:
尝试做checkpiont,如果成功,重建丢失的redo日志,此时current日志也不能要了,归档日志也不连续了,重做一次全备。
如果失败,只有做不完全恢复,再不行就强制非一致性开库。
归档日志(Archived log files):
1、开归档日志
在mount状态下:
alter system set log_archive_dest_1='location=/mnt/disk01/oracle_archive_log';
alter database archivelog;
open数据库
2、关归档日志
在mount状态下:
alter database noarchivelog;
3、查看归档日志信息
archive log list
select name from v$archived_log;
4、清理归档日志
使用rman删(推荐):
rman target /
list archivelog all;
delete archivelog until sequence n;
或
delete archivelog all completed before 'sysdate-7';
delete archivelog all;
手工删:
直接在操作系统层面删除文件,登录rman,清理控制文件中的记录,因为归档日志文件都记录在控制文件中。
rman target /
crosscheck archivelog all;
delete expired archivelog all;
参数文件(parameter file)
与postgresql类似,Oracle也有一个参数文件,每次启动时读取,就是所谓的pfile,这是个文本文件,默认在$ORACLE_HOME/dbs。
参数格式是:parameter_name=parameter_value
spfile是pfile的二进制形式,它们是互相替代的,可以从pfile创建spfile,也可以从spfile创建pfile:
默认创建到($ORACLE_HOME/dbs)
create spfile from pfile;
create pfile from spfile;
二进制形式的spifile有许多优点,但是,首次从命令行创建数据库时,需要设置参数文件仍然是文本形式的pfile,例如:$ORACLE_HOME/dbs/initORCL.ora。
注意,使用dbca建库后默认使用spfile。
每次启动时,在$ORACLE_HOME/dbs目录下寻找spfile或pfile读取参数,有些使用spfile,优先级顺序为:
spfile<SID>.ora
spfile.ora
init<SID>.ora
init.ora
启动后,所有的参数可以通过 v$parameter查看,查看某个参数:show parameter <name>。
在数据库运行时,可以用
alter system set <parameter_name> = <value> scope=<memory|spfile|both>;
修改参数,其中scope=spfile表示修改存储到spfile,memory表示存储到内存,both表示都改,如果没有scope默认就是both。
对于所有参数,有两种,一种是动态参数,即alter system修改以后立即生效的,第二种是静态参数,alter system修改后不生效,数据库重启后生效。
如果是静态参数,scope设为spfile或修改pfile,才能重启生效。
密码文件(password file)
密码文件有两个作用:
1、初次安装Oracle创建数据库时,没有创建任何用户,然而要执行CREATE DATABASE需要一个有足够权限的用户,SYS就是第一个用户,通过密码文件设置SYS用户的密码。
2、以sysdba权限远程登录时,服务器端必须创建密码文件,如果忘记SYS密码,还可以通过覆盖密码文件,重新设置SYS密码。
以sysdba权限远程登录,cdb-remote是远程Oracle的网络配置:
sqlplus sys/123456@cdb-remote as sysdba
创建的密码文件,使用orapwd命令,例如:
orapwd file=orapwORCL password=123456 entries=5 format=12 force=y
密码文件必须放在 $ORACLE_HOME/dbs 目录下(Oracle服务器端)。
文件名必须是orapw+SID,Oracle才可以找到,例如orapwORCL。
format=12是指12c格式的密码文件,对密码字符的要求并不严格。
实例的启动和关闭
视图:v$instance
启动的阶段:
shutdown -- 彻底关闭
nomount -- 读取配置参数,分配SGA内存,启动后台进程
mount -- 读取控制文件
open -- 打开数据文件、在线redo日志,检查一致性
实例关闭:
shutdown命令有4中模式:
shutdown immediate|abort|normal|transactional
其中IMMEDIATE、NORMAL、TRANSACTIONAL是一致性关库,ABORT是非一致性关库。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库