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)';
用户全局区 User Global Area, UGA
专用服务器模式下,进程和会话是一对一的关系,UGA被包含在PGA中,在联机服务器模式下,进程和会话是一对多的关系,所以UGA就不再属于 PGA了,而会在大型池(Large Pool)中分配。但如果从大型池中分配失败,如大型池太小,或是根本没有设置大型池,则从共享池(Shared Pool)中分配。
Oracle
Oracle数据库的版本
Oracle 8i Oracle 9i 表明当时是internet概念盛行的年代, oracle为了迎合当时环境, 而做出的internet方面的改进
Oracle 10g Oracle11g g是grid网格运算,10g和11g就是oracle为了迎合分布式计算而做出的变化
Oracle 12c c是cloud 表明云计算的意思
Oracle 18c 19c 20c 新的命名规则以年份命名,之前已经在2018年发布了18c-12.2.0.2,2019年发布了19c-12.2.0.3。2020年2月发布了20c,可以看出Oracle近3年一直沿用年份命名版本的规则没有发生变化
Oracle 体系结构
Oracle 服务器
由Oracle实例和Oracle数据库组成的
Oracle实例
用户可以通过连接到的实例访问数据库,是一种访问数据库的基本方式 总是打开一个并且,只能打开一个数据库 oracle数据库启动后首先在内存中划分一片空间,并启动一些进程,而内存和进程统称oracle数据库实例,数据库关闭后,实例就被关闭。
一般情况下,Oracle服务器都是一个数据库对应一个实例。
一个数据库也可以对应多个实例,如两个,四个等,一般没有单数的。用户可以通过连接到的实例访问数据库,可以实现负载均衡,提高并发等的效果,这种结构叫做oracle的RAC技术。
Oracle实例 = 内存结构 + 后台进程结构
一个数据库可以有多个实例,但一个实例只能在一个数据库里
在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件。
用Oracle官方描述:实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合。 其实就是用来访问和使用数据库的一块进程,它只存在于内存中。就像Java中new出来的实例对象一样。 我们访问Oracle都是访问一个实例,这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。
实例名指的是用于响应某个数据库操作的数据库管理系统的名称。同时也叫SID。 实例名是由参数instance_name决定的 查询当前数据库实例名
数据库实例名(instance_name)用于对外部连接。 在操作系统中要取得与数据库的联系,必须使用数据库实例名。 比如我们作开发,要连接数据库,就得连接数据库实例名:
连接和会话
连接 connection 用户进程和实例之间的通信 连接是从客户端到Oracle 实例的一条物理路径。
会话 session 用户通过用户进程与实例建立的特定连接 会话是实例中存在的一个逻辑实体。 提到
数据库连接
时,大多数人首先想到的就是会话
。 在服务器中的会话上执行SQL、提交事务和运行存储过程Oracle 11g R2 sessions=(1.5 * processes) + 22
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;
sqlplus 用户名/密码@192.168.19.189:1521/数据库名
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)';
SQL> select * from v$datafile;
alter database backup controlfile to 'C:\controlfile01.ctl';
configure controlfile autobackup on;
alter system set control_files='PATH1,PATH2,PATH3' scope=spfile;
alter database backup controlfile to trace
startup nomount; restore controlfile from autobackup;
3.2 跟踪日志
跟踪文件由各个后台进程生成,一般在遇到错误时生成。这些文件与警报日志放在一起 跟踪文件包括后台进程跟踪文件和用户进程跟踪文件
后台进程跟踪文件用于记录后台进程的警告或错误信息。 后台进程跟踪文件的命名格式为.trc
用户进程跟踪文件用于记载与用户进程相关的信息,主要用于跟踪SQL语句。通过用户进程跟踪文件,可以判断SQL语句的执行性能。 用户进程跟踪文件的命名格式为ora.trc
3.3 重做日志
记录着每一个对数据库的更改,当发生数据库记忆丢失的情况时(如数据文件意外删除,数据表意外删除,数据文件块损坏等),oracle只要规规矩矩地按照日志文件记载一步一步把曾经执行过的操作再重做一遍,数据库还是可以回到应用的状态。 重做日志的简单原理,在数据更新操作commit前,将更改的SQL脚本写入重做日志。主要用于数据库的增量备份和增量恢复。重做日志直接对应于硬盘的重做日志文件(有在线和归档二种),重做日志文件以组(Group)的形式组织,一个重做日志组包含一个或者多个日志文件
重做日志分为
redo日志文件中,将按照SCN(system change number)先后顺序,以重做条目的形式记录数据库的操作。 归档日志文件可以看成是redo日志文件的备份累积,在数据库开启归档模式下才会产生
对于在线重做日志,Oracle 11g, 12c 默认对于每个数据库实例, 建立3个在线日志组 每组一个日志文件,文件名称为REDO01.LOG,REDO02.LOG和REDO03.LOG
REDO写入过程 从上到下写,第一个写完后就写第二个,第二个写完后就写第三个,第三个写满后就写第一个
REDO-- 日志组 每组内的日志文件的内容完全相同, 作用是冗余,且保存在不同的位置,用于磁盘日志镜像,以做多次备份提高安全性。
默认情况这3组通常只有一组处于活动状态,不断地同步写入已操作的脚本,当日志文件写满时(达到指定的空间配额), 如果当前数据库处于归档模式,则将在线日志归档到硬盘,成为归档日志 如果当前数据库处于非归档模式,则不进行归档操作,而当前在线日志的内容会被下一次重新写入覆盖而无法保存。
因此,通常数据库在运行时,是处于归档模式下的,以保存数据更新的日志。当前归档日志组写满后,Oracle会切换到下一日志组,继续写入,就这样循环切换; 当处于归档模式下,切换至原已写满的日志组,若该日志组归档完毕则覆盖写入,若没有则只能使用日志缓冲区,等待归档完毕之后才能覆盖写入。当然,处于非归档模式下是直接覆盖写入的。
简单的说
LGWR写第一个组,第一个组写完后,就会写第二个组,然后ARCH会将第一个组归档成一个归档文件
Oracle提供了2个视图用于维护在线重做日志:
V$LOG 和 V$LOGFILE
,我们可以通过这两个视图查看和修改在线日志。当然,还可以通过ALTER DATABASE ADD 、delete等命令增加/修改/删除在线日志或日志组.常见的日志文件操作
查询系统使用的是哪一组日志文件
查询正在使用的组所对应的日志文件
查询日志的归档模式
查询归档日志的信息
参数文件
主要用来记录数据库的配置文件,在数据库启动时,Oracle读取参数文件,并根据参数文件中的参数设置来配置数据库。如内存池的分配,允许打开的进程数和会话数等
两类参数文件
Oracle 启动读取参数文件的顺序,如果个文件都不存在,则Oracle会报错
总结
物理块是操作系统分配的基本的存储单位,逻辑结构中的数据块由若干个物理块组成
Oracle 逻辑结构
oracle的逻辑结构包括 表空间(tablespace),段(segment), 区(extent), 数据块(data block) oracle数据库在逻辑上是由多个表空间组成的,表空间中存储的对象叫段,比如数据段,索引段,和回退段。段由区组成,区是磁盘分配的最小单位。段的增大是通过增加区的个数来实现的。每个区的大小是数据块大小的整数倍,区的大小可以不相同;数据块是数据库中最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位。块的大小由参数DB_BLOCK_SIZE设置,其值应设置为操作系统块大小的整数倍
表空间是Oracle数据库最大的逻辑结构,一个Oracle数据库在逻辑上由多个表空间组成,一个表空间只隶属于一个数据库 一个表空间可以有多数据文件,但是一个数据文件只能属于一个表空间 一个表空间就是一片磁盘区域,他由一个或者多个磁盘文件组成,一个表空间可以容纳许多表、索引或者簇等。每个表空间有一个预制的磁盘区域称为初始区间(initial extent)用完这个区间后再用下一个,直到用完表空间,这时候需要对表空间进行扩展,增加数据文件或者扩大已经存在的数据文件
Oracle数据库的默认表空间
SYSTEM的表空间 这个表空间是在创建或安装数据库时自动创建的。主要用于存储系统的数据字典,过程,函数,触发器等
TEMP的表空间 比如SQL排序等操作,其实就是在临时表空间里进行的
Users表空间 Users表空间也就是默认用户表空间 在创建一个用户并没有指定此用户使用表空间时,次用户所有信息都会放入到users表空间中
可以建立用户时指定用户的默认表空间
查看用户的默认表空间
创建表空间
SIZE 为初始表空间大小,单位为K或者M AUTOEXTEND 是否自动扩展,值为ON或OFF NEXT 为文件满了后扩展大小 MAXSIZE 为文件最大大小,值为数值或UNLIMITED(表示不限大小)
查询表空间
删除表空间
创建临时表空间
Oracle临时表空间主要是存储数据库的排序操作、临时表、中间排序结果等临时对象。例如,我们进行大数量级的排序操作时,当数据库内存不够时,就会写入临时表空间,当操作完成后,临时表空间就会自动清空释放。Oracle经常使用到临时表空间的操作有:create index(创建索引)、group by(分组查询)、order by(排序时)、集合运算时(union、minus、intersect)、多表连接查询时,当数据库内存不足时,会用到临时表空间 Oracle数据库在安装完后就会创建一个默认的临时表空间temp。 Oracle创建临时表空间的语法结构和创建持久化表空间一样,只是多了关键字temporary进行创建临时表空间。
用户和表空间
表空间不足对策
修改表空间为自动增长
增加数据库文件 当一个DBF文件,达到了最大的限制(比如32G)时候,自动扩容也不行 就需要增加数据库文件了
段 Segment Oracle中的段可以分成4种类型:数据段、索引段、回滚段、临时段。 数据段用来存储用户的数据 每个表都有一个对应的回滚段,其名称和数据表的名字相同。回滚段用来存储用户数据修改前的值,回退段与事务是一对多的关系,一个事务只能使用一个回退段,而一个回退段可存放一个或多个事务的回退数据。 索引段用来存储系统、用户的索引信息。 临时段用于order by语句的排序以及一些汇总。
区 extent 块是构成Oracle逻辑存储结构中最小的单位,而区是由连续的数据库块构成的,区存储于段中。
块 数据块是oracle中最小的空间分配单位,各种操作的数据就的放在这里,oracle从磁盘读写的也是块。 据块大小由DB_BLOCK_SIZE参数决定,不同的oracle版本DB_BLOCK_SIZE的默认值是不同的。 一旦create database,db_block_size就是不可更改的。因为oracle是以块为单位存储数据的,任何一个存储元素最少占用一个块,如果你改变了 db_block_size,必然导致部分块不能正常使用。
表空间数据文件容量与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;添加数据文件的方式就可以了。
总结
物理存储结构和逻辑存储结构的关系
Oracle 内存结构
系统全局区 (System Global Area, SGA)
SGA是一组共享内存结构, 被所有的服务和后台进程所共享。当数据库实例启动时,系统全局区内存被自动分配。当数据库实例关闭时,SGA内存被回收。 SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
查询SGA区的情况
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大类
Oracle 通过 2 个列表(DIRTY、LRU)来管理缓存块
数据高速缓存的工作原理过程是
这里可以看出,如果你的高速缓冲区很小的,不停地写写,造成很大I/O开销。
高速缓冲区可以配置1、2或3个缓冲池,默认只有一个
默认池(Default pool) 所有数据默认都在这里缓存,对应参数DB_CACHE_SIZE及DB_nK_CACHE_SIZE
保持池(Keep pool) 缓存需要多次重用的数据,长期保存内存中, 对应参数buffer_pool_keep , 默认值为0。
回收池(Recycle pool) 用来缓存很少重用的数据,用完就释放,对应参数buffer_pool_recycle , 默认值为0。
数据加载到缓冲区时,存放在那个缓存池由对象的存储属性决定,在创建对象时,可以指定storage参数将会把数据加载到那个缓存池
不指定默认为在默认池
3. 重做日志缓冲区
对对象的修改inset update create等等都会生成重做记录,重做日志缓冲区就是用来临时保存这些重做记录的区域,对应初始化参数log_buffer
重做日志缓冲区满足一定的条件就会触发lgwr进程将其写到联机重做日志redo log
查看重做日志缓冲大小
log_buffer一般设定为5M就可以了
4. 共享池
用于存放SQL语句、PL/SQL代码、数据字典、资源锁和其他控制信息。它由初始化参数SHARED_POOL_SIZE控制其大小。它包含以下几个缓冲区
数据字典
Oracle通过数据字典来管理和展现数据库信息,数据字典通常储存数据库的元数据,是数据库的“数据库”。通常说的数据字典由4部分组成:内部RDBMS(X$)表、数据字典表、(静态)数据字典视图和动态性能视图(V$)。(两表两视图)
内部RDBMS(X$)表 X$表示Oracle数据库的核心部分,这些表用于跟踪数据库内部信息,维持数据库的正常运行。X$表是加密命名的,而且Oracle不做文档说明。X$表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建, oracle不允许SYSDBA以外的用户直接访问。 研究X$表的好办法是借用oracle的AUTOTRACE功能,当查询一些视图时,可以发现这些X$底层表;
数据字典表 数据字典表用以存储表、索引、约束以及其他数据库结构的信息。 这些对象通常是以‘$’结尾(例如:TAB$、OBJ$、TS$等)
这些数据字典表对于数据库的稳定运行生死攸关,所以通常oracle不允许直接对数据字典进行操作。当用户执行DDL和DML操作时,在后台oracle将这些操作解析为对于数据字典的自动执行。
例如:当创建一张数据表时,oracle将会在后台执行一系列的内部操作,比如像OBJ$表中插入数据、向tab$表中记录数据、向col$表中记录字段信息、向con$记录约束信息、向seg$中记录数据段信息。 oracle通过将DDL解析为dml操作,并将这些操作记录在数据字典表中 通过将这些信息反向解析,可以得到原始的创建语句。 Oracle 9i 开始,一个新的工具包 DBMS_METADATA 就可以完成该功能
OBJ是对于USER_OBJECTS建立的同义词;其创建语法如下
使用
动态性能视图(V$)记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。 数据库启动时,oracle动态创建X$表,在此基础之上,oracle创建了GV$和V$视图 从oracle 8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在。 GV$视图的产生是为了满足OPS/RAC环境的需要
用单实例进行测试如下(如果是rac环境的话返回的是多个实例名称)
而V$视图只会返回本实例上的实例名
查询表空间
查询当前会话
查询数据库信息
查询内存结构的摘要信息
查询内存分配的细节
查询V$PARAMETER视图,将得到init.ora参数的当前值
库缓冲区 库缓存的目的就是保存最近解析过的SQL语句、PL/SQL过程和包。这样一来,Oracle在执行一条SQL语句、一段PL/SQL 过程和包之前,首先在“库缓存”中搜索,如果查到它们已经解析过了,就利用“库缓存”中解析结果和执行计划来执行,而不必重新对它们进行解析,显著提高执行速度和工作效率。
结果高速缓存 此高速缓存用于存储 SQL 查询或 PL/SQL 函数的结果,以加快其将来的执行速度。
5. 大池
大池由初始化参数LARGE_POOL_SIZE确定大小。 可以使用ALTER SYSTEM语句来动态改变大池的大小,是可选项。 DBA可以根据实际业务需要来决定是否在SGA区中创建大池。
如果没有创建大池,则需要大量内存空间的操作将占用共享池的内存, 将对SHARED POOL造成一定的性能影响,而LARGE POOL是起着这种功能隔离作用的一块区域。
ORACLE 需要大量内存的操作有
用户全局区 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会为下列组件自动分配内存
下列sga组件不受sga_target的管理和影响,即需要单独为以下几个组件分配大小
非零值的sga_target时,几个参数之间的大小可以动态分配,且根据需要来动态调整各个部分的大小。 当设置sga_target为零值时(缺省值),SGA相关参数内存的分配由参数控制,且无法根据系统状况实施动态调整大小。
Oracle 10g之后建议将SGA的内存管理设置为由sga_target动态管理
Oracle 进程体系
Oracle的进程体系分为,用户进程,服务器进程,后台进程。
进程全局区 PGA
每个服务进程私有的内存区域,一个PGA是一块独占内存区域,Oracle进程以专有的方式用它来存放数据和控制信息。 当Oracle进程启动时,PGA也就由Oracle数据库创建了。当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容。当这个用户会话终止时,系统会自动释放这个PGA区所占用的内存。这个PGA区对于数据库的性能有比较大的影响,特别是对于排序操作的性能。所以,在必要的时候合理管理PGA区,能够在很大程度上提高数据库的性能。
PGA主要包含排序区、会话区、堆栈区和游标区四个部分的内容,他们各司其职,完成用户进程与数据库之间的会话。通常情况下,系统管理员主要关注的是排序区,在必要时需要手工调整这个排序区的大小。另外需要主要的是,游标区是一个动态的区域,在游标打开时创建,关闭时释放。故在数据库开发时,不要频繁的打开和关闭游标可以提高游标操作的效率,改善数据库的性能。其他分区的内容管理员只需要了解其用途,日常的维护交给数据库系统来完成即可。
为排序设置合理的排序区大小 当用户需要对某些数据进行排序时,数据库是如何处理的呢?首先,数据库系统会将需要排序的数据保存到PGA程 序缓存区中的一个排序区内。然后再在这个排序区内对这些数据进行排序。如需要排序的数据有2M,那么排序区内必须至少要有2M的空间来容纳这些数据。然后 排序过程中又需要有2M的空间来保存排序后的数据。 但是如果PGA区 中的排序区容量不够,不能够容纳排序后的数据,那会如何呢?此时,系统会从硬盘中获取一个空间,用来保存这需要排序的数据。此时排序的效率就会降低许多。 受SORT_AREA_SIZE参数控制
会话区保存着用户的权限等重要信息 在程序缓存区内还包含着一个会话区。虽然绝大部分情况下,管理员不要维护这个会话区,可以让数据库系统进行维护
堆栈区保存变量信息 有时候为了提高SQL语句的重用性,会在语句中使用绑定变量。简单的说,就是SQL语句可以接受用户传入的变量。从而用户只需要输入不同的变量值,就可以满足不同的查询需求。
通常情况下,这个堆栈区跟上面讲到的会话区一样,都可以让数据库系统进行自我维护,而管理员不用参与到其中。这些分区的大小,也是系统根据实际情况来进行自动分配的。当这个用户会话结束时,系统会自动释放这些区所占用的空间。
自动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后台进程伴随实例的启动而启动,他们主要是维护数据库的稳定,相当于一个企业中的管理者及内部服务人员。他们并不会直接给用户提供服务。
PMON: 进程监控器 进程监控器(process monitor)负责在连接出现异常终止后进行清理工作,还负责监控其他的Oracle后台进程,并在必要的时候(而且可能)时重启这些后台进程。
LREG: 监听注册进程 从Database 12C开始,负责将数据库实例和服务注册到监听器中。当一个数据库实例启动时,LREG进程会去查看监听端口(一般为1521)是否已经有监听器在上面运行了。
SMON: 系统监听器 SMON所做的工作包括以下几种:
RECO: 分布式数据库恢复 RECO的核心任务:由于两阶段提交(2PC)期间的奔溃或连接丢失等原因,有些事务可能还保持在准备状态。这个进程就是要恢复这些事务。
CKPT:检查点进程 实施检查点是DBWn进程的工作。CKPT仅仅是协助实际运行检查点的进程,来更新数据文件的文件头。
DBWn: 数据库块写入器 数据库块写入器是负责将脏块写入磁盘的后台进程。DBWn的性能至关重要,如果它写出块的速度不够快,不能很快地释放缓冲区,就会看到Free Buffer Waits和Write Complete Waits这两个等待时间的数量和等待时间开始增加。 在Oracle Database 11g中,我们最多可以配置36个DBWn进程;而到了Database 12C,我们可以配置多达100个DBWn进程。 在最好的情况下,DBWn使用异步I/O将块写至磁盘。块写入器进程会将块分散地写到磁盘的各个位置,也就是说DBWn会执行大量的离散写。相比于LGWR的顺序写,离散写的速度慢很多,这也是在线重做日志存在的必要性。
LGWR: 日志写入器 LGWR进程负责将SGA中重做日志缓冲区中的内容刷新输出到磁盘。 LGWR通过顺序写,只把有变化的字节写出到磁盘。触发LGWR进行写操作的条件有以下三个:
ARCn: 归档进程 ARCn进程的任务:当LGWR将一个在线重做日志文件填满时,将其复制到另一个位置。此后这些归档的重做日志文件可以用来完成介质恢复。 归档重做日志文件出现在磁盘故障时用于“修正”数据文件。
DIAG: 诊断进程 利用ADR(高级诊断库,Advanced Diagnostic Repository),它会负责监视实例的整体状况,而且会捕获处理实例失败时所需的信息。这既适用于单个实例配置,也适用于多实例的RAC配置。
Oracle Net
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的三种方式
如果通过TNS连接Oracle,那么客户端必须安装Oracle client程序 TNS的配置文件包括服务器端和客户端两部分。 Oracle所有的TNS配置文件的默认路径
%ORACLE_HOME%\network\admin
所以如果不是使用的远程的连接,listener进程就不是必需的 同样的如果关闭listener进程并不会影响已经存在的数据库连接
tnsnames.ora 配置客户端到服务器端的连接服务,包括客户端要连接到的服务器和数据库的配置信息 tnsnames.ora在客户端配置
sqlnet.ora 用来管理和约束或限制tns连接的配置,通过在该文件中设置一些参数,可以管理TNS连接。根据参数作用的不同,需要分别在服务器和客户端配置
TNS配置
首先在Oracle服务器端安装完成之后,应该先着手配置LISTENER,LISTENER是进行Oracle通讯的首要组件,紧接着在客户端安装Oracle client,同时配置tnsnames.ora文件。
listener.ora 首先监听器包括两个部分:Oracle要监听的地址、端口、通讯协议 Oracle要监听的数据库实例,非RAC环境下,LISTENER只能监听本服务器的地址和实例 RAC环境下,LISTENER还可以监听远程服务器。每个数据库最少要配置一个监听器。
tnsnames.ora 这个文件放在客户端机器上,记录客户端访问数据库的本地配置,其实就是定义网络服务
tnsnames.ora也包括两部分,ADDRESS_LIST 部分包含了Oracle数据库服务器的监听地址信息,也就是要告诉TNS数据库可通过这个地址和CLIENT进行通讯;CONNECT_DATA 定义了CLIENT要连接的数据库,以及数据库的连接方式,(专用或共享)。
sqlnet.ora sqlnet.ora 通过这个文件来决定怎样找一个连接中出现的连接字符串
SQLNET.AUTHENTICATION_SERVICES= (NTS) 表明用户连接数据库用哪种验证方式 主要两种:
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES,EZCONECT) 表示将首先利用tnsnames进行解析;如果tnsnames解析不到,将使用hostname解析;如果 hostname解析不到,将采用onames进行解析;最后使用EZCONNECT解析
sqlplus sys/oracle@orcl
SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
ORA-12154 -- 有可能TNSNAMES.ORA放在不正确的位置 ORA-12198和ORA-12203 -- 指出tnsnames.ora是列出的服务无法联系到。有可能指定的服务名称错误。 ORA-12533 -- 指出配置ADDRESS不正确 ORA-12541 -- 指出指定端口未找到相应监听器。