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格式的密码文件,对密码字符的要求并不严格。

SYS用户的密码,还可以在sqlplus命令行下,
用命令 password 或 alter user sys identified by <password> 修改,
如果已经创建了密码文件,这些命令会修改密码文件,但是,如果没有密码文件,这些命令不会创建密码文件。
 
 

实例的启动和关闭

视图:v$instance

 启动的阶段:

shutdown -- 彻底关闭

nomount -- 读取配置参数,分配SGA内存,启动后台进程

mount -- 读取控制文件

open -- 打开数据文件、在线redo日志,检查一致性

实例关闭:

shutdown命令有4中模式:

shutdown immediate|abort|normal|transactional

 

其中IMMEDIATE、NORMAL、TRANSACTIONAL是一致性关库,ABORT是非一致性关库。

 

posted on   射手h  阅读(83)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示