OracleRedolog并行机制详解
Oracle的数据库日志称为Redo log 所有数据改变都记录Redo log 可以用于修复受损的数据库 Redo log 是用于恢复和一个高级特性的重要数据 一个redo条目包含了相应操作导致的数据库变化的所有信息 所有redo条目最终都要被写入redo文件中去
Redo log buffer是为了避免Redo文件IO导致性能瓶颈而在sga中分配出的一块内存 一个redo条目首先在用户内存(PGA)中产生 然后由oracle服务进程拷贝到log buffer中 当满足一定条件时 再由LGWR进程写入redo文件 由于log buffer是一块 共享 内存 为了避免冲突 它是受到redo allocation latch保护的 每个服务进程需要先获取到该latch才能分配redo buffer 因此在高并发且数据修改频繁的oltp系统中 我们通常可以观察到redo allocation latch的等待 Redo写入redo buffer的整个过程如下
在PGA中生产Redo Enrey > 服务进程获取Redo Copy latch(存在多个 CPU_COUNT ) > 服务进程获取redo allocation latch(仅 个) > 分配log buffer > 释放redo allocation latch > 将Redo Entry写入Log Buffer > 释放Redo Copy latch;
shared strand
为了减少redo allocation latch等待 在oracle 中 引入了log buffer的并行机制 其基本原理就是 将log buffer划分为多个小的buffer 这些小的buffer被成为strand(为了和之后出现的private strand区别 它们被称之为shared strand) 每一个strand受到一个单独redo allocation latch的保护 多个shared strand的出现 使原来序列化的redo buffer分配变成了并行的过程 从而减少了redo allocation latch等待
shared strand的初始数据量是由参数log_paralleli 控制的;在 g中 该参数成为隐含参数 并新增参数_log_paralleli _max控制shared strand的最大数量;_log_paralleli _dynamic则控制是否允许shared strand数量在_log_paralleli 和_log_paralleli _max之间动态变化
HELLODBA >select nam ksppinm val KSPPSTVL nam ksppdesc
from sys x$ksppi nam
sys x$ksppsv val
where nam indx = val indx
AND nam ksppinm LIKE _%
AND upper(nam ksppinm) LIKE %LOG_PARALLE% ;
KSPPINM KSPPSTVL KSPPDESC
_log_paralleli Number of log buffer strands
_log_paralleli _max Maximum number of log buffer strands
_log_paralleli _dynamic TRUE Enable dynamic strands
每一个shared strand的大小 = log_buffer/(shared strand数量) strand信息可以由表x$kcrfstrand查到(包含shared strand和后面介绍的private strand g以后存在)
HELLODBA >select indx strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa != ;
INDX STRAND_SIZE_KCRFA
HELLODBA >show parameter log_buffer
NAME TYPE VALUE
log_buffer integer
关于shared strand的数量设置 个cpu之内最大默认为 当系统中存在redo allocation latch等待时 每增加 个cpu可以考虑增加 个strand 最大不应该超过 并且_log_paralleli _max不允许大于cpu_count
注意 在 g中 参数_log_paralleli 被取消 shared strand数量由_log_paralleli _max _log_paralleli _dynamic和cpu_count控制
Private strand
为了进一步降低redo buffer冲突 在 g中引入了新的strand机制 Private strand Private strand不是从log buffer中划分的 而是在shared pool中分配的一块内存空间
HELLODBA >select from V$sgastat where name like %strand% ;
POOL NAME BYTES
shared pool private strands
HELLODBA >select indx strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa = ;
INDX STRAND_SIZE_KCRFA
Private strand的引入为Oracle的Redo/Undo机制带来很大的变化 每一个Private strand受到一个单独的redo allocation latch保护 每个Private strand作为 私有的 strand只会服务于一个活动事务 获取到了Private strand的用户事务不是在PGA中而是在Private strand生成Redo 当flush private strand或者mit时 Private strand被批量写入log文件中 如果新事务申请不到Private strand的redo allocation latch 则会继续遵循旧的redo buffer机制 申请写入shared strand中 事务是否使用Private strand 可以由x$ktcxb的字段ktcxbflg的新增的第 位鉴定
HELLODBA >select decode(bitand(ktcxbflg ) ) used_private_strand count()
from x$ktcxb
where bitand(ksspaflg ) !=
and bitand(ktcxbflg ) !=
group by bitand(ktcxbflg );
USED_PRIVATE_STRAND COUNT()
对于使用Private strand的事务 无需先申请Redo Copy Latch 也无需申请Shared Strand的redo allocation latch 而是flush或mit是批量写入磁盘 因此减少了Redo Copy Latch和redo allocation latch申请/释放次数 也减少了这些latch的等待 从而降低了CPU的负荷 过程如下
事务开始 > 申请Private strand的redo allocation latch (申请失败则申请Shared Strand的redo allocation latch) > 在Private strand中生产Redo Enrey > Flush/Commit > 申请Redo Copy Latch > 服务进程将Redo Entry批量写入Log File > 释放Redo Copy Latch > 释放Private strand的redo allocation latch
注意 对于未能获取到Private strand的redo allocation latch的事务 在事务结束前 即使已经有其它事务释放了Private strand 也不会再申请Private strand了
每个Private strand的大小为 K g中 shared pool中的Private strands的大小就是活跃会话数乘以 K 而 g中 在shared pool中需要为每个Private strand额外分配 k的管理空间 即 数量 k
g:
SQL> select from V$sgastat where name like %strand% ;
POOL NAME BYTES
shared pool private strands
HELLODBA >select trunc(value KSPPSTVL / )
from (select value from v$parameter where name = transactions ) a
(select val KSPPSTVL
from sys x$ksppi nam sys x$ksppsv val
where nam indx = val indx
AND nam ksppinm = _log_private_paralleli _mul ) b;
TRUNC(VALUEKSPPSTVL/ )
g:
HELLODBA >select from V$sgastat where name like %strand% ;
POOL NAME BYTES
shared pool private strands
HELLODBA >select trunc(value KSPPSTVL / ) ( + )
from (select value from v$parameter where name = transactions ) a
(select val KSPPSTVL
from sys x$ksppi nam sys x$ksppsv val
where nam indx = val indx
AND nam ksppinm = _log_private_paralleli _mul ) b;
TRUNC(VALUEKSPPSTVL/ )( + )
Private strand的数量受到 个方面的影响 logfile的大小和活跃事务数量
参数_log_private_mul指定了使用多少logfile空间预分配给Private strand 默认为 我们可以根据当前logfile的大小(要除去预分配给log buffer的空间)计算出这一约束条件下能够预分配多少个Private strand
HELLODBA >select bytes from v$log where status = CURRENT ;
BYTES
HELLODBA >select trunc(((select bytes from v$log where status = CURRENT ) (select to_number(value) from v$parameter where name = log_buffer ))
(select to_number(val KSPPSTVL)
from sys x$ksppi nam sys x$ksppsv val
where nam indx = val indx
AND nam ksppinm = _log_private_mul ) / / )
as calculated private strands
from dual;
calculated private strands
HELLODBA >select count( ) actual private strands from x$kcrfstrand where last_buf_kcrfa = ;
actual private strands
当logfile切换后(和checkpoint一样 切换之前必须要将所有Private strand的内容flush到logfile中 因此我们在alert log中可能会发现日志切换信息之前会有这样的信息 Private strand flush not plete 这是可以被忽略的) 会重新根据切换后的logfile的大小计算对Private strand的限制
HELLODBA >alter system switch logfile;
System altered
HELLODBA >select bytes from v$log where status = CURRENT ;
BYTES
HELLODBA >select trunc(((select bytes from v$log where status = CURRENT ) (select to_number(value) from v$parameter where name = log_buffer ))
(select to_number(val KSPPSTVL)
from sys x$ksppi nam sys x$ksppsv val
where nam indx = val indx
AND nam ksppinm = _log_private_mul ) / / )
as calculated private strands
from dual;
calculated private strands
HELLODBA >select count( ) actual private strands from x$kcrfstrand where last_buf_kcrfa = ;
actual private strands
参数_log_private_paralleli _mul用于推算活跃事务数量在最大事务数量中的百分比 默认为 Private strand的数量不能大于活跃事务的数量
HELLODBA >show parameter transactions
NAME TYPE VALUE
transactions integer
transactions_per_rollback_segment integer
HELLODBA >select trunc((select to_number(value) from v$parameter where name = transactions )
(select to_number(val KSPPSTVL)
from sys x$ksppi nam sys x$ksppsv val
where nam indx = val indx
AND nam ksppinm = _log_private_paralleli _mul ) / )
as calculated private strands
from dual;
calculated private strands
HELLODBA >select count( ) actual private strands from x$kcrfstrand where last_buf_kcrfa = ;
actual private strands
注 在预分配Private strand时 会选择上述 个条件限制下最小一个数量 但相应的shared pool的内存分配和redo allocation latch的数量是按照活跃事务数预分配的
lishixinzhi/Article/program/Oracle/201311/16501
1977年6月,Larry Ellison与Bob Miner和Ed Oates在硅谷共同创办了一家名为软件开发实验室(Software Development Laboratories,SDL)的计算机公司(ORACLE公司的前身)。那个时候,32岁的Larry Ellison,这个读了三家大学都没能毕业的辍学生,还只是一个普通的软件工程师。公司创立之初,Miner是总裁,Oates为副总裁,而Ellison,因为一个合同的事情,还在另一家公司上班。没多久,第一位员工Bruce Scott(用过ORACLE数据库软件的人都知道有个Scott用户的吧?没错,就是这个Scott,至于Scott用户的密码Tiger,那是Scott养的猫的名字, Oracle也一直没有忘记她的第一位程序员)加盟进来,在Miner和Oates有些厌倦了那种合同式的开发工作后,他们决定开发通用软件,不过们还不知道自己能开发出来什么样的产品。Oates最先看到了埃德加 考特的那篇著名的论文连同其他几篇相关的文章并推荐Ellison和Miner也阅读一下。Ellison和Miner预见到数据库软件的巨大潜力(跟着IBM走,没错),于是,SDL开始策划构建可商用的关系型数据库管理系统(RDBMS)。
根据Ellison和Miner他们在前一家公司从事的一个由中央情报局投资的项目代码,他们把这个产品命名为ORACLE。因为他们相信,ORACLE(字典里的解释有“神谕, 预言”之意)是一切智慧的源泉。1979年,SDL更名为关系软件有限公司(Relational Software,Inc,RSI),毕竟“软件开发实验室”不太像一个大公司的名字。1983年,为了突出公司的核心产品,RSI再次更名为ORACLE。Oracle从此正式走入人们的视野。
RSI在1979年的夏季发布了可用于DEC公司的PDP-11计算机上的商用ORACLE产品,这个数据库产品整合了比较完整的SQL实现,其中包括子查询、连接及其他特性。出于市场策略,公司宣称这是该产品的第二版,但却是实际上的第一版。这就是Oracle这种“要命”的市场策略,事实上,这种策略有时候也是非常成功的。
1983年3月,RSI发布了ORACLE第三版。Miner和Scott历尽艰辛用C语言重新写就这一版本。(说老实话,太佩服这两个大牛了,为什么一直没多少媒体宣传这两个人呢,怀疑Miner简直就是“少林老僧”般的人物。)要知道,C语言当时推出不久,用它来写ORACLE软件也是具有一定的风险的,但除此之外,别无他法。很快就证明了这样做是多么的正确:C编译器便宜而又有效,还有很好的移植性。从现在起,ORACLE产品有了一个关键的特性:[可移植性]。同样是1983年,IBM发布了姗姗来迟的Database 2(DB2),但只可在MVS上使用。不管怎么说,ORACLE已经占取了先机。
在开发第三版还没有结束的时候,Scott离开了ORACLE。当时用C语言改写ORACLE的压力很大,无休止的软件调试终于让Scott不堪重负,选择了一走了之。把剩下的重担交给了Miner一个人。在出售了自己的%4的股票之后,Scott 后来创建了Gupta公司(现更名为Centura Software)和PointBase公司(提供百分之百纯Java嵌入式数据库),都是开发和数据库相关的产品。多年后有人问到他的%4的ORACLE股票的时候,Scott,这个曾经给ORACLE写出第一行代码的技术高手,也只能报以一笑了。如果能坚持下来,那是一笔几亿美金的财富。不过当时的Scott没有那么多的想法,他只是太累了。
很长一段时间里,公司研发由Miner独力承担。Miner视金钱如无物,为人低调,和Ellison的锋芒必露形成鲜明的对比。在公司里,大家一致认为他是老好人,他也深受员工爱戴。Ellison是公司的大脑,Miner则当之无愧的成为公司的心脏。他是个沉默的英雄,正如Steve Jobs背后的Steve Wozniak一样。
1984年10月,ORACLE发布了第4版产品。产品的稳定性总算得到了得到了一定的增强,用Miner的话说,达到了“工业强度”。
在1985年,ORACLE发布了50版。有用户说,这个版本算得上是ORACLE数据库的稳定版本。这也是首批可以在Client/Server模式下运行的的RDBMS产品,在技术趋势上,ORACLE数据库始终没有落后。
那是在1985年,当时曾经的最大的独立软件公司Cullinet(主要销售网状数据库)已经如流星般陨落。ORACLE的主要竞争对手是Ingres数据库。Ingres在加州大学伯克利分校诞生,主要的设计者是当时鼎鼎大名的Michael Stonebraker教授。可以说Ingres数据库软件是上个世纪80年代技术上最好的数据库,Ingres市场分额的快速增长已经给ORACLE早成了很大的压力。巧的是,这个时候,IBM公司再一次伸出“上帝之手”。
Ingres使用的是Stonebraker 发明的QUEL(Query Language))的查询技术,这和IBM的SQL大不相同。在某些地方QUEL甚至要优于SQL。IBM当时担心Ingres把QUEL变成标准会对自己不利。经过一番衡量,决定把自己的SQL提交给数据库标准委员会。而Stonebraker教授可不打算把QUEL提交给数据库标准委员会,学院派的他认为这麽做实际上是扼杀了创新精神。可以看出,学院派,大都会把事情搞杂。
1986年3月12日,ORACLE公司以每股15美元公开上市,当日以2075美元收盘,公司市值27亿美元。3月13日,微软以每股21美元的发行价上市,以28美元收市,公司市值达到7亿美元。远远超过了ORACLE。成功的光环的微软和盖茨遮盖住了ORACLE和Ellison的光芒,可能这也是Ellison敌视微软的开始。
ORACLE第6版于1988年发布。由于过去的版本在性能上屡受诟病,Miner带领着工程师对数据库核心进行了重新的改写。引入了行级锁(row-level locking)这个重要的特性,也就是说,执行写入的事务处理只锁定受影响的行,而不是整个表。这个版本引入了还算不上完善的PL/SQL(Procedural Language extension to SQL)语言。第6版还引入了联机热备份功能,使数据库能够在使用过程中创建联机的备份,这极大地增强了可用性。
在第六版刚发布之后,很多迫不及待开始使用的用户就怨声载道。这是个根本就没有测试好就进行发布的产品(也怪Ellison,大话总要说在前头,只好自尝苦果)。用户开始对ORACLE大肆抨击,ORACLE的一些对手也开始落井下石,针对ORACLE产品的一些弱点进行攻击。
噩梦延续到ORACLE第七版的推出而结束。这个公司已经空谈了好几年的新版本(一度被讥讽为不过是Ellison的故计重施而已),直到1992年6月才终于闪亮登场,这一次公司吸取了第六版匆忙上市的教训,听取了用户的多方面的建议,并集中力量对新版本进行了大量而细致的测试。该版本增加了许多新的性能特性:分布式事务处理功能、增强的管理功能、用于应用程序开发的新工具以及安全性方法。
ORACLE 第七版是ORACLE真正出色的产品,取得了巨大的成功。这个版本的出现真是好时机,当时Sybase公司的数据库已经占据了不少份额,ORACLE借助这一版本的成功,一具击退了咄咄逼人的Sybase。公司的销售人员这次算到了给用户兑现空头许诺的时候。公司经过两三年的治理,终于摆脱了种种麻烦,重新开始健康发展,销售额也从92年的15亿美元变为四年后的42亿美元。
1997年6月,ORACLE第八版发布。ORACLE8支持面向对象的开发及新的多媒体应用,这个版本也为支持Internet、网络计算等奠定了基础。同时这一版本开始具有同时处理大量用户和海量数据的特性。
1998年9月,ORACLE公司正式发布ORACLE 8i。“i”代表Internet,这一版本中添加了大量为支持Internet而设计的特性。这一版本为数据库用户提供了全方位的Java支持。ORACLE 8i成为第一个完全整合了本地Java运行时环境的数据库,用Java就可以编写ORACLE的存储过程。对,Java,只要是能够打击微软的武器,ORACLE都要派上用场。
在2001年6月的ORACLE OpenWorld大会中,ORACLE发布了ORACLE 9i。在ORACLE 9i的诸多新特性中,最重要的就是Real Application Clusters(RAC)了。说起ORACLE集群服务器,早在第五版的时候,ORACLE就开始开发ORACLE并行服务器(ORACLE Parallel Server ,OPS),并在以后的版本中逐渐的完善了其功能,不过,严格来说,尽管OPS算得上是个集群环境,但是并没有体现出集群技术应有的优点。
2003年9月8日,旧金山举办的ORACLE World大会上,Ellison宣布下一代数据库产品为“ORACLE 10g”。ORACLE应用服务器10g(ORACLE Application Server 10g)也将作为甲骨文公司下一代应用基础架构软件集成套件。“g”代表“grid ,网格”。这一版的最大的特性就是加入了网格计算的功能。(Oracle绝对是造概念的能手,只要是能引领出新的卖点,出些新概念,也是值得的)。
最近两年,Oracle先后又收购了People soft(103亿$), BEA(80多亿$),还有Sibel之类的就不说了。通过收购,实力大增。
2007年11月,Oracle 11g正式发布,功能上大大加强。11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Information Lifecycle Management)等多项创新。大幅提高了系统性能安全性,全新的Data Guard最大化了可用性,利用全新的高级数据压缩技术降低了数据存储的支出,明显缩短了应用程序测试环境部署及分析测试结果所花费的时间,增加了RFID Tag、DICOM医学图像、3D空间等重要数据类型的支持,加强了对Binary XML的支持和性能优化。
从Oracle的发展来看,它的市场策略直接引导着公司的发展。与别的公司有很大的不同。
数据库名、实例名、数据库域名、全局数据库名、服务名 ,\x0d\这是几个令很多初学者容易混淆的概念。相信很多初学者都与我一样被标题上这些个概念搞得一头雾水。我们现在就来把它们弄个明白。 \x0d\\x0d\一、数据库名\x0d\什么是数据库名?\x0d\数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下:\x0d\DB_NAME=myorcl\x0d\\x0d\在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。\x0d\\x0d\数据库名的作用\x0d\数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。\x0d\有很多Oracle安装文件目录是与数据库名相关的,如:\x0d\winnt: d:\oracle\product\1010\oradata\DB_NAME\\x0d\Unix: /home/app/oracle/product/1010/oradata/DB_NAME/\x0d\pfile:\x0d\winnt: d:\oracle\product\1010\admin\DB_NAME\pfile\iniora\x0d\Unix: /home/app/oracle/product/1010/admin/DB_NAME/pfile/init$ORACLE_SIDora\x0d\跟踪文件目录:\x0d\winnt: /home/app/oracle/product/1010/admin/DB_NAME/bdump/\x0d\另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。\x0d\同样,修改数据库结构的语句alter database, 当然也要指出要修改的数据库的名称。\x0d\如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。\x0d\还有在备份或恢复数据库时,都需要用到数据库名。\x0d\总之,数据库名很重要,要准确理解它的作用。\x0d\\x0d\查询当前数据名\x0d\方法一:select name from v$database;\x0d\方法二:show parameter db\x0d\方法三:查看参数文件。\x0d\\x0d\修改数据库名\x0d\前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:\x0d\1关闭数据库。\x0d\2修改数据库参数文件中的DB_NAME参数的值为新的数据库名。\x0d\3以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)\x0d\\x0d\二、数据库实例名\x0d\什么是数据库实例名?\x0d\数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。\x0d\数据库名和实例名可以相同也可以不同。\x0d\在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。\x0d\\x0d\查询当前数据库实例名\x0d\方法一:select instance_name from v$instance;\x0d\方法二:show parameter instance\x0d\方法三:在参数文件中查询。\x0d\\x0d\数据库实例名与ORACLE_SID\x0d\虽然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变量。 ORACLD_SID用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过ORACLE_SID。在winnt不台, ORACLE_SID还需存在于注册表中。\x0d\且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。\x0d\\x0d\数据库实例名与网络连接\x0d\数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来说明 。\x0d\\x0d\三、数据库域名\x0d\什么是数据库域名?\x0d\在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如:\x0d\全国交通运政系统的分布式数据库,其中:\x0d\福建节点: fjjtyz\x0d\福建厦门节点: xmfjjtyz\x0d\江西: jxjtyz\x0d\江西上饶:srjxjtyz\x0d\这就是数据库域名。\x0d\数据库域名在存在于参数文件中,他的参数是db_domain\x0d\\x0d\查询数据库域名\x0d\方法一:select value from v$parameter where name = 'db_domain';\x0d\方法二:show parameter domain\x0d\方法三:在参数文件中查询。\x0d\\x0d\全局数据库名\x0d\全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradbfjjtyz\x0d\\x0d\四、数据库服务名\x0d\什么是数据库服务名?\x0d\从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。\x0d\如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。\x0d\\x0d\查询数据库服务名\x0d\方法一:select value from v$parameter where name = 'service_name';\x0d\方法二:show parameter service_name\x0d\方法三:在参数文件中查询。\x0d\\x0d\数据库服务名与网络连接\x0d\从oracle8i开如的oracle网络组件,数据库与客户端的连接主机串使用数据库服务名。之前用的是ORACLE_SID,即数据库实例名\x0d\\x0d\创建Oracle数据库(以Oracle10g为例)\x0d\\x0d\有两种创建数据库的方式,一种是以命令行脚本方式,即手动方式创建;另一种是利用Oracle提供的数据库配置向导来创建。本篇主要介绍在Unix和Windows下以命令行脚本方式创建Oracle数据库。\x0d\\x0d\ 一个完整的数据库系统,应包括一个物理结构、一个逻辑结构、一个内存结构和一个进程结构,如果要创建一个新的数据库,则这些结构都必须完整的建立起来
0条评论