首页 > 编程知识 正文

数据库系统设计案例,数据库设计案例

时间:2023-05-06 16:32:47 阅读:47518 作者:773

什么是数据库实例在实际的开发APP应用程序中,对于Oracle数据库,我们经常听到创建数据库、创建实例、启动Instance等。 其实问他们数据库是什么,Instance是什么,也许他们给的答案是数据库是Instance,Instance是数据库。 没有任何区别。 在这里,他们可能使用甲骨文有一定的经验,但基本概念只能说还不太清楚。

我们知道数据库是存储数据的介质,而数据以某种格式存储在特定文件中。 我们比较早接触到的数据库,例如DBASE/FORXBASE等数据库,实际上经常表现为记录管理系统。 文件中以格式存储了一些数据记录。 开发早期DBASE APP应用程序的程序员可能还记得第一个dbase数据库是独立的。 因此,不考虑互斥或锁定的问题,根据业务要求处理记录即可。 后来有了新网,福克斯的应用得到了广泛的应用。 hmdhmgsjx最初学习NOVELL网络时也感到困惑,对FOXBASE能够在NOVELL网络上运行感到非常神秘。 然后,NOVELL网络实际上为FOXBASE数据库提供了共享文件系统,FOXBASE理解通过NOVELL共享文件系统在多个网络终端之间共享,然后在NOVELL网络上理解的FOXBASE中

刚才好像有点远,相反,让我们看看Oracle数据库。 Oracle数据库是支持高并发的RDBMS系统。 因此,Oracle还需要解决大量并发用户的一致访问问题。 因此,Oracle数据库在TWO-TASK模式下提供服务,而不是让APP应用程序直接打开数据文件并处理数据库。 在此体系结构中,APP应用程序不能直接访问数据库,而是必须通过称为实例的逻辑结构访问数据库。

接下来,我们需要了解INSTANCE这个新的非常重要的概念。 那么什么是实例呢? 官方说法是,Instance是操作系统中的一系列进程,以及分配给这些进程的内存块。 为了清楚地说明实例,Oracle数据库实例是访问Oracle数据库的通道。

首先,让我们来看看数据库实例的一些基本概念。 数据库实例包含Oracle共享内存和一系列后台进程。 一个实例同时只能打开一个数据库,一个数据库可以由多个实例同时打开。 当然,这是人们常说的RAC。 Oracle数据库的实例必须依赖于特定的ORACLE_HOME,并且包含在启动该实例所需的所有程序和相关文件$ORACLE_HOME中。 此外,每个实例都有自己的SID。 可以在同一ORACLE_HOME中启动多个实例,但这些实例需要不同的SID。 其他非RAC数据库不能在多个实例上打开,因为它们是在多个实例装载独立数据库时独占执行的。 RAC的数据库,只能由同一群集中的多个实例打开。 同一群集以外的节点不能打开同一数据库。

在上述说明中,我们了解了实例、数据库、ORACLE_HOME和SID等概念之间的关系。 接下来,让我们详细了解一下实例。 在Oracle中,可以启动Oracle实例。 此时,尽管有进程和SGA等一系列内存,但此时并未读取数据库文件。 实例启动后,它为访问Oracle数据库提供了基本环境。 此基环境包含Oracle数据库的一系列内部数据结构,包括Oracle数据库的SQL和数据字典缓冲区(共享池中的库缓存和行缓存)以及数据块缓冲区(DB CACHE ) 在启动Oracle实例的UNIX系统上,可以使用ipcs命令检查共享内存的状态。

[oracle@ ~]$ ipcs

--------sharedmemorysegments----------------------------------------

keyshmidownerpermsbytesnattchstatus

0x9a 8837 b 4163840 Oracle 640105067315220

------- semaphore arrays----------

key semid owner perms nsems

0x03c13d24 753664 oracle 640 154

可以看到Oracle用户被分配了一组共享内存和信号。 这与在UNIX下创建具有共享内存的APP应用程序没有区别。 实例启动时,首先加载参数文件,并基于参数文件中定义的内存相

关参数创建共享内存和信号灯,然后将参数文件装载到共享内存中的被称为ksppi的内存区域,同时将当前实例的参数装载到一个独立的区域-ksppsv。根据参数文件,启动进程完成SGA中内存结构的初始化工作,然后启动相关的后台进程。这个过程完成后,数据库实例启动的第一步,nomount就完成了。

实例启动到nomount后,所有的共享内存和后台进程都已经装载完毕,于是,根据参数文件中控制文件的位置,打开控制文件,并对控制文件进行校验,如果这个步骤没有发现问题,就完成了mount步骤。

数据库实例mount完成后,通过对控制文件,UNDO ,REDO等进行比对分析后,发现数据库状态是一致的,数据库实例就可以OPEN数据库了。数据库Open 后数据库实例就可以提供对外服务了。

关于数据库实例启动过程在很多书中都有十分详细的介绍,因此在本节中就不浪费篇幅再详细描述了。数据库实例启动后,应用程序就可以通过数据库实例来访问数据库了。

应用要访问Oracle 数据库,可以通过三种方式,第一种方式是应用进程直接访问数据库实例的共享内存;第二种方式是通过beq协议在本机上访问;第三种方式是通过网络协议访问。第一种方式使用的场合很少,我们不做过多的讨论。我们下面着重讨论通过第二种和第三种方式访问数据库。

首先后两种访问数据库的方式都是基于TWO-TASK结构的,都需要在数据库服务器上建立一个服务进程(SERVER进程,或者前台进程)来为客户端应用服务(在这里我们又有一个限定条件,我们讨论的是独立服务器模式,共享服务器模式十分类似,我们将在后面进行一个专题描述)。TWO-TASK架构下访问数据库,首先需要在服务器端创建一个进程,这个进程启动时首先要映射共享内存,然后才能够通过共享内存中的内部数据结构完成会话的初始化工作。

在本机上不经过SQL*NET连接数据库,前台进程和用户进程之间通过IPC机制进行通讯,通讯协议就是著名的Bequeath协议,简称BEQ协议。而如果通过SQL*NET连接数据库,那么就需要使用网络协议,现在TCP/IP协议已经成为使用最为广泛的协议,因此我们主要面对的是TCP/IP协议,而10多���前,著名的SPX协议、DECNET协议、TOKEN RING协议等都曾经是DBA进程配置的协议。使用SQL*NET协议的前台进程和用户进程之间的通讯采用SOCKET通讯。实际上,在服务器上,我们也可以使用SQL*NET连接数据库,只不过我们很少会去这样做,因为BEQ协议在效率上高于SOCKET通讯。

除了使用的协议不同,在本机上通过BEQ协议连接数据库实例和通过SQL*NET连接数据库实例还有什么不同吗?很多DBA可能会感觉有所不同,因为在本机上直接连接数据库协议,前台进程是shell进程产生的子进程,而通过SQL*NET连接数据库实例,SERVER进程是LISTENER(tnslsnr)产生的子进程,如果listener进程的属性不同,那么产生的子进程会和shell直接产生的子进程有所不同。这一点不同在早期的Oracle 版本中确实存在,而自从$ORACLE_HOME/oracle这个映像文件被设定为s属性后,这个问题就不存在了。Oracle映像通过s属性可以将子进程的属性转为oracle用户。

不过使用BEQ协议和网络协议在服务进程方面还是有所不同,BEQ协议通过IPC通讯,因此不需要使用SOCKET,而通过网络协议(SQL*NET)连接,客户进程最初连接的是tnslsnr进程,tnslsnr进程接受了连接请求后,为其创建一个子进程,然后通知客户端进程重新连接到子进程上继续工作。在这个时候,就存在一个SOCKET重定向的问题。LISTENER产生子进程时会为新的连接分配一个未被使用的端口号,这个子进程启动后就在该端口上侦听,同时LISTENER会通知客户端进程,要求其重定向到新的端口号。此时客户端进程会关闭老的SOCKET,并打开一个新的SOCKET,完成登录操作。

可能有些DBA对上面的讨论感到有些迷茫了,怎么讨论实例的问题,一下子又转到了LISTENER的工作机制上了,这些知识对于DBA又有什么作用呢?我们刚才一直在强调实例是客户端访问数据库的通道,因此讨论客户单如何通过LISTENER连接数据库就十分有意义了。

首先第一点,现在很多客户对系统安全性要求很高,因此服务器上大量的网络端口是被封掉的,只有必须使用的才会被开放。那么对于Oracle 数据库来说,我们只需要开放监听器所需要的端口就可以了吗?事实上不是这样的,除了开放类似1521的监听端口外,我们还需要开放一些高端口,这些端口将被用于SOCKET重定向。

可能很多用户碰到过在客户端连接数据库的过程中经常会碰到TNS-12535之类的错误,开始的时候总是从网络超时的角度去分析,不过这样分析往往很难找到真正的故障原因。这类问题在一个存在防火墙的环境中,往往是由于在防火墙环境下的SOCKET重定向引起的,特别是在有NAT功能的防火墙上,这类问题很容易出现。客户端连接的是一个NAT翻译后的IP地址,而重定向的时候,LISTENER要求客户端连接到真实的IP地址上,这样就会出现连接超时导致的失败。这种情况一般的解决方案是使用connect manager(CMAN),hmdhmgsjx也曾经碰到过几个这样的客户,最后是通过CMAN来彻底解决问题的。

 

 本文链接:http://www.oraclefans.cn/blog/showblog.jsp?rootid=33413

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。