Oracle实例剖析三篇

2024-07-07

Oracle实例剖析 篇1

Oracle数据库都是由Oracle实例 (Instance) 与数据库 (数据文件, 控制文件、重做日志文件) 组成。在服务器中, 每一个运行的Oracle数据库都与一个数据库实例相联系, 实例是访问数据库的手段。Oracle数据库的总体结构如图1所示。

实例在操作系统中用ORACLE_SID来标识, 在Oracle中用参数INSTANCE_NAME来标识, 它们的值相同。数据库启动时, 系统首先在内存中分配系统全局区 (SGA) , 构成了Oracle的内存结构, 然后启动若干个常驻内存的操作系统进程, 构成了Oracle的进程结构, 内存区域和后台进程合称为一个Oracle实例。

数据库与实例之间是1:1或是1:n的关系, 在非并行的数据库系统中每个Oracle数据库与一个实例相对应;在并行的数据库系统中, 一个数据库会对应多个实例, 同一时间用户只与一个实例相联系, 当某一个实例出现故障时, 其它实例自动服务, 保证数据库正常运行。在任何情况下, 每个实例都只可以对应一个数据库。

2 Oracle实例的内存结构

Oracle的内存与实例对应, 即一个实例就有一个独立的内存结构。从总体上讲, Oracle的内存分为两大块:系统全局区域 (System Global Area, SGA) 和程序全局区 (Program Global Area, PGA) 。

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

系统全局区域是一组包含一个Oracle实例的数据和控制信息的共享内存结构。一个SGA只服务于一个实例, 当一台机器上有多个实例运行时, 每个实例都有一个自己的SGA, 实例之间不能相互访问对方的SGA区。

当数据库实例启动时, SGA的内存被自动分配;当数据库实例关闭时, SGA内存被回收。SGA是占用内存最大的一个区域, 同时也是影响数据库性能的重要因素。

SGA分为共享池、数据缓冲区、重做日志缓冲区和其它一些结构。

2.1.1 共享池 (Shared Pool)

共享池是SGA中最关键的内存片段, 特别是在性能和可伸缩性上, 一个太小的共享池会扼杀性能, 使系统停止, 太大的共享池也会有同样的效果, 将会消耗大量的CPU来管理这个共享池。

共享池主要又可以细分为SQL语句缓冲区 (Library Cache) 和数据字典缓冲区 (Data Dictionary Cache) 。

2.1.2 数据缓冲区 (Database Buffer Cache)

如果每次执行一个操作时, Oracle都必须从磁盘读取所有数据块, 并在改变它之后又必须把每一块写入磁盘, 显然效率会非常低。数据缓冲区存放需要经常访问的数据, 供所有用户使用。修改数据时, 首先从数据文件中取出数据, 存储在数据缓冲区中, 数据缓冲区的大小对数据库的存取速度有直接影响, 特别是在多用户状态时尤为明显。

在这个数据缓冲区里没有系统文件, 用户数据文件, 临时数据文件, 回滚段文件之分。即任何文件的数据块都有可能被缓冲。

数据库的任何修改都在该缓冲区里完成, 并由DBWR进程将修改后的数据写入磁盘。这个缓冲区的块基本上在两个不同的列表中管理。一个是块的脏表 (Dirty List) , 需要用数据库块的书写器 (DBWR) 来写入;另外一个是不脏的块的列表 (Free List) , 一般的情况下, 是使用最近最少使用 (Least Recently Used, LRU) 算法来管理。

块缓冲区高速缓存又可以细分为默认池 (Default Pool) 、持久池 (Keep Pool) 、大对象池 (Recycle Pool) 。ORACLE默认为Default Pool。

2.1.3 重做日志缓冲区 (Redo Log Buffer)

重做日志缓冲区是重做日志文件的缓冲区, 对数据库的任何修改都按顺序被记录在该缓冲, 然后由LGWR进程将它写入磁盘。这些修改信息可能是DML语句或DDL语句。

重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多, 所以重作日志缓冲区可以加快数据库的操作速度, 但是考虑到数据库的一致性与可恢复性, 数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小, 大于3M之后的重作日志缓冲区已经没有太大的实际意义。

2.2 程序全局区 (Program Global Area, PGA)

程序全局区是服务器后台进程所需的数据与控制信息的内存缓冲区。PGA是当服务器后台进程启动时由Server创建的。PGA中存储的信息由Oracle的配置情况决定。

PGA区包含单个服务器进程或单个后台进程的数据和控制信息, 与几个进程共享的SGA正相反PGA是只被一个进程使用的区域, 是在用户进程连接到Oracle数据库并创建一个会话时, 由Oracle自动分配的, 它是非共享区, 主要用于在编程时存储变量与数组。会话结束时, PGA被释放。

3 Oracle实例的进程结构

进程是操作系统中的一种机制, 它可执行一系列的操作。一个进程通常有它自己的专用存储区。Oracle进程的体系结构设计使其性能最大。

Oracle实例有两种类型:单进程实例和多进程实例。

单进程Oracle (又称单用户Oracle) 是一种数据库系统, 一个进程执行全部Oracle代码。由于Oracle部分和客户应用程序不能分别以进程执行, 所以Oracle的代码和用户的数据库应用是单个进程执行。在单进程环境下的Oracle实例, 仅允许一个用户可存取, 例如在MS-DOS上运行Oracle。

多进程Oracle实例 (又称多用户Oracle) 使用多个进程来执行Oracle的不同部分, 对于每一个连接的用户都有一个进程。

在多进程系统中, 进程分为两类:用户进程和Oracle进程。当用户运行应用程序时, 为用户运行的应用建立一个用户进程。

Oracle进程又分为两类:服务器进程和后台进程。服务器进程用于处理连接到该实例的用户进程的请求。当应用和O-racle是在同一台机器上运行, 而不再通过网络, 一般将用户进程和它相应的服务器进程组合成单个的进程, 可降低系统开销。然而, 当应用和Oracle运行在不同的机器上时, 用户进程经过一个分离服务器进程与Oracle通信。它可执行下列任务:对于用户发出的SQL语句进行语法分析、编译, 执行用户的SQL语句, 如是数据块不在数据缓冲区时, 则从磁盘数据文件将数据读入到SGA的共享数据缓冲区中, 将SQL语句的执行结果返回给应用程序。

系统为了使性能最好和协调多个用户, 在多进程系统中使用一些附加进程, 称为后台进程。在许多操作系统中, 后台进程是在实例启动时自动地建立。

一个Oracle实例可以有许多后台进程, 但它们不是一直存在。下面介绍各个后台进程。

(1) DBWR进程

DBWR (Database Writer) 进程将缓冲区中的数据写入数据文件, 负责数据缓冲区的管理。

当数据缓冲区中的一个数据被修改后, 被标记为“脏”, DBWR进程负责将“脏”数据写入磁盘。DBWR采用LRU算法来替换数据缓冲区中的数据。

在一个Oracle实例中, 允许启动多个DBWR进程, DBWR进程个数由参数DB_WRITE_PROCESSES指定, 上限为20, 进程名依次自动命名为:DBW0, DBW1, DBW2, ……, DBW19。

(2) LGWR进程

LGWR (Log Writer) 进程将日志数据从日志缓冲区中写入磁盘日志文件中。

每一个Oracle实例只有一个LGWR进程。

LGWR将日志信息同步的写入到日志文件组的多个日志成员中, 如果组中的一个成员文件被删除或不可使用, LGWR将日志信息继续写到该组的其它文件中, 不影响数据库运行。

(3) SMON进程

SMON (System Monitor) 进程在实例启动时执行实例恢复, 并负责清理不再使用的临时段。

(4) PMON进程

PMON (Process Monitor) 进程在服务器进程出现故障时执行进程恢复, 负责清理内存和释放该进程所使用的资源。

(5) ARCH进程

ARCH (Archive Process) 进程, 在日志存满时将日志信息写到磁盘或磁带, 用于介质失败时的恢复。

日志信息首先产生于日志缓冲区, 再由日志写入进程LGWR将日志数据写入日志文件组, 日志切换时, 由归档进程ARCH将日志数据从日志文件组中写入归档日志中。

在一个数据库实例中, 归档进程最多可以启动10个, 进程名依次自动命名为ARC0, ARC1, ARC2, …, ARC9。

(6) CKPT进程

CKPT (Check Point) 进程对全部数据库文件及控制文件的文件头的同步号进行修改, 以保证数据库的同步。

系统对于数据库的改变信息用系统改变号SCN表示, SCN也叫检验点号, 在日志中用CHECKPOINT_CHANGE#表示, 它是数据文件、日志文件、控制文件的同步依据, 同时存储在这3个中, 在系统改变时, 检验点号也会同时改变。

(7) RECO进程

RECO (Recover) 进程用于分布式数据库系统, RECO进程自动地解决在分布式数据库中的事务故障。

(8) LCKn进程

LCKn进程用于Oracle并行服务器环境下, 用于多个实例间的封锁, 该进程最多可以启动10个。

(9) Dnnn进程

Dnnn (Despatcher) 进程用于多线程服务器体系结构中。

(10) SNP进程

SNP是作业进程, 主要用于分布式数据库中, 进行数据库之间快照的自动刷新, 并同时通达DBMS_JOB程序包自动运行预定的存储过程, SQL, PL/Sql程序等。

摘要:Oracle数据库启动时, 系统首先在内存中分配系统全局区 (SGA) , 构成了Oracle的内存结构, 然后启动若干个常驻内存的操作系统进程, 构成了Oracle的进程结构, 内存区域和后台进程组成Oracle实例。

关键词:实例,Instance,系统全局区,SGA,程序全局区,PGA,Oracle进程

参考文献

[1] (美) SUMIT SARIN.Oracle数据库管理员技术指南[M].钟鸣, 译, 北京:机械工业出版社, 2001.

[2] (美) KEVIN LONEY, MARLENE THERIAULT.Oracle8i数据库管理员手册[M].李纪松, 译, 北京:机械工业出版社, 2001.

英译汉典型错误实例剖析 篇2

语法基础不扎实导致译文欠佳

语法能力是语言实践能力的前提,是把握和运用语言的先决条件,是分析句子结构和领会句子含义最根本、最有效的工具。如果语法基础不牢固或是对语法的理解有些片面,在翻译时,就会出现误解与误译。下面的几个例子就是由于对语法的理解过于片面、不够深刻而造成的。

1.It’s five months since he was ill.

【原译】他已经病了五个月了。

【评析】该句译错的几率极高,很多人会将其理解成:“他已经病了五个月了。”这样理解其实是错误的。而产生这种错误的主要原因是很多人不了解这样一个事实:当since作为连词接状语从句时,该状语从句中谓语动词的性质会影响句子表达的含义。如果since后的状语从句中的谓语动词是瞬间动词,我们可以按原句的字面意思来理解,例如,对于“It’s three hours since he left.”我们可以理解为:“他已经离开三个小时了。”因为从句中的“left”是瞬间动词。但是,如果since后接的状语从句的谓语动词是延续性动词,从句表达的意思与字面意思则是相反的,通常是指从句动作或状态的结束。请看下面两个例句:

It is two years since he lived in Beijing. (此处的“lived”是延续性动词)

他不在北京已经两年了。

All has changed since he was at home. (此处的“be at home”是延续性状态)

自他离开家以后,这里的一切都变了。

【改译】他的病已经好了五个月了。

2.He has left for five days.

【原译】他已经离开五天了。

【评析】原句看似简单,实则有一定难度。很多人认为原句是错误的,理由是里面的“left”是瞬间动词,后面不可以接表示“一段时间”的状语。这种理解是片面的。其实,这里的介词“for”是明确表示“要去多少天”,即“多少天以后回来”,因而,原句应该理解为:“他离开了,要过五天才回来。”又如:“He has come for five days.”应译为:“他已经来了,要住上五天。”

【改译】他已经离开了,要过五天才回来。

3.He loves her more than you.

【原译】他比你更爱她。

【评析】原句非常好理解。但这句话的难点在于其不仅可以理解为:“他比你更爱她。”而且可以理解为:“他爱她胜过他爱你。”因为这里的“you”既可以理解为主格用法,也可以理解为宾格用法。当将“you”理解为主格用法时,我们可以理解为:“他比你更爱她。”这时“you”后面省去了“do”或者 “love her”。当将“you”理解为宾格用法时,则“you”是“love”的宾语,原句相当于“He loves her more than he loves you.”翻译成中文为:“他爱她胜过爱你。”

【改译】①他比你更爱她。②他爱她胜过爱你。

4.Is he leaving at six or seven tomorrow morning?

【原译】他明天早上是六点还是七点离开?

【评析】很多人将原句理解为选择疑问句,所以才出现了上面的译文。然而,如果进一步思考,原句也可以理解为一般疑问句,这时的“six or seven”表示约数,因而此处也可以翻译成:“他是明天早上六七点钟离开吗?”如果在真实的语境中,我们可以通过说话者的语调来确定该句的意思:如果说话者说的是“Is he leaving at ↗six or ↘seven tomorrow morning?”(six处用升调,seven处用降调),我们要将这句话理解为选择疑问句;如果说话者说的是“Is he leaving at ↗six or ↗seven tomorrow morning?”(six和seven处都用升调),我们则要将其理解为一般疑问句。

【改译】①他明天早上是在六点还是七点离开?②他是明天早上六七点钟离开吗?

翻译技巧不熟悉导致译文欠佳

翻译实际上就是两种语言之间的“意义”转换,而不是字对字的转换。因此,在进行英译汉时,我们不但要领会英语原文表达的意义,翻译成汉语时还要做到表达准确、地道,符合汉语表达习惯。而要做到后者,我们必须熟练掌握一些翻译技巧,如正译、反译、选词、转换、增词、减词、拆句、合并、倒置、包孕、插入、重组和综合等技巧。否则,译文可能会走样,甚至无法传递原文的真实含义。以下笔者就列举几例因对翻译技巧不熟悉而造成翻译欠佳的实例。

反译法的应用

1. Are you OK?

【原译】你还好吗?

【评析】这句英语我们在英文电影中经常听到,一般来说,当某人生病、跌倒、受到碰撞等异常情况下,身边的人常会说这句话以示关心。在翻译这个句子时,我们可以根据汉语的表达习惯,翻译成:“你没事吧?”也就是说,将原文的肯定式疑问句转化成汉语中的否定式疑问句,以使译文更加地道,这便是所谓的“反译法”,即“正话反说”或“反话正说”。

【改译】你没事吧?

2.Only three customers remained in the bar.

【原译】只有三个顾客留在酒吧里。

【评析】上述翻译在意义上并没有差错。但是,考虑到汉语的习惯表达,这里我们也可以采取反译法,将其翻译成:“酒吧里只有三位顾客还没走。”反译后,译文的表达更加自然。

【改译】酒吧里只有三位客人还没走。

转换法的应用

3.There are two words “No Smoking” on the wall.

【原译】墙上有两个单词:禁止吸烟。/ 墙上有两个字:禁烟。

【评析】英文原句非常容易,但是有些译者在翻译时因不懂转换,从而出现了上述不妥的翻译。由于“No Smoking”翻译成中文是“禁止吸烟”四个字,因而我们在翻译英文中的“two words”时,要进行适当转换,使之符合汉语的习惯和逻辑。而少数译者为了顾及原文中的“two words”,将“No Smoking”翻译成“禁烟”,这也是错误的,因为“禁烟”与“禁止吸烟”的意思截然不同。由此可知,在进行英汉翻译时,我们不应受原文框架的束缚,而要根据汉语特点,大胆打破原文的字面意思,进行合理转换。

【改译】墙上有四个字:禁止吸烟。

4.His failure to answer questions made the police suspicious.

【原译】他回答问题的失败使得警察怀疑。

【评析】这句英语不难理解,若有难点的话,那就是如何使译文更地道。上面这句译文的最大问题就是过分忠实原文,因而显得极其生硬。这里如果我们采用“词性转换”的翻译技巧,将名词“failure”译成汉语中的否定副词“未能”,便会使译文流畅自然。

【改译】他未能回答出问题,这引起了警察的怀疑。

选词法的应用

5.Don’t cough more than you can help.

【原译】不要咳嗽超过你能控制的程度。

【评析】上述译文在意义表达方面基本接近原句含义,但是翻译腔极重,表达不够地道。翻译时,我们不能受到原文字面意思的约束,而要在理解原句含义的基础上,进行恰当的选词和转化,译成琅琅上口的汉语。

【改译】能不咳,就不咳。

6.He is the last man I want to see.

【原译】他是我想见的最后一个人。

【评析】对于大多数人来说,要理解原句的字面意思并不难。但如果我们直接译成字面意思,则让人难以理解。因此,翻译这句话时,要仔细斟酌,选择恰如其分的词语来表达,翻译时既要使语气准确,也要使意义到位。

【改译】他是我最不想见的人。/我见谁都不想见他。

拆译法的应用

7.He tried vainly to put the pieces together.

【原译】他徒劳地试图把碎片拼在一起。

【评析】上述译文虽然能够让人读明白,但是显得有些杂糅。如果我们在翻译时学会使用“拆译”的技巧,将修饰“try to put the pieces together”的副词“vainly”单独提出来翻译,则问题可以迎刃而解。

【改译】他想把这些碎片拼起来,结果白费力气。

8.She slept off a headache.

【原译】她利用睡眠消除了头痛。

【评析】“sleep off”的意思是“通过睡眠消除某种不舒服的状态,通过睡眠治好”。因而很多人将这句话直接翻译成:“她利用睡眠消除了头痛。”这样的译文显然不符合汉语习惯。而之所以有这样的译文,主要在于译者不懂翻译技巧,受原文形式的束缚,不敢打破原文的结构框架。原句中的“slept off a headache”其实包含两层含义:①她睡觉了;②她的头痛因此没有了。因而,我们可以采用“拆译”的技巧,将其译成:“她睡了一觉,头不痛了。”

【改译】她睡了一觉,头不痛了。

Oracle实例剖析 篇3

一般Oracle数据库(Oracle Database)可以分为两部分,即实例(Instance)和数据库(Database)。

实例:是一个非固定的、基于内存的基本进程与内存结构。当服务器关闭后,实例也就不存在了。

数据库(Database)指的是固定的、基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等。

一般情况下,Oracle数据库都是一个数据库对应一个实例。如下图所示。

当然可以根据需要创建多个数据库和对应的多个实例。

测试环境

Windows 7 旗舰版,32位操作系统,已经安装Oracle 11g R2,并创建一个数据库和实例ORAC11 Windows中安装的服务如下图所示。

创建新的数据库及对应的实例

打开Database Configuration Assistant

此警告页面不用管,后面可以重新配置。

连接不同的数据库实例

上一篇:校长准备项目下一篇:337条款