wangbo123855842 / Learning

15 stars 2 forks source link

Oracle 体系结构篇 #13

Open wangbo123855842 opened 3 years ago

wangbo123855842 commented 3 years ago
スクリーンショット 2020-04-17 22 18 27

Oracle

Oracle数据库的版本

Oracle 体系结构

スクリーンショット 2020-04-18 18 36 28

Oracle 服务器

Oracle实例Oracle数据库组成的

Oracle实例

用户可以通过连接到的实例访问数据库,是一种访问数据库的基本方式 总是打开一个并且,只能打开一个数据库 oracle数据库启动后首先在内存中划分一片空间,并启动一些进程,而内存和进程统称oracle数据库实例,数据库关闭后,实例就被关闭。

一般情况下,Oracle服务器都是一个数据库对应一个实例。

スクリーンショット 2020-04-22 8 04 24

一个数据库也可以对应多个实例,如两个,四个等,一般没有单数的。用户可以通过连接到的实例访问数据库,可以实现负载均衡,提高并发等的效果,这种结构叫做oracle的RAC技术。

Oracle实例 = 内存结构 + 后台进程结构

一个数据库可以有多个实例,但一个实例只能在一个数据库里

スクリーンショット 2020-04-18 21 50 40

在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件。

用Oracle官方描述:实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合。 其实就是用来访问和使用数据库的一块进程,它只存在于内存中。就像Java中new出来的实例对象一样。 我们访问Oracle都是访问一个实例这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。

实例名指的是用于响应某个数据库操作的数据库管理系统的名称。同时也叫SID。 实例名是由参数instance_name决定的 查询当前数据库实例名

select instance_name from v$instance;

数据库实例名(instance_name)用于对外部连接。 在操作系统中要取得与数据库的联系,必须使用数据库实例名。 比如我们作开发,要连接数据库,就得连接数据库实例名:

jdbc:oracle:thin:@localhost:1521:orcl(orcl就为数据库实例名)

连接和会话

スクリーンショット 2020-04-18 21 58 15

Oracle 11g R2 sessions=(1.5 * processes) + 22


#### 总结
1. **必须先建立连接,才可以再建立会话,会话建立以后用户才可以执行sql语句**
2. 在一条连接上可以建立0个、一个或多个会话。
3. **各个会话是单独而且独立的**,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。
4. Oracle 数据库中的**同一个用户可以同时创建多个会话**。例如,用户名/密码为的SCOTT/TIGER 用户可以多次连接到同一个 Oracle 实例。
5. 无连接无会话无进程: sqlplus /nolog
6. 单个连接单个会话单个进程: sqlplus/ as sysdba 或者 CONN SCOTT/oracle

### Oracle查看和修改 连接 会话

- 查询数据库当前进程的连接数

SQL> select count(*) from v$process ;


- 查询数据库允许的最大连接数

SQL> select value from v$parameter wherename = 'processes';


- 修改数据库允许的最大连接数

SQL> alter system set processes = 300 scope = spfile;

需要重启数据库才能实现连接数的修改

SQL>shutdown immediate; SQL>startup;


- 查看数据库当前会话的连接数

SQL> select count(*) from v$session ;


- 查看数据库的并发会话的连接数

SQL> select count(*) from v$sessionwhere status='ACTIVE';


- 查看当前数据库建立的会话情况

SQL>select sid,serial,username,program,machine,status from v$session;


## oracle认证方式
Oracle登录认证有两种方式,基于操作系统的登录认证,基于oracle密码的验证。
可以通过改变sqlnet.ora文件,可以修改oracle登录认证方式

操作系统验证登录方式,即常说的OS验证登录方式。
当用Windows的管理员帐户登陆系统后登陆数据库,只要加上 as sysdba,不管用什么用户名和密码登陆,都正确,因为这时系统已经忽略了/ 两边的用户名和密码,默认就是sys用户。

几种登陆方式不是一种概念
sqlplus /nolog
- conn /as sysdba                    
本机登陆,使用操作系统认证,有无监听都可以

- conn sys/password as sysdba   
本机登陆,使用密码文件认证,有无监听都可以

- conn sys/password@dbhost as sysdba  
可以本机可以远程,使用密码文件认证,
必须有监听,必须有tnsnames.ora,remote_login_passwordfile必须是EXCLUSIVE

sqlplus /nolog
/nolog 选项会启动sqlplus, 但不连接数据库,如果没有/nolog参数,sqlplus会提示你输入用户名和密码

sqlplus远程连接oracle

sqlplus 用户名/密码@192.168.19.189:1521/数据库名


## 专用服务器 / 共享服务器

数据库的连接模式有两种,一种叫做专用服务器连接(dedicated server) ,另外一种叫做共享服务器连接(shared server)。

- 专用服务器(DEDICATED)
**一个客户端连接对应一个服务器进程**
专用服务器模式就是说每次在对Oracle进行访问的时候,Oracle服务器的Listener会得到这个访问请求,然后回为这个访问**创建一个新的进程来进行服务**。所以说,对于每一个客户端的访问,都会生成一个新的进程进行服务,是**一种类似一对一的映射关系**。

<img width="559" alt="スクリーンショット 2020-04-19 14 55 47" src="https://user-images.githubusercontent.com/6970715/79681585-03246c00-824e-11ea-90eb-bb620f9d9a91.png">

- 共享服务器(SHARE)
**多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理**。
**它必须使用net services.也就是说必须配置tns**
数据库的**初始化的时候就会创建一批服务器连接的进程**,然后把这些连接进程放入一个**连接池**来进行管理。初始化的池中的进程数量在数据库初始化建立的时候是可以手动设置的。在连接建立的时候,Listener首先接受到客户端的建立连接的请求,然后**Listener去生成一个叫做调度器(dipatcher)的进程与客户端进行连接**。调度器把把客户端的请求放在SGA(系统全局域)的一个请求队列中,然后再共享服务器连接池中查找有无空闲的连接,然后让这个空闲的服务器进行处理。处理完毕以后再把处理结果放在SGA的相应队列中。调度器通过查询相应队列,得到返回结果,再返回给客户端。**这种连接模式的优点在于服务器进程的数量可以得到控制,不大可能出现因为连接人数过多而造成服务器内存崩溃**。但是由于增加了复杂度以及请求相应队列,**可能性能上有所下降**。

<img width="616" alt="スクリーンショット 2020-04-19 14 56 12" src="https://user-images.githubusercontent.com/6970715/79681588-0ae41080-824e-11ea-9dd1-b75561d23ad2.png">

**专用服务器不需要设置,这个是oracle的默认选项**
如果在前端使用了weblogic等connecting pool类似功能,那么你在database level再使用shared servers可能就不是很必要,因为这时你的用户连接已经在weblogic层面上得到了控制。

### 配置共享服务器
1. 配置共享服务器参数

alter system set shared_servers=10 scope=both; alter system set max_dispatchers=7 scope=both; ALTER SYSTEM SET DISPATCHERS = '(PROT=tcp)(DISP=3)', '(PROT=tcps)(DISP=3)';

和Shared Server相关的参数主要有两个:**shared_server**和**dispatchers**。后一个参数用来设置分发器,可以针对不同的协议设置分发器,比如这样
DISPATCHERS = “(PRO=TCP)(DIS=3)(PRO=IPC)(DIS=2)”
复杂一点的,带有连接池的
DISPATCHERS="(PROTOCOL=tcp)(DISPATCHERS=1)(POOL=on)(TICK=1)(CONNECTIONS=500)(SESSIONS=1000)"
Shared_server用来定义系统启动时启动的Shared server数量,如果是0,就取消了Shared mode。
另外还有一些参数
MAX_DISPATCHERS:设置最大的调度器数
SHARED_SERVER_SESSIONS:自动创建的SHARED SERVER的最大session数。
MAX_SHARED_SERVERS:设置最大的SHARED_SERVER数。如果未给此参数附值,那么SHARED_SERVER数库无限制

2. 配置tnsnames.ora文件
<img width="539" alt="スクリーンショット 2020-04-19 15 05 31" src="https://user-images.githubusercontent.com/6970715/79681765-48956900-824f-11ea-879c-24c07a9ad42d.png">

## Oracle数据库
<img width="745" alt="スクリーンショット 2020-04-20 7 42 47" src="https://user-images.githubusercontent.com/6970715/79702917-cc486780-82da-11ea-9bc5-f1d1bcc2651c.png">

Oracle数据库是数据的集合体
主要有四类文件组成,**数据文件**,**控制文件**,**日志文件**,**其它文件**

# Oracle 文件结构(物理)
Oracle数据库的物理存储是操作系统的文件系统决定的

<img width="601" alt="スクリーンショット 2020-04-20 8 07 26" src="https://user-images.githubusercontent.com/6970715/79703368-ff402a80-82dd-11ea-935e-53394d64bcde.png">

Oracle的文件系统主要分成以下的四大块
- 控制文件(.CTL)
- 数据文件(.DBF)
- 日志文件(.LOG)
- 其他文件

存放在`$ORACLE_HOME$\oradata\`

### 1. 数据文件

**真正存储数据库中的数据,包括表,索引,视图等**
通常情况下数据文件的后缀名都是.DBF,但这只是约定俗成的一种做法,实际上数据库并不要求数据文件以.DBF为后缀,只是便于区分,建议建立数据文件的时候都加上。

查看所有数据文件的文件号、状态和文件名

SQL> select * from v$datafile;


### 2. 控制文件
**定义当前数据库物理状态的二进制文件**,**每个oracle数据库至少有一个控制文件**。
控制文件由DBA管理维护。
**每个控制文件都只关联一个数据库**
数据库运行期间控制文件不断地被更新
控制文件若丢失需要恢复

#### 控制文件包含主要内容
1. 数据库名及数据库唯一标识
2. 数据文件和日志文件标识
3. 数据库创建时间
4. 表空间名
5. 重做日志归档信息
6. 备份信息

####  对oracle控制文件的管理主要包括
1. 控制文件的备份
2. 控制文件的移动
3. 控制文件的重建
4. 控制文件的修改(重命名数据库)

创建备份控制文件

alter database backup controlfile to 'C:\controlfile01.ctl';

rman配置自动备份控制文件 

configure controlfile autobackup on;

移动控制文件

alter system set control_files='PATH1,PATH2,PATH3' scope=spfile;

通过跟踪文件重建

alter database backup controlfile to trace

控制文件丢失,若rman中存在备份,可以通过rman进行恢复控制文件

startup nomount; restore controlfile from autobackup;


### 3. 日志文件
alert log files        --警报日志
trace log files       --跟踪日志 (用户和进程)
redo log file          --重做日志(记录数据库的更改)。

#### 3.1 警告日志
警告日志文件是一类特殊的跟踪文件(trace file)。
警告日志文件命名一般为alert_<SID>.log,其中SID为ORACLE数据库实例名称。
数据库警告日志是按时间顺序记录message和错误信息。

警告日志包含哪些数据
  1. 所有的内部错误(ORA-600)信息,块损坏错误(ORA-1578)信息,以及死锁错误(ORA-60)信息等
  2. 管理操作,例如CREATE、ALTER、DROP语句等,以及数据库启动、关闭以及日志归档的一些信息
  3. 涉及物理结构的所有操作:例如创建、删除、重命名数据文件与联机重做日志文件的ALTER DATABASE命令,此外还涉及重新分配数据文件大小以及将数据文件联机与脱机的操作。
  4. 表空间操作,例如DROP与CREATE命令,此外还包括为了进行用户管理的备份而将表空间置入和取出热备份模式的操作 5.与共享服务器或调度进程相关功能的消息和错误信息。
  5. 动态参数的修改信息。

3.2 跟踪日志

跟踪文件由各个后台进程生成,一般在遇到错误时生成。这些文件与警报日志放在一起 跟踪文件包括后台进程跟踪文件用户进程跟踪文件

后台进程跟踪文件用于记录后台进程的警告或错误信息。 后台进程跟踪文件的命名格式为.trc

用户进程跟踪文件用于记载与用户进程相关的信息,主要用于跟踪SQL语句。通过用户进程跟踪文件,可以判断SQL语句的执行性能。 用户进程跟踪文件的命名格式为ora.trc

3.3 重做日志

记录着每一个对数据库的更改,当发生数据库记忆丢失的情况时(如数据文件意外删除,数据表意外删除,数据文件块损坏等),oracle只要规规矩矩地按照日志文件记载一步一步把曾经执行过的操作再重做一遍,数据库还是可以回到应用的状态。 重做日志的简单原理,在数据更新操作commit前,将更改的SQL脚本写入重做日志。主要用于数据库的增量备份和增量恢复。重做日志直接对应于硬盘的重做日志文件(有在线和归档二种),重做日志文件以组(Group)的形式组织,一个重做日志组包含一个或者多个日志文件

重做日志分为

  1. 在线重做日志 -- online Redo log files
  2. 归档重做日志 -- archive Redo log files

redo日志文件中,将按照SCN(system change number)先后顺序,以重做条目的形式记录数据库的操作。 归档日志文件可以看成是redo日志文件的备份累积,在数据库开启归档模式下才会产生

对于在线重做日志,Oracle 11g, 12c 默认对于每个数据库实例, 建立3个在线日志组 每组一个日志文件文件名称为REDO01.LOG,REDO02.LOG和REDO03.LOG

REDO写入过程 从上到下写,第一个写完后就写第二个,第二个写完后就写第三个,第三个写满后就写第一个

スクリーンショット 2020-04-22 12 29 34

REDO-- 日志组 每组内的日志文件的内容完全相同, 作用是冗余,且保存在不同的位置,用于磁盘日志镜像,以做多次备份提高安全性。

スクリーンショット 2020-04-22 12 30 52

默认情况这3组通常只有一组处于活动状态,不断地同步写入已操作的脚本,当日志文件写满时(达到指定的空间配额), 如果当前数据库处于归档模式,则将在线日志归档到硬盘,成为归档日志 如果当前数据库处于非归档模式,则不进行归档操作,而当前在线日志的内容会被下一次重新写入覆盖而无法保存。

因此,通常数据库在运行时,是处于归档模式下的,以保存数据更新的日志。当前归档日志组写满后,Oracle会切换到下一日志组,继续写入,就这样循环切换; 当处于归档模式下,切换至原已写满的日志组,若该日志组归档完毕则覆盖写入,若没有则只能使用日志缓冲区,等待归档完毕之后才能覆盖写入。当然,处于非归档模式下是直接覆盖写入的。

简单的说

LGWR写第一个组,第一个组写完后,就会写第二个组,然后ARCH会将第一个组归档成一个归档文件

スクリーンショット 2020-04-22 12 32 32

Oracle提供了2个视图用于维护在线重做日志:V$LOG 和 V$LOGFILE,我们可以通过这两个视图查看和修改在线日志。当然,还可以通过ALTER DATABASE ADD 、delete等命令增加/修改/删除在线日志或日志组.

常见的日志文件操作

查询系统使用的是哪一组日志文件

select * from v$log;

查询正在使用的组所对应的日志文件

select * from v$logfile;

查询日志的归档模式

select dbid,name,created,log_mode from v$database;

查询归档日志的信息

select recid,stamp,thread#,sequence#,name from v$archived_log;

参数文件

主要用来记录数据库的配置文件,在数据库启动时,Oracle读取参数文件,并根据参数文件中的参数设置来配置数据库。如内存池的分配,允许打开的进程数和会话数等

两类参数文件

Oracle 启动读取参数文件的顺序,如果个文件都不存在,则Oracle会报错

spfile<sid>.ora --> spfile.ora -->init<sid>.ora

总结

スクリーンショット 2020-04-20 9 47 24

物理块是操作系统分配的基本的存储单位,逻辑结构中的数据块由若干个物理块组成

スクリーンショット 2020-04-20 9 55 05

Oracle 逻辑结构

スクリーンショット 2020-04-20 10 52 05

oracle的逻辑结构包括 表空间(tablespace),段(segment), 区(extent), 数据块(data block) oracle数据库在逻辑上是由多个表空间组成的表空间中存储的对象叫段,比如数据段,索引段,和回退段。段由区组成区是磁盘分配的最小单位段的增大是通过增加区的个数来实现的。每个区的大小是数据块大小的整数倍,区的大小可以不相同;数据块是数据库中最小的I/O单位同时也是内存数据缓冲区的单位,及数据文件存储空间单位块的大小由参数DB_BLOCK_SIZE设置,其值应设置为操作系统块大小的整数倍

表空间是Oracle数据库最大的逻辑结构,一个Oracle数据库在逻辑上由多个表空间组成一个表空间只隶属于一个数据库 一个表空间可以有多数据文件,但是一个数据文件只能属于一个表空间 一个表空间就是一片磁盘区域,他由一个或者多个磁盘文件组成,一个表空间可以容纳许多表、索引或者簇等。每个表空间有一个预制的磁盘区域称为初始区间(initial extent)用完这个区间后再用下一个,直到用完表空间,这时候需要对表空间进行扩展,增加数据文件或者扩大已经存在的数据文件

Oracle数据库的默认表空间

スクリーンショット 2020-04-20 12 43 02

可以建立用户时指定用户的默认表空间

SQL> create user g1 identified by g1 default tablespace users1;

查看用户的默认表空间

select username,default_tablespace from dba_users where username='ISEADMIN'

创建表空间

CREATE TABLESPACE 表空间名
DATAFILE '数据文件路径' SIZE 大小
[AUTOEXTEND ON] [NEXT 大小]
[MAXSIZE 大小];

SIZE 为初始表空间大小,单位为K或者M AUTOEXTEND 是否自动扩展,值为ON或OFF NEXT 为文件满了后扩展大小 MAXSIZE 为文件最大大小,值为数值或UNLIMITED(表示不限大小)

查询表空间

SELECT file_name, tablespace_name, bytes, autoextensible
FROM dba_data_files
WHERE tablespace_name = 'ts_test';

删除表空间

--仅删除表空间
DROP TABLESPACE 表空间名;
--删除表空间及数据文件
DROP TABLESPACE 表空间名 INCLUDING CONTENTS AND DATAFILES;

创建临时表空间

Oracle临时表空间主要是存储数据库的排序操作、临时表、中间排序结果等临时对象。例如,我们进行大数量级的排序操作时,当数据库内存不够时,就会写入临时表空间,当操作完成后,临时表空间就会自动清空释放。Oracle经常使用到临时表空间的操作有:create index(创建索引)、group by(分组查询)、order by(排序时)、集合运算时(union、minus、intersect)、多表连接查询时,当数据库内存不足时,会用到临时表空间 Oracle数据库在安装完后就会创建一个默认的临时表空间temp。 Oracle创建临时表空间的语法结构和创建持久化表空间一样,只是多了关键字temporary进行创建临时表空间。

create temporary tablespace kc_temp
tempfile 'C:\app\Administrator\oradata\orcl\kc_temp.dbf' 
size 50m  
autoextend on  
next 50m maxsize 20480m  
extent management local;  

用户和表空间

create user dev identified by "dev123"
default tablespace dev_db --默认表空间
temporary tablespace test_temp --临时表空间
profile default;

表空间不足对策

  1. 修改表空间为自动增长

    ALTER DATABASE 
    DATAFILE 'D:\oradata\orcl\USERS01.DBF' AUTOEXTEND 
    ON NEXT 500M MAXSIZE UNLIMITED
  2. 增加数据库文件 当一个DBF文件,达到了最大的限制(比如32G)时候,自动扩容也不行 就需要增加数据库文件了

    ALTER TABLESPACE USERS ADD DATAFILE 'D:\oradata\orcl\USERS02.DBF' SIZE 1G AUTOEXTEND ON NEXT 1G MAXSIZE 32g;

表空间数据文件容量与DB_BLOCK_SIZE的设置有关 4k最大表空间为:16384M 8K最大表空间为:32768M 16k最大表空间为:65536M 32K最大表空间为:131072M 64k最大表空间为:262144M 而Oracle默认分配的为8K,也就是对应于32768M左右的空间大小,如果想继续增大表空间的话,需要通过alter tablespace name add datafile ‘path/file_name’ size 1024M;添加数据文件的方式就可以了。

总结

スクリーンショット 2020-04-20 10 54 05

物理存储结构和逻辑存储结构的关系

スクリーンショット 2020-04-20 10 53 27

Oracle 内存结构

スクリーンショット 2020-04-20 20 42 52

系统全局区 (System Global Area, SGA)

SGA是一组共享内存结构被所有的服务和后台进程所共享。当数据库实例启动时,系统全局区内存被自动分配。当数据库实例关闭时,SGA内存被回收。 SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素

查询SGA区的情况

SQL> select * from v$sga;
NAME              VALUE
----------------------------
Fixed Size               2217832
Variable Size          1795164312
Database Buffers   1476395008
Redo Buffers           16568320

Fixed Size 表示固定区域,存储SGA各个组件的信息。不能修改大小 Variable Size 表示可变区域,比如共享池、java池、大型池等 Database Buffers 表示数据库高速缓冲区 Redo Buffers 表示日志缓冲区

1. 固定SGA Fixed SGA

固定SGA:顾名思义,是一段不变的内存区,指向SGA中其他部分,Oracle通过它找到SGA中的其他区,可以简单理解为用于管理的一段内存区

2. 数据高速缓冲区

数据缓冲区用来存放从数据文件读取到的数据数据缓冲区中的数据共享存在,数据一次性读到缓冲区,只要不被替换出,下次可以继续在缓冲区中读取。 由初始化参数DB_CACHE_SIZE决定

查询时,Oracle会先把从磁盘读取的数据放入内存供所有用户共享,以后再查询相关数据时不用再次读取磁盘。插入和更新时,Oracle会先在该区中缓存数据,之后批量写到硬盘中。通过块缓冲区,Oracle可以通过内存缓存提高磁盘的I/O性能

数据高速缓存块由许多大小相等的缓存块组成,这些缓存块的大小和OS块大小相同。

这些缓存块分为3大类

  1. 脏缓存块( Dirty buffers ) 脏缓存块中保存的时被修改过的缓存块。即当一条SQL语句对某个缓存块中的数据进行修改后,该缓存块就被标记为脏缓存块。最后该脏缓存块被进程写入到硬盘的数据文件中,永久保留起来。
  2. 命中缓存块( Pinned buffers ) 命中缓存块中保存的是最近正在被访问的缓存块。它始终被保留中数据高速缓存中,不会被写入数据文件。
  3. 空闲缓存块(Free buffers) 该缓存块中没有数据,等待被写入数据。oracle从数据文件中读取数据后,寻找空闲缓存块,以便写入其中

Oracle 通过 2 个列表(DIRTY、LRU)来管理缓存块

  1. DIRTY 列表中保存已经被修改但还没有被写入到数据文件中的脏缓存块。
  2. LRU列表中保存所有的缓存块 还没有被移动到DIRTY列表中的脏缓存块、空闲缓存块、命中缓存块。 当某个缓存块被访问后,该缓存块就被移动到LRU列表的头部,其他缓存块就向LRU列表的尾部移动。放在最尾部的缓存块就最先被移出LRU列表。

数据高速缓存的工作原理过程是

  1. ORACLE在将数据文件中的数据块复制到数据高速缓存中之前,先在数据高速缓存中找空闲缓存块,以便容纳该数据块。Oracle 将从LRU列表的尾部开始搜索,直到找到所需的空闲缓存块为止。
  2. 如果先搜索到的是脏缓存块,将该脏缓存块移动到DIRTY列表中,然后继续搜索。如果搜索到的是空闲缓存块,则将数据块写入,然后将该缓存块移动到DIRTY列表的头部。
  3. 如果能够搜索到足够的空闲缓存块,就将所有的数据块写入到对应的空闲缓存块中。则搜索写入过程结束。
  4. 如果没有搜索到足够的空闲缓存块,则ORACLE就先停止搜索,而是激活DBWn进程,开始将DIRTY列表中的脏缓存块写入到数据文件中。
  5. 已经被写入到数据文件中的脏缓存块将变成空闲缓存块,并被放入到LRU列表中。执行完成这个工作后,再重新开始搜索,直到找到足够的空闲缓存块为止。

这里可以看出,如果你的高速缓冲区很小的,不停地写写,造成很大I/O开销

高速缓冲区可以配置1、2或3个缓冲池,默认只有一个

  1. 默认池(Default pool) 所有数据默认都在这里缓存,对应参数DB_CACHE_SIZE及DB_nK_CACHE_SIZE

  2. 保持池(Keep pool) 缓存需要多次重用的数据,长期保存内存中, 对应参数buffer_pool_keep , 默认值为0。

  3. 回收池(Recycle pool) 用来缓存很少重用的数据,用完就释放,对应参数buffer_pool_recycle , 默认值为0。

数据加载到缓冲区时,存放在那个缓存池由对象的存储属性决定,在创建对象时,可以指定storage参数将会把数据加载到那个缓存池

Create table test(a number) storage(buffer_pool_keep)

不指定默认为在默认池

3. 重做日志缓冲区

对对象的修改inset update create等等都会生成重做记录,重做日志缓冲区就是用来临时保存这些重做记录的区域,对应初始化参数log_buffer

重做日志缓冲区满足一定的条件就会触发lgwr进程将其写到联机重做日志redo log

  1. 每3秒一次
  2. 无论何时有人commit
  3. 缓存达到1MB或1/3满时

查看重做日志缓冲大小

select * from v$parameter where name='log_buffer'

log_buffer一般设定为5M就可以了

4. 共享池

用于存放SQL语句、PL/SQL代码、数据字典、资源锁和其他控制信息。它由初始化参数SHARED_POOL_SIZE控制其大小。它包含以下几个缓冲区

数据字典

Oracle通过数据字典来管理和展现数据库信息,数据字典通常储存数据库的元数据,是数据库的“数据库”。通常说的数据字典由4部分组成:内部RDBMS(X$)表数据字典表(静态)数据字典视图动态性能视图(V$)。(两表两视图)

这些数据字典表对于数据库的稳定运行生死攸关,所以通常oracle不允许直接对数据字典进行操作当用户执行DDL和DML操作时,在后台oracle将这些操作解析为对于数据字典的自动执行

例如:当创建一张数据表时,oracle将会在后台执行一系列的内部操作,比如像OBJ$表中插入数据、向tab$表中记录数据、向col$表中记录字段信息、向con$记录约束信息、向seg$中记录数据段信息。 oracle通过将DDL解析为dml操作,并将这些操作记录在数据字典表中 通过将这些信息反向解析,可以得到原始的创建语句。 Oracle 9i 开始,一个新的工具包 DBMS_METADATA 就可以完成该功能

スクリーンショット 2020-04-21 8 11 51
  1. USER_:用户所拥有的相关对象信息
  2. ALL_:用于有权限访问的所有对象的信息
  3. DBA_:数据库所有相关对象的信息,用于需要有 select any table 的权限才能访问
    select table_name,tablespace_namefrom user_tables;
    TABLE_NAME                                                  TABLESPACE_NAME
    ------------------------------------------------------------ -----
    DEPT                                                       USERS
    EMP                                                         USERS
    ISEADMIN                                               USERS

    OBJ是对于USER_OBJECTS建立的同义词;其创建语法如下

    CREATE PUBLICSYNONYM OBJ FIR SYS.USER_OBJECTS;

    使用

    SQL>select object_name, object_type from obj;
    OBJECT_NAME                   OBJECT_TYPE
    ------------------------------ -------------------
    PK_DEPT                       INDEX
    DEPT                             TABLE
    EMP                               TABLE
    PK_EMP                         INDEX
    BONUS                          TABLE
    SALGRADE                    TABLE

动态性能视图(V$)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。 数据库启动时,oracle动态创建X$表,在此基础之上,oracle创建了GV$和V$视图 从oracle 8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在。 GV$视图的产生是为了满足OPS/RAC环境的需要

用单实例进行测试如下(如果是rac环境的话返回的是多个实例名称)

SQL>select inst_id,instance_name,statusfrom gv$instance;
INST_ID INSTANCE_NAME                    STATUS
---------- -------------------------------- ------------------------
1                 isdb                           OPEN

而V$视图只会返回本实例上的实例名

SQL>select instance_number,instance_name,statusfrom v$instance;
INSTANCE_NUMBER INSTANCE_NAME                   STATUS
--------------- -------------------------------- ------------------------
1                    isdb                           OPEN

查询表空间

select * from v$tablespace;

查询当前会话

select * from v$session;

查询数据库信息

SQL> select name, created, log_mode from v$database;
NAME      CREATED        LOG_MODE
--------- -------------- ------------
TEST      13-9月 -09     ARCHIVELOG

查询内存结构的摘要信息

SQL> select * from  v$sga;
NAME                            VALUE
-------------------- ----------------
Fixed Size                  1,248,576
Variable Size             100,664,000
Database Buffers     180,355,072
Redo Buffers             7,139,328

查询内存分配的细节

SQL> select * from v$sgastat;
POOL         NAME                            BYTES
------------ -------------------------- ----------
             fixed_sga                     1248576
             buffer_cache                180355072
             log_buffer                    7139328
shared pool  dpslut_kfdsg                      256
shared pool  hot latch diagnostics              80
shared pool  ENQUEUE STATS                    8360
shared pool  transaction                    264528
shared pool  KCB buffer wait statistic        3352
shared pool  invalid low rba queue             320
shared pool  KQF optimizer stats table        2396

查询V$PARAMETER视图,将得到init.ora参数的当前值

SQL>select name, value, isdefault, isses_modifiable,issys_modifiable from v$parameter order by name;
NAME            VALUE                               ISDEFAULT ISSES ISSYS_MOD
--------------- ----------------------------------- --------- ----- ---------
active_instance                                     TRUE      FALSE FALSE
asm_diskgroups                                      TRUE      FALSE IMMEDIATE
audit_file_dest D:/ORACLE/ADMIN/TEST/ADUMP          FALSE     FALSE DEFERRED
audit_sys_opera FALSE                               TRUE      FALSE FALSE
background_dump D:/ORACLE/ADMIN/TEST/BDUMP          FALSE     FALSE IMMEDIATE
backup_tape_io_ FALSE                               TRUE      FALSE DEFERRED

5. 大池

大池由初始化参数LARGE_POOL_SIZE确定大小。 可以使用ALTER SYSTEM语句来动态改变大池的大小,是可选项。 DBA可以根据实际业务需要来决定是否在SGA区中创建大池。

如果没有创建大池,则需要大量内存空间的操作将占用共享池的内存, 将对SHARED POOL造成一定的性能影响而LARGE POOL是起着这种功能隔离作用的一块区域

ORACLE 需要大量内存的操作有

  1. 数据库备份和恢复,如RMAN某些情况下用于磁盘IO缓冲区
  2. 具有大量排序操作的SQL语句
  3. 并行化的数据库操作,存放进程间的消息缓冲区
  4. 共享服务器模式下UGA在大池中分配(如果设置了大池)

用户全局区 User Global Area, UGA 专用服务器模式下,进程和会话是一对一的关系,UGA被包含在PGA中,在联机服务器模式下,进程和会话是一对多的关系,所以UGA就不再属于 PGA了,而会在大型池(Large Pool)中分配。但如果从大型池中分配失败,如大型池太小,或是根本没有设置大型池,则从共享池(Shared Pool)中分配。

6. Java池

可选,用于支持在数据库中运行java代码,一般由JAVA_POOL_SIZE控制 为满足在ORACLE中内嵌JAVA存储过程或其他JAVA程序(例如CORBA中间件)运行时而需要的内存, 如果不用JAVA等程序,就无须设置,使其值为0就可以了

如何在Oracle中使用Java存储过程 Java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大 https://blog.csdn.net/xiaodoudou123456/article/details/51695014

7. 流池

加强对流的支持,一般由STREAM_POOL_SIZE控制。 流池(或者如果没有配置流池,则是共享池中至多10%的空间)会用于缓存流进程在数据库间移动/复制数据时使用的队列消息

SGA 性能优化

Oracle SGA 自动管理特性 sga_target

sga_max_size决定了为Oracle分配内存的最大值 sga_target 决定了基于sga_max_size的大小来自动分配内存

sga_max_size = (total_mem 80%)80% (官方建议) sga_target <= sga_max_size

sga_target会为下列组件自动分配内存

  1. Buffer cache (DB_CACHE_SIZE)
  2. Shared pool (SHARED_POOL_SIZE)
  3. Large pool (LARGE_POOL_SIZE)
  4. Java pool (JAVA_POOL_SIZE)
  5. Streams pool (STREAMS_POOL_SIZE)

下列sga组件不受sga_target的管理和影响,即需要单独为以下几个组件分配大小

  1. Log buffer(日志缓冲)
  2. Other buffer caches, such as KEEP, RECYCLE, and other block sizes(保留池,回收池,nK 池)
  3. Fixed SGA and other internal allocations

非零值的sga_target时,几个参数之间的大小可以动态分配,且根据需要来动态调整各个部分的大小。 当设置sga_target为零值时(缺省值),SGA相关参数内存的分配由参数控制,且无法根据系统状况实施动态调整大小

Oracle 10g之后建议将SGA的内存管理设置为由sga_target动态管理

Oracle 进程体系

スクリーンショット 2020-04-21 10 10 53

Oracle的进程体系分为,用户进程,服务器进程,后台进程

进程全局区 PGA

每个服务进程私有的内存区域,一个PGA是一块独占内存区域,Oracle进程以专有的方式用它来存放数据和控制信息。 当Oracle进程启动时,PGA也就由Oracle数据库创建了。当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容。当这个用户会话终止时,系统会自动释放这个PGA区所占用的内存。这个PGA区对于数据库的性能有比较大的影响,特别是对于排序操作的性能。所以,在必要的时候合理管理PGA区,能够在很大程度上提高数据库的性能。

PGA主要包含排序区、会话区、堆栈区和游标区四个部分的内容,他们各司其职,完成用户进程与数据库之间的会话。通常情况下,系统管理员主要关注的是排序区,在必要时需要手工调整这个排序区的大小。另外需要主要的是,游标区是一个动态的区域,在游标打开时创建,关闭时释放。故在数据库开发时,不要频繁的打开和关闭游标可以提高游标操作的效率,改善数据库的性能。其他分区的内容管理员只需要了解其用途,日常的维护交给数据库系统来完成即可。

  1. 为排序设置合理的排序区大小 当用户需要对某些数据进行排序时,数据库是如何处理的呢?首先,数据库系统会将需要排序的数据保存到PGA程 序缓存区中的一个排序区内。然后再在这个排序区内对这些数据进行排序。如需要排序的数据有2M,那么排序区内必须至少要有2M的空间来容纳这些数据。然后 排序过程中又需要有2M的空间来保存排序后的数据。 但是如果PGA区 中的排序区容量不够,不能够容纳排序后的数据,那会如何呢?此时,系统会从硬盘中获取一个空间,用来保存这需要排序的数据。此时排序的效率就会降低许多。 受SORT_AREA_SIZE参数控制

  2. 会话区保存着用户的权限等重要信息 在程序缓存区内还包含着一个会话区。虽然绝大部分情况下,管理员不要维护这个会话区,可以让数据库系统进行维护

  3. 堆栈区保存变量信息 有时候为了提高SQL语句的重用性,会在语句中使用绑定变量。简单的说,就是SQL语句可以接受用户传入的变量。从而用户只需要输入不同的变量值,就可以满足不同的查询需求。

通常情况下,这个堆栈区跟上面讲到的会话区一样,都可以让数据库系统进行自我维护,而管理员不用参与到其中。这些分区的大小,也是系统根据实际情况来进行自动分配的。当这个用户会话结束时,系统会自动释放这些区所占用的空间。

  1. 游标区 无论是SQLServer数据库还是Oracle数据库中,有时候都需要用到游标技术。当运行使用游标的语句时,Oracle数据库系统会在程序缓存区中间为其分配一块区域。这块区域就叫做游标区。

自动PGA管理

设置PGA_AGGREGATE_TARGET为非0,则启用PGA自动管理。 并忽略所有*_area_size的设置。如sort_area_size,hash_area_size等

默认为启用PGA的自动管理

一般设置PGA_AGGREGATE_TARGET为SGA的20%

SGA内存 + PGA内存 + OS内存 < 总物理RAM

SGA & PGA

后台进程

oracle后台进程伴随实例的启动而启动,他们主要是维护数据库的稳定,相当于一个企业中的管理者及内部服务人员。他们并不会直接给用户提供服务

  1. PMON: 进程监控器 进程监控器(process monitor)负责在连接出现异常终止后进行清理工作,还负责监控其他的Oracle后台进程,并在必要的时候(而且可能)时重启这些后台进程。

  2. LREG: 监听注册进程 从Database 12C开始,负责将数据库实例和服务注册到监听器中。当一个数据库实例启动时,LREG进程会去查看监听端口(一般为1521)是否已经有监听器在上面运行了。

  3. SMON: 系统监听器 SMON所做的工作包括以下几种:

    • 清理临时表空间;
    • 合并空闲表空间;
    • 针对原来不可用的文件恢复活动的事务;
    • 执行RAC中失败节点的实例恢复;
    • 清理OBJ$
    • 管理撤销段
    • 回滚段离线
  4. RECO: 分布式数据库恢复 RECO的核心任务:由于两阶段提交(2PC)期间的奔溃或连接丢失等原因,有些事务可能还保持在准备状态。这个进程就是要恢复这些事务。

  5. CKPT:检查点进程 实施检查点是DBWn进程的工作。CKPT仅仅是协助实际运行检查点的进程,来更新数据文件的文件头。

  6. DBWn: 数据库块写入器 数据库块写入器是负责将脏块写入磁盘的后台进程。DBWn的性能至关重要,如果它写出块的速度不够快,不能很快地释放缓冲区,就会看到Free Buffer Waits和Write Complete Waits这两个等待时间的数量和等待时间开始增加。 在Oracle Database 11g中,我们最多可以配置36个DBWn进程;而到了Database 12C,我们可以配置多达100个DBWn进程。 在最好的情况下,DBWn使用异步I/O将块写至磁盘。块写入器进程会将块分散地写到磁盘的各个位置,也就是说DBWn会执行大量的离散写。相比于LGWR的顺序写,离散写的速度慢很多,这也是在线重做日志存在的必要性。

  7. LGWR: 日志写入器 LGWR进程负责将SGA中重做日志缓冲区中的内容刷新输出到磁盘。 LGWR通过顺序写,只把有变化的字节写出到磁盘。触发LGWR进行写操作的条件有以下三个:

    • 每3秒一次
    • 无论何时有人commit
    • 缓存达到1MB或1/3满时
  8. ARCn: 归档进程 ARCn进程的任务:当LGWR将一个在线重做日志文件填满时,将其复制到另一个位置。此后这些归档的重做日志文件可以用来完成介质恢复。 归档重做日志文件出现在磁盘故障时用于“修正”数据文件。

  9. DIAG: 诊断进程 利用ADR(高级诊断库,Advanced Diagnostic Repository),它会负责监视实例的整体状况,而且会捕获处理实例失败时所需的信息。这既适用于单个实例配置,也适用于多实例的RAC配置。

Oracle Net

スクリーンショット 2020-04-21 12 49 24

Oracle通过Oracle Net协议实现客户端与服务器端的连接以及数据传递。 Oracle Net是同时驻留在Oracle数据库服务器端和客户端上的一个软件层,它封装了TCP/IP协议,负责建立与维护客户端应用程序到数据库服务器的连接。

客户端发出的请求首先通过Oracle Net协议转换,转换成可以通过网络传输的信息,通过TCP/IP网络将请求传输到数据库服务器端;服务器端接受到客户请求后要通过Oracle Net协议转换,将请求转换成数据库可以解释执行的本地指令,并在服务器端执行,并将结果通过TCP/IP协议和Oracle Net协议传输给客户端显示

Oracle数据库服务器通过一个名为“Oracle Net监听器”的组件接收来自客户端的连接请求。 监听器是位于服务器端的一个后台进程,发送给数据库的客户端连接请求,首先被服务器端的监听器所侦听,并将请求所转交给对应的数据库实例,从而建立起客户端与服务器的连接。连接建立后,客户端与服务器端就可以直接进行通讯,不再需要监听器参与

TNS

TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,必须配置TNS。 当然在少数情况下,不用配置TNS也可以连接Oracle数据库,比如通过JDBC。 JDBC连接ORACLE的三种方式

格式一:jdbc:oracle:thin:@//<host>:<port>/<service_name>
格式二:jdbc:oracle:thin:@<host>:<port>:<SID> 
格式三:jdbc:oracle:thin:@<TNSName> 

如果通过TNS连接Oracle,那么客户端必须安装Oracle client程序 TNS的配置文件包括服务器端和客户端两部分。 Oracle所有的TNS配置文件的默认路径 %ORACLE_HOME%\network\admin

所以如果不是使用的远程的连接,listener进程就不是必需的 同样的如果关闭listener进程并不会影响已经存在的数据库连接

TNS配置

首先在Oracle服务器端安装完成之后,应该先着手配置LISTENERLISTENER是进行Oracle通讯的首要组件紧接着在客户端安装Oracle client,同时配置tnsnames.ora文件

  1. listener.ora 首先监听器包括两个部分:Oracle要监听的地址、端口、通讯协议 Oracle要监听的数据库实例,非RAC环境下,LISTENER只能监听本服务器的地址和实例 RAC环境下,LISTENER还可以监听远程服务器。每个数据库最少要配置一个监听器。

    スクリーンショット 2020-04-19 18 33 35
  2. tnsnames.ora 这个文件放在客户端机器上,记录客户端访问数据库的本地配置,其实就是定义网络服务

    スクリーンショット 2020-04-19 19 19 34

    tnsnames.ora也包括两部分,ADDRESS_LIST 部分包含了Oracle数据库服务器的监听地址信息,也就是要告诉TNS数据库可通过这个地址和CLIENT进行通讯;CONNECT_DATA 定义了CLIENT要连接的数据库,以及数据库的连接方式,(专用或共享)。

  3. sqlnet.ora sqlnet.ora 通过这个文件来决定怎样找一个连接中出现的连接字符串

    
    SQLNET.AUTHENTICATION_SERVICES= (NTS)
    NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES,EZCONNECT)

SQLNET.AUTHENTICATION_SERVICES= (NTS) 表明用户连接数据库用哪种验证方式 主要两种:

NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES,EZCONECT) 表示将首先利用tnsnames进行解析;如果tnsnames解析不到,将使用hostname解析;如果 hostname解析不到,将采用onames进行解析;最后使用EZCONNECT解析


例如我们客户端输入

sqlplus sys/oracle@orcl

假如我的sqlnet.ora是下面这个样子

SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)

那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的 ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例

### 几种连接用到的命令形式
1. sqlplus / as sysdba 这是典型的**操作系统认证**,**不需要listener进程**

2. sqlplus sys/oracle 这种连接方式**只能连接本机数据库**,同样**不需要listener进程**

3.sqlplus sys/oracle@orcl 这种方式需要listener进程处于可用状态。

### 诊断并解决客户端连接问题
1. 证实客户能够联系服务器
ping命令

2. 确定客户到大服务器采取的网络路径
tracert命令

使用**tnsping**, 它会尝试联系一个ORACLE监听器。
它证实客户能联系监听器,但不证实能实际连接到ORACLE服务器。该工具还能显示联系监听器所花费的时间。在后面跟一个数字可以告诉它尝试连接的次数。
如:tnsping orcl 3

3. 证实本地命名配置文件,网络配置文件
检查客户端 tnsnames.ora 和 sqlnet.ora 

4. 检查网络文件位置
如果网络文件不在TNS_ADMIN环境变量指定的目录下,则ORACLE会找不到这些文件

6. 检查NAMES.DIRECTORY_PATH参数
检查SQLNET.ORA文件中该参数设置值正确,并且名称解释的优先顺序正确.

7. 检查NAMES.DEFAULT_DOMAIN参数
如果该参数被设置,如"vicp.net",当输入sqlplus sys/sys@prod时,命名会被附加上默认域名,变成"sqlplus sys/sys@prod.vicp.net"。 如果正确服务名称只是prod,那当然不可能正确解释了。

8. 检查任何常用客户端错误代码

ORA-12154 -- 有可能TNSNAMES.ORA放在不正确的位置 ORA-12198和ORA-12203 -- 指出tnsnames.ora是列出的服务无法联系到。有可能指定的服务名称错误。 ORA-12533 -- 指出配置ADDRESS不正确 ORA-12541 -- 指出指定端口未找到相应监听器。