-
Oct27
cibadmin man手册
Posted in 系统管理, 高可用性, 617 views
-
cibadmin (8)
Name
cibadmin - 提供对群集配置的直接访问
大纲
允许查询、修改、替换和删除配置或配置的某些部分。
cibadmin (--query|-Q) -[Vrwlsmfbp] [-i xml-object-id|-o xml-object-type] [-t t-flag-whatever] [-h hostname]cibadmin (--create|-C) -[Vrwlsmfbp] [-X xml-string] [-x xml- filename] [-t t-flag-whatever] [-h hostname]cibadmin (--replace-R) -[Vrwlsmfbp] [-i xml-object-id| -o xml-object-type] [-X xml-string] [-x xml-filename] [-t t-flag- whatever] [-h hostname]cibadmin (--update|-U) -[Vrwlsmfbp] [-i xml-object-id| -o xml-object-type] [-X xml-string] [-x xml-filename] [-t t-flag- whatever] [-h hostname]cibadmin (--modify|-M) -[Vrwlsmfbp] [-i xml-object-id| -o xml-object-type] [-X xml-string] [-x xml-filename] [-t t-flag- whatever] [-h hostname]cibadmin (--delete|-D) -[Vrwlsmfbp] [-i xml-object-id| -o xml-object-type] [-t t-flag-whatever] [-h hostname]cibadmin (--delete_alt|-d) -[Vrwlsmfbp] -o xml-object-type [-X xml-string|-x xml-filename] [-t t-flag-whatever] [-h hostname]cibadmin --erase (-E)cibadmin --bump (-B)cibadmin --ismaster (-m)cibadmin --master (-w)cibadmin --slave (-r)cibadmin --sync (-S)cibadmin --help (-?)描述
cibadmin 是用于操作 Heartbeat CIB 的低级管理命令。它可以用来转储、更新或修改所有或部分 CIB,删除整个 CIB 或执行各种 CIB 管理操作。
cibadmin 在 CIB 的 XML 树上运行,基本上不清楚所执行的更新或查询的含义。这意味着对于理解 XML 树中的元素含义的人来说很常见的快捷方式无法用于 cibadmin。它在输入和输出时要求消除不明确性,并且只能处理有效的 XML 子树(标记和元素)。
注: 使用 cibadmin 应始终优先于手动编辑 cib.xml 文件,特别是在群集活动的情况下。群集会竭尽全力检测和阻止此做法,从而确保您的数据不会丢失或损坏。
选项
- --obj_type 对象类型,-o 对象类型
-
指定要操作的对象类型。有效值为 nodes、resources、constraints、crm_status 和 status。
- --verbose,-V
-
打开调试模式。附加的 -V 选项可增加输出的详细程度。
- --help,-?
-
从 cibadmin 获取安全消息。
- --xpath 指定路径,-A 指定路径
-
提供用于替换 obj_type 的有效 XPath。
命令
- --bump,-B
-
递增 CIB 中的 epoch 版本计数器。通常在选举新的领导节点时群集会自动增加该值。当您想废弃旧的配置(如不活动的群集节点上储存的配置)时,手动增加该值可能会有用。
- --create,-C
-
从自变量的 XML 内容创建新的 CIB。
- --delete,-D
-
删除与提供的准则匹配的第一个对象,例如,<op id="rsc1_op1" name="monitor"/>。 标记名称和所有属性必须匹配才能删除元素。
- --erase,-E
-
删除整个 CIB 的内容。
- --ismaster,-m
-
打印指示 CIB 软件的本地实例是否为主实例的消息。如果它是主实例,将退出并返回代码 0;如果不是,则返回代码 35。
- --modify,-M
-
在 CIB 的 XML 树中的某处找到对象并更新它。
- --query,-Q
-
查询 CIB 的一部分。
- --replace,-R
-
递归替换 CIB 中的 XML 对象。
- --sync,-S
-
强制所有节点与指定主机上的 CIB(如果使用 -h)或 DC(如果未使用 -h 选项)重新同步。
XML 数据
- --xml-text 字符串,-X 字符串
-
指定 crmadmin 应操作的 XML 标记或片段。它必须是完整的标记或 XML 片段。
- --xml-file 文件名,-x 文件名
-
从文件指定 cibadmin 应操作的 XML。它必须是完整的标记或 XML 片段。
- --xml_pipe,-p
-
指定 cibadmin 应操作的 XML 来自标准输入。它必须是完整的标记或 XML 片段。
高级选项
- --host 主机名,-h 主机名
-
将命令发送至指定的主机。仅适用于 query 和 sync 命令。
- --local,-l
-
使命令在本地生效(较少使用的高级选项)。
- --no-bcast,-b
-
即使命令改变了 CIB,也不会对它进行广播。
重要说明: 使用此选项时请小心,以避免导致群集分散。
- --sync-call,-s
-
返回前等待调用完成。
示例
要获取递送到 stdout 的整个活动 CIB(包含状态部分等)的副本,请发出以下命令:
cibadmin -Q
要向资源部分添加 IPaddr2 资源,首先要使用以下内容创建一个文件 foo:
<primitive id="R_10.10.10.101" class="ocf" type="IPaddr2" provider="heartbeat"> <instance_attributes id="RA_R_10.10.10.101"> <attributes> <nvpair id="R_ip_P_ip" name="ip" value="10.10.10.101"/> <nvpair id="R_ip_P_nic" name="nic" value="eth0"/> </attributes> </instance_attributes> </primitive>然后发出以下命令:
cibadmin --obj_type resources -U -x foo
要更改先前添加的 IPaddr2 资源的 IP 地址,请发出以下命令:
cibadmin -M -X '<nvpair id="R_ip_P_ip" name="ip" value="10.10.10.102"/>'
注: 此命令不会更改资源名称以匹配新的 IP 地址。要执行该操作,请先删除资源再重新添加带有新 ID 标记的资源。
要停止(禁用)先前添加的 IP 地址资源而不将它删除,请创建包含以下内容的名为 bar 的文件:
<primitive id="R_10.10.10.101"> <instance_attributes id="RA_R_10.10.10.101"> <attributes> <nvpair id="stop_R_10.10.10.101" name="target-role" value="Stopped"/> </attributes> </instance_attributes> </primitive>
然后发出以下命令:
cibadmin --obj_type resources -U -x bar
要重启动上一步中停止的 IP 地址资源,请发出以下命令:
cibadmin -D -X '<nvpair id="stop_R_10.10.10.101">'
要将此 IP 地址资源从 CIB 中彻底删除,请发出以下命令:
cibadmin -D -X '<primitive id="R_10.10.10.101"/>'
要将 CIB 替换为新的手动编辑版本,请使用以下命令:
cibadmin -R -x $HOME/cib.xml
文件数
/var/lib/heartbeat/crm/cib.xml— 磁盘上的 CIB(去除状态部分)。
另请参见
crm_resource (8),crmadmin (8),lrmadmin(8),heartbeat(8)
作者
cibadmin 由 Andrew Beekhof 编写。
此手册页最初由 Alan Robertson 编写。
警告
避免在本地磁盘上的 CIB 的自动维护副本中工作。当群集中的任何内容发生更改时,会更新 CIB。因此使用 CIB 的过期备份副本来传播配置更改可能会导致群集不一致。
用 Flock 浏览器 创建 -
No Comments » cib crm ha ha.cf heartbeat
-
Sep13
-
[本文转载自CSDN蒋涛的博客]
背景:这是我在98年应刘韧之邀在中国计算机报开设"环球IT英雄"陆续发表的文章,主要是介绍国际IT界知名人物,也许内容陈旧了一些,不过看看历史的故事吧.我的写作资料基本来自互联网,不过遗憾的是当时没有做引用记录.
埃里森在32岁以前他还一事无成, 读了三个大学,没得到一个学位文凭, 换了十几家公司,老婆也离他而去,开始创业时只有1200美元,却使得Oracle公司连续十二年销售额每年翻一翻,成为世界上第二大的软件公司,他拥有的Oracle是世界上最大的数据库软件公司. Ellison以不择手段的经营手腕和强力甚至欺骗的市场竞争,击败了一个又一个的对手, Ellison要打倒的最后一个目标就是软件帝国之王微软的比尔.盖茨。
Ellison 还以乐于享受,好勇斗狠,傲慢自大还有和漂亮女人交往而出名,在32岁以前他一事无成,二十年后成了硅谷首富。“读了三个大学,没得到一个学位文凭”
Ellison美国犹太人,俄罗斯移民,出生在1944年的曼哈顿,他的未婚妈妈只有19岁,Ellison由舅舅一家抚养,在芝加哥犹太区中下阶层长大,那时贫富的差别没有现在巨大。学生时代的Ellison并没有显示出成功的素质和成绩,在学校他非常孤僻,独来独往,不过却十分注意打扮和享受,在别的孩子还是由父母来理发时,他却请专业理发师打理。
1962 年Ellison高中毕业,进入Illinois 大学就读,二年级时离开了学校,商业周刊报导他离开的原因是因为平均成绩没有达到及格水平,但他却不置可否。过了一个夏天他进入Chicago 大学,同时还在Northwestern 大学学习, 虽然经历了三个大学,最终他没有得到任何大学文凭。
1966年Ellison离开家乡,来到加州的伯克莱,准备就读研究生,同时开始工作赚钱,他学习了电脑编程,主要是为IBM大型电脑开发,他并不想投身高科技,只不过想赚点生活费,他的工作是给一些大公司开发应用程序,那时的软件开发意味着:挂上磁带,备份数据,工作单调也没有挑战性,远不能和现在的程序员相比。
关于学位Ellison认为:“大学学位是有用的,我想每个人都应该去获得一个或者更多,但我在大学没有得到学位,我从来没有上过一堂计算机课,但我却成了程序员。我完全是从书本自学编程的。”“换了十几家公司,老婆也离他而去”
在伯克莱Ellison认识了主修中国历史的Adda Quinn.他们很快就结婚了。60年代的美国是动荡和巨变的时代,中东战争,越南战争...。Ellison 不停地更换工作,虽然挣钱不多(夫妇俩月收入合计1600美元),花钱却十分大方,他甚至借了三千美元购买一条34英尺的帆船同时还在分期付款购买另一条小帆船。Ellison 是一个完美主义者。他从来不操心帐单,Quinn却受够了,1974年他们离婚了,Ellison劝她说:“我会成为百万富翁的,如果你和我在一起,你可以得到你想要的任何东西。”,但Quinn却不相信,不过她最后也没有后悔自己的选择。
1973年Ellison在Amdahl工作, Amdahl是和IBM竞争的生产大型电脑的公司,有45%的股份是日本富士通的, Ellison所以有机会去日本出差,他被京都东方异国情调给迷住了,日本的禅学和文化给 Ellison 以深刻的影响,他成了一个日本文化艺术的终身爱好者。
离开Amdahl Ellison加入Ampex,这是硅谷一家生产影像设备的公司,在那里他认识了他一生中最重要的两个人:Bob Miner和Edward Oates. 他们一起研究如何有效存储读取海量的数字信息,Ellison转向了市场和销售工作,他们的项目最终失败了,Ellison将这归咎于公司管理不善,“我比公司的头们懂技术,也比他们懂市场,如果他们能经营公司,我也能。”
就在他们打算成立公司时,另外两个传奇式的公司也产生了,一个是苹果,一个是微软,虽然公司产品,理想,文化完全不同,但却有着同样成功的模式:创立者都是一个有梦想精神的技术企业家和一个技术天才,Bill Gates 有Paul Allen, Steve Jobs 有Steve Wozniak,
Larry Ellison 有Bob Miner.
1977年6月Ellison 他们三人合伙出资2000美元成立了软件开发研究公司,Ellison拥有60%的股份,Ellison占这么多股份是因为成立公司完全是由于Ellison的鼓动,而且他有一个40万美元的项目合同,这一年他32岁。
“好在经营软件公司不需要大量的资金,用点小钱就可以创业。所有伟大的软件公司都是这样开始的,也许不是所有的,但Microsoft和我们是的,我们比Microsoft资金更少,几乎一无所有。”“IBM犯了上百亿美元的错误”
1976年IBM研究人员发表了一篇里程碑的论文 “R系统:数据库关系理论”,介绍了关系数据库理论和查询语言SQL, Ellison非常仔细地阅读了这篇文章,被其内容震惊,这是第一次有人用全面一致的方案管理数据信息。作者Ted Codd十年前就发表了关系数据库理论,并在IBM研究机构开发原型,这个项目就是R系统,存取数据表的语言就是SQL,文章详细描述了他十年的研究成果和如何实现的方法,Ellison 看完后,敏锐意识到在这个研究基础上可以开发商用软件系统。
那时大多数人认为关系数据库不会有商业价值,因为速度太慢,不可能满足处理大规模数据或者大量用户存取数据,关系数据库理论上很漂亮而且易于使用,但不足就是太简单实现速度太慢。 Ellison认为这是他们的机会:他们决定开发通用商用数据库系统Oracle,这个名字来源于他们曾给中央情报局做过的项目名。不过也不是只有他们独家在行动,Berkeley大学也开始开发关系数据库系统Ingres.
IBM 却没有计划开发,为什么蓝色巨人放弃了这个价值上百亿的产品,原因有很多:IBM的研究人员大多是学术出身,他们最感兴趣的是理论,而不是推向市场的产品,从学术上看,研究成果应该公开,发表论文和演讲能使他们成名,为什么不呢?还有一个很主要的原因就是IBM当时有一个销售得还不错的层次数据库产品IMS,推出一个竞争性的产品会影响IMS的销售和人员工作,直到1985年IBM才发布了关系数据库DB2,Ellision那时已经成了千万富翁。
Ellison曾将IBM选择Microsoft的MS-DOS作为IBM-PC机 的操作系统比为:“世界企业经营历史上最严重的错误,价值超过了上千亿美元。”,IBM发表R系统论文,而且没有很快推出关系数据库产品的错误可能仅仅次之,Oracle的市值在1996年就达到了280亿."我需要的不仅仅是成功"
几个月后,他们就开发了Oracle 1.0,但这只不过是个玩具,除了完成简单关系查询不能做任何事情,他们需要花相当长的时间才能使Oracle有用,维持公司运转主要靠承接一些数据库管理项目和做顾问咨询工作。
Oracle数据库的头两个用户是美国中央情报局和海军情报所,他们使用完全不同的硬件和软件, 中央情报局用的是IBM大型机, 海军用VAX机,而Ellison和Miner开发Oracle用的是Digital的PDP机,这迫使他们作出了重要而关键的决定:新版本3.0全部用C语言开发,因为C语言是所有机器支持的,而且C编译器很便宜.
Ellison向客户宣称Oracle能运行在所有的机器上,事实上当然不可能,但这是非常聪明的市场策略,大型公司和机构都拥有各种类型的电脑和操作系统,他们愿意购买一种能通用的数据库。
Oracle的成功除了有IBM的友好帮助外,还要记上Digital的一份功劳。IBM向Ellison提供了关系数据库理论,DEC提供了表演的舞台:VAX电脑,VAX是历史上最成功的小型机.
Ellison和Miner都十分好战, "我需要的不仅仅是成功,所有其他人都必须失败.",虽然Ellison后来否认了他对新闻周刊记者说过的这段话,但这是他的一贯作风,既使是在工作之余的体育比赛中他也总要争取胜利, 他是相当不错的网球和棒球选手。为了胜利他可以不择手段,夸大其词和撒谎是家常便饭,Oracle的规模还很小,如果客户知道他们的实情—只有四五个程序员,根本就不会购买他们的产品。“出色的市场推销员”
早期的Oracle版本无法正常地工作,程序充满了错误,用户抱怨不断,但Ellison相信较早占领大块市场份额是最主要的,“当市场已建立好,你知道百事可乐要花多少钱才能夺得可口可乐1%的市场,非常非常昂贵。”IBM的作风大相径庭,如果用户不满意就不会推出新产品。Oracle直到1986年的5.0版本才是基本可靠运转的系统,不过有趣的是早期的用户并不在意损失金钱和数据,既使是中央情报局,也没有不高兴,他们需要的是技术的发展,而不仅是一个产品,Ellison能为他们描述产品将能达到的美好功能,虽然现在没有,但他们愿意支付费用。
Ellison的工作不只是推销产品,而且到处宣传关系数据库观念,他经常作的演讲标准题目是“关系数据技术的缺陷”,讲述关系数据库会出现的问题,然后介绍Oracle是如何解决的.另外一个推销技巧是别的产品只是讲述它们的功能,而Ellison当场就作演示,在电脑上输入一个关系查询,很快结果就出来了,虽然实际应用时情况会不同,但现场听众都印象深刻。Ellison不仅在作演示,而且在培训用户使用关系查询语言SQL. Ellison的成功不是作为一个技术专家而是市场推销专家。
"Oracle生逢其时,Ellison将市场放在第一位,其他所有的靠后,拥有普通技术和一流市场能力的公司总是打败了拥有一流技术和只有普通市场能力的公司",一位硅谷资深人士评论道。“你们都会成为百万富翁,我确信!”
Ellison经常向他的员工宣传只要采用他的市场策略,他们都会成为百万富翁,事实上早期的员工基本上都达到了这一目标。他的策略是销售产品时强调Oracle的三大特性:可移植性,和其他数据库产品特别是IBM的兼容性,支持广泛网络连接.这满足了用户的需要,虽然他们实际得到的比期望的要少,Ellison的对手攻击他总是销售气泡软件, 气泡软件指的是功能还未完成的软件产品,Microsoft也以此闻名。
Ellison的主要对手是Ingres,1984年Oracle的销售额是1270万美元,Ingres是900万美元,1985年两者销售额都翻了一倍以上,只是Ingres增长得更快,如果照此发展,Ingres将会超越对手,但这时蓝色巨人IBM又帮了Ellison一把.
1985年IBM发布了关系数据库DB2,采用了和Ingres不同的数据查询语言SQL, Ingres用的是QUEL, Ellison 抓住了市场机会,到处宣传Oracle和IBM的兼容性,结果从1985年到1990年虽然Ingres的销售额每年增长高于50%,但Oracle远远跑在了前面,每年增长率超过100%,SQL在1986年成为了正式工业标准,Ingres的老板简直无法相信Ellison的运气,但这正是Ellison的精明之处,“跟着蓝色巨人,永远不会错。”
IBM确立SQL的标准是Oracle成功的关键,但数据库的战争远未结束.Sybase和Informix也加入了竞争的行列.“我的目标是杀死对手”
Ingres犯了一个致命的错误就是很晚才开发PC机上的版本,而Ellison和Bill Gates一样看都到了PC的巨大潜力,Oracle很快就有了一个PC机上的廉价版本,但它几乎没有任何用处,可是Ellison和销售人员却有了有力的宣传武器:Oracle能运行在PC机上,Ingres不能。
Ellison听说Ingres发明了一种新技术:分布式查询,十天后Oracle就刊登广告宣布了SQL之星:第一个分布式查询数据库,事实上没有任何这样产品。Ellison就是这样,想象产品应该怎样,然后再才去实现,如果成功了,他是成功的预言家,失败了,他就是骗子。
1986年Oracle股票公开上市,不过很令人费解的是上市前几天Ellison解雇了他的销售主管Seashols, Seashols接着跳槽到了Oracle的老对手Ingres,不过已经太迟了,战争已经结束了。Ingres是一个学术化的公司,只注重技术而不关心市场,注定是要失败的。
Oracle的上市给Ellison带来了9300万美元的身家,Microsoft在第二天也公开上市,Microsoft和Oracle在同一年成立,Bill Gates拥有的股票价值超过了3亿美元,Ellison这时发现了他一生中最强大的对手.
1988年Oracle 推出了6.0版本,这是当时功能最强大的产品,不过它的匆忙上市对公司简直是一场灾难,使用6.0的最初用户都遭遇了频繁死机和数据库毁坏,直到6.0.27版本,产品质量才基本稳定,这表示6.0版本经过了27次大的修改.
既然这样,用户为什么不选择其他的产品呢?主要原因是如果用户选择其他厂商的产品,他们就得重写所有应用程序,这是非常巨大的工作量,所以一旦选用了某种数据库平台进行开发,你就得依赖它。“遭遇危机”
Oracle从1977年创立到1990年,销售额保持了每年高于100%的增长,高增长的同时也潜伏着巨大的隐患,公司的财务和销售管理十分混乱,销售人员为了完成任务得到提成,大量签订无法收款的合同,甚至有人弄虚作假,合同执行情况也无人过问,现金流量是负值,Ellison高薪聘请了有经验的管理人员开始整顿公司,1990年第三财政季度有1500万美元的销售合同无法执行,结果季度销售额虽然达到创记录的2.36亿美元,但利润只增长了1%。消息公布第二天Oracle的股票从25.38元跌到了17.5元,损失了30%的市值。为度过危机Oracle解雇了10%的员工,在以后的两个季度情况变得更糟,股票在10月底的收盘价只有5.38美元,在春天Ellison还拥有的价值近10亿的股票在11月只剩下了1.6亿美元。
Ellison勇敢地接受了挑战,他没有卖掉自己的股票。公司开始改进销售和财务的管理,保持足够的现金流量,销售合同必须得到确认,这些普通公司的做法就起了很大的作用,但公司的增长率减慢了,这是Ellison原来不愿采用这些做法的真正原因。91年和92年的销售额增长率只有12%和15%。
Ellison将希望寄托于Oracle 7.0,这个公司已经谈论了好几年的新版本,直到1992年6月才终于登场,吸取6.0匆忙上市的教训在10个月前发布过Alpha测试版,Oracle 7.0是极为出色的产品,取得了巨大的成功,Ellison的销售队伍有了真正的王牌,销售额从92年的15亿美元增长到95年的42亿。
公司也开始有了成熟的管理方式,耐心听取用户的意见并满足他们的需求,Oracle原来从来没这么做过,有个Oracle对待客户的典型事件,一个客户打电话抱怨Oracle数据库死机并毁坏了他的数据,技术支持工程师的回答是:“无赖,一点用都没有.”这种情况再也不会出现了,客户必须得到一流的服务。“改变世界的网络计算机”
Ellison现在不再负责日常工作,只是规划Oracle未来的发展方向.闲暇之余驾驶长达78英尺的“莎扬娜那”号出海兜风,在1995年他曾经夺得悉尼帆船比赛的冠军。
信息高速公路吸引了Ellison的注意,他是克林顿总统最大的赞助商之一。他曾极力推动交互式电视和顶式盒的发展,不久他就发现了更迷人的机会:WWW环球网,Netscape的浏览器将WWW网推向了全世界,PC机的性能将不再是主角,连上Internet网才是价值所在。
Ellison在1995年巴黎举行的欧洲信息技术论坛会议上,介绍了网络计算机Network Computer的观念,所谓NC指的是配置简单却能充分利用网络资源的低价电脑,不需要不断更新的硬件设备和越来越复杂,庞大的操作系统,没有软盘和硬盘,只要打开电源用浏览器连上网络,就可以获得信息和存储文件,售价将不高于500美元。Ellison这一次将他的标靶瞄上了软件帝国Microsoft.“Oracle将只会做一件事情,我们管理海量的数据并通过网络提供这些数据。”
网络计算机的背后就是强大的网络服务器,所有数据和应用程序都存储在服务器的数据库中,Oracle的数据库技术将使网络计算机非常容易操作管理.Gates紧接着Ellison 发言,他认为网络计算机没有任何价值,只是大型机哑终端的翻版.但这一天的胜利是属于Ellison的,网络计算机的报道出现在所有报刊的主要版面上.
媒体对网络计算机评价不一,CNET的记者认为没有硬盘网络计算机需要依赖服务器,这将是完全不可靠的,商业周刊专栏记者则认为网络计算机会带来一种完全不同的个人电脑工业,Microsoft负责技术的副总裁认为:"人们想要电脑提供越多的能力,而不是越少.网络计算机根本不值一提。"但大型公司和机构对网络计算机大加赞赏,每隔两年就要更新电脑和升级软件的成本实在太高,1996年一台标准PC机成本是2000美元,但维护的费用每台要接近13200美元,网络计算机的管理成本相对应该低很多。 。
虽然Oracle集合了IBM,Sun,Apple和Netscape 在1996年制定了网络计算机的标准,但事实上没有一台网络计算机生产出来。Gates虽然对网络计算机嗤之以鼻,但也发表了一种简单个人电脑SIPC的标准进行反击,SIPC基本上和NC一样,只有一点不同:它需要用Windows操作系统.
不过这一切都无关紧要了,NC和SIPC都将不存在了.随着AMD和Intel的竞争,97年800美元以下的电脑成为电脑行业新的增长点,500美元以下的Basic Computer不久也将会出现,Microsoft 仍然是市场的主导者,但Ellison从来不会放弃,他说:"观念的战争已经结束,市场的竞争才刚刚开始。"Larry Ellison语录
"日本文化非常有趣,对我影响非常巨大,日本人是世界上最好斗的民族同时又是最有礼貌的,极度傲慢自大和极度谦卑混合,一种美妙的平衡。在创立Oracle时,我们想在公司尽可能地创造这种文化,一方面很好斗另一方面很谦虚,如果你能平衡这两者,你在竞争中取得成功的机会就会大大增加,这对个人和集体都一样。"
“当我创立Oracle时,我想建立一个让我喜爱工作的环境,这是最主要的目的,当然,我也要通过公司养家糊口,但没想到会成为现在这么富有。钱不是最主要的,我真的是想和我喜欢或者佩服的人一起工作,Oracle招聘有一个原则:如果这个人你不喜欢一周有三次和他一起午餐,就不要他加入。我真正想建立的环境不只是要有能力的人,这样我才可以相信你的能力和努力精神,我们才能象团队一样工作,你才会完成你承诺要做的工作。从个人关系上我也会喜欢你,你的成功不会让我烦恼,我会为你而高兴,就象我自己成功一样。”
Ellison最崇拜的人是英国二战首相温斯顿—丘吉尔 "我认为,可能是他拯救了整个西方文明,他有令人难以置信的勇气,特立独行。",他和丘吉尔有很多相同点:学生时代都很普通,都拼命想取得父亲的赞赏,富于机智,爱挑剔,富有魅力。
我一向怀疑所谓“传统的智慧”,我不相信权威的观点,特别是那些人云亦云的权威,对我来说,事情必须合理才行.
这种思考方式在企业经营上非常有价值,比如,你看到“传统的智慧”的错误,即使每个人都说那是对的,可是事实并非如此,那就成为我们进入市场的绝好机会.因为你将成为第一个有机会做不同事情,同时占据市场先机。可是,如何避免自己犯错误呢?很简单,就是勤奋加思考,不断尝试,和一大群聪明人一起讨论。Oracle的前销售副总裁说:"为Ellison工作就象骑着老虎,不管路程如何危险艰难,你必须紧贴老虎背,如果你掉下来,老虎会把你吃掉。其他人对他而言,只有两种人:朋友和敌人。"
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiangtao/archive/2005/09/14/480970.aspx
用 Flock 浏览器 创建
-
No Comments » oracle 人物
-
Aug10
优化Linux下的内核TCP参数来提高服务器负载能力
Posted in 性能优化, 操作系统, 系统管理, 1,042 views
-
本文转载自 Ren的Linux大杂坛
提高服务器的负载能力,是一个永恒的话题。在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的。要提高Linux系统下的负载能力,可以先启用Apache的Worker模式,来提高单位时间内的并发量。但是即使这么做了,当网站发展起来之后,连接数过多的问题就会日益明显。在节省成本的情况下,可以考虑修改Linux的内核TCP/IP参数,来最大的压榨服务器的性能。当然,如果通过修改内核参数也无法解决的负载问题,也只能考虑升级服务器了,这是硬件所限,没有办法的事。
Linux系统下,TCP/IP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源(因为关闭后进程才会退出)。这个时候我们可以考虑优化TCP/IP的内核参数,来及时将TIME_WAIT状态的端口清理掉。
本文介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,不是这个原因的情况下,效果可能不明显。那么,到哪儿去查TIME_WAIT状态的连接呢?那就是使用netstat命令。我们可以输入一个复核命令,去查看当前TCP/IP连接的状态和对应的个数:#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
这个命令会显示出类似下面的结果:
LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP/IP内核参数,让系统更快的释放TIME_WAIT连接。
我们用vim打开配置文件:
#vim /etc/sysctl.conf
然后,在这个文件中,加入下面的几行内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30最后输入下面的命令,让内核参数生效:
#/sbin/sysctl -p
简单的说明下,上面的参数的含义:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间。在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御一定程度的DDoS、CC和SYN攻击,是个一举两得的做法。
此外,如果你的连接数本身就很多,我们可以再优化一下TCP/IP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。这几个参数的含义如下:
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 10000 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死。经过这样的配置之后,你的服务器的TCP/IP并发能力又会上一个新台阶。
-
No Comments » kernel linux sysctl tcp time_wait tuning
-
Aug10
优化内核参数,减少TCP连接中的TIME_WAIT
Posted in 性能优化, 操作系统, 系统管理, 1,193 views
-
vi /etc/sysctl.conf
编辑/etc/sysctl.conf文件,增加三行:引用
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。再执行以下命令,让修改结果立即且永久生效:
/sbin/sysctl -p用以下语句看了一下服务器的TCP状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果如下:
ESTABLISHED 1423
FIN_WAIT1 1
FIN_WAIT2 262
SYN_SENT 1
TIME_WAIT 962效果:处于TIME_WAIT状态的sockets从原来的10000多减少到1000左右。处于SYN_RECV等待处理状态的sockets为0,原来的为50~300。
对于上面产生的FIN_WAIT进行优化,可以设置tcp_fin_timeout加快FIN_WAIT状态结束。
net.ipv4.tcp_fin_timeout = 60设置完后再执行以下命令,让修改结果立即且永久生效:
/sbin/sysctl -p对于上面的设置也可以在/proc/sys/net/ipv4这里进行设置,这里设置为即时生效重启还原。
-
No Comments » kernel linux sysctl tcp time_wait
-
Jul14
Nginx与PCRE
Posted in Web服务器, 操作系统, 系统管理, 1,110 views
-
Nginx的Urlrewrite模块依赖PCRE,而Nginx不能很好的识别到系统中的PCRE,在make时可能遇到类似这样的错误:
make -f objs/Makefile
make[1]: Entering directory `/root/nginx-0.7.65'
cd /usr/local/lib/pcre \
&& if [ -f Makefile ]; then make distclean; fi \
&& CC="gcc" CFLAGS="-O2 -fomit-frame-pointer -pipe " \
./configure --disable-shared
/bin/sh: line 0: cd: /usr/local/lib/pcre: No such file or directory
make[1]: *** [/usr/local/lib/pcre/Makefile] Error 1
make[1]: Leaving directory `/root/nginx-0.7.65'
make: *** [build] Error 2原因是nginx不能自动找到pcre的库文件,下载最新的pcre源码包安装后:
#mkdir -p /usr/local/lib/.libs/
# cp /usr/local/lib/libpcre.a /usr/local/lib/.libs/libpcre.a -
No Comments » linux nginx PRCE
-
Jul14
编译Google perftools的小问题
Posted in Web服务器, 操作系统, 系统管理, 754 views
-
在编译时可能会遇到这个错误:
error Cannot calculate stack trace: need either libunwind or frame-pointers
解决方法是在编译参数里增加 --enable-frame-pointers
-
No Comments » Google nginx perftools
-
Jul07
64位centOS编译php5.3时的小问题
Posted in 操作系统, 系统管理, 773 views
-
64位CentOS5.5在编译php5.3时,提示找不到libmysqlclient,
checking for MING support... no
checking for mSQL support... no
checking for MSSQL support via FreeTDS... no
checking for MySQL support... yes, shared
checking for specified location of the MySQL UNIX socket... no
checking for MySQL UNIX socket location... no
configure: error: Cannot find libmysqlclient under /usr.
Note that the MySQL client library is not bundled anymore!这是由于搜索路径有误,需在编译时增加一个参数: "--with-libdir=lib64"
-
1 Comment » 64bit centos libmysqlclient mysql php
-
Mar24
-
堆大小设置
JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
典型设置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m:设置持久代大小为16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
回收器选择
JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。
吞吐量优先的并行收集器
如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
典型配置:
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
响应时间优先的并发收集器
如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。
典型配置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片
辅助信息
JVM提供了大量命令行参数,打印信息,供调试使用。主要有以下一些:
-XX:+PrintGC
输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]-XX:+PrintGCDetails
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
输出形式:Application time: 0.5291524 seconds-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用
输出形式:Total time for which application threads were stopped: 0.0468229 seconds-XX:PrintHeapAtGC:打印GC前后的详细堆栈信息
输出形式:
34.702: [GC {Heap before gc invocations=7:
def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
tenured generation total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8:
def new generation total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)
from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)
to space 6144K, 0% used [0x221d0000, 0x221d0000, 0x227d0000)
tenured generation total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
}
, 0.0757599 secs]
-Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析。
常见配置汇总
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。调优总结
年轻代大小选择
响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
年老代大小选择
响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
并发垃圾收集信息
持久代并发收集次数
传统GC信息
花在年轻代和年老代回收上的时间比例
减少年轻代和年老代花费的时间,一般会提高应用的效率
吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩 -
No Comments » gc jvm 优化 调优
-
Feb07
禁用/启用所有外键约束
Posted in DBA脚本, Oracle, 数据库管理, 900 views
-
1、ORACLE数据库中的外键约束名都在表user_constraints中可以查到。其中constraint_type='R'表示是外键约束。
2、启用外键约束的命令为:alter table table_name enable constraint constraint_name
3、禁用外键约束的命令为:alter table table_name disable constraint constraint_name
4、然后再用SQL查出数据库中所以外键的约束名:
select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
-
No Comments » fk oracle 启用 外键 禁用 约束
-
Feb03
用SQL处理多行汇聚问题
Posted in Oracle, 数据库管理, 软件开发, 887 views
-
表结构如下:
NAME Null Type
------------------------ --------- -----
N_SEC_CODE NOT NULL CHAR(6)
C_RESEARCHER_CODE NOT NULL VARCHAR2(20)此表保存了“股票”与“研究员”的对应关系数据,一般而言,对于同一只股票而言,可能有多个研究员对其进行跟踪研究。所以目前遇到一个要求,需查询出每只股票和对应的研究员(研究员代码间,使用逗号分隔)。
例如有如下数据:
000297 chenpeng
000297 liusu
合并处理后需显示为:
000297 chenpeng,liusu多行数据汇总聚一行,只需要把SQL中“n_sec_code”换为你的用来汇总的列,“c_researcher_code”替换为需合并文本的列,“m_researcher_stock_rel”替换为你的表名
SELECT n_sec_code,
TRANSLATE (LTRIM (text, '/'), '*/', '*,') researcherList
FROM
(SELECT ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code, lvl DESC) rn,
n_sec_code ,
text
FROM
(SELECT n_sec_code,
LEVEL lvl ,
SYS_CONNECT_BY_PATH (c_researcher_code,'/') text
FROM
(SELECT n_sec_code ,
c_researcher_code AS c_researcher_code,
ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code,c_researcher_code) x
FROM m_researcher_stock_rel
ORDER BY n_sec_code,
c_researcher_code
) a CONNECT BY n_sec_code = PRIOR n_sec_code
AND x - 1 = PRIOR x
)
)
WHERE rn = 1
ORDER BY n_sec_code; -
No Comments » SQL 多行 汇聚

Comments