oracle-12c-cloud_sm.jpg


体系结构

学习oracle的目的

数据一致性和优化性能,但是数据一致性的要求优先于性能

 

处理模型

C/S模型 
客户端:用户和用户进程
服务器端:服务器进程、实例和数据库本身


概念

实例/instance: 后台进程+共享内存 用于管理和控制数据库
数据库/database: 物理文件的集合 为实例提供数据,如数据文件,控制文件,参数文件,日志文件等
数据库服务器/database server: 软件+实例+数据库


数据库环境分为两部分:

oracle软件,存放在服务器本地硬盘上
oracle数据库,存放在共享存储上


实例

oracle数据库启动后首先在内存中划分一片空间,并启动一些进程,而内存和进程统称oracle数据库实例,数据库关闭后,实例就被关闭
一个数据库可以对应多个实例,如两个,四个等,一般没有单数的。用户可以通过连接到的实例访问数据库,可以实现负载均衡,提高并发等的效果,这种结构叫做RAC技术


查看oracle实例

ps -ef | grep ora

2020-02-14_233526.jpg


查看相关内存

ipcs
#oracle启动后在内存中独享一块内存区域

2020-02-14_233624.jpg


连接/connection:

连接是从客户端到Oracle 实例的一条物理路径。连接可以在网络上建立,或者通过IPC 机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接

    

会话/session:

会话是实例中存在的一个逻辑实体。这就是会话状态(session state),也就是表示特定会话的一组内存中的数据结构
提到"数据库连接"时首先想到的就是“会话”,在服务器中的会话上执行SQL、提交事务和运行存储过程


进程/process:

指定了一个实例在操作系统级别能同时运行的进程数,包括后台进程与服务器进程
由上面的分析可知,一个服务器/前台进程可能同时对应对个会话,因此通常sessions的值是大于processes的值
通常的设置公式
Oracle 11g R1以及之前版本 sessions=(1.1 * processes) + 5 
Oracle 11g R2 sessions=(1.5 * processes) + 22


无连接、无会话、无进程

shutdown immediate;
exit
sqlplus /nolog
!ps -ef | grep ora

2020-02-14_234030.jpg


有连接,有会话,有进程

SELECT SID,SERIAL#,USERNAME FROM V$SESSION WHERE USERNAME IS NOT NULL;
!ps -ef | grep ora

2020-02-14_234448.jpg


#查看进程和会话之间的关系

select name,value from v$parameter where name='processes';
select name,value from v$parameter where name='sessions';
select (1.5*150)+22 from dual;

2020-02-14_234558.jpg


物理存储结构

数据库的几类文件

CONTROL FILE     控制文件  在线
DATA FILE            数据文件  在线
REDO LOG FILE    重做日志文件 在线
PARAMETER FILE  参数文件  在线

ARCHIVE LOG FILE 归档日志文件 离线
PASSWORD FILE    密码文件  离线
ALERT FILE             告警文件
TRACE FILE            追踪文件

在线文件 文件实时改变,不能进行操作
离线文件 文件生成后不会改变


 安全

复用:尽可能不要单点
分散:尽可能多地存放


控制文件

作用:用于记录数据库的物理结构,属于重要角色,没有控制文件,实例立即崩溃,数据库的启动和正常运行都离不开控制文件
包含的内容:数据库物理结构信息,数据库归档历史信息,各个数据文件的SCN号和系统检查点信息,RMAN元数据

性质:控制文件是一个二进制文件,不可以通过文本编辑器编辑,该文件由oracle自行维护,oracle建议至少有两份冗余,并且放在不同的磁盘上。 默认块大小为16K

查看:
show parameters control_files;
select * from v$controlfile;

2020-02-14_235339.jpg


数据文件

作用:用来存储实际数据,数据文件是存储数据的物理概念

数据文件的状态:
ONLINE:  联机状态
OFFLINE: 脱机状态
OFFLINE DROP: 删除数据文件

将数据文件OFFLINE时,不会影响表空间的状态,但是表空间的状态会影响到数据文件的状态

查看:
col name for a30
select file#,name,status from v$datafile;
select * from dba_data_files;
select * from dba_temp_files;

2020-02-14_235746.jpg


逻辑存储结构

段Segments、区Extents、块DataBlocks

从存储的角度只有段,记录到数据字典

段Segments: 
 一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的对象,一个段只能属于一个数据库对象
有以下几种段:
数据段:数据段存放的是数据表中的数据,数据段的增大时向数据段增加区,创建表时,系统自动创建一个同名的段
索引段:包含了用于提高系统性能的索引,一旦建立索引,系统自动创建一个同名的索引段
回滚段:也叫撤销段,该段保存了回滚的条目,oracle将修改前的旧数据存放在回滚段中,利用这个,可以撤销未提交的操作
临时段:当执行创建索引、查询等操作时,系统会使用一些临时空间用来保存解析过的查询语句以及在排序过程中产生的临时数据

区Extents:
段空间分配时最小的单位,由连续的数据块组成

块DataBlocks 
组成区的最小单位,通常是操作系统数据块的整数倍,ORACLE支持同时使用多种大小
  
块组成部分:
块头:存放数据块的基本信息,如块的物理地址,块所属段的类型
表目录:如果是数据表,存放数据表的相关信息
行目录:如果有行数据,那么存储行信息
空余空间:新行插入和存在行的更新
行数据:存放表数据和索引数据

#查看标准数据库块大小
COL NAME FOR A30
COL VALUE FOR A30
SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME='db_block_size';

2020-02-15_000814.jpg


表空间tablespace

表空间是数据库的最大逻辑存储结构,和物理数据文件相对应,一个表空间可以由多个数据文件组成,一个数据文件只能属于一个表空间

分类:
基本表空间: 一般为用户使用的永久性表空间,存储用户永久性数据
临时表空间: 临时表空间是一个磁盘空间,存储用户在执行ORDER BY等语句进行排序或汇总时产生的临时数据,默认情况下所有用户都使用temp作为默认的临时表空间,也允许使用其他临时表空间作为默认临时表空间,需要在创建用户时指定大文件表空间: 存储大型数据
非标准数据块表空间:在一个实例中创建数据库大小不同的表空间
撤销表空间:存储事务的撤销数据,在数据恢复时使用,一个数据库中可以有多个撤销表空间,但是数据库一次只能使用一个,默认使用自动创建的undotbs撤销表空间

主要的几个表空间:
SYSTEM: 系统表空间,用于存放内部表和数据字段的数据,如表名、列名、用户名
SYSAUX: 系统辅助表空间,由ORACLE自行维护
UNDO:存放撤销信息的表空间
USERS:建议用户使用的表空间,scott用户的表就在这个表空间上

状态属性:
ONLINE:  在线,允许访问该表空间中的数据
OFFLINE: 离线,不允许访问该表空间的数据
READ ONLY: 只读,只允许读,必须处于ONLINE状态,不能包含任何事务的回滚段,不能处于在线备份期间
READ WRITE: 读写,可以读写,必须处于ONLINE状态

建议:不同应用系统存放在不同的表空间上,不同的表空间的文件放在不同的磁盘上,减少并发,提高性能


#查看数据字典的信息
COL TABLE_NAME FOR A30
COL COMMENTS FOR A30
SELECT * FROM DICT;

2020-02-15_000156.jpg


#查看数据库内部表的信息
COL VIEW_NAME FOR A30
COL VIEW_DEFINITION FOR A30
SELECT * FROM V$FIXED_VIEW_DEFINITION;

2020-02-15_000309.jpg


#查看表空间
select tablespace_name,contents from dba_tablespaces;

2020-02-15_001547.jpg


#查看表空间对应的数据文件
col file_name for a80
set linesize 600
select distinct file_name,tablespace_name from dba_data_files;

2020-02-15_001817.jpg


#查看USERS表空间
SELECT SEGMENT_TYPE,SEGMENT_NAME,OWNER FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='USERS';

2020-02-15_001908.jpg


#创建一个表
create table hehe (c1 varchar2(10)) segment creation immediate;
#查询该表的段的表空间,区id等信息
select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where segment_name='HEHE';

2020-02-15_002119.jpg


#根据文件编号查找对应的数据文件
select name from v$datafile where file#=&file_id;

2020-02-15_002221.jpg


#根据块id和和块大小来计算块的起始位置
select block_size * &block_id from dba_tablespaces where tablespace_name='&tablespace_name';

1

#创建表空间newtab
create tablespace newtab datafile '/u01/app/oracle/oradata/orcl/newtab01.dbf' size 10m extent management local autoallocate segment space management auto;
#创建表newtable到表空间newtab
create table newtable(c1 date) tablespace newtab;
#查看该表的相关段信息,确定第一个区大小
select extent_id,segment_name,segment_type,tablespace_name,bytes from dba_extents where segment_name='NEWTABLE';

2020-02-15_002505.jpg


#手动增加区,重复执行4次,然后再次查看相关区的信息
alter table newtable allocate extent;
select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where segment_name='NEWTABLE';

2020-02-15_002754.jpg


#让表空间脱机
alter tablespace newtab offline;
#插入数据到表newtable;
insert into newtable values(sysdate);

2020-02-15_002923.jpg

#将表空间上线
alter tablespace newtab online;
#再次插入数据
insert into newtable values(sysdate);

2020-02-15_003017.jpg


#将表空间设置为只读
alter tablespace newtab read only;
#插入数据到表newtable
insert into newtable values(sysdate);

2020-02-15_003148.jpg

#将表空间设置为读写
alter tablespace newtab read write;
#插入数据到表newtable
insert into newtable values(sysdate);

2020-02-15_003301.jpg


#查看表空间状态
select tablespace_name,status from dba_tablespaces;

2020-02-15_003403.jpg


#向表空间newtab中增加数据文件
alter tablespace newtab add datafile '/u01/app/oracle/oradata/orcl/newtab02.dbf' size 50m;
#查看新增的数据文件
select distinct file_name,tablespace_name,autoextensible from dba_data_files;

2020-02-15_003507.jpg


#修改数据文件
alter database datafile '/u01/app/oracle/oradata/orcl/newtab02.dbf' autoextend on next 50m maxsize 2g;
#修改数据文件大小
alter database datafile '/u01/app/oracle/oradata/orcl/newtab02.dbf' resize 70m;
#删除表空间newtab;
drop tablespace newtab including contents and datafiles;

2020-02-15_003634.jpg


段管理

 使用自动段管理,使用位图进行管理

#查看表空间的段管理方式
#手动转换自动请新创建表空间
select tablespace_name,segment_space_management from dba_tablespaces;

2020-02-15_003746.jpg


区管理

区管理方法为每个表空间设置,应用于表空间中的所有段,可使用字典管理或者本地管理,但是请不要使用字典管理

字典管理:使用两张表对区进行管理

本地管理:使用位图来管理区

使用uniform size指定每次分配的区大小

#创建一个区大小为150m的表空间dabiao
create tablespace dabiao datafile '/u01/app/oracle/oradata/orcl/dabiao_01.dbf' size 5g extent management local uniform size 150m;
#查看创建好的表空间中数据文件的大小
select name,bytes/1024/1024 from v$datafile

2020-02-15_003947.jpg

#查看表空间的信息
select tablespace_name,next_extent,min_extlen from dba_tablespaces;

2020-02-15_004028.jpg


#创建一个区大小为150K的表空间xiaobiao
create tablespace xiaobiao datafile '/u01/app/oracle/oradata/orcl/xiaobiao_01.dbf' size 2g extent management local uniform size 150k;
#查看创建好的表空间中数据文件的大小
select name,bytes/1024/1024 from v$datafile;

2020-02-15_004134.jpg

#查看表空间的信息
select tablespace_name,next_extent,min_extlen from dba_tablespaces;

2020-02-15_004206.jpg


#ORACLE公司建议使用autoallocate关键字
create tablespace xiaobiao1 datafile '/u01/app/oracle/oradata/orcl/all_01.dbf' size 2g extent management local autoallocate;
#删除
drop tablespace dabiao including contents and datafiles;
drop tablespace xiaobiao including contents and datafiles;
drop tablespace xiaobiao1 including contents and datafiles;

2020-02-15_004404.jpg


内存结构

Database Buffer Cache

服务器进程,针对每一个连接启动一个服务器进程,数据在buffer cache,如果没有就会找dbf/数据文件,server process读取数据 dbw将修改后的数据写入数据文件
缓冲区状态:
已连接:正在进行读/写的瞬间
干净: 数据文件和内存中一致,该内存可以重用
空闲: 未使用的内存空间,该内存可以重用
脏: 内存中的数据发生了修改,需要写回dbf   dirty block
如果没有空闲和干净的内存空间,则触发dbwn


Redo Log Buffer

buffer cache中的数据一旦有修改就会产生该日志
log buffer通过LGWR写入到redo log中,写满后会进行切换
ARCn将redo log归档到归档日志


Large Pool

RMAN备份恢复的时候,执行并行查询的时候,执行大量排序操作的时候,共享服务器的时候


Java Pool

存储过程可以使用java写,数据库内部存在jvm


Streams Pool

 由Oracle Streams使用


查看sga内存详情

col component for a30;
select component,current_size,min_size,max_size from v$sga_dynamic_components;

2020-02-15_004941.jpg


PGA 进程/私有全局区

作用:
PGA是服务器进程使用的内存空间,后台进程也有PGA
在PGA中进行数据排序
PGA只有服务器进程可以访问,独享内存空间
PGA和服务器进程是关键点

构成:
 1、private SQL area
 静态区: 会话结束释放
 动态区: sql执行结束释放
 2、Session Memory
 3、SQL Work Areas(主要)
  1.sort_area_size   排序空间大小
  2.sort_area_retained_size 排序空间释放到的最小空间大小
  3.hash_area_size   多表访问需要哈希空间
  4.hash_join_enable   哈希空间相关
  5.bitmap_merge_area_size 位图区
  6.create_bitmap_area_size 位图区创建
  7.open_cursors    一个会话可以执行的SQL的数量
  8._pga_max_size   每一个会话能分配的最大的PGA大小
  
手动指定空间时,如果在排序时需要的排序空间不够时,服务器进程会在临时数据文件上拿到空间再进行排序,在PGA中的排序叫内存排序,在临时数据文件中的排序叫磁盘排序,如果一次磁盘排序不够,还需要多次排序
建议使用自动管理,我们只需要分配一个PGA总空间,其他的自动调整,但是在自动管理中,每个服务器进程能够使用的PGA空间仍然要有限制


#查看当前配置
#默认为自动
SHOW PARAMETER AREA;

2020-02-15_005201.jpg


#查看当前pga的分配情况
select name,value from v$pgastat where name in('maximum PGA allocated','total PGA allocated');

2020-02-15_005312.jpg


#查看_pga_max_size的值
col name for a20
col value for a20
col desc for a20
SELECT KSPPINM "Name",ksppstvl/1024/1024 ||'M' "Value",ksppdesc "Desc" from x$ksppi x, x$ksppcv y where x.indx = y.indx and ksppinm = '_pga_max_size';
#生产环境中可根据上述查询结果来估算PGA空间大小
#修改内存大小
alter system set 内存参数=大小

2020-02-15_005524.jpg


进程结构

生产环境中,前台进程远远多于后台进程

后台进程

DBWn: 将buffer cache中的脏数据写入到dbf中,只写不读
执行时间点:没有任何可用缓冲区、脏缓冲区过多、三秒超时、遇到检查点


#查看当前DBWn数量
show parameter db_writer_processes;

2020-02-15_005855.jpg


#修改DBWn数量
alter system set db_writer_processes=20 scope=spfile;
alter system set db_writer_processes=20 scope=both;
#收到错误提示ORA-02095: specified initialization parameter cannot be modified
#有些参数不能动态修改,需要使用ALTER SYSTEM SET parameter = value scope = spfile, 然后重新启动数据库才能生效

2020-02-15_010218.jpg


#设置检查点
alter system checkpoint;


LGWR

将log buffer中的数据写入到redo log中
LGWR触发条件:
1、用户提交
2、有三分之一的log buffer未被写入磁盘
3、有大于1M的log buffer未被写入磁盘
4、每隔三秒
5、DBWn需要写入的数据的SCN大于LGWR记录的SCN,触发LGWR写入,日志写入优先(Write-Ahead-Log)


CKPT

周期性触发,更新检查点信息,更新到控制文件和每个数据文件头部。
检查点类型:
1、完全检查点,执行ALTER SYSTEM CHECKPOINT,正常关闭实例
2、增量检查点

检查点队列:该队列是脏数据块所对应的buffer header,dbwn按照这个写


SMON

主内,监控实例内部,实例恢复,如整理碎片,清理不使用的临时段


PMON

主外,监控用户连接。
1、在用户进程失败时执行进程恢复
2、清除数据库缓冲区高速缓存
3、释放该用户进程使用的资源
4、监视会话是否发生空闲会话超时
5、将数据库服务动态注册到监听程序


ARCn

将写满后的redo log写入到归档日志中。可以收集事物处理重做数据,并将该数据传输到备用目标位置


MMON

自我监视和自我管理支持进程


MMNL

 MMON辅助进程,


ADDM

自动数据库诊断监视器


MMAN

自动内存管理


LREG

监听注册进程


前台进程

服务器进程,应用程序服务器产生到数据库服务器的连接,多个连接形成一个连接池



更新日期: 2020年02月14日
文章链接: https://www.vos.cn/db/403.html  
版权说明:如非注明,本站文章均为vOS原创,转载请注明出处和附带本文链接。