oracle_(中文)_专家高级编程_第(02)章.doc_第1页
oracle_(中文)_专家高级编程_第(02)章.doc_第2页
oracle_(中文)_专家高级编程_第(02)章.doc_第3页
oracle_(中文)_专家高级编程_第(02)章.doc_第4页
oracle_(中文)_专家高级编程_第(02)章.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 2 章 体系结构概述 Oracle 被设计为一个相当可移植的数据库;在当前所有平台上都能运行,从 Windows 到 UNIX 再到大型机都支持 Oracle。出于这个原因,在不同的操作系统上,Oracle的物理体系结构也有所不同。例如,在 UNIX 操作系统上可以看到,Oracle 实现为多个不同的操作系统进程,实际上每个主要功能分别由一个进程负责。这种实现对于UNIX来说是正确的,因为UNIX就是以多进程为基础。不过,如果放到Windows上就不合适了,这种体系结构将不能很好地工作(速度会很慢,而且不可扩缩) 。在Windows平台上,Oracle实现为一个多线程的进程。 如果是一个运行OS/390和z/OS的IBM大型机系统, 针对这种操作系统的Oracle体系结构则充分利用了多个OS/390地址空间,它们都作为一个 Oracle 实例进行操作。一个数据库实例可以配置多达 255 个地址空间。另外,Oracle 还能与 OS/390 工作负载管理器(Workload Manager,WLM)协作,建立特定Oracle工作负载相互之间的相对执行优先级,还能建立相对于OS/390系统中所有其他工作的执行优先级。尽管不同平台上实现 Oracle 所用的物理机制存在变化,但 Oracle 体系结构还是很有一般性,所以你能很好地了解 Oracle在所有平台上如何工作。 这一章会从全局角度概要介绍这个体系结构。我们会分析 Oracle 服务器,并给出“数据库”和“实例”等术语的定义(这些术语通常很容易混淆) 。这里还会介绍“连接”到Oracle时会发生什么, 另外将从高层分析服务器如何管理内存。在后续3章中, 我们还会详细介绍Oracle体系结构中的3大部分: q 第3章将介绍文件,其中涵盖构成数据库的5大类文件:参数文件、数据文件、临时文件、控制文件和重做日志文件。我们还会介绍另外几类文件,包括跟踪文件、警告文件、转储文件(DMP) 、数据泵文件(data pump)和简单的平面文件。这一章将谈到 Oracle 10g 新增的一个文件区,称为闪回恢复区(Flashback Recovery Area) ,另外我们还会讨论自动存储管理(Automatic Storage Management,ASM)对文件存储的影响。 q 第4章介绍Oracle的一些内存结构,分别称为系统全局区(System Global Area,SGA) 、进程全局区(Process Global Area,PGA)和用户全局区(User Global Area,UGA) 。我们会分析这些结构之间的关系,并讨论共享池(shared pool) 、大池(big pool) 、Java池(Java pool)以及SGA中的其他一些组件。 q 第 5 章介绍 Oracle 的物理进程或线程。我们会讨论数据库上运行的 3 类不同的进程:服务器进程(server process) 、后台进程(background process)和从属进程(slave process) 。 先介绍哪一部分实在很难定夺。由于进程使用了SGA,所以如果在进程之前先介绍SGA可能不太合适。另一方面,讨论进程及其工作时,又会引用SGA。另外两部分的关系也很紧密:文件由进程处理,如果不先了解进程做什么,将很难把文件搞清楚。 正因如此,我会在这一章定义一些术语,对Oracle是什么提供一个一般性的概述(也许你会把它画出来) 。有了这些准备,你就能深入探访各个部分的具体细节了。 2.1 定义数据库和实例 在Oracle领域中有两个词很容易混淆,这就是“实例”(instance)和“数据库”(database) 。作为Oracle术语,这两个词的定义如下: q 数据库(database):物理操作系统文件或磁盘(disk)的集合。使用Oracle 10g的自动存储管理(Automatic Storage Management,ASM)或RAW分区时,数据库可能不作为操作系统中单独的文件,但定义仍然不变。 q 实例(instance):一组 Oracle 后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁盘) 。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过你完全可以把它想成是最有用的事物,这有助于对实例和数据库划清界线。 这两个词有时可互换使用,不过二者的概念完全不同。实例和数据库之间的关系是:数据库可以由多个实例装载和打开,而实例可以在任何时间点装载和打开一个数据库。实际上,准确地讲,实例在其整个生存期中最多能装载和打开一个数据库!稍后就会介绍这样的一个例子。 是不是更糊涂了?我们还会做进一步的解释,应该能帮助你搞清楚这些概念。实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件) 。在任何时刻,一个实例只能有一组相关的文件(与一个数据库关联) 。大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行操作。不过,Oracle的真正应用集群(Real Application Clusters,RAC)是一个例外,这是Oracle提供的一个选项,允许在集群环境中的多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘上) 。由此,我们可以同时从多台不同的计算机访问这个数据库。Oracle RAC能支持高度可用的系统,可用于构建可扩缩性极好的解决方案。 下面来看一个简单的例子。假设我们刚安装了Oracle 10g 。我们执行一个纯软件安装,不包括初始的“启动”数据库,除了软件以外什么都没有。 通过pwd命令可以知道当前的工作目录 (这个例子使用一个Linux平台的计算机) 。 我们的当前目录是dbs (如果在Windows平台上,则是database目录) 。 执行lsl命令显示出这个目录为“空”。 其中没有init.ora 文件,也没有任何存储参数文件 (stored parameter file, SPFILE) ;存储参数文件将在第3章详细讨论。 ora10glocalhost dbs$ pwd /home/ora10g/dbs ora10glocalhost dbs$ ls -l total 0 使用ps(进程状态)命令,可以看到用户ora10g运行的所有进程,这里假设ora10g是Oracle软件的所有者。此时还没有任何Oracle数据库进程。 ora10glocalhost dbs$ ps -aef | grep ora10g ora10g 4173 4151 0 13:33 pts/0 00:00:00 -su ora10g 4365 4173 0 14:09 pts/0 00:00:00 ps -aef ora10g 4366 4173 0 14:09 pts/0 00:00:00 grep ora10g 然后使用ipcs命令,这个UNIX命令可用于显示进程间的通信设备,如共享内存、信号量等。目前系统中没有使用任何通信设备。 ora10glocalhost dbs$ ipcs -a - Shared Memory Segments - key shmid owner perms bytes nattch status - Semaphore Arrays - key semid owner perms nsems - Message Queues - key msqid owner perms used-bytes messages 然后启动SQL*Plus (Oracle的命令行界面) , 并作为SYSDBA连接 (SYSDBA账户可以在数据库中做任何事情) 。 连接成功后, SQL*Plus报告称我们连上了一个空闲的实例: ora10glocalhost dbs$ sqlplus / as sysdba SQL*Plus: Release .0 - Production on Sun Dec 19 14:09:44 2004 Copyright (c) 1982, 2004, Oracle. All rights reserved. Connected to an idle instance. SQL 我们的“实例”现在只包括一个Oracle服务器进程,见以下输出中粗体显示的部分。此时还没有分配共享内存,也没有其他进程。 SQL !ps -aef | grep ora10g ora10g 4173 4151 0 13:33 pts/0 00:00:00 -su ora10g 4368 4173 0 14:09 pts/0 00:00:00 sqlplus as sysdba ora10g 4370 1 0 14:09 ? 00:00:00 oracleora10g (.) ora10g 4380 4368 0 14:14 pts/0 00:00:00 /bin/bash -c ps -aef | grep ora10g ora10g 4381 4380 0 14:14 pts/0 00:00:00 ps -aef ora10g 4382 4380 0 14:14 pts/0 00:00:00 grep ora10g SQL !ipcs -a - Shared Memory Segments - key shmid owner perms bytes nattch status - Semaphore Arrays - key semid owner perms nsems - Message Queues - key msqid owner perms used-bytes messages SQL 现在来启动实例: SQL startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file /home/ora10g/dbs/initora10g.ora SQL 这里提示的文件就是启动实例时必须要有的一个文件,我们需要有一个参数文件(一种简单的平面文件,后面还会详细说明) ,或者要有一个存储参数文件。现在就来创建参数文件,并放入启动数据库实例所需的最少信息(通常还会指定更多的参数,如数据库块大小、控制文件位置,等等) 。 $ cat initora10g.ora db_name = ora10g 然后再回到SQL*Plus: SQL startup nomount ORACLE instance started. 这里对 startup 命令加了 nomount 选项,因为我们现在还不想真正“装载”数据库(要了解启动和关闭的所有选项,请参见 SQL*Plus文档) 。 注意 在Windows上运行startup命令之前,还需要使用oradim.exe实用程序执行一条服务创建语句。 现在就有了所谓的“实例”。运行数据库所需的后台进程都有了,如进程监视器(process monitor,PMON) 、日志写入器(log writer,LGWR)等,这些进程将在第5章详细介绍。 Total System Global Area 113246208 bytes Fixed Size 777952 bytes Variable Size 61874464 bytes Database Buffers 50331648 bytes Redo Buffers 262144 bytes SQL !ps -aef | grep ora10g ora10g 4173 4151 0 13:33 pts/0 00:00:00 -su ora10g 4368 4173 0 14:09 pts/0 00:00:00 sqlplus as sysdba ora10g 4404 1 0 14:18 ? 00:00:00 ora_pmon_ora10g ora10g 4406 1 0 14:18 ? 00:00:00 ora_mman_ora10g ora10g 4408 1 0 14:18 ? 00:00:00 ora_dbw0_ora10g ora10g 4410 1 0 14:18 ? 00:00:00 ora_lgwr_ora10g ora10g 4412 1 0 14:18 ? 00:00:00 ora_ckpt_ora10g ora10g 4414 1 0 14:18 ? 00:00:00 ora_smon_ora10g ora10g 4416 1 0 14:18 ? 00:00:00 ora_reco_ora10g ora10g 4418 1 0 14:18 ? 00:00:00 oracleora10g (.) ora10g 4419 4368 0 14:18 pts/0 00:00:00 /bin/bash -c ps -aef | grep ora10g ora10g 4420 4419 0 14:18 pts/0 00:00:00 ps -aef ora10g 4421 4419 0 14:18 pts/0 00:00:00 grep ora10g 再使用ipcs命令,它会首次报告指出使用了共享内存和信号量,这是UNIX上的两个重要的进程间通信设备: SQL !ipcs a - Shared Memory Segments - key shmid owner perms bytes nattch status 0x99875060 458760 ora10g 660 115343360 8 - Semaphore Arrays - key semid owner perms nsems 0xf182650c 884736 ora10g 660 34 - Message Queues - key msqid owner perms used-bytes messages SQL 注意,我们还没有“数据库”呢!此时,只有数据库之名(在所创建的参数文件中) ,而没有数据库之实。如果试图“装载”这个数据库,就会失败,因为数据库根本就不存在。下面就来创建数据库。有人说创建一个Oracle数据库步骤很繁琐,真是这样吗?我们来看看: SQL create database; Database created. 这里创建数据库就是这么简单。但在实际中,也许要使用一个稍有些复杂的 CREATE DATABASE 命令,因为可能需要告诉 Oracle把日志文件、数据文件、控制文件等放在哪里。不过,我们现在已经有了一个完全可操作的数据库了。可能还需要运行$ORACLE_HOME/rdbms/admin/ catalog.sql脚本和其他编录脚本(catalog script)来建立我们每天使用的数据字典(这个数据库中还没有我们使用的某些视图,如ALL_OBJECTS) ,但不管怎么说,数据库已经有了。可以简单地查询一些Oracle V$视图(具体就是V$DATAFILE、V$LOGFILE和V$CONTROLFILE) ,列出构成这个数据库的文件: SQL select name from v$datafile; NAME - /home/ora10g/dbs/dbs1ora10g.dbf /home/ora10g/dbs/dbx1ora10g.dbf SQL select member from v$logfile; MEMBER - /home/ora10g/dbs/log1ora10g.dbf /home/ora10g/dbs/log2ora10g.dbf SQL select name from v$controlfile; NAME - /home/ora10g/dbs/cntrlora10g.dbf SQL Oracle 使用默认设置,把所有内容都放在一起,并把数据库创建为一组持久的文件。如果关闭这个数据库,再试图打开,就会发现数据库无法打开: SQL alter database close; Database altered. SQL alter database open; alter database open * ERROR at line 1: ORA-16196: database has been previously opened and closed 一个实例在其生存期中最多只能装载和打开一个数据库。要想再打开这个(或其他)数据库,必须先丢弃这个实例,并创建一个新的实例。 重申一遍: q 实例是一组后台进程和共享内存。 q 数据库是磁盘上存储的数据集合。 q 实例“一生”只能装载并打开一个数据库。 q 数据库可以由一个或多个实例(使用RAC)装载和打开。 前面提到过,大多数情况下,实例和数据库之间存在一种一对一的关系。可能正因如此,才导致人们很容易将二者混淆。从大多数人的经验看来,数据库就是实例,实例就是数据库。 不过,在许多测试环境中,情况并非如此。在我的磁盘上,可以有 5 个不同的数据库。测试主机上任意时间点只会运行一个 Oracle实例,但是它访问的数据库每天都可能不同(甚至每小时都不同) ,这取决于我的需求。只需有不同的配置文件,我就能装载并打开其中任意一个数据库。在这种情况下,任何时刻我都只有一个“实例”,但有多个数据库,在任意时间点上只能访问其中的一个数据库。 所以,你现在应该知道,如果有人谈到实例,他指的就是 Oracle 的进程和内存。提到数据库时,则是说保存数据的物理文件。可以从多个实例访问一个数据库,但是一个实例一次只能访问一个数据库。 2.2 SGA 和后台进程 你可能已经想到了Oracle实例和数据库的抽象图是个什么样子(见图2-1) 。 图2-1以最简单的形式展示了Oracle实例和数据库。Oracle有一个很大的内存块,称为系统全局区(SGA) ,在这里它会做以下工作: q 维护所有进程需要访问的多种内部数据结构; q 缓存磁盘上的数据,另外重做数据写至磁盘之前先在这里缓存; q 保存已解析的SQL计划; q 等等。 图 2-1 Oracle实例和数据库 Oracle有一组“附加到”SGA的进程,附加机制因操作系统而异。在UNIX环境中,这些进程会物理地附加到一个很大的共享内存段,这是操作系统中分配的一个内存块,可以由多个进程并发地访问(通常要使用shmget()和shmat()) 。 在 Windows 中,这些进程只是使用 C 调用(malloc())来分配内存,因为它们实际上是一个大进程中的线程,所以会共享相同的虚拟内存空间。Oracle还有一组供数据库进程/线程读写的文件(只允许Oracle进程读写这些文件) 。这些文件保存了所有的表数据、索引、临时空间、重做日志等。 如果在一个UNIX系统上启动Oracle,并执行ps命令,会看到运行着许多物理进程,还会显示出这些进程的名字。在前面的例子中,我们已经观察到了pmon、 smon以及其他一些进程。 我会在第5章逐一介绍这些进程, 现在只要知道它们通称为Oracle后台进程(background process)就足够了。这些后台进程是构成实例的持久性进程,从启动实例开始,这些进程会一直运行,直至实例关闭。 有一点要注意,这些都是进程,而不是单个的程序。UNIX 上只有一个 Oracle 二进制可执行文件;根据启动时所提供的选项,这个可执行文件会有多种不同的“个性”。执行ora_pmon_ora10g进程要运行这个二进制可执行文件,执行ora_ckpt_ora10g进程时运行的可执行文件仍是它。二进制可执行文件只有一个,就是oracle,只是会以不同的名字执行多次。 在Windows上, 使用pslist工具 (/ntw2k/freeware/ pslist.shtml) 只会看到一个进程oracle.exe。同样, Windows上也只有一个二进制可执行文件(oracle.exe) 。在这个进程中,可以看到表示Oracle后台进程的多个线程。 使用pslist(或另外的某个工具) ,可以看到以下线程: C:Documents and Settingstkytepslist oracle PsList 1.26 - Process Information Lister Copyright (C) 1999-2004 Mark Russinovich Sysinternals - Process information for ORACLE-N15577HE: Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time oracle 1664 8 19 284 354684 0:00:05. 687 0:02:42.218 从中可以看出,这个 Oracle 进程里有 19 个线程(以上所示的 Thd 列) 。这些线程就对应于 UNIX 上的进程(pmon、arch、lgwr 等Oracle进程) 。还可以用pslist查看各线程的更多详细信息: C:Documents and Settingstkytepslist -d oracle PsList 1.26 - Process Information Lister Copyright (C) 1999-2004 Mark Russinovich Sysinternals - Thread detail for ORACLE-N15577HE: oracle 1664: Tid Pri Cswtch State User Time KernelTime Elapsed Time 1724 9 148 Wait:Executive 0:00:00.000 0:00:00.218 0:02:46.625 756 9 236 Wait:UserReq 0:00:00.000 0:00:00.046 0:02:45.984 1880 8 2 Wait:UserReq 0:00:00.000 0:00:00.000 0:02:45.953 1488 8 403 Wait:UserReq 0:00:00.000 0:00:00.109 0:02:10.593 1512 8 149 Wait:UserReq 0:00:00.000 0:00:00.046 0:02:09.171 1264 8 254 Wait:UserReq 0:00:00.000 0:00:00.062 0:02:09.140 960 9 425 Wait:UserReq 0:00:00.000 0:00:00.125 0:02:09.078 2008 9 341 Wait:UserReq 0:00:00.000 0:00:00.093 0:02:09.062 1504 8 1176 Wait:UserReq 0:00:00.046 0:00:00.218 0:02:09.015 1464 8 97 Wait:UserReq 0:00:00.000 0:00:00.031 0:02:09.000 1420 8 171 Wait:UserReq 0:00:00.015 0:00:00.093 0:02:08.984 1588 8 131 Wait:UserReq 0:00:00.000 0:00:00.046 0:02:08.890 1600 8 61 Wait:UserReq 0:00:00.000 0:00:00.046 0:02:08.796 1608 9 5 Wait:Queue 0:00:00.000 0:00:00.000 0:02:01.953 2080 8 84 Wait:UserReq 0:00:00.015 0:00:00.046 0:01:33.468 2088 8 127 Wait:UserReq 0:00:00.000 0:00:00.046 0:01:15.968 2092 8 110 Wait:UserReq 0:00:00.000 0:00:00.015 0:01:14.687 2144 8 115 Wait:UserReq 0:00:00.015 0:00:00.171 0:01:12.421 2148 9 803 Wait:UserReq 0:00:00.093 0:00:00.859 0:01:09.718 不同于 UNIX,这里看不到线程的“名字”(UNIX 上则会显示 ora_pmon_ora10g 等进程名) ,不过,我们可以看到线程 ID(Tid) ,优先级(Pri)以及有关的其他操作系统审计信息。 2.3 连接 Oracle 这一节将介绍Oracle服务器处理请求的两种最常见的方式, 并分析它们的基本原理,这两种方式分别是专用服务器 (dedicated server)连接和共享服务器(shared server)连接。要想登录数据库并在数据库中真正做事情,必须先连接,我们会说明建立连接时客户端和服务器端会发生什么。最后会简要地介绍如何建立 TCP/IP 连接(TCP/IP 是网络上连接 Oracle 所用的主要网络协议) ,并说明对于专用服务器连接和共享服务器连接,服务器上的监听器(listener)进程会以不同的方式工作,这些监听器进程负责建立与服务器的物理连接。 2.3.1 专用服务器 从图2-1和pslist输出可以看出启动Oracle之后是什么样子。如果现在使用一个专用服务器登录数据库,则会创建一个新的进程,提供专门的服务: C:Documents and Settingstkytesqlplus tkyte/tkyte SQL*Plus: Release .0 - Production on Sun Dec 19 15:41:53 2004 Copyright (c) 1982, 2004, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release .0 - Production With the Partitioning, OLAP and Data Mining options tkyteORA10G host pslist oracle PsList 1.26 - Process Information Lister Copyright (C) 1999-2004 Mark Russinovich Sysinternals - Process information for ORACLE-N15577HE: Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time oracle 1664 8 20 297 356020 0:00:05.906 0:03:21.546 tkyteORA10G 现在可以看到,线程有20个而不是19个,多加的这个线程就是我们的专用服务器进程(稍后会介绍专用服务器进程的更多内容) 。注销时,这个额外的线程也没有了。在UNIX上,可以看到正在运行的Oracle进程列表上会多加一个进程,这就是我们的专用服务器。 再回过来看前面的那个图。现在如果按最常用的配置连接Oracle,则如图2-2所示。 图 2-2 典型的专用服务器配置 如前所述,在我登录时,Oracle总会为我创建一个新的进程。这通常称为专用服务器配置,因为这个服务器进程会在我的会话生存期中专门为我服务。对于每个会话,都会出现一个新的专用服务器,会话与专用服务器之间存在一对一的映射。按照定义,这个专用服务器不是实例的一部分。我的客户进程(也就是想要连接数据库的程序)会通过某种网络通道(如TCP/IP socket)与这个专用服务器直接通信,并由这个服务器进程接收和执行我的SQL。如果必要,它会读取数据文件,并在数据库的缓存中查找我要的数据。也许它会完成我的更新语句,也可能会运行我的PL/SQL代码。这个服务器进程的主要目标就是对我提交的SQL调用做出响应。 2.3.2 共享服务器 Oracle还可以接受另一种方式的连接,这称为共享服务器(shared server) ,正式的说法是多线程服务器(Multi-Threaded Server)或MTS。如果采用这种方式,就不会对每条用户连接创建另外的线程或新的UNIX进程。在共享服务器中,Oracle使用一个“共享进程”池为大量用户提供服务。共享服务器实际上就是一种连接池机制。利用共享服务器,我们不必为 10,000 个数据库会话创建 10,000 个专用服务器(这样进程或线程就太多了) ,而只需建立很少的一部分进程/线程,顾名思义,这些进程/线程将由所有会话共享。这样Oracle就能让更多的用户与数据库连接,否则很难连接更多用户。如果让我的机器管理 10,000 个进程,这个负载肯定会把它压垮,但是管理 100 个或者1,000个进程还是可以的。采用共享服务器模式,共享进程通常与数据库一同启动,使用ps命令可以看到这个进程。 共享服务器连接和专用服务器连接之间有一个重大区别,与数据库连接的客户进程不会与共享服务器直接通信,但专用服务器则不然,客户进程会与专用服务器直接通信。之所以不能与共享服务器直接对话,原因就在于这个服务器进程是共享的。为了共享这些进程,还需要另外一种机制,通过这种机制才能与服务器进程“对话”。为此,Oracle使用了一个或一组称为调度器(dispatcher,也称分派器)的进程。客户进程通过网络与一个调度器进程通信。这个调度器进程将客户的请求放入 SGA 中的请求队列(这也是 SGA 的用途之一) 。第一个空闲的共享服务器会得到这个请求,并进行处理(例如,请求可能是UPDATE T SET X = X+5 WHERE Y = 2) 。完成这个命令后,共享服务器会把响应放在原调度器(即接收请求的调度器)的响应队列中。调度器进程一直在监听这个队列,发现有结果后,就会把结果传给客户。从概念上讲,共享服务器请求的流程如图2-3所示。 图 2-3 共享服务器请求的流程步骤 如图2-3所示,客户连接向调度器发送一个请求。调度器首先将这个请求放在SGA中的请求队列中。第一个可用的共享服务器从请求队列中取出这个请求并处理。共享服务器的处理结束后,再把响应(返回码、数据等)放到响应队列中,接下来调度器拿到这个响应,传回给客户。 在开发人员看来,共享服务器连接和专用服务器连接之间并没有什么区别。 既然已经了解了专用服务器连接和共享服务器连接是什么,你可能会有一些疑问: q 首先怎么才能连接呢? q 谁来启动这个专用服务器? q 怎么与调度器联系? 这些问题的答案取决于你的特定平台,不过下一节会概括介绍一般的过程。 2.3.3 TCP/IP 连接的基本原理 这里将分析网络上最常见的一种情形:在TCP/IP连接上建立一个基于网络的连接请求。在这种情况下,客户在一台机器上,而服务器驻留在另一台机器上,这两台机器通过一个TCP/IP网络连接。客户率先行动,使用Oracle客户软件(Oracle提供的一组应用程序接口,或API)建立一个请求,力图连接数据库。例如,客户可以发出以下命令: tkytelocalhost tkyte$ sqlplus scott/tigerora10g.localdomain SQL*Plus: Release .0 - Production on Sun Dec 19 16:16:41 2004 Copyright (c) 1982, 2004, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release .0 - Production With the Partitioning, OLAP and Data Mining options scottORA10G 这里,客户是程序SQL*Plus,scott/tiger为用户名/密码,ora10g.localdomain是一个TNS服务名。TNS代表透明网络底层(Transparent Network Substrate) ,这是Oracle客户中处理远程连接的“基础”软件,有了它才有可能建立对等通信。TNS连接串告诉Oracle软件如何与远程数据库连接。一般地,你的机器上运行的客户软件会读取一个 tnsnames.ora 文件。这是一个纯文本的配置文件,通常放在 ORACLE_HOMEnetworkadmin 目录下(ORACLE_HOME 表示Oracle安装目录的完整路径) 。如果有以下配置: ORA10G.LOCALDOMAIN = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = ora10g) ) 根据这个配置信息,Oracle 客户软件可以把我们使用的 TNS 连接串 ora10g.localdomain 映射到某些有用的信息,也就是主机名、该主机上“监听器”进程接受(监听)连接的端口、该主机上所连接数据库的服务名,等等。服务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论