Monthly Archives: 11月 2015

(转)InfiniBand可以运行哪些协议?

InfiniBand可以运行哪些协议?

 

发布时间:2013-01-30 00:00:00 来源:博客 作者:Steven.Lee

关键字:Exadata IPoIB Oracle RDS SDP tcp/ip 以太网

 

这不是一篇介绍infiniband是什么的文章,而仅仅站在Oracle RAC和Exadata的角度上阐述infiniband。 如果您不知道infiniband是什么,请点击这里。

 

很多人可能不知道,绝大多数高性能计算机内部或者集群之间都是使用infiniband互联的。在国家超算中心,在亚马逊的云计算中心都有它的身影。为什么infiniband会如此受欢迎呢?原因无非有两个: 一是目前infiniband本身能提供比传统以太网更高的带宽, 二是通常infiniband的开销比以太网要小,对于节点间通信大量数据传输比以太网效率要更高。当然Oracle也是这一技术的主导者, 其中RDS本身就是Oracle的一个开源项目。常见的运行在infiniband之上协议有哪些呢?下面就简单介绍一下Oracle DB可能会用到的几个:

 

IPoIB协议:

Internet Protocol over InfiniBand 简称IPoIB 。传统的TCP/IP栈的影响实在太大了,几乎所有的网络应用都是基于此开发的,IPoIB实际是infiniband为了兼容以太网不得不做的一种折中,毕竟谁也不愿意使用不兼容大规模已有设备的产品。IPoIB基于TCP/IP协议,对于用户应用程序是透明的,并且可以提供更大的带宽, 也就是原先使用TCP/IP协议栈的应用不需要任何修改就能使用IPoIB。例如如果使用infiniband做RAC的私网,默认使用的就是IPoIB。下图左侧是传统以太网tcp/ip协议栈的拓扑结构,右侧是infiniband使用IPoIB协议的拓扑结构。

1111

RDS协议:

 

Reliable Datagram Sockets (RDS)实际是由Oracle公司研发的运行在infiniband之上,直接基于IPC的协议。之所以出现这么一种协议,根本的原因在于传统的TCP/IP栈本身过于低效,对于高速互联开销太大,导致传输的效率太低。RDS相比IPoIB, CPU的消耗量减少了50%, 相比传统的UDP协议,网络延迟减少了一半。下图左侧是使用IPoIB协议的infiniband设备的拓扑图,右侧是使用RDS协议的infiniband设备的拓扑结构。默认情况下,RDS协议不会被使用,需要进行额外的relink。另外即使relink RDS库以后,RAC节点间的CSS通信也是无法使用RDS协议的,节点间心跳维持以及监控总是使用IPoIB。下图左侧infiniband使用IPoIB协议的拓扑结构,右侧是infiband使用RDS协议的拓扑结构。

22222222

 

SDP协议:

 

知道并且使用过RDS协议的人不少,但是可能不少人都没有听过sdp协议 。这个协议实际早在10g时代就存在过,只是没有专门的文档。这个白皮书算是比较少见的。其中只是简要的提到了sdp,所著笔墨不多,也没有提到如何实现,可能在这个版本属于试验性的功能。文中提到依靠一个Oracle Application Server端的驱动,SDP协议可以与TCP/IP协议栈进行透明的转换。Database端如何配置SDP连接可以点击这里: 11.1 11.2, Exalogic端如何配置SDP的链接可以在这里找到。甚至还有如何在java程序中使用SDP协议的案例介绍。在实际应用中,多个Exadata机柜的相连可以通过配置SDP协议连接,Exalogic和Exadata的连接也是通过SDP‘协议的。但是需要注意的是Oracle的Net Service目前是无法走RDS协议的。下图左侧是传统以太网tcp/ip协议栈的拓扑结构,右侧是infiniband使用SDP协议的拓扑结构。

3333333333333

 

还有可能会听过的协议有ZDP和IDB协议,这两个是新名词,如果有一点了解就知道是久瓶装新酒。iDB协议用于Exadata 数据库节点(DB node)和存储节点(cell node)之间的通信。i代表 intelligence, 言下之一就是智能数据库协议,您可不要小看它,整个Exadata的精髓offloading全靠它来完成,之所以其它第三方Oracle数据库一体机只有Exadata的形而没有Exadata的神,原因就在此。简单的说它是由Oracle数据库内核来实现的,可以智能的将表扫描的工作放到存储一端去完成,然后由存储进行过滤,最后只返回查询需要的数据。举个简单的例子: 比如某个表有1亿行,但是满足过滤条件的就只有1万行,数据库节点会发出一个指令告诉存储节点,“我需要查询某某表过滤条件是什么,你去处理一下,把结果告诉我就成,我还有别的事情要忙”。这个指令就是iDB。iDB的实现是Oracle公司的最高机密,除了Exadata的核心研发团队和技术高管没有人知道内部是如何实现的,只知道iDB协议是运行在ZDP协议(Zero-loss Zero-copy Datagram Protocol)之上,基于基于RDS协议的V3版本(OFED version 1.3.1))的标准进行研发的。Oracle的官方数据显示使用ZDP协议进行数据传输能达到每秒3GB/s,而仅仅消耗主机CPU资源的2%。

444444444444

 

 

某社保 ORACLE数据库主机 内存耗光 之原因

1. SYSAUX表空间由于空间不足,导致数据库性能数据不能写入,当前SYSAUX空间已经很大,建议进行清理。

2. 使用nmon来监控系统的内存、CPU、IO的使用。(使用root用户在crontab中加入:nmon -f -s 30 -c 2880 -m /nmon_data,注:/nmon_data为存放数据的目录,根据需要修改),在crontab中每天0点开始运行,以便进行后续的内存使用分析。

3. 监控OGG的内存使用。

4. 建议调整内核参数:
vmo -p -o v_pinshm=1
vmo -p -o maxclient%=15
vmo -p -o maxperm%=15
vmo -p -o maxpin%=90

5. 当前数据库最大进程数为700,以当前的主机内存来看,不足以支撑,建议缩小最大进程数和SGA(SGA缩小到12G)。

块级重复数据删除

块级重复数据删除

多年以前的重复数据删除技术,可以看作是文件级的技术,当时称之为“单一实例存储(Single Instance Store,SIS)”,通过SIS技术,整个文件系统或电子邮件系统的重复文件可以被减少为单一的拷贝,当再出现这一文件时,会被指向到这一单一拷贝,从而减少容量需求。这一技术通常被用于电子邮件管理及归档系统。
今天的重复数据删除技术利用了与SIS类似的数据缩减概念,但却使之向前迈进了一大步 – 实现了块级(子文件)重复数据删除。当读取数据时,系统利用Hash算法识别唯一的数据块,系统将保留Hash索引,每个Hash编码指向一个不同的数据块。当新的备份发生时,会自动的与现有的块进行比对,如果索引中已经有相同的块,数据将会被删除或被指向块的指针所代替;反之,则会被保存并在索引中为其创建一个新的Hash编码。这里提到的唯一数据块的大小,会根据用户选择的不同的重复数据删除解决方案而不同,平均大小在4KB-24KB之间。
与文件级SIS技术相比,块级的重复数据删除技术可以说更具优势。它可以在不同的文件或应用中消除冗余数据块。比如,如果一个文件只做了想当小的一点修改并保存,块级重复数据删除技术则将只保存发生变化的数据块。按这种方式,块级重复数据删除可以提供更好的压缩比率,特别是应用于巨大数据量的情况下,如数据库或全备份之后。
下面的例子进一步说明了SIS和块级两种重复数据删除技术的结果比较。
一个企业向1000个邮件地址发出一封带有注册内容的活动邀请函,传统的备份应用将会把文件备份1000次。SIS解决方案可以识别出文件是相同的,将只会保留一份备份,然后生成999个指针指向那个唯一的备份,因此,大概节省了99.9%的空间。但是,之后这1000个参会人可能会将注册内容填好后回复给发件人,由于他们的名字不同,SIS解决方案就会备份1000份回执。
块级解决方案在发出邀请函的时候执行了相同的重复数据删除处理,也实现了99.9%的存储空间节省。但是,当收到1000份参会人的回执时,块级解决方案会发现每个回执的大部分内容与第一封收到的是相同的并已经备份过,因此,它只会对其它999封回执的相异数据块(块级)进行备份。这种方法与SIS技术相比,则还可以节省额外的99.9%的存储空间。

ORACLE 10G RAC的备份与恢复 ( pl )

ORACLE 10G RAC的备份与恢复

1 创建rac 节点上需要备份的程序文件清单
su – root
find /etc/init.d/init.* >lst
find /etc/rc{0,1,2,4,6}.d/K96init.crs >>lst
find /etc/rc{3,5}.d/S96init.crs >>lst
find /etc/inittab.crs /etc/inittab >>lst
find /home/oracle/oraInventory >>lst
find /home/oracle/.ssh >>lst
#find /u01 >>lst #/u01很大,为节约测试时间暂时注释掉
find /etc/oraInst.loc /etc/oracle /etc/oratab >>lst
find /opt/oracle >>lst
find /opt/ORCLfmap >>lst
find /usr/local/bin/coraenv >>lst
find /usr/local/bin/dbhome >>lst
find /usr/local/bin/oraenv >>lst
2 将清单中的文件打包备份
# tar -czvPWf $HOSTNAME.tgz -T lst
补充说明:
tar -c,–create:创建一个新归档
tar -z, –gzip, –gunzip:使用 gzip 处理归档
tar -v, –verbose:详细地列出处理的文件
tar -P, –absolute-names:不要从文件名中清除引导符‘/’
tar -W, –verify:在写入以后尝试校验归档
tar -f,–file:指定备份文件。后紧跟被处理的文件名,不要再加其它参数
tar -T:从文件名清单创建tar归档
3 模拟重装系统(本测试仅将RAC程序删除)
su – root
rm -rf /etc/init.d/init.*
rm -f /etc/rc{0,1,2,4,6}.d/K96init.crs
rm -f /etc/rc{3,5}.d/S96init.crs
rm -f /etc/inittab.crs
echo y|cp /etc/inittab.orig /etc/inittab
rm -rf /home/oracle/oraInventory
rm -rf /home/oracle/.ssh
##rm -rf /u01 #为节约测试时间暂时不删掉/u01
rm -rf /etc/oraInst.loc
rm -rf /etc/oracle
rm -rf /etc/oratab
rm -rf /opt/oracle
rm -rf /opt/ORCLfmap
rm -rf /tmp/hsperfdata_oracle
rm -rf /tmp/OraInstall*
rm -rf /tmp/OraInstall*
rm -rf /usr/local/bin/coraenv
rm -rf /usr/local/bin/dbhome
rm -rf /usr/local/bin/oraenv
##mkdir -p /u01/app/oracle
##chown -R oracle:oinstall /u01
##chmod -R 775 /u01
 reboot
单独备份/u01
tar -czvPWf /u01.tgz -T /u01
4 从 $HOSTNAME.tgz备份恢复中恢复程序文件
# ls *.tgz
rac1.tgz
# echo $HOSTNAME
rac1
# echo y|tar -xzwPf $HOSTNAME.tgz
extract `/etc/init.d/init.crs’?extract `/etc/init.d/init.crsd’?
extract `/etc/init.d/init.cssd’?
extract `/etc/init.d/init.evmd’?
extract `/etc/rc0.d/K96init.crs’?
extract `/etc/rc1.d/K96init.crs’?
extract `/etc/rc2.d/K96init.crs’?
extract `/etc/rc4.d/K96init.crs’?
extract `/etc/rc6.d/K96init.crs’?
extract `/etc/rc3.d/S96init.crs’?
extract `/etc/rc5.d/S96init.crs’?
extract `/etc/inittab.crs’?
extract `/etc/inittab’?
extract `/home/oracle/.ssh’?
extract `/home/oracle/.ssh/authorized_keys’?
extract `/home/oracle/.ssh/known_hosts’?
extract `/home/oracle/.ssh/id_dsa.pub’?
extract `/home/oracle/.ssh/id_dsa’?
extract `/home/oracle/.ssh/id_rsa.pub’?
extract `/home/oracle/.ssh/id_rsa’?
extract `/home/oracle/.ssh/authorized_keys’?
extract `/home/oracle/.ssh/known_hosts’?
extract `/home/oracle/.ssh/id_dsa.pub’?
extract `/home/oracle/.ssh/id_dsa’?
extract `/home/oracle/.ssh/id_rsa.pub’?
extract `/home/oracle/.ssh/id_rsa’?
extract `/etc/oraInst.loc’?
extract `/etc/oracle’?
extract `/etc/oracle/ocr.loc’?
extract `/etc/oracle/scls_scr’?
extract `/etc/oracle/scls_scr/rac1′?
extract `/etc/oracle/scls_scr/rac1/root’?
extract `/etc/oracle/scls_scr/rac1/root/crsdboot’?
extract `/etc/oracle/scls_scr/rac1/root/nooprocd’?
extract `/etc/oracle/scls_scr/rac1/root/cssrun’?
extract `/etc/oracle/scls_scr/rac1/root/crsstart’?
extract `/etc/oracle/scls_scr/rac1/root/noclsmon’?
extract `/etc/oracle/scls_scr/rac1/oracle’?
extract `/etc/oracle/scls_scr/rac1/oracle/cssfatal’?
extract `/etc/oracle/ocr.loc’?
extract `/etc/oracle/scls_scr’?
extract `/etc/oracle/scls_scr/rac1′?
extract `/etc/oracle/scls_scr/rac1/root’?
extract `/etc/oracle/scls_scr/rac1/root/crsdboot’?
extract `/etc/oracle/scls_scr/rac1/root/nooprocd’?
extract `/etc/oracle/scls_scr/rac1/root/cssrun’?
extract `/etc/oracle/scls_scr/rac1/root/crsstart’?
extract `/etc/oracle/scls_scr/rac1/root/noclsmon’?
extract `/etc/oracle/scls_scr/rac1/oracle’?
extract `/etc/oracle/scls_scr/rac1/oracle/cssfatal’?
extract `/etc/oracle/scls_scr/rac1′?
extract `/etc/oracle/scls_scr/rac1/root’?
extract `/etc/oracle/scls_scr/rac1/root/crsdboot’?
extract `/etc/oracle/scls_scr/rac1/root/nooprocd’?
extract `/etc/oracle/scls_scr/rac1/root/cssrun’?
extract `/etc/oracle/scls_scr/rac1/root/crsstart’?
extract `/etc/oracle/scls_scr/rac1/root/noclsmon’?
extract `/etc/oracle/scls_scr/rac1/oracle’?
extract `/etc/oracle/scls_scr/rac1/oracle/cssfatal’?
extract `/etc/oracle/scls_scr/rac1/root’?
extract `/etc/oracle/scls_scr/rac1/root/crsdboot’?
extract `/etc/oracle/scls_scr/rac1/root/nooprocd’?
extract `/etc/oracle/scls_scr/rac1/root/cssrun’?
extract `/etc/oracle/scls_scr/rac1/root/crsstart’?
extract `/etc/oracle/scls_scr/rac1/root/noclsmon’?
extract `/etc/oracle/scls_scr/rac1/root/crsdboot’?
extract `/etc/oracle/scls_scr/rac1/root/nooprocd’?
extract `/etc/oracle/scls_scr/rac1/root/cssrun’?
extract `/etc/oracle/scls_scr/rac1/root/crsstart’?
extract `/etc/oracle/scls_scr/rac1/root/noclsmon’?
extract `/etc/oracle/scls_scr/rac1/oracle’?
extract `/etc/oracle/scls_scr/rac1/oracle/cssfatal’?
extract `/etc/oracle/scls_scr/rac1/oracle/cssfatal’?
extract `/etc/oratab’?
extract `/opt/ORCLfmap’?
extract `/opt/ORCLfmap/prot1_32′?
extract `/opt/ORCLfmap/prot1_32/log’?
extract `/opt/ORCLfmap/prot1_32/bin’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputl’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputlhp’?
extract `/opt/ORCLfmap/prot1_32/etc’?
extract `/opt/ORCLfmap/prot1_32/etc/filemap.ora’?
extract `/opt/ORCLfmap/prot1_32′?
extract `/opt/ORCLfmap/prot1_32/log’?
extract `/opt/ORCLfmap/prot1_32/bin’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputl’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputlhp’?
extract `/opt/ORCLfmap/prot1_32/etc’?
extract `/opt/ORCLfmap/prot1_32/etc/filemap.ora’?
extract `/opt/ORCLfmap/prot1_32/log’?
extract `/opt/ORCLfmap/prot1_32/bin’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputl’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputlhp’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputl’?
extract `/opt/ORCLfmap/prot1_32/bin/fmputlhp’?
extract `/opt/ORCLfmap/prot1_32/etc’?
extract `/opt/ORCLfmap/prot1_32/etc/filemap.ora’?
extract `/opt/ORCLfmap/prot1_32/etc/filemap.ora’?
extract `/usr/local/bin/coraenv’?
extract `/usr/local/bin/dbhome’?
extract `/usr/local/bin/oraenv’?
补充说明:
tar -w, –interactive, –confirmation 每次操作都要求确认
tar -P, –absolute-names:不要从文件名中清除引导符‘/’
5 验证还原是否有效果
1、以root身份重启RAC节点
[root@rac1 ~]# reboot
2、验证程序是否已经运行
[oracle@rac1 ~]$ crs_stat -t
Name Type Target State Host
————————————————————
ora….B1.inst application ONLINE ONLINE rac1
ora….B2.inst application ONLINE ONLINE rac2
ora.RACDB.db application ONLINE ONLINE rac2
ora….SM1.asm application ONLINE ONLINE rac1
ora….C1.lsnr application ONLINE ONLINE rac1
ora.rac1.gsd application ONLINE ONLINE rac1
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip application ONLINE ONLINE rac1
ora….SM2.asm application ONLINE ONLINE rac2
ora….C2.lsnr application ONLINE ONLINE rac2
ora.rac2.gsd application ONLINE ONLINE rac2
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip application ONLINE ONLINE rac2

重装LINUX系统
1、 创建ORACLE用户和组
2、 绑定盘符
3、 编辑用户环境变量
4、 调整系统参数即可
剩下就可以还原RAC。

LINUX备份与还原
1、LINUX系统备份说明
# tar cvpzf backup.tgz –exclude=/proc –exclude=/lost+found –exclude=/backup.tgz –exclude=/mnt –exclude=/sys /
让我们来简单看一下这个命令:
“tar”当然就是我们备份系统所使用的程序了。
“cvpfz”是tar的选项,意思是“创建档案文件”、“保持权限”(保留所有东西原来的权限)、“使用gzip来减小文件尺寸”。
“backup.gz”是我们将要得到的档案文件的文件名。
“/”是我们要备份的目录,在这里是整个文件系统。
在档案文件名“backup.gz”和要备份的目录名“/”之间给出了备份时必须排除在外的目录。有些目录是无用的,例如“/proc”、“ /lost+found”、“/sys”。当然,“backup.gz”这个档案文件本身必须排除在外,否则你可能会得到一些超出常理的结果。如果不把“ /mnt”排除在外,那么挂载在“/mnt”上的其它分区也会被备份。另外需要确认一下“/media”上没有挂载任何东西(例如光盘、移动硬盘),如果有挂载东西,必须把“/media”也排除在外。
2. linux恢复系统说明
在进行恢复系统的操作时一定要小心!如果你不清楚自己在做什么,那么你有可能把重要的数据弄丢,请务必小心!
接着上面的例子。切换到root用户,并把文件“backup.tgz”拷贝到分区的根目录下。在Linux中有一件很美妙的事情,就是你可以在一个运行的系统中恢复系统,而不需要用boot-cd来专门引导。当然,如果你的系统已经挂掉不能启动了,你可以用Live CD来启动,效果是一样的。你还可以用一个命令把Linux系统中的所有文件干掉。
使用下面的命令来恢复系统:
# tar xvpfz backup.tgz -C /
注意:上面的命令会用档案文件中的文件覆盖分区上的所有文件。
执行恢复命令之前请再确认一下你所键入的命令是不是你想要的,执行恢复命令可能需要一段不短的时间。
恢复命令结束时,你的工作还没完成,别忘了重新创建那些在备份时被排除在外的目录:
# mkdir proc
# mkdir lost+found
# mkdir mnt
# mkdir sys
当你重启电脑,你会发现一切东西恢复到你创建备份时的样子了!

3、具体操作测试以这个为准
第一种情况:
tar cvpjf backup.tar.bz2 –exclude=/proc –exclude=/lost+found –exclude=/backup.tar.bz2 –exclude=/mnt –exclude=/sys –exclude=/boot –exclude=/dev /
Linux 排除目录 重装LINUX
备份
/
目录 /boot 这种情况下,可以恢复用户应用服务器
/dev
/sys
/proc
/lost+found

重装LINUX可以恢复任何应用服务器,即使机器、存储都变了。

第二种情况:
tar cvpjf backup.tar.bz2 –exclude=/proc –exclude=/lost+found –exclude=/backup.tar.bz2 –exclude=/mnt –exclude=/sys /

Linux 排除目录
备份
/
目录 /lost+found
/proc
/sys

1、 系统能启动,可以直接恢复。
2、 安装系统,覆盖安装,不格式化分区,可以直接恢复。
3、 格式化分区全新安装(或者重新创建分区),恢复后要重建GRUD。
原因:系统启动时找不到引导文件,你以前的引导文件对应的分区变了。(还没测试)

结论:
目前可以采取第一种方式在线备份和恢复系统。
红旗LINUX 3相当于red hat 5.5, 还没找到红旗LINUX光盘测试。

(转)大销售的七种武器

1)会聆听并了解客户的需求。
2)要学会利用所有的资源来帮自己
3)要在最短的时间内做到要做的事情。
4)签单的一刻是最重要的,不能节外生支,速战速决。
5)了解竞争对手并把他们的未来三步都想好。
6)要勤奋,时间是你的敌人。
7)要平衡单的大小跟时间。
8)最最最重要是运气好

1) 会聆听并了解客户的需求:我见过有销售自以为很会讲话,但跟客户开会后完全不知道客户想要什么。
客户时间有限,有客户要知道产品,有客户要知道技术,有客户要知道用那个代理。老外有一个说法是what keeps you awake at night. 你能知道客户的痛处你就是赢家。好的销售不会滔滔不绝的,知道是皇道 。

2)学会利用所有资源~要利用你的公司资源,工程师能做的放心交给他,老板什么时候出场,大老板和老外变成你的棋子,总部有什么帮到你。
合作伙伴相当重要,利用一个还是多个?怎么摆平他们的利益冲突?
怎么利用你身边的关系,包括朋友,学友,亲戚?
怎么利用竞争对手,有时候放烟幕有时候互相利用?

3)最短时间做到要做的事情。好的销售比一般的销售能够更快解决所有的问题。销售的敌人是时间,因为项目会出错,会延误。客户人事会变化。竞争对手会有新招。 但对有些老板的为了完成年底或季度末目标要压货或利用一切拿下有点不认证,单子是要快,但要看客户时间流程而不是看销售老板的指标完成时间。

4) 簽单一刻是最重要的。很多人都节外生支,喜欢客户说得更多,希望能簽更大的单,或介绍更多的产品,或找另外的代理去簽单。
其实很多东西都最后一刻有变数,能了结单子的时候要快,不要额外说更多,这是销售的基本功。
见过好多销售最后客户要买了,还好多唠叨的说下去,然后单子都变别人的,要注意。

5)了解竞争对手并把他们未来三步想好。
竞争对手的强处是什么?弱点在那里?产品是他们好还是自己好?他的销售是什么个性?跟客户那条线熟?
举一个例子,现在是云计算热潮,有些对手希望每一张单都全赢,包括产品,服务,咨询。看起来强势,但敌人太多,
每个合作伙伴都想做服务,就不想跟他们合作了。

6)要勤奋,时间是你的敌人。所有认识的人都是你的销售资源。
懒惰,你的资源是不会增加的。一天只有16小时,什么时候跟谁吃饭聊天都要安排好。
你会发觉时间过得很快,但你的资源还是原本的几个。跑快一步,你会事半功倍。
能赢的单子快赢,夜长梦多。有空的话打多点电话给没单子的客户也是资源的一种。

7)平衡单子大小跟时间。无论你是是什么销售,都会有时候纠结到底要不要等做更大金额的单子。有房产销售卖房子给我的时候想卖贵一点的房子给我,
越看越豪华,然后过了原本的预算,再看之下选择多了,最后挑了别家的房子。
很多时候简单是美,先把项目分包,先签了最基本再谈其他的。不是每一次都全赢的。

8)最最最重要是运气好。其实做好头七点,你已成功了一大半。只靠运气是不够的,但运气不好也不行。
很多销售经理每年去拜神,就是希望运气好。你的组织里有销售每年都完成两倍指标以上,
他们是有运气而且做好头七点,好好加他们工资。

用GDB调试程序

用GDB调试程序
一、GDB概述 2
二、使用GDB 2
三、GDB的命令概貌 2
四、在GDB中运行程序 2
五、暂停/恢复程序运行 2
1、设置断点(Break Point) 2
2、设置观察点(WatchPoint) 3
3、设置捕捉点(CatchPoint) 3
4、维护停止点 3
5、停止条件维护 4
6、恢复程序运行和单步调试 4
7、线程(Thread Stops) 4
六、查看栈信息 5
七、查看源程序 6
1、显示源代码 6
2、搜索源代码 6
3、指定源文件的路径 6
八、查看运行时的数据 6
1、表达式 6
2、程序变量 6
3、数组 7
4、输出格式 7
6、自动显示 7
九、改变程序的执行 7
1、修改变量的值 7
2、强制函数返回 7
3、强制调用函数 8

一、GDB概述
GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
二、使用GDB
在用GDB调试C/C++的程序时,首先在编译时,我们必须要把调试信息加入到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
cc -g test.c –o test 或 g++ -g test.cpp –o test
启动GDB的方法:
gdb program也就是我们的执行文件,一般在当前目录下。
三、GDB的命令概貌
启动gdb后,就可以使用gdb的命令开始调试程序了,使用help命令可查看gdb的命令,命令格式为:help。
GDB的命令很多,gdb把其分成许多个种类。help命令,将列出gdb的命令种类,如果要看种类中的命令,可以使用help 命令。如 help list ,查看有关list 命令使用方法。
list linenum :显示程序第linenum行的周围的源程序
list first,last: 显示从first行到last行之间的源代码。
list func:显示函数名为func的函数的源程序
list : 显示当前行后面的源程序
list – :显示当前行前面的源程序
注:一般打印的是当前行的上5行和下5行,如果显示函数时上2行下8行,默认总显示行数为10行。当然,我们可以定制显示的范围,使用下面命令可以设置一次显示源程序的函数。
set listsize num //num为设置一次显示源代码的函数;
show listsize //查看当前listsize的设置
GDB中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令。按下两次tab键后,gdb会把我们的函数补充完整。按两次tab键后补齐函数名的功能在调试C++程序时,可以查看到C++中的所有重载函数及参数。
要退出gdb,只用发quit或简称q就可以了。
四、在GDB中运行程序
在gdb中,运行程序使用r或run命令。
五、暂停/恢复程序运行
调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。 当进程被gdb停住时,你可以使用info program来查看程序是否在运行,进程号,被暂停的原因。
1、设置断点(Break Point)
gdb用break命令来设置断点,有以下几种设置断点的方法:
1> break 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
2> break 在指定行号处停住。
3> break +offset/-offset在当前行号的前面或后面的offset行停住。Offset为自然数。
4>break filename:function 在源文件filename的function函数的入口处停住。
5>break *address 在程序运行的内存地址处停住。
6>break 不带参数时,表示在下一条指令处停住。
7>break…if …可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体,可以设置break if i=100,表示当i为100时停住程序。
查看断点信息,可以使用info命令,如下所示:(n表示断点号)
info breakpoints [n]
info break [n]
2、设置观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。有以下几种方法来设置观察点:
watch 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序。
rwatch expr被读时,停住程序。
awatch 当表达式(变量)的值被读或被写时,停住程序。
info watchpoints 列出当前所设置的所有的观察点
3、设置捕捉点(CatchPoint)
你可以设置捕捉点来捕捉程序运行时的一些事件。如:加载共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
catch
当event发生时,停住程序。event可以是下面的内容:
1> throw 一个C++抛出的异常。(throw为关键字)
2> catch一个C++捕捉到的异常。(catch 为关键字)
3> exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4> fork 调用系统调用fork时。(fork 为关键字,目前此功能只在HP-UX下有用)
5> vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6> load 或 load 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7> unload 或 unload 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
tcatch
只设置一次捕捉点,当程序停住以后,此点将自动删除。
4、维护停止点
在GDB中,如果觉得已定义好的停止点没有用了,可以使用,delete、clear、disable、enable这几个命令来维护。
clear 清除所有的已定义的停止点。
clear 清除对应函数停止点
clear 清除所有设置在函数上的停止点。
clear 清除指定行处的停止点
clear 清除所有设置在指定行上的停止点。
delete [breakpoints] [range…]
删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。
比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。
disable [breakpoints] [range…]
disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.
enable [breakpoints] [range…]
enable所指定的停止点,breakpoints为停止点号。
enable [breakpoints] once range…
enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。
enable [breakpoints] delete range…
enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。
5、停止条件维护
在GDB中可以设置一个条件,当条件成立时,程序自动停止。一般来说,使用 if关键词设置停止条件,if后面跟断点条件。条件设置好后,我们可以用condition命令来修改断点的条件。(只有break和watch命令支持if, catch目前暂不支持if)
condition 修改断点号为bnum的停止条件为expression。
condition 清除断点号为bnum的停止条件。
还有一个比较特殊的维护命令ignore,你可以指定程序运行时,忽略停止条件几次。格式如下: ignore
表示忽略断点号为bnum的停止条件count次。
6、恢复程序运行和单步调试
当程序被停住了,可用continue命令恢复程序的运行直到程序结束或下一个断点到来。也可以使用step或next命令单步跟踪程序。
continue [ignore-count] 或c [ignore-count] 或 fg [ignore-count]
恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思
step
单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。
next
同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加。
finish
运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
7、线程(Thread Stops)
如果程序是多线程的话,可以定义断点是否在所有的线程上,或是在某个特定的线程。
break thread break thread if …
linespec 指定了断点在源程序的行号,threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。
六、查看栈信息
当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。下面是一些查看函数调用栈信息的GDB命令:
backtrace 或bt
打印当前的函数调用栈的所有信息。如:
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
从上可以看出函数的调用栈信息:__libc_start_main –> main() –> func()
backtrace 或 bt
n是一个正整数,表示只打印栈顶上n层的栈信息。
backtrace <-n> 或 bt <-n>
-n表一个负整数,表示只打印栈底下n层的栈信息。
如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。
frame 或 f
n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
up 表示向栈的上面移动n层,可以不打n,表示向上移动一层。
down 表示向栈的下面移动n层,可以不打n,表示向下移动一层。
查看当前栈层的信息,你可以用以下GDB命令:
frame 或 f
会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
info frame 或 info f
这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如:
(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame’s sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8
info args 打印出当前函数的参数名及其值。
info locals 打印出当前函数中所有局部变量及其值。
info catch 打印出当前的函数中的异常处理信息。
七、查看源程序
1、显示源代码
详细在第三部分GDB的命令概貌。
2、搜索源代码
GDB提供了源代码搜索的命令:
forward-search
search
向前面搜索。
reverse-search
全部搜索。
其中,就是正则表达式,也是一个字符串的匹配模式。
3、指定源文件的路径
某些时候,用-g编译过后的执行程序中只是包括了源文件的名字,没有路径名。GDB提供了可以让你指定源文件的路径的命令,以便GDB进行搜索。
directory
dir
加一个源文件路径到当前路径的前面。如果你要指定多个路径,UNIX下你可以使用“:”,Windows下你可以使用“;”。
directory
清除所有的自定义的源文件搜索路径信息。
show directories
显示定义了的源文件搜索路径。
八、查看运行时的数据
当程序被停住时,可以使用print命令(简写为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:
print 或 print /
是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。
1、表达式
print和许多GDB的命令一样,可以接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,可以是当前程序运行中的const常量、变量、函数等内容。
在表达式中,有几种GDB所支持的操作符如下:
@ 是一个和数组有关的操作符,在后面会有更详细的说明。
:: 指定一个在文件或是一个函数中的变量。
{} 表示一个指向内存地址的类型为type的一个对象。
2、程序变量
在GDB中,你可以随时查看以下三种变量的值:
1、全局变量(所有文件可见的)
2、静态全局变量(当前文件可见的)
3、局部变量(当前Scope可见的)
3、数组
为了查看一段连续的内存空间的值。如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。如 int *array = (int *) malloc (len * sizeof (int));
在GDB调试过程中,可用如下命令显示出这个动态数组的取值:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。
4、输出格式
一般来说,GDB会根据变量的类型输出变量的值。但也可以自定义GDB的输出的格式。x 按十六进制格式显示变量。 d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。 o 按八进制格式显示变量。
t 按二进制格式显示变量.。 a 按十六进制格式显示变量。
c 按字符格式显示变量。 f 按浮点数格式显示变量。
如:(gdb) p i
$21 = 101
(gdb) p /a i
$22 = 0x65
6、自动显示
可以设置一些自动显示的变量,当程序停住时,或是在单步跟踪时,这些变量会自动显示。相关的GDB命令是display。
格式为:display 或display/ 或display/
expr是一个表达式,fmt表示显示的格式,addr表示内存地址。
与display相对应的 GDB命令:
undisplay delete display
删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)
九、改变程序的执行
当GDB挂上被调试程序时,就可以根据自己的调试思路,来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值。
1、修改变量的值
在GDB中,修改被调试程序运行时的变量值,使用GDB的print命令即可完成。如: (gdb) print x=4
有时候,可能变量和GDB中的参数冲突,为此,可以使用set var命令来设置变量,如:(gdb) set var width=47
2、强制函数返回
如果调试断点在某个函数中,并还有语句没有执行完。则可使用return命令强制函数忽略还没有执行的语句并返回。语法如下:
return 或return
使用return命令取消当前函数的执行,并立即返回,如果指定了,那么该表达式的值会被认作函数的返回值。
3、强制调用函数
call
表达式中可以是一函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。

(转)2007年 叶成辉访谈

叶成辉访谈

【2007.01.16 15:11】

  2006年11月2日,EMC的董事长兼CEO乔·图斯在复旦大学演讲,介绍叶成辉时,他
说,“这位,是我们EMC中国长期的领导者。”EMC进入中国10年,大中华区总裁换了5
个,说这样的话,图斯还是第一次。

  彼时的叶成辉走马上任不过100天。他刚去的时候,员工们私底下议论,“又来一
个新人,过一年可能又要换。”谁知没过多久,这位37岁的总裁就抛出了个“未来3-5
年计划”。

  “如果待不到3-5年是我的失败。”接受《英才》记者采访时,叶成辉说,“在美
国公司做事,你不能看短期,因为你追不上。每三个月去华尔街交一次报表,如果每天
只是想未来两三个月做什么,你肯定活不下去。”

  调整结构 平衡利益

  “EMC中国以前有个问题就是不够团结,我觉得这是第一个要解决的问题。”

  叶成辉刚到EMC,就有人找他告状,“这个人说那个人不好,那个人说这个人不
好”。

  在EMC,市场按区域分为华北、华东、华南和西区,按行业分为金融、电信、政府
和中小型企业,设4个区域老总、4个行业老总,这种垂直结构所引发的问题是——“比
方说,华东区有个金融的单子,华东区的老总可能就会跟金融行业的老总争起来。所
以,有单子,大家互不通气,偷偷去做,做到快签单才拿出来,很多时间花在了内耗
上。”

  “EMC中国以前有个问题就是不够团结,我觉得这是第一个要解决的问题。”叶成
辉说。

  叶成辉的办法说起来也简单——在每个区域再划分4个行业,一个单子,区域和行
业各派一名销售人员或销售总监一起去做,“大家的利益可以平衡”。

  需要打破的壁垒不只是这一道。“在中国,很多人觉得EMC是个存储公司,不觉得
EMC是个信息公司,是个卖解决方案的公司,为什么?因为渠道和部门的整合还是不
够。”叶成辉坦言。

  就EMC在中国的合作伙伴而言,以前卖硬件的合作伙伴不能卖EMC的软件,卖软件的
合作伙伴则不能卖EMC的硬件;而在EMC中国内部,硬件、软件、服务各有自己的部门,
卖硬件的觉得软件不关自己的事,有软件的单子就撒手不管。

  对这种现象,叶成辉希望通过培训来解决。“每个销售硬件的员工都必须能讲清楚
我们每一个软件的好处,这样他们跟客户谈的时候就可以讲我们有什么软件,我们可以
做整体的解决方案。”

  思考3个月 放弃15年老东家

  “EMC过去换了太多大中华区总裁,这是个风险。如果只准备干一年,我没兴
趣。”

  决定请叶成辉之前,EMC通过猎头公司物色了许多候选人。找到叶成辉的时候,他
的职务是IBM的亚太区副总裁兼存储系统事业部总经理,在IBM,叶成辉已经干了15年。

  叶成辉毕业于加州大学伯克利分校,专业背景是电子工程,做技术似乎理所当然。
可没过多久,叶成辉不干了,要去做销售,“我一直觉得自己不是块工程师的料,因为
我不能连续坐在一个地方超过两个小时,所以,销售这个角色比较适合我。”

  在IBM每两年一次的晋升足以证明:叶成辉是个出色的销售,而最主要的原因在
于,“为客户,我想的是他为什么要买、怎样买;为公司,我想的是公司要的不是一单
生意而是一种长期的关系,所以,每次我都会帮客户设计一个长远的规划,这样客户才
会信任我,才会多给我一点信息,我才会比竞争对手更有优势。”

  下离开IBM的决心,叶成辉用了3个月。

  担心是有的。“EMC过去换了太多大中华区总裁,这是个风险。如果只准备干一
年,我没兴趣。”

  选择EMC的理由更充分。“我在IBM做了十五六年,差不多了,我觉得可以试着做一
个公司的全权负责人了,我考虑了好久。EMC是个很有远见的公司,过去13个季度,它
在全球都是两位数的增长,利用这些增长,它买了23家公司,它的未来打动了我,以后
无论在硬件还是软件方面,它都会有增长点。”叶成辉说。

  销售思维 精力放在外面

  “我觉得内部的东西一定要简化,大家的精力一定要放在外面。”

  叶成辉面试的时候,EMC亚太区总裁Steven Leonard问他“希望在上海还是北京办
公”,叶成辉那时住在上海,但他回答,“我的意见很简单,这个大中华区总裁的位置
如果不在北京,我是不会来的。”在他看来,不在北京办公是EMC大中华区总裁频频更
换的原因之一。

  上任第一周,叶成辉举家迁到北京。比起以前,叶成辉笑称“现在辛苦多了”。

  整合完团队之后,叶成辉终于可以“多花点时间在外面”了,“见了100多个客
户,有时一天就见了6个。”每次去见客户,叶成辉都会带上销售总监,让他们“看看
怎样跟客户谈整体的解决方案”。

  EMC在大中华区有9个销售总监,叶成辉要求他们每周提交一份报告,内容是:上周
见了多少客户,谈了什么。刚开始,他们见的客户还没有叶成辉多,“我说,我要熟悉
那么多事,我一天还见五六个客户,你们怎么一个星期才见三个,他们就觉得很有压力
了。”另外,叶成辉还做统计,看谁见的客户最多谁见的客户最少,每周发一个报告,
在全体销售总监会议上公开。

  “以前,EMC文化的最大问题是,很多人花大量时间在办公室做内部的事情,不去
外面跑,我觉得内部的东西一定要简化,大家的精力一定要放在外面,最重要的是先把
他们赶到外面去,然后慢慢努力,成绩就会好。”叶成辉说。

  《英才》:IBM和EMC,谁给你的薪水更高?

  叶成辉:薪水就不要讲了,两边都高,但这不是薪水的问题,是你的未来需要什么
的问题。IBM给了我很多,我在IBM的时候是最年轻的副总裁,从副总裁变成总裁可能还
需要15年,这15年,我是等,还是出去看看自己有没有能力做一个公司的总裁呢?我决
定来EMC。

  《英才》:你是把人生规划得很好的人吗?

  叶成辉:没有一个人生是可以规划好的,我觉得我只是一个见到机会就会很快跳进
去吃掉的人。

  《英才》:对EMC目前在中国的成绩满意吗?

  叶成辉:永远没有满意的。我们现在最大的挑战在于:第一,软件支持不够;第
二,中小型企业还没有做起来,这部分的比例应该占到35%-40%左右,现在差不多是
20%,所以这部分的增长一定要快。

  《英才》:你现在不工作的时候做什么?

  叶成辉:我有两个小孩,不工作的时候我一般会陪他们,跟他们踢球;另外,我平
常没什么时间运动,所以,每周末我都去游泳。

(转)李广才整理的DBA常用脚本

整理的DBA常用脚本
oracle用户权限检查

1. 系统权限记录在 dba_sys_privs 视图中:
select grantee, privilege, admin_option
from dba_sys_privs
where grantee = ‘USERNAME’ ;

2. 角色权限记录在 dba_role_privs 视图中:
select grantee, granted_role, admin_option
from dba_role_privs
where grantee = ‘USERNAME’ ;

3. 对象权限记录在 dba_tab_privs 视图中,虽然视图名看起来像是表权限,但是实际包含了包,存储过程等等对象级的权限:
select grantee, owner || ‘.’ || table_name obj_name, privilege, grantable
from dba_tab_privs
where grantee = ‘USERNAME’;

4. 其他还有部分权限,如表空间的quota权限,记录在 dba_ts_quota中:
select username,
tablespace_name,
bytes / 1024 / 1024 “used space (m)”,
decode(decode(max_bytes, -1, 0, max_bytes) / 1024 / 1024,
0,
‘unlimited’,
max_bytes / 1024 / 1024) “max space(m)”,
blocks used_blocks,
max_blocks
from dba_ts_quotas
where username = ‘USERNAME’;
select * from session_privs; 当前用户拥有的权限
SELECT * FROM DBA_SYS_PRIVS; 查询每个用户的权限
锁的检查
select b.owner,
b.object_name,
l.SESSION_ID,
DECODE(L.LOCKED_MODE,
0,
‘None’,
1,
‘Null’,
2,
‘Row-S (SS)’,
3,
‘Row-X (SX)’,
4,
‘Share’,
5,
‘S/Row-X (SSX)’,
6,
‘Exclusive’,
TO_CHAR(L.LOCKED_MODE)) MODE_HELD,
s.USERNAME
from dba_objects b, v$locked_object l, V$SESSION S
where b.object_id = l.object_id
and l.SESSION_ID = s.SID
查看一个长查询的进度
SELECT *
FROM ( select username,opname,sid,serial#,
context,b.sql_text,sofar,totalwork,
round(sofar/totalwork*100,2) “% Complete”,
elapsed_seconds
from v$session_longops , v$sql b
where sql_hash_value=b.hash_value
and sql_address = address
and totalwork <> 0
)
WHERE “% Complete” <> 100 ;
查看ACTIVE SESSION的等待事件
select a.event,
sum(decode(wait_Time, 0, 0, 1)) “Prev”,
sum(decode(wait_Time, 0, 1, 0)) “Curr”,
count(*) “Tot”
from v$session_wait a, v$session b
where a.sid = b.sid
and b.status = ‘ACTIVE’
group by a.event
— having count(*) > 10
order by 4;

在某个用户下找所有的索引
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
from user_ind_columns, user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
通过DBMS_METADATA包得到对象的DLL语句
a.获取单个的建表和建索引的语法,其他对象类似:
select dbms_metadata.get_ddl(‘TABLE’,’TABLE_NAME’,’TABLE_OWNER’) from dual;
select dbms_metadata.get_ddl(‘INDEX’,’INDEX_NAME’,’INDEX_OWNER’) from dual;

b.获取一个SCHEMA下的所有建表的语法,以scott为例,其他对象类似:
SELECT DBMS_METADATA.GET_DDL(‘TABLE’, u.table_name, u.owner) || ‘;’
FROM DBA_TABLES u
where owner = ‘SCOTT’ ;
查看回滚段名称及大小
select segment_name,
tablespace_name,
r.status,
(initial_extent / 1024) InitialExtent,
(next_extent / 1024) NextExtent,
max_extents,
v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name;

查看表空间的名称及大小
select t.tablespace_name, round(sum(bytes / (1024 * 1024)), 0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;

查看数据库的版本
Select version
FROM Product_component_version
Where SUBSTR(PRODUCT, 1, 6) = ‘Oracle’;

查看数据库的创建日期和归档方式
Select Created, Log_Mode From V$Database;

查看还没提交的事务
select * from v$locked_object;
select * from v$transaction;
查找object为哪些进程
select p.spid,
s.sid,
s.serial# serial_num,
s.username user_name,
a.type object_type,
s.osuser os_user_name,
a.owner,
a.object object_name,
decode(sign(48 – command),
1,
to_char(command),
‘Action Code #’ || to_char(command)) action,
p.program oracle_process,
s.terminal terminal,
s.program program,
s.status session_status
from v$session s, v$access a, v$process p
where s.paddr = p.addr
and s.type = ‘USER’
and a.sid = s.sid
and a.object = ‘EMP’
order by s.username, s.osuser
怎样计算一个表占用的空间的大小?
select owner,
table_name,
NUM_ROWS,
BLOCKS * AAA / 1024 / 1024 “Size M”,
EMPTY_BLOCKS,
LAST_ANALYZED
from dba_tables
where table_name = ‘XXX’;

注意:执行以上语句前要先对表做统计分析

select sum(a.bytes) / 1024 * 1024 “size”
from dba_extents a
where a.segment_name = ‘GOV_FDDBR’
select a.bytes / 1024 * 1024 “size”, (a.blocks * 8192) / 1024 * 1024 “da”
from dba_segments a
where a.segment_name = ‘GOV_FDDBR’
如何查看最大会话数
SELECT * FROM V$PARAMETER WHERE NAME LIKE ‘proc%’;
SQL>
SQL> show parameter processes

NAME TYPE VALUE
———————————— ——- ——————————
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 4
log_archive_max_processes integer 1
processes integer 200

这里为200个用户。

select * from v$license;
其中sessions_highwater纪录曾经到达的最大会话数
如何在Oracle服务器上通过SQLPLUS查看本机IP地址

select sys_context(‘userenv’,’ip_address’) from dual;

如何将表、索引移动表空间
ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;
ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME;
如何才能得知系统当前的SCN号
select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe;
如何在字符串里加回车
select ‘Welcome to visit’||chr(10)||’www.CSDN.NET’ from dual;
如何将小表放入keep池中
alter table xxx storage(buffer_pool keep);
如何查询做比较大的排序的进程?
SELECT b.tablespace,
b.segfile#,
b.segblk#,
b.blocks,
a.sid,
a.serial#,
?? a.username,
a.osuser,
a.status ??
FROM v$session a, v$sort_usage b ??
WHERE a.saddr = b.session_addr ??
ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks;

如何删除重复记录?
DELETE FROM TABLE_NAME
WHERE ROWID != (SELECT MAX(ROWID)
FROM TABLE_NAME D
WHERE TABLE_NAME.COL1 = D.COL1
AND TABLE_NAME.COL2 = D.COL2);
如何回滚段的争用情况
select name, waits, gets, waits / gets “Ratio”  
from v$rollstat C, v$rollname D  
where C.usn = D.usn;
如何监控表空间的 I/O 比例
select B.tablespace_name name,
B.file_name “file”,
A.phyrds pyr,
  A.phyblkrd pbr,
A.phywrts pyw,
A.phyblkwrt pbw  
from v$filestat A, dba_data_files B  
where A.file# = B.file_id  
order by B.tablespace_name;

如何监控文件系统的 I/O 比例
Select substr(C.file#, 1, 2) “#”,
substr(C.name, 1, 30) “Name”,
C.status,
C.bytes,
D.phyrds,
D.phywrts  
from v$datafile C, v$filestat D  
where C.file# = D.file#;
如何在某个用户下找所有的索引
select user_indexes.table_name,
user_indexes.index_name,
uniqueness,
column_name  
from user_ind_columns, user_indexes  
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name  
order by user_indexes.table_type,
user_indexes.table_name,
 user_indexes.index_name,
column_position;
如何监控 SGA 中字典缓冲区的命中率
select parameter,
gets,
Getmisses,
getmisses / (gets + getmisses) * 100 “miss ratio”,
 (1 – (sum(getmisses) / (sum(gets) + sum(getmisses)))) * 100 “Hit ratio”  
from v$rowcache  
where gets + getmisses <> 0  
group by parameter, gets, getmisses;
如何监控 SGA 中共享缓存区的命中率,应该小于1%
select sum(pins) “Total Pins”,
sum(reloads) “Total Reloads”,
 sum(reloads) / sum(pins) * 100 libcache  
from v$librarycache;

select sum(pinhits – reloads) / sum(pins) “hit radio”,
sum(reloads) / sum(pins) ????”reload percent” ??
from v$librarycache;
监控 SGA 中重做日志缓存区的命中率,应该小于1%
SELECT name,
gets,
misses,
immediate_gets,
immediate_misses,
Decode(gets, 0, 0, misses / gets * 100) ratio1,
Decode(immediate_gets+immediate_misses,0,0, immediate_misses / (immediate_gets + immediate_misses) * 100) ratio2  
FROM v$latch
WHERE name IN (‘redo allocation’, ‘redo copy’);

监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size
SELECT name, value
FROM v$sysstat
WHERE name IN (‘sorts (memory)’, ‘sorts(disk)’);
如何监控当前数据库谁在运行什幺SQL语句?
SELECT osuser, username, sql_text
from v$session a, v$sqltext b  
where a.sql_address = b.address
order by address, piece;
如何查看碎片程度高的表?
SELECT segment_name table_name, COUNT(*) extents  
FROM dba_segments
WHERE owner NOT IN (‘SYS’, ‘SYSTEM’)
GROUP BY segment_name  
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
FROM dba_segments
GROUP BY segment_name);
如何知道表在表空间中的存储情况?
select segment_name, sum(bytes), count(*) ext_quan
from dba_extents
where tablespace_name = ‘&tablespace_name’
and segment_type = ‘TABLE’
group by tablespace_name, segment_name;
如何知道索引在表空间中的存储情况?
select segment_name, count(*)
from dba_extents
where segment_type = ‘INDEX’
and owner = ‘&owner’  
group by segment_name;

如何知道使用CPU多的用户session?
Select a.sid,spid,status,
substr(a.program,1,40)
prog,a.terminal,osuser,value/60/100 value
  from v$session a,v$process b,v$sesstat c
  where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr
order by value desc;
物理读和内存读较高SQL
SELECT t.HASH_VALUE,
t.EXECUTIONS,
t.DISK_READS,
round(t.DISK_READS / t.EXECUTIONS) AS perDiskReads,
t.BUFFER_GETS,
round(t.BUFFER_GETS / t.EXECUTIONS) AS perBufferReads,
t.ELAPSED_TIME,
round(t.ELAPSED_TIME / t.EXECUTIONS) AS perElayTime,
t.CPU_TIME,
round(t.CPU_TIME / t.EXECUTIONS) AS perCpuTime,
t.FIRST_LOAD_TIME,
t.SQL_TEXT
FROM v$sql t
WHERE (t.DISK_READS / t.EXECUTIONS > 500 OR
t.BUFFER_GETS / t.EXECUTIONS > 20000)
AND t.EXECUTIONS > 0
ORDER BY 6 DESC;
查看低效率的SQL语句
SELECT EXECUTIONS,
DISK_READS,
BUFFER_GETS,
ROUND((BUFFER_GETS – DISK_READS) / BUFFER_GETS, 2) Hit_radio,
ROUND(DISK_READS / EXECUTIONS, 2) Reads_per_run,
SQL_TEXT
FROM  V$SQLAREA    
WHERE EXECUTIONS > 0   
AND  BUFFER_GETS > 0   
AND (BUFFER_GETS – DISK_READS) / BUFFER_GETS < 0.8    ORDER BY EXECUTIONS DESC 或者 select executions exec, loads loads, parse_calls parse, disk_reads reads, buffer_gets gets, rows_processed rows_proc, sorts sorts, sql_text from v$sqlarea order by &sortkey desc; 找出oracle中从没有使用的索引 set pages 999; set heading off; spool run_monitor.sql select 'alter index '||owner||'.'||index_name||' monitoring usage;' from dba_indexes where owner not in ('SYS','SYSTEM','PERFSTAT') spool off; @run_monitor 等待一段时间直到在数据库上运行了足够多的SQL语句以后,然后你就可以查询新的V$OBJECT_USAGE视图。 Select index_name,table_name,mon,used from v$object_usage; 在V$OBJECT_USAGE有一列被称作USED,它的值是YES或者NO。不幸的是,它不会告诉你Oracle使用了这个索引多少次,但是这个工具对于找出没有使用的索引还是很有用的。 自己编写的脚本 select c.SID,c.STATUS,s.NAME,b.VALUE from v$statname s, v$sesstat b, v$session c where s.STATISTIC# = b.STATISTIC# and b.SID = c.SID and b.sid=&sid and s.NAME in ('consistent gets','physical reads','parse count (total)','parse count (hard)') V$sql:查询一条sql执行时间及消耗的cpu时间,被执行及被分析的次数 Parse_calls, Executions Cpu_time, Elapsed_time Alter system flush shared_pool 清空共享池

OGG FOR SQLSERVER 的 DDL 部署

1. 在目标端创建OGG_EVENT表
CREATE TABLE [dbo].[OGG_EVENT](
[EVENT_ID] [nvarchar](10) NOT NULL,
[EVENT_ITM] [bigint] NOT NULL,
[EVENT_IMP] [nchar](1) NOT NULL,
[EVENT_IMP_DATE] [datetime] NULL,
[EVENT_TXT] [nvarchar](4000) NOT NULL,
CONSTRAINT [pk_OggEvent] PRIMARY KEY CLUSTERED
(
[EVENT_ITM] ASC,
[EVENT_ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[OGG_EVENT] WITH CHECK ADD CONSTRAINT [CK_OGG_EVENT_EVENT_IMP]
CHECK (([EVENT_IMP]=N’Y’ OR [EVENT_IMP]=N’N’))
GO

ALTER TABLE [dbo].[OGG_EVENT] CHECK CONSTRAINT [CK_OGG_EVENT_EVENT_IMP]
GO

ALTER TABLE [dbo].[OGG_EVENT] ADD DEFAULT (N’N’) FOR [EVENT_IMP]
GO

2. 在目标端创建OGGDDL Procedure
CREATE PROCEDURE dbo.execOGGDDL @evtId nvarchar(10)
AS
BEGIN
BEGIN TRY
SET NOCOUNT ON
DECLARE @evtItm bigint
DECLARE @evtTxt nvarchar(4000)
— Test for any Events to process
IF (SELECT COUNT (*) FROM dbo.OGG_EVENT WHERE EVENT_ID = @evtId
AND UPPER(EVENT_IMP) = N’N’) = 0
PRINT N’There are no Events to process for Event_Itm ‘
+@evtId +N’.’
— Start looping through the records
WHILE (SELECT COUNT (*) FROM dbo.OGG_EVENT WHERE EVENT_ID = @evtId
AND UPPER(EVENT_IMP) = N’N’) > 0
BEGIN
— Grab the first record out
SET @evtItm = (SELECT MIN(EVENT_ITM) FROM dbo.OGG_EVENT WHERE
EVENT_ID = @evtId AND UPPER(EVENT_IMP) = N’N’)
SELECT @evtTxt = EVENT_TXT FROM dbo.OGG_EVENT WHERE EVENT_ID =
@evtId AND EVENT_ITM = @evtItm AND UPPER(EVENT_IMP) = N’N’
— execute the statements
IF @evtTxt != N’End Event’
exec(@evtTxt)
— Update the record to set the EVENT_IMP to ‘Y’
UPDATE dbo.OGG_EVENT SET EVENT_IMP = N’Y’, EVENT_IMP_DATE =
GETDATE() WHERE EVENT_ID = @evtId and EVENT_ITM = @evtItm
END
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
END
GO

3. 停止源端的抽取
GGSCI (hisha02) 5> info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING
EXTRACT STOPPED EXHIS 00:00:00 00:00:10
EXTRACT STOPPED PUMP_T 00:00:00 00:00:02

4、在源端创建OGG_EVENT表
CREATE TABLE [dbo].[OGG_EVENT](
[EVENT_ID] [nvarchar](10) NOT NULL,
[EVENT_ITM] [bigint] NOT NULL,
[EVENT_IMP] [nchar](1) NOT NULL,
[EVENT_IMP_DATE] [datetime] NULL,
[EVENT_TXT] [nvarchar](4000) NOT NULL,
CONSTRAINT [pk_OggEvent] PRIMARY KEY CLUSTERED
(
[EVENT_ITM] ASC,
[EVENT_ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[OGG_EVENT] WITH CHECK ADD CONSTRAINT [CK_OGG_EVENT_EVENT_IMP]
CHECK (([EVENT_IMP]=N’Y’ OR [EVENT_IMP]=N’N’))
GO

ALTER TABLE [dbo].[OGG_EVENT] CHECK CONSTRAINT [CK_OGG_EVENT_EVENT_IMP]
GO

ALTER TABLE [dbo].[OGG_EVENT] ADD DEFAULT (N’N’) FOR [EVENT_IMP]
GO

5. 在源端创建OGGDLL procedure
CREATE PROCEDURE dbo.execOGGDDL @evtId nvarchar(10)
AS
BEGIN
BEGIN TRY
SET NOCOUNT ON
DECLARE @evtItm bigint
DECLARE @evtTxt nvarchar(4000)
— Test for any Events to process
IF (SELECT COUNT (*) FROM dbo.OGG_EVENT WHERE EVENT_ID = @evtId
AND UPPER(EVENT_IMP) = N’N’) = 0
PRINT N’There are no Events to process for Event_Itm ‘
+@evtId +N’.’
— Start looping through the records
WHILE (SELECT COUNT (*) FROM dbo.OGG_EVENT WHERE EVENT_ID = @evtId
AND UPPER(EVENT_IMP) = N’N’) > 0
BEGIN
— Grab the first record out
SET @evtItm = (SELECT MIN(EVENT_ITM) FROM dbo.OGG_EVENT WHERE
EVENT_ID = @evtId AND UPPER(EVENT_IMP) = N’N’)
SELECT @evtTxt = EVENT_TXT FROM dbo.OGG_EVENT WHERE EVENT_ID =
@evtId AND EVENT_ITM = @evtItm AND UPPER(EVENT_IMP) = N’N’
— execute the statements
IF @evtTxt != N’End Event’
exec(@evtTxt)
— Update the record to set the EVENT_IMP to ‘Y’
UPDATE dbo.OGG_EVENT SET EVENT_IMP = N’Y’, EVENT_IMP_DATE =
GETDATE() WHERE EVENT_ID = @evtId and EVENT_ITM = @evtItm
END
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
END
GO

6. 在源端给dbo.OGG_EVENT添加TRANDATA
GGSCI (hisha02) 7> dblogin sourcedb cxzyy_his, userid ssa, password 20031118
GGSCI (hisha02 as ssa@CXZYY_HIS) 10> ADD TRANDATA dbo.OGG_EVENT

7. 在源端的OGG安装目录下的dirsql\ddlCaptureApply子目录下创建ddlevt.bat
@echo off
setlocal enabledelayedexpansion
REM Get the event id for this run
set EVTID=%1
REM Set an output location
set OUTLOC=%~dp0
REM Strip spaces from the directory name
for /f “tokens=* delims= ” %%a in (‘echo %OUTLOC%’) do (set S=%%a & set S=!S: =! &
echo !S!)
set OUTLOC=%S% %EVTID%.out
for /f “tokens=* delims= ” %%a in (‘echo %OUTLOC%’) do (set S=%%a & set S=!S: =! &
echo !S!)
set OUTLOC=%S%
REM Execute the Stored Procedure
sqlcmd -Q “exec dbo.execOGGDDL @evtId=’%EVTID%'” -S VMMSS2008 -U gguser -P Oracle1
-d east -o %OUTLOC%

8. 在源端的OGG安装目录下的dirsql\ddlCaptureApply子目录下创建ddlevt.bat
@echo off
setlocal enabledelayedexpansion
REM Get the event id for this run
set EVTID=%1
REM Set an output location
set OUTLOC=%~dp0
REM Strip spaces from the directory name
for /f “tokens=* delims= ” %%a in (‘echo %OUTLOC%’) do (set S=%%a & set S=!S: =! &
echo !S!)
set OUTLOC=%S% %EVTID%.out
for /f “tokens=* delims= ” %%a in (‘echo %OUTLOC%’) do (set S=%%a & set S=!S: =! &
echo !S!)
set OUTLOC=%S%
REM Execute the Stored Procedure
sqlcmd -Q “exec dbo.execOGGDDL @evtId=’%EVTID%'” -S VMMSS2008 -U gguser -P Oracle1
-d east -o %OUTLOC%

10 修改源端抽取进程的参数
EXTRACT exhis
TRANLOGOPTIONS MANAGESECONDARYTRUNCATIONPOINT
SOURCEDB cxzyy_his, USERID ssa, PASSWORD 20031118
EXTTRAIL Z:\mh\soft\dirdat\lt
DISCARDFILE Z:\mh\soft\dirrpt\exhis.dsc,PURGE

nodynamicresolution
ignoreupdates
ignoredeletes
table dbo.OGG_EVENT,
filter (@strcmp(EVENT_TXT, “End Event”) <> 0)
;

table dbo.OGG_EVENT,
filter (@strcmp(EVENT_TXT, “End Event”) = 0),
eventactions(SHELL (“Z:\mh\soft\dirsql\ddlCaptureApply\ddlevt.bat ddljob”,
VAR ddljob = EVENT_ID),
STOP)
;

dynamicresolution
getupdates
getdeletes
tableexclude dbo.OGG_EVENT
table dbo.*;

TABLE cxzyy_his.*;
TABLE cxzyy_his1.*;
TableExclude dbo.dtproperties;
TableExclude dbo.MSreplication_objects;
TableExclude dbo.MSreplication_subscriptions;
TableExclude dbo.MSsavedforeignkeycolumns;
TableExclude dbo.MSsavedforeignkeyextendedproperties;
TableExclude dbo.MSsavedforeignkeys;
TableExclude dbo.MSsnapshotdeliveryprogress;
TableExclude dbo.MSsubscription_agents;
TableExclude dbo.systranschemas;
TableExclude dbo.ggsckpt;
11.修改源端的data pump进程的参数
没有修改

12修改目标端的replicat进程的参数
REPLICAT rep_t
ASSUMETARGETDEFS
HANDLECOLLISIONS
SOURCEDB cxykt_his, USERID ssa, PASSWORD 20031118
DISCARDFILE D:\mh\soft\dirrpt\rep_t.dsc, APPEND
batchsql

allowduptargetmap
nodynamicresolution

map dbo.OGG_EVENT, target dbo.OGG_EVENT,
filter (@strcmp(EVENT_TXT, “End Event”) <> 0)
;

MAP dbo.OGG_EVENT, TARGET dbo.OGG_EVENT,
FILTER ( @STRCMP(EVENT_TXT,”End Event”) <>
map dbo.OGG_EVENT, target dbo.OGG_EVENT,
filter (@strcmp(EVENT_TXT, “End Event”) = 0),
eventactions(SHELL (“D:\mh\soft\dirsql\ddlCaptureApply\Target\ddlevt.bat
ddljob”,
VAR ddljob = EVENT_ID),
checkpoint before, ignore, stop)

dynamicresolution
mapexclude dbo.OGG_EVENT
map dbo.*, target dbo.*;

MAP cxzyy_his.*, TARGET cxzyy_his.*;
MAP cxzyy_his1.*, TARGET cxzyy_his1.*;