拷贝于https://www.cnblogs.com/ahudyan-forever/p/6016784.htmlhtml
在实际的开发应用中,关于Oracle数据库,常常听见有人说创建一个数据库,创建一个Instance,启动一个Instance之类的话。算法
其实问他们什么是数据库,什么是Instance,极可能他们给的答案就是数据库就是Instance,Instance就是数据库啊,没有什么区别。sql
在这里,只能说虽然他们Oracle用了可能有了必定的经验,不过基础的概念仍是不太清楚。(我目前就是这个状态)数据库
1、什么是数据库,其实很简单,数据库就是存储数据的一种媒介。好比经常使用的文件就是一种,在Oracle10G中,数据的存储有好几种。缓存
第一种是文件形式,也就是在你的磁盘中建立一批文件,而后在这些文件中存储信息。服务器
第二种就是磁盘阵列形式,这个是什么意思呢,这个就是说明数据库不是存放为某个文件,而是把一个或者多个磁盘格式化成Oracle的一种格式了,网络
等于整个磁盘就是存放Oracle数据库的,不能做为别的用途。这样的优势是存储性能高,由于再也不借助别的文件格式了,而是把整个磁盘都成为多线程
Oracle最适应的文件系统格式。并发
固然还可能有别的形式,好比网络什么的。不过咱们最经常使用的仍是文件格式的,在文件格式中,数据库指的就是那些数据文件,oracle
控制文件以及REDO文件等等一系列文件。
2、什么是Instance,其实就是指的操做系统中一系列的进程以及为这些进程所分配的内存块。在Oracle中,咱们能够新建一个Oracle的Instance,
这个时候虽然有了进程还有SGA等一系列的内存快,可是这个时候并无把数据库文件读取进来。因此只是一个实例,在后来,你能够经过命令手动
或者自动地把数据库文件加载进咱们的数据库Instance中,这个时候的数据库才可让咱们真正的开始访问操做。因此说,数据库的应用若是想实现,
数据库和数据库Instance是缺一不可的,若是只有数据库的那些文件,那么,只能表明数据在这个文件中,可是咱们没法直接进行操做。
而若是只有数据库Instance,那么咱们虽然能够进行操做,可是也不知道操做哪些数据,操做生成的数据也没法保存等等。因此,当一个Oracle Instance
真正Load了一个Oracle Database了之后,数据库才能够被咱们使用。
在这里要注意一点的是,Oracle的实例在启动之后,只能load一次数据库,若是想把数据库与Instance断开,而后再从新挂在一个数据库Instance,
那么你首先把数据库Instance进程结束,而后从新创建这个instance的一个进程,再load另一个数据库。不然确定要抛除ORA-16169错误,
说数据库已经被打开。由于一个数据库Instance在其生存期中最多只能load和打开一个instance.
刚接触ORACLE的人确定会对实例和数据库感到困惑,实例到底表明些什么?为何会有这个概念的出现?
ORACLE实例 = 进程 + 进程所使用的内存(SGA)
实例是一个临时性的东西,你也能够认为它表明了数据库某一时刻的状态!
数据库 = 重作文件 + 控制文件 + 数据文件 + 临时文件
数据库是永久的,是一个文件的集合。
3、ORACLE实例和数据库之间的关系
1. 临时性和永久性
2. 实例能够在没有数据文件的状况下单独启动 startup nomount , 一般没什么意义
3. 一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
4. 一个数据库可被许多实例同时装载和打开(即RAC),RAC环境中实例的做用可以获得充分的体现!
4、下面对实例和数据库作详细的诠释:
在Oracle领域中有两个词很容易混淆,这就是“实例”(instance)和“数据库”(database)。做为Oracle术语,这两个词的定义以下:
数据库(database):物理操做系统文件或磁盘(disk)的集合。使用Oracle 10g的自动存储管理(Automatic Storage Management,ASM)或RAW分区时,
数据库可能不做为操做系统中单独的文件,但定义仍然不变。
实例(instance):一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里能够维护易失的、非持久性内容
(有些能够刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过你彻底能够把它想成
是最有用的事物,这有助于对实例和数据库划清界线。
这两个词有时可互换使用,不过两者的概念彻底不一样。
实例就是一组操做系统进程(或者是一个多线程的进程)以及一些内存。这些进程能够操做数据库;
数据库只是一个文件集合(包括数据文件、临时文件、重作日志文件和控制文件)。在任什么时候刻,一个实例只能有一组相关的文件(与一个数据库关联)。
大多数状况下,反过来也成立:一个数据库上只有一个实例对其进行操做。不过,Oracle的真正应用集群(Real Application Clusters,RAC)是一个例外,
这是Oracle提供的一个选项,容许在集群环境中的多台计算机上操做,这样就能够有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘上)。
由此,咱们能够同时从多台不一样的计算机访问这个数据库。Oracle RAC能支持高度可用的系统,可用于构建可扩缩性极好的解决方案。
实例 就是治理相关库的内存结构的名字(由SGA、PGA、服务器进程、用户进程、后台进程等组成)
数据库 就是实际的磁盘上的文件(数据文件、日志文件、控制文件等),负责保存数据,但由对应的实例来操做它的数据
服务名 就是对外公布的名称,为网络监听服务
其实,在咱们传统的概念里,数据库是一个统称的名字,在Oracle中,你能够把“数据库”理解成一个大概念,也要把它理解成一个小概念
一、一个Oracle数据库系统中能够同时安装几个数据库,每个数据库对应一个惟一的实例,可是OPS系统除外,能够多个实例同时对一个数据库操做,称为并行服务器
二、只是一个名字,SID便是INSTANCE_NAME,SERVICE_NAMES主要用在监听器中,为了方便吧,有些是为了传统习惯的延续,有些是为了更方便的使用
三、NET EASY CONFIG操纵的应该是主机字符串,是为客户端服务的,
一个数据库能够对外公布多个服务名(SERVICE_NAMES)
一个客户端也能够用多个主机字符串链接到同一个数据库服务器上
四、一个OS上能够装多个Oracle数据库(小的概念),每一个库能够对外公布多个服务名,都经过init.ora和listener.ora来实现
主机字符串,数据库服务名,数据库别名,不太同样。
service_names是对外的服务名,是服务器端使用的,一个库能够设置多个对外服务名,以实现不一样的目的
“主机字符串”的叫法主要在SQL*Plus中使用,是在客户端使用,
“数据库别名”主要用在一些开发工具链接Oracle服务器时使用,是通俗叫法
还有像配置ODBC时的Data Source的Service Name,
它们都是一个道理,指向的都是客户端tnsnames.ora文件中的一小段文本
一、在SQL/PLUS中的登录中,用USER/PWD@***,那么,这个***是主机字符串。
二、在设置ODBC时的用户和密码必定要是ORACLE中的合法用户和密码,但不输也行,引用ODBC名时再给出也能够。
三、若要向ORACLE代理商购买ORACLE,是以用户数来算钱的。那么,这个“用户”跟咱们在ORACLE中经过
CREATE USER USERNAME IDENTIFIED BY PASSWORD建立的用户是不一样概念,“用户数”指的是并发访问用户数,
(我理解是同时间访问同一个内存地址的进程数)。要是我买了8个用户的,能够建几10、上百个用户也没问题,只要峰值达不到并发数就能够了。
打个比方,你的名字叫小明,可是你有不少外号。你父母叫你小明,可是朋友都叫你的外号。
这里你的父母就是oracle实例,小明就是sid,service name就是你的外号。
sid用于实例区分各个数据库,service name用于外部连接。
对于初接触Oracle 数据库的人来说,很容易混淆的两个概念便是Oracle 实例和Oracle 数据库。这两
概念不一样于SQL sever下的实例与数据库,固然也有些类似之处。只是在SQL server咱们根本不须要花费太
多的精力去搞清SQL实例和数据库,由于它简单易于理解。下面简要说明一下SQL实例、数据库,更多的是讲
述Oracle下的实例及数据库。
=====================================================
1、SQL server中的实例与数据库
1.SQL中的实例指的是一个SQL server服务器上仅有一个缺省实例。缺省实例名即为机器名ServerName
(或IP),若是在同一台机器上再安装SQL server,咱们能够对实例命名如ServerName/InstanceName。
即一台SQL server服务器上能够存在多个不一样的实例。一个实例下能够存在多个不一样的数据库。
对于不一样实例下的数据库的访问,使用ServerName/InstanceName:PortNo便可实现访问,缺省实例
为ServerName:PortNo。
2.对不一样的实例配置IP地址,相关的访问协议,端口等等。
3.实例的可访问性须要启动该实例对应的相关服务。此处须要注意的是实例名和实例的服务名并非相
同的。缺省的实例的服务名为MSSQLSERVER,而命名实例的服务名为MSSQL$INSTANCE_NAME。
4.实例的相关功能性的设置能够经过外围应用配置来实现。
=======5.上述完成后,便可实现对数据库的访问。
=======================================================
一个Oracle Server由一个Oracle实例和一个Oracle数据库组成。
即:Oracle Server = Oracle Instance + Oracle Database
Oracle实例
包括了内存结构(SGA)和一系列后台进程(Background Process),二者合起来称为一个Oracle实例
即:Oracle Instance = SGA + Background Process
Oracle内存结构
包含系统全局区(SGA)和程序全局区(PGA)
即Oracle Memory Structures = SGA + PGA
SGA由服务器和后台进程共享
PGA包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反,PGA是
只被一个进程使用的区域,PGA 在建立进程时分配在终止进程时回收。即由服务器进程产生。
1.SGA
系统全局区SGA,SGA = 数据缓冲区+ 重作日志缓冲区+ 共享池+ 大池+ Java 池+ 流池
系统全局区是动态的,由参数SGA_MAX_SIZE决定。
查看当前系统的SGA大小:show parameter sga_max_size;
要修改:alter system set sga_max_size=1200m scope=spfile;
由于实例内存的分配是在数据库启动时进行的,因此要让修改生效,要重启数据库。
ORACLE 10G 引入了ASMM(自动共享内存管理),DBA只需设置SGA_TARGET,ORACLE就会
自动的对共享池、JAVA池、大池、数据缓冲区、流池进行自动调配。取消自动调配就是
SGA_TARGET设为。
数据缓冲区(Database buffer cache):存储从数据文件中得到的数据块的镜像
大小由db_cache_size 决定
查看:show parameter db_cache_size;
设置:alter system set db_cache_size=800M;
重作日志缓冲区(Redo log buffer):对数据库的任何修改都按顺序被记录在该缓冲,而后由LGWR进程将
它写入磁盘,大小由LOG_BUFFER决定
共享池(Shared pool):是SGA中最关键的内存片断,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成,
它的做用是存放频繁使用的sql,在有限的容量下,数据库系统根据必定的算法决定什么时候释放共享池中的sql。
库缓存大小由shared_pool_size 决定
查看:show parameter shared_pool_size
修改:alter system set shared_pool_size=120m;
数据字典缓存:
存储数据库中数据文件、表、索引、列、用户和其它数据对象的定义和权限信息
大小由shared_pool_size 决定,不能单独指定
大池(Large pool):是一个可选的区域,用于一些大型的进程如Oracle的备份恢复操做、IO服务器进程等
Java 池:该程序缓冲区就是为Java 程序保留的。若是不用Java程序没有必要改变该缓冲区的默认大小
流池(Stream pool):被Oracle流所使用
2.PGA
是为每一个用户进程链接ORACLE数据库保留的内存进程建立时分配,进程结束时释放,只能被一个进程使用。
PGA包括了如下几个结构:
排序区、游标状态区、会话信息区、堆栈区
由参数:pga_aggregate_target 决定
3.几类进程:
用户进程,服务器进程,后台进程,其它可选进程
用户进程:在用户链接数据库产生,请求oracle服务器链接,必需要先创建一个链接,不会直接和oracle服务器链接。
服务器进程:当链接实例并创建用户会话时产生,独立服务器或者提供共享服务器都能产生。
后台进程:维持物理和内存之间的联系,用来管理数据库的读写,恢复和监视等工做。服务器进程主要是经过它和用户进程
进行联系和沟通,并由它和用户进程进行数据的交换。在Unix机器上,Oracle后台进程相对于操做系统进程,也就是说,
一个Oracle后台进程将启动一个操做系统进程。在Windows机器上,Oracle后台进程相对于操做系统线程,打开任务管理器,
咱们只能看到一个ORACLE.EXE的进程,可是经过另外的工具,就能够看到包含在这里进程中的线程。
可选进程:ARCN 归档进程、RECO、SNNN、PNNN
必需要有的后台进程:
DBWn数据库写进程、PMON程序监控进程、SMON系统监控进程、LGWr日志写进程、CKPT检查点进程
DBWn(数据库写进程),曾用名DBWr(DateBase Writer), 后来容许多个进程写data file就改为DBWn了。负责将修改过的
数据块从数据库缓冲区高速缓存写入磁盘上的数据文件中。
写入条件:发生检查点、脏缓存达到限制、没有自由的缓存、超时发生、表空间离线、表空间只读、表被删除或者截断、 开始备份表空间。能够修改数据写进程的数量alter system set db_writer_processes=3 scope=spfile;PMON(程序监控进程):清除失效的用户进程,释放用户进程所用的资源。如PMON将回滚未提交的工做,释放锁,释放分配给失败进程的SGA资源。清除失败的进程回滚事务释放锁释放其余资源SMON(系统监控进程):检查数据库的一致性,当启动失败时完成灾难恢复等。实列恢复时,前滚全部重作日志中的文件,打开数据库为了用户能访问,回滚未提交的事务,释放临时表空间清除临时空间,聚结空闲空间,从不可用的文件中恢复事务的活动,OPS中失败节点的实例恢复清除OBJ$表缩减回滚段使回滚段脱机LGWr(日志写进程):将重作日志缓冲区中的更改写入在线重作日志文件。条件:提交的时候(commit)达到/满每隔秒有大于M 重作日志缓冲区未被写入磁盘DBWr须要写入的数据的SCN号大于LGWr记录的SCN号,DBWr触发LGWr写入超时在dbwr进程些以前写日志CKPT(检查点进程):DBWr/LGWr的工做原理,形成了数据文件,日志文件,控制文件的不一致,CKPT进程负责同步数据文件,日志文件和控制文件,CKPT会更新数据文件/控制文件的头信息条件:在日志切换的时候数据库用immediate ,transaction ,normal选项shutdown数据库的时候根据初始话文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的设置的数值来肯定用户触发ARCN(归档进程)在每第二天志切换时把已满的日志组进行备份或归档条件:数据库以归档方式运行的时候RECO负责解决分布事物中的故障。Oracle能够链接远程的多个数据库,当因为网络问题,有些事物处于悬而未决的状态。RECO进程试图创建与远程服务器的通讯,当故障消除后,RECO进程自动解决全部悬而未决的会话。Server Process(服务进程)分为专用服务进程(Dedicated Server Process)和共享服务进程(MultiTreaded Server Process)专用服务进程:一个服务进程对应多个用户进程,轮流为用户进程服务。用户进程(User Process)、服务进程(Server Process)、后台进程(Background Processes)的启动用户进程: 数据库用户请求Oralce server会话时被启动服务进程:当用户会话启动后,链接到Oracle实例时该进程被启动后台进程:当Oracle实例被启动时,启动相关的后台进程3、Oracle 数据库一系列物理文件的集合包括控制文件、数据文件、联机日志文件、参数文件、密码文件等 即:Oracle Database = Controlfile + datafile + logfiel + spfile +..1.控制文件(controlfile)数据库的名字,检查点信息,数据库建立的时间戳全部的数据文件,联机日志文件,归档日志文件信息备份信息等2.数据文件(datafile)包含了用户和应用程序的全部数据--查看数据文件信息3.联机日志文件记录了用户对数据库的全部操做,一个数据库中至少要有两个日志组文件,每一个日志组中至少有一个日志成员日志组中的多个日志成员是互为镜相关系4.归档日志文件Oracle能够运行在两种模式之中,归档模式和非归档模式。在归档模式中,为了保存用户的全部修改,在联机日志文件切换后和被覆盖之间系统将他们另外保存成一组连续的文件系列,该文件系列就是归档日志文件。用户恢复意外状况出现的数据丢失、异常等。5.参数文件(pfile和spfile)initSID.ora或init.ora文件,一般位于:$ORACLE_BASE/admin/<SID>/pfile初始化文件记载了许多数据库的启动参数,如内存,控制文件,进程数等,在数据库启动的时候加载(Nomount时加载)6.其余文件密码文件:用于Oracle 的具备sysdba权限用户的认证.告警日志文件:报警日志文件(alert.log或alrt.ora),记录数据库启动,关闭和一些重要的出错信息查看路径:select value from v$PARAMETER where name =‘background_dump_dest’;7.数据库逻辑组织结构表空间、段、区、块一个数据库由一个或多个表空间组成,一个表空间只能属于一个数据库一个表空间由一个或多个多个数据文件组成,一个数据文件只能属于一个表空间一个数据文件由一个或多个操做系统块组成,每个操做系统块只能数以一个数据文件一个表空间能够包含一个或多个段,一个段只能属于一个表空间一个段由一个或多个区组成,每个区只能属于一个段一个区由一个或多个Oracle 块组成,每个Oracle块只能属于一个区一个区只能属于一个数据文件,数据文件的空间能够分配到一个或多个区一个Oracle 块由一个或多个操做系统块组成,一个操做系统块是一个Oracle块的一部分