OCP 体系结构

目录

实例与数据库:

SAG:

PGA:

进程:

检查点:

数据文件(data files):

表空间和数据文件的关系:

控制文件(control files):

控制文件的备份与恢复:

Redo日志(在线):

强制切换日志组:

redo日志损坏的恢复:

归档日志(Archived log files):

参数文件(parameter file):

密码文件(password file):

实例的启动和关闭:

告警日志:


实例与数据库:

实例 = 内存(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,区分配的元数据可以放在数据字典里,也可以放在表空间里,这种方式叫做locally managed tablespace。

一个segment包括多个extent,而且这些extent不一定是连续的,Oracle以extend为单位,给段分配空间,一个extent不可以跨data file,一个extent只能属于一个data file。

块(Block)读写的最小单位,有内部结构,表记录存储在Block中,Oracle块以OS块的整数倍,例如默认Oracle块是8K,数据字典不管理块。

逻辑存储架构:

查看表空间:select * from v$tablespace;

查看段:select * from user_segments;

查看区:select * from user_extents;

控制文件(control files):

control file用于存储数据库当前状态信息,这些信息,并不记录在数据字典中,因为数据字典也是表,同样受系统崩溃影响。

控制文件在mount时被实例读取。

是一个二进制小文件。

控制文件中的信息包括:

检查点、SCN、RMAN元数据、归档日志,redo日志,数据文件信息。

以下查询的是控制文件:

select name from v$datafile;

select member from v$logfile;

而v$datafile_header是从数据文件头部读取的。

查看控制文件位置:

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。

查看数据库是使用pfile还是spfile,如果spfile的值不是空,就是使用spfile。

show parameter spfile;

每次启动时,在$ORACLE_HOME/dbs目录下寻找spfile或pfile读取参数,有些使用spfile,优先级顺序为:

spfile<SID>.ora

spfile.ora

init<SID>.ora

init.ora

如果以pfile启动,启动后就一直用pfile,因此不能使用

alter system set <parameter>=<value> scope=spfile;

如果向将参数修改后保存到spfile,应该从pfile创建spfile,然后重新启动,这次启动就是使用spfile了,之后就可以用alter system set <parameter>=<value> scope=spfile;将参数保存到spfile中了。

启动后,所有的参数可以通过 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是非一致性关库。

告警日志:

这里说的告警日志,是Oracle运行的错误日志,可以查看各种报错的详细信息。可以从视图 v$diag_info 查看告警日志存放路径。

告警日志是Diag Trace这一条,不是Diag Alert。所以存放路径是在/u01/app/oracle/diag/rdbms/cdb/CDB/trace,alter目录下是xml格式的告警日志。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值