WARNING: inbound connection timed out (ORA-3136)

1、现象
alert文件中
Mon Jun 27 11:12:34 2011
WARNING: inbound connection timed out (ORA-3136)
sqlnet.log文件中
Fatal NI connect error 12170.
VERSION INFORMATION:
TNS for Linux: Version 10.2.0.4.0 – Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 10.2.0.4.0 – Production
TCP/IP NT Protocol Adapter for Linux: Version 10.2.0.4.0 – Production
Time: 27-JUN-2011 11:12:34
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS:operation timed out
ns secondary err code: 12606
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=211.155.227.20)(PORT=2104))
2、原因
Whenever default timeouts are assigned to a parameter, there may be cases where this default does not work well with a particular application. However, some type of timeout on the connection establishment is necessary to combat Denial of Service attacks on the database. In this case, SQLNET.INBOUND_CONNECT__TIMEOUT and INBOUND_CONNECT_TIMEOUT_listenername were given default values of 60 seconds in Oracle 10.2. It is these timeout values that can cause the errors described in this note.
Also note that it is possilbe the reason the database is slow to authenticate, may be due to an overloaded Oracle database or node.
3、解决
1). set INBOUND_CONNECT_TIMEOUT_listenername=0 in listener.ora
2). set SQLNET.INBOUND_CONNECT_TIMEOUT = 0 in sqlnet.ora of server.
3). stop and start both listener and database.
4). Now try to connect to DB and observe the behaviour
4、具体操作
4.1)修改INBOUND_CONNECT_TIMEOUT_listenername
4.1.1)lsnrctl命令修改
LSNRCTL> set inbound_connect_timeout 0
LSNRCTL>save_config
4.1.2)vi修改
修改listener.ora文件,加入: INBOUND_CONNECT_TIMEOUT_listenername=0
4.2)修改SQLNET.INBOUND_CONNECT__TIMEOUT
修改sqlnet.ora文件,加入: SQLNET.INBOUND_CONNECT__TIMEOUT=0

21个故事的启示

1.甲去买烟,烟29元,但他没火柴,跟店员说:“顺便送一盒火柴吧。”店员没给。
乙去买烟,烟29元,他也没火柴,跟店员说:“便宜一毛吧。”最后,他用这一毛买一盒火柴。
这是最简单的心理边际效应。第一种:店主认为自己在一个商品上赚钱了,另外一个没赚钱。赚钱感觉指数为1。第二种:店主认为两个商品都赚钱了,赚钱指数为2。当然心理倾向第二种了。同样,这种心理还表现在买一送一的花招上,顾客认为有一样东西不用付钱,就赚了,其实都是心理边际效应在作怪。 -…
启示:变换一种方式往往能起到意想不到的效果! 通常很多事情换一种做法结果就不同了。人生道路上,改善心智模式和思维方式是很重要的。. ..~.
2.有个小男孩,有一天妈妈带着他到杂货店去买东西,老板看到这个可爱的小孩,就打开一罐糖果,要小男孩自己拿一把糖果。但是这个男孩却没有任何动作。几次的邀请之后,老板亲自抓了一大把糖果放进他的口袋中。回到家中,母亲好奇地问小男孩,为什么没有自己去抓糖果而要老板抓呢?小男孩回答很妙:“因为我的手比较小呀!而老板的手比较大,所以他拿的一定比我拿的多很多!” -…
启示:这是一个聪明的孩子,他知道自己的有限,而更重要的,他也知道别人比自己强。凡事不只靠自己的力量,学会适时地依靠他人,是一种谦卑,更是一种聪明。…..~…..
3.美国知名主持人林克莱特有一天访问一名小朋友,问他说:“你长大后想要当做什么呀?”小朋友天真地回答:“嗯……我要当飞机的驾驶员!”林克莱特接着问:“如果有一天,你的飞机飞到太平洋上空所有引擎都熄火了,你会怎么办?”小朋友想了想:“我会先告诉坐在飞机上的人绑好安全带,然后我挂上我的降落伞跳出去。”当在场的观众笑得东倒西歪时,林克莱特继续注视着这孩子,想看他是不是自作聪明的家伙。没想到,接着孩子的两行热泪夺眶而出,这才使得林克莱特发觉这孩子的悲悯之心远非笔墨所能形容。于是林克莱特问他说:为什么你要这么做?”小孩的答案透露了这个孩子真挚的想法:“我要去拿燃料,我还要回来!!!” -.
启示:这就是“听的艺术”。一是听话不要听一半。二是不要把自己的意思,投射到别人所说的话上头。要学会聆听,用心听,虚心听。
4. 有两个和尚他们分别住在相邻的两座山上的庙里。这两座山之间有一条溪,于是这两个和尚每天都会在同一时间下山去溪边挑水,久而久之他么变成为了好朋友。就这样时间在每天挑水中不知不觉已经过了五年。突然有一天左边这座山的和尚没有下山挑水,右边那座山的和尚心想:”他大概睡过头了。”便不以为意。哪知道第二天左边这座山的和尚还是没有下山挑水,第三天也一样。过了一个星期还是一样,直到过了一个月右边那座山的和尚终于受不了,他心想:”我的朋友可能生病了,我要过去拜访他,看看能帮上什么忙。”于是他便爬上了左边这座山,去探望他的老朋友。等他到了左边这座山的庙,看到他的老友之后大吃一惊,因为他的老友正在庙前打太极拳,一点也不像一个月没喝水的人。他很好奇地问:”你已经一个月没有下山挑水了,难道你可以不用喝水吗?”左边这座山的和尚说:”来来来,我带你去看。”于是他带着右边那座山的和尚走到庙的后院,指着一口井说:”这五年来,我每天做完功课后都会抽空挖这口井,即使有时很忙,能挖多少就算多少。如今终于让我挖出井水,我就不用再下山挑水,我可以有更多时间练我喜欢的太极拳。”-
启示:我们在公司领的薪水再多,那都是挑水。而把握下班后的时间挖一口属于自己的井,培养自己另一方面的实力,未来当我们年纪大了,体力拼不过年轻人了,依然还是有水喝,而且还能喝得很悠闲。-
5.有两个人相约到山上去寻找精美的石头,甲背了满满的一筐,乙的筐里只有一个他认为是最精美的石头。甲就笑乙:“你为什么只挑一个啊?”乙说:“漂亮的石头虽然多,但我只选一个最精美的就够了。”甲笑而不语,下山的路上,甲感到负担越来越重,最后不得已不断地从一筐的石头中挑一个最差的扔下,到下山的时候他的筐里结果只剩下一个石头! –
启示:人生中会有许多的东西,值得留恋,有的时候你应该学会去放弃。
6.有一家牙膏厂,产品优良,包装精美,受到顾客的喜爱,营业额连续10年递增,每年的增长率在10%~20%。可到了第11年,业绩停滞下来,以后两年也如此。公司经理召开高级会议,商讨对策。会议中,公司总裁许诺说:谁能想出解决问题的办法,让公司的业绩增长,重奖10万元。有位年轻经理站起来,递给总裁一张纸条,总裁看完后,马上签了一张10万元的支票给了这位经理。那张纸条上写着:将现在牙膏开口扩大1毫米。消费者每天早晨挤出同样长度的牙膏,开口扩大了l毫米,每个消费者就多用1毫米宽的牙膏,每天的消费量将多出多少呢!公司立即更改包装。第14年,公司的营业额增加了32%。 –
启示:面对生活中的变化,我们常常习惯过去的思维方法。其实只要你把心径扩大1毫米,你就会看到生活中的变化都有它积极的一面,充满了机遇和挑战
7.一只火鸡和一头牛闲聊,火鸡说:我希望能飞到树顶,可我没有勇气。牛说:为什么不吃一点我的牛粪呢,他们很有营养。火鸡吃了一点牛粪,发现它确实给了它足够的力量飞到第一根树枝,第二天,火鸡又吃了更多的牛粪,飞到第二根树枝,两个星期后,火鸡骄傲的飞到了树顶,但不久,一个农夫看到了它,迅速的把它从树上射了下来。-
启示:牛屎运让你达到顶峰,但不能让你留在那里。
8.乌鸦站在树上,整天无所事事,兔子看见乌鸦,就问:我能像你一样,整天什么事都不用干吗?乌鸦说:当然,有什么不可以呢?于是,兔子在树下的空地上开始休息,忽然,一只狐狸出现了,它跳起来抓住兔子,把它吞了下去。-
启示:如果你想站着什么事都不做,那你必须站的很高,非常高。
9.一只小鸟飞到南方去过冬。天很冷,小鸟几乎冻僵了。于是,飞到一大块空地上,一头牛经过那儿,拉了一堆牛粪在小鸟的身上,冻僵的小鸟躺在粪堆里,觉得很温暖,渐渐苏醒过来,它温暖而舒服的躺着,不久唱起歌来,一只路过的野猫听到声音,走过去看个究竟,循着声音,野猫很快发现了躺在粪堆里的小鸟,把它拽出来吃掉了。-
启示:不是每个往你身上拉大粪的人都是你的敌人。也不是每个把你从粪堆里拉出来的人都是你的朋友,还有,当你躺在粪堆里时,最好把你的嘴闭上。
10.从前,有两个饥饿的人得到了一位长者的恩赐:一根鱼竿和一篓鲜活硕大的鱼。其中,一个人要了一篓鱼,另一个人要了一根鱼竿,于是他们分道扬镳了。得到鱼的人原地就用干柴搭起篝火煮起了鱼,他狼吞虎咽,还没有品出鲜鱼的肉香,转瞬间,连鱼带汤就被他吃了个精光,不久,他便饿死在空空的鱼篓旁。另一个人则提着鱼竿继续忍饥挨饿,一步步艰难地向海边走去,可当他已经看到不远处那片蔚蓝色的海洋时,他浑身的最后一点力气也使完了,他也只能眼巴巴地带着无尽的遗憾撒手人间。又有两个饥饿的人,他们同样得到了长者恩赐的一根鱼竿和一篓鱼。只是他们并没有各奔东西,而是商定共同去找寻大海,他俩每次只煮一条鱼,他们经过遥远的跋涉,来到了海边,从此,两人开始了捕鱼为生的日子,几年后,他们盖起了房子,有了各自的家庭、子女,有了自己建造的渔船,过上了幸福安康的生活。-
启示:一个人只顾眼前的利益,得到的终将是短暂的欢愉;一个人目标高远,但也要面对现实的生活。只有把理想和现实有机结合起来,才有可能成为一个成功之人。有时候,一个简单的道理,却足以给人意味深长的生命启示。
11.孔子的一位学生在煮粥时,发现有肮脏的东西掉进锅里去了。他连忙用汤匙把它捞起来,正想把它倒掉时,忽然想到,一粥一饭都来之不易啊。于是便把它吃了。刚巧孔子走进厨房,以为他在偷食,便教训了那位负责煮食的同学。经过解释,大家才恍然大悟。孔子很感慨的说:“我亲眼看见的事情也不确实,何况是道听途听呢?”-
启示:推销生意是一种组织性质的生意,因为人多,人事问题也多。我们不时听到是非难辨的话,如某公司攻击另一间公司,如是者往往令人混淆是非,影响信心。因此找出事情的真相,不是轻易相信谣言,辛辛苦苦建立的事业才不会毁于一旦。
12.有位秀才第三次进京赶考,住在一个经常住的店里。考试前两天他做了三个梦,第一个梦是梦到自己在墙上种白菜,第二个梦是下雨天,他戴了斗笠还打伞,第三个梦是梦到跟心爱的表妹躺在一起,但是背靠着背。这三个梦似乎有些深意,秀才第二天就赶紧去找算命的解梦。算命的一听,连拍大腿说:”你还是回家吧。你想想,高墙上种菜不是白费劲吗?戴斗笠打雨伞不是多此一举吗?跟表妹躺在一张床上了,却背靠背,不是没戏吗?” 秀才一听,心灰意冷,回店收拾包袱准备回家。店老板非常奇怪,问:”不是明天才考试吗,今天你怎么就回乡了?”秀才如此这般说了一番,店老板乐了:”哟,我也会解梦的。我倒觉得,你这次一定要留下来。你想想,墙上种菜不是高种吗?戴斗笠打伞不是说明你这次有备无患吗?跟你表妹背靠背躺在床上,不是说明你翻身的时候就要到了吗?”秀才一听,更有道理,于是精神振奋地参加考试,居然中了个探花。-
启示:积极的人,象太阳,照到哪里哪里亮,消极的人,象月亮,初一十五不一样。想法决定我们的生活,有什么样的想法,就有什么样的未来。
13.有一天动物园管理员们发现袋鼠从笼子里跑出来了,于是开会讨论,一致认为是笼子的高度过低。所以它们决定将笼子的高度由原来的十公尺加高到二十公尺。结果第二天他们发现袋鼠还是跑到外面来,所以他们又决定再将高度加高到三十公尺没想到隔天居然又看到袋鼠全跑到外面,于是管理员们大为紧张,决定一不做二不休,将笼子的高度加高到一百公尺。一天长颈鹿和几只袋鼠们在闲聊,”你们看,这些人会不会再继续加高你们的笼子?”长颈鹿问。”很难说。”袋鼠说∶”如果他们再继续忘记关门的话!”
启示:其实很多人都是这样,只知道有问题,却不能抓住问题的核心和根基。
14. 一天夜里,已经很晚了,一对年老的夫妻走进一家旅馆,他们想要一个房间。前台侍者回答说:”对不起,我们旅馆已经客满了,一间空房也没有剩下。”看着这对老人疲惫的神情,侍者不忍心深夜让这对老人出门另找住宿。而且在这样一个小城,恐怕其他的旅店也早已客满打烊了,这对疲惫不堪的老人岂不会在深夜流落街头?于是好心的侍者将这对老人引领到一个房间,说:”也许它不是最好的,但现在我只能做到这样了。”老人见眼前其实是一间整洁又干净的屋子,就愉快地住了下来。第二天,当他们来到前台结账时,侍者却对他们说:”不用了,因为我只不过是把自己的屋子借给你们住了一晚–祝你们旅途愉快!”原来如此。侍者自己一晚没睡,他就在前台值了一个通宵的夜班。两位老人十分感动。老头儿说:”孩子,你是我见到过的最好的旅店经营人。你会得到报答的。”侍者笑了笑,说这算不了什么。他送老人出了门,转身接着忙自己的事,把这件事情忘了个一干二净。没想到有一天,侍者接到了一封信函,打开看,里面有一张去纽约的单程机票并有简短附言,聘请他去做另一份工作。他乘飞机来到纽约,按信中所标明的路线来到一个地方,抬眼一看,一座金碧辉煌的大酒店耸立在他的眼前。原来,几个月前的那个深夜,他接待的是一个有着亿万资产的富翁和他的妻子。富翁为这个侍者买下了一座大酒店,深信他会经营管理好这个大酒店。这就是全球赫赫有名的希尔顿饭店首任经理的传奇故事。
启示:事情都是从一个富有同情心、满怀仁爱的侍者的智慧头脑开始:“让我来想想办法……”进入数学的领域,需要的一定是严密的逻辑,合理的推论及精确的求证;来到文学的天地,凭借的却是美好的人性,动人的情节和意外而圆满的结局。但你发现没有:不管是文学还是数学,结局都很神奇——爱加上智慧原来是能够产生奇迹的。
15.有一位表演大师上场前,他的弟子告诉他鞋带松了。大师点头致谢,蹲下来仔细系好。等到弟子转身后,又蹲下来将鞋带解松。有个旁观者看到了这一切,不解地问:”大师,您为什么又要将鞋带解松呢?”大师回答道:”因为我饰演的是一位劳累的旅者,长途跋涉让他的鞋带松开,可以通过这个细节表现他的劳累憔悴.” “那你为什么不直接告诉你的弟子呢?””他能细心地发现我的鞋带松了,并且热心地告诉我,我一定要保护他这种热情的积极性,及时地给他鼓励,至于为什么要将鞋带解开,将来会有更多的机会教他表演,可以下一次再说啊。”
启示:人一个时间只能做一件事,懂抓重点,才是真正的人才。
16.一个人在高山之巅的鹰巢里,抓到了一只幼鹰,他把幼鹰带回家,养在鸡笼里。这只幼鹰和鸡一起啄食、嬉闹和休息。它以为自己是一只鸡。这只鹰渐渐长大,羽翼丰满了,主人想把它训练成猎鹰,可是由于终日和鸡混在一起,它已经变得和鸡完全一样,根本没有飞的愿望了。主人试了各种办法,都毫无效果,最后把它带到山顶上,一把将它扔了出去。这只鹰像块石头似的,直掉下去,慌乱之中它拼命地扑打翅膀,就这样,它终于飞了起来!-
启示:磨练召唤成功的力量。
17.雨后,一只蜘蛛艰难地向墙上已经支离破碎的网爬去,由于墙壁潮湿,它爬到一定的高度,就会掉下来,它一次次地向上爬,一次次地又掉下来……第一个人看到了,他叹了一口气,自言自语:”我的一生不正如这只蜘蛛吗?忙忙碌碌而无所得。”于是,他日渐消沉。第二个人看到了,他说:这只蜘蛛真愚蠢,为什么不从旁边干燥的地方绕一下爬上去?我以后可不能像它那样愚蠢。于是,他变得聪明起来。第三个人看到了,他立刻被蜘蛛屡败屡战的精神感动了。于是,他变得坚强起来。-
启示:有成功心态者处处都能发觉成功的力量。
18.一个老人在高速行驶的火车上,不小心把刚买的新鞋从窗口掉了一只,周围的人倍感惋惜,不料老人立即把第二只鞋也从窗口扔了下去。这举动更让人大吃一惊。老人解释说:”这一只鞋无论多么昂贵,对我而言已经没有用了,如果有谁能捡到一双鞋子,说不定他还能穿呢!”
启示:成功者善于放弃。
19.某大公司准备以高薪雇用一名小车司机,经过层层筛选和考试之后,只剩下三名技术最优良的竞争者。主考者问他们:”悬崖边有块金子,你们开着车去拿,觉得能距离悬崖多近而又不至于掉落呢?””二公尺。”第一位说。”半公尺。”第二位很有把握地说。”我会尽量远离悬崖,愈远愈好。”第三位说。结果这家公司录取了第三位。-
启示:不要和诱惑较劲,而应离得越远越好。
20.老和尚携小和尚游方,途遇一条河;见一女子正想过河,却又不敢过。老和尚便主动背该女子趟过了河,然后放下女子,与小和尚继续赶路。小和尚不禁一路嘀咕:师父怎么了?竟敢背一女子过河?一路走,一路想,最后终于忍不住了,说:师父,你犯戒了?怎么背了女人?老和尚叹道:我早已放下,你却还放不下!
启示:君子坦荡荡,小人常戚戚;心胸宽广,思想开朗,遇事拿得起、放得下,才能永远保持一种健康的心态。
21.一个心理学教授到疯人院参观,了解疯子的生活状态。一天下来,觉得这些人疯疯癫癫,行事出人意料,可算大开眼界。想不到准备返回时,发现自己的车胎被人下掉了。”一定是哪个疯子干的!”教授这样愤愤地想道,动手拿备胎准备装上。事情严重了。下车胎的人居然将螺丝也都下掉。没有螺丝有备胎也上不去啊!教授一筹莫展。在他着急万分的时候,一个疯子蹦蹦跳跳地过来了,嘴里唱着不知名的欢乐歌曲。他发现了困境中的教授,停下来问发生了什么事。教授懒得理他,但出于礼貌还是告诉了他。疯子哈哈大笑说:”我有办法!”他从每个轮胎上面下了一个螺丝,这样就拿到三个螺丝将备胎装了上去。教授惊奇感激之余,大为好奇:”请问你是怎么想到这个办法的?” 疯子嘻嘻哈哈地笑道:”我是疯子,可我不是呆子啊!”
启示;自己想吧

基于innobackupex的mysql备份脚本

#! /bin/bash
#数据库相关信息
dbuser=root
dbpasswd=password
mycnf=/etc/mysql/my.cnf
#如果bin-log没有指定路径
dir_bin=/opt/mysql/mysqldata/mysqllog
#数据库备份的路径
install_dir=/opt/MySqlBackUp
data_dir=$install_dir/data
temp_dir=$install_dir/temp
log_dir=$install_dir/logs
bin_dir=$install_dir/bin
#接受邮箱
mail=chengfei@srt.com.cn
#备份文件名、日志名、备份日志
sj=`date +\%Y``date +\%m``date +\%d``date +\%H``date +\%M``date +\%S`
datafile=$sj"_data.tar.gz"
log=$sj".log"
binlogfile=$sj"_bin.tar.gz"
#使用mysqldump备份
#是否启动dump功能(0表示不启用,1表示启用)
dump_flag=1
#需要dump出来的数据库名
dumpdb=srtair
#dump文件名
dumpfile=$sj"_"$dumpdb".sql.gz"
#是否备份至远程
#是否启用ftp传输功能
ftp_flag=0
#ftp IP地址
ftp_ip=
#ftp 用户名
ftp_user=
#ftp 密码
ftp_passwd=
#上传ftp 路径
ftp_dir=
#读取my.cnf文件
process_readconfig()
{
echo "-----------开始读my.cnf文件--`date`-------------"
#没有具体路径情况或者有具体路径
bin_log=`cat $mycnf | grep -i '^log-bin' | awk -F = '{print $2}'|sed s/\ //g`
#数据文件路径
datadir=`cat $mycnf | grep -i '^datadir' | awk -F = '{print $2}'|sed s/\ //g`
#需要判断是否有/,然后决定是否是全路径
#basedir路径
basedir=`cat $mycnf | grep -i '^basedir' | awk -F = '{print $2}'|sed s/\ //g`
}
#日志处理
process_binlog()
{
echo "……………………………开始备份日志文件--`date`………………………………">>"$log_dir/$log"
echo "……………………………开始备份日志文件--`date`………………………………"
echo "需要备份二进制日志列表……">>"$log_dir/$log"
ls -tl "$bin_log."[0-9]* >>"$log_dir/$log"
echo "开始备份二进制日志文件……"`date`>>"$log_dir/$log"
tar czvfP "$data_dir/$binlogfile" "$bin_log".[0-9]*
echo "结束备份二进制日志文件……"`date`>>"$log_dir/$log"
#删除一天以前的日志文件
echo "删除过期二进制日志文件……"`date`>>"$log_dir/$log"
echo "删除过期二进制日志列表……">>"$log_dir/$log"
find $dir_bin -type f -mtime +1>>"$log_dir/$log"
find $dir_bin -type f -mtime +1 -exec rm -f {} \;
echo "删除过期二进制日志文件结束……"`date`>>"$log_dir/$log"
echo "…………………………备份日志文件结束--`date`……………………………………">>"$log_dir/$log"
echo "…………………………备份日志文件结束--`date`……………………………………"
}
#数据备份
process_backup()
{
process_readconfig
#备份数据库
echo "……………………………开始备份数据文件--`date`………………………………"
echo "……………………………开始备份数据文件--`date`………………………………">>"$log_dir/$log"
source /root/.bash_profile
$bin_dir/innobackupex --user="$dbuser" --password="$dbpasswd" --defaults-file="$mycnf" --stream=tar "$temp_dir" 2>"$temp_dir/$sj"_tmp.log | gzip>"$data_dir/$datafile"
echo "……………………………备份数据文件结束--`date`………………………………">>"$log_dir/$log"
echo "……………………………备份数据文件结束--`date`………………………………"
cat "$temp_dir/$sj"_tmp.log>>"$log_dir/$log"
#删除7天以前备份数据和信息
echo "清理7天前备份数据与相关信息……"`date`>>"$log_dir/$log"
find $data_dir -type f -mtime +7>>"$log_dir/$log"
find $data_dir -type f -mtime +7 -exec rm -f {} \;
#mysqldump操作
if [ "$dump_flag" == 1 ]; then
echo "……………… mysqldump操作开始--`date`……………"
echo "……………… mysqldump操作开始--`date`………">>"$log_dir/$log"
 exp_sql
echo "……………… mysqldump操作结束--`date`…………">>"$log_dir/$log"
echo "……………… mysqldump操作结束--`date`……………………………"
fi
#登录mysql,切换日志
$basedir/bin/mysql -u$dbuser -p$dbpasswd<<XFF
flush logs;
exit
XFF
#备份日志文件
process_binlog
#ftp(没有写是否上传失败,成功)
if [ "$ftp_flag" == 1 ]; then
echo "……………… ftp操作开始--`date`……………"
echo "……………… ftp操作开始--`date`…………">>"$log_dir/$log"
 exec_ftp
echo "……………… ftp操作结束--`date`…………">>"$log_dir/$log"
echo "……………… ftp操作结束--`date`……………………………"
fi
#发送邮件
process_send
}
process_send()
{
  #查找错误
  grep "Error" "$temp_dir/$sj"_tmp.log > "$temp_dir/$sj".err
  IP=`/sbin/ifconfig ${eth} | grep 'inet addr:'| awk '{print $2}' | awk -F : '{print $2}'`
  IP=`echo $IP|awk '{print $1}'`
  echo `grep "innobackupex: completed OK\!" "$temp_dir/$sj"_tmp.log | awk -F : '{print $4}'|sed s/\ //g`>"$temp_dir/$sj".good
  GOOD_COUNT=`cat "$temp_dir/$sj".good |wc -l`
  ERROR_COUNT=`cat  "$temp_dir/$sj".err |wc -l`
  if [ "$ERROR_COUNT" == 0 -a "$GOOD_COUNT" == 1 ]; then
     echo "`date`-----MySql备份成功-----">>"$log_dir"/result.log
     echo "-----------------------------------">>"$log_dir"/result.log
     echo "……………………………开始发送邮件--`date`………………………………"
     echo "……………………………开始发送邮件--`date`………………………………">>"$log_dir/$log"
     echo "MySql_Backup_Succeed" | mutt -s "$IP"_MySql_Backup_Succeed -a "$log_dir/$log" ${mail}
  else
     echo "`date`-----MySql备份失败,请检查$temp_dir"/"$sj"_tmp.log>>"$log_dir"/result.log
     echo "-----------------------------------">>"$log_dir"/result.log
     echo "……………………………开始发送邮件--`date`………………………………"
     echo "……………………………开始发送邮件--`date`……………………………">>"$log_dir/$log"
     cat "$temp_dir/$sj".err  | mutt -s "$IP"_MySql_Backup_Fail -a "$temp_dir/$sj"_tmp.log ${mail}
  fi
   #删除7天前的日志文件
   find $temp_dir -type f -mtime +7 -exec rm -f {} \;
   echo "……………………………发送邮件结束--`date`………………………………">>"$log_dir/$log"
   echo "……………………………发送邮件结束--`date`………………………………"
}
#导出sql语句
exp_sql()
{
  mysqldump -u "$dbuser" -p"$dbpasswd"   --single-transaction --allow-keywords --add-locks   --add-drop-table  -F -q "$dumpdb" |gzip 1>"$data_dir/$dumpfile"
}
#ftp操作
exec_ftp()
{
  echo "#!/bin/bash">"$temp_dir/$sj"_ftp.sh
  echo "ftp -n $ftp_ip <<XFF">>"$temp_dir/$sj"_ftp.sh
  echo "user $ftp_user $ftp_passwd">>"$temp_dir/$sj"_ftp.sh
  echo "bin">>"$temp_dir/$sj"_ftp.sh
  echo "cd $ftp_dir">>"$temp_dir/$sj"_ftp.sh
  echo "lcd $data_dir">>"$temp_dir/$sj"_ftp.sh
  echo "put $datafile">>"$temp_dir/$sj"_ftp.sh
  echo "put $dumpfile">>"$temp_dir/$sj"_ftp.sh
  echo "put $binlogfile">>"$temp_dir/$sj"_ftp.sh
  echo "lcd $log_dir">>"$temp_dir/$sj"_ftp.sh
  echo "put $log">>"$temp_dir/$sj"_ftp.sh
  echo "close">>"$temp_dir/$sj"_ftp.sh
  echo "bye" >>"$temp_dir/$sj"_ftp.sh
  echo "XFF">>"$temp_dir/$sj"_ftp.sh
  chmod 777 "$temp_dir/$sj"_ftp.sh
  sh  "$temp_dir/$sj"_ftp.sh
}
#执行备份
process_backup

mysql_backup.sh程序安装说明
1、安装mysqlbackup程序
上传mysqlbackup到服务器/tmp目录
cd /tmp
unzip mysqlbackup.zip
cp /tmp/mysqlbackup/* /opt/mysql/product/5.1/bin
mkdir -p /opt/MySqlBackUp/bin
mkdir -p /opt/MySqlBackUp/data
mkdir -p /opt/MySqlBackUp/logs
mkdir -p /opt/MySqlBackUp/temp
ln -s /opt/mysql/product/5.1/bin/innobackupex /opt/MySqlBackUp/bin/innobackupex
对innobackupex进行授权
cd /opt/mysql/product/5.1/bin/
chmod +x innobackupex*
chmod +x xtrabackup*
chmod +x tar4ibd
cp /tmp/mysqlbackup/mysql_backup.sh /opt/MySqlBackUp/bin/
chmod 775 /opt/MySqlBackUp/bin/mysql_backup.sh
2、修改mysql_backup.sh中的相关数据
dbuser
dbpasswd
mail
dumpdb
3、配置mysql环境变量到root中
export MYSQL_BASE=/opt/mysql
export BASEDIR=$MYSQL_BASE/product/5.1
export DATADIR=$MYSQL_BASE/mysqldata
export LD_LIBRARY_PATH=$BASEDIR/lib:/lib:/usr/lib:/usr/local/lib
export TMPDIR=/tmp
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$BASEDIR/bin:$MYSQL_BASE:$BASEDIR:$LD_LIBRARY_PATH
添加到/root/.bash_profile文件中
4、测试备份
cd /opt/MySqlBackUp/bin
./mysql_backup.sh
5、查看备份是否成功
cat /opt/MySqlBackUp/logs/result.log
如果提示备份成功,则表示程序安装成功,可能不熟到crontab中
6、部署crontab
0 1 * * * (cd /opt/MySqlBackUp/bin;sh ./mysql_backup.sh)
说明:参数配置,均是基于按照mysql安装路径配置

删除data guard归档日志

Oracle Data Guard 是通过归档文件来进行数据同步的。 主库的归档文件,我们可以在RMAN 备份的时候进行删除,但是备库的归档文件无法自动删除,需要写脚本来定时删除。

#!/bin/bash
export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1
export ORACLE_SID=zjch
export ARCHIVE_DIR=/opt/oracle/oradata/zjch/archive
export LOG_FILE=/home/oracle/logs/del_archive.log
echo "开始删除归档日志:`date`……">>$LOG_FILE
if [ `whoami` != 'oracle' ]
then
echo "Error: You must be oracle to execute.">>$LOG_FILE
exit 99
fi
del_seq=`ls -tr $ARCHIVE_DIR/|grep -v stdarch | head -1|cut -f2 -d_`
$ORACLE_HOME/bin/sqlplus -silent "/ as sysdba" <<XFF>tmp.log
set pagesize 0 feedback off verify off heading off echo off
select max(sequence#) from v\$ARCHIVED_LOG where APPLIED='YES';
exit;
XFF
max_sn=`cat tmp.log`
rm tmp.log
max_sn=$(( $max_sn - 20 ))
#我这里是保留最近的20个归档文件,这个具体情况自己决定
while [[ ${del_seq} -lt ${max_sn} ]]
do
  echo "${ARCHIVE_DIR}/1_${del_seq}_681145105.dbf">>$LOG_FILE
  rm ${ARCHIVE_DIR}/1_${del_seq}_681145105.dbf
  #这里是我定义归档文件的格式,具体根据自己的归档文件格式来匹配,关键是匹配日志的sequence no。
  del_seq=$(( $del_seq + 1 ))
done
echo "删除归档日志结束:`date`……">>$LOG_FILE
#清楚controlfile中信息
$ORACLE_HOME/bin/rman target / <<XIFENFEI>>$LOG_FILE
crosscheck archivelog all;
delete expired archivelog all;
YES
exit;
XIFENFEI
echo "………………………………………………………………………………………………………………………">>$LOG_FILE

重点是在读取现在存在的归档日志文件中sequence最小值时,
使用了ls -tr $ARCHIVE_DIR/|grep -v stdarch | head -1|cut -f2 -d_

Oracle 聚簇因子

前几天被人问到聚簇因子被问住了,所以今天做了个试验说明这个问题
1、准备试验条件

--创建表t_1
CREATE TABLE t_1
AS
SELECT ROWNUM rn,a.* FROM all_objects a ORDER BY object_name DESC;
--创建t_1表关于rownum索引
CREATE INDEX ind_t_1 ON t_1(rn);
--创建表表t_2
CREATE TABLE t_2
AS
SELECT * FROM (
SELECT ROWNUM rn,a.* FROM all_objects a ) ORDER BY rn ASC;
--创建t_2表关于rownum索引
CREATE INDEX ind_t_2 ON t_2(rn);
--分析两张表及其索引
EXEC DBMS_STATS.gather_table_stats(USER, 'T_1');
EXEC DBMS_STATS.gather_table_stats(USER, 'T_2');
EXEC DBMS_STATS.gather_index_stats(USER, 'IND_T_1');
EXEC DBMS_STATS.gather_index_stats(USER, 'IND_T_2');
--说明:两个表的区别就是t_2表中的rn是有序的,刚刚建立t_2表的索引一致

2、执行查询操作
SQL> set autot traceonly stat;
SQL> SELECT * FROM t_1 WHERE rn BETWEEN 100 AND 120;
已选择21行。
统计信息
———————————————————-
0 recursive calls
0 db block gets
17 consistent gets
0 physical reads
0 redo size
1807 bytes sent via SQL*Net to client
357 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
21 rows processed
SQL> SELECT * FROM t_2 WHERE rn BETWEEN 100 AND 120;
已选择21行。
统计信息
———————————————————-
0 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
1807 bytes sent via SQL*Net to client
357 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
21 rows processed
3、观察试验结果
通过执行统计信息观察,t_1表的查询一致读是17,而t_2表的一致读只有7,尽然t_1的一致读尽然是t_2的2倍还多,是不是有点奇怪,同样的表结构,同样的数据(t_2多两条数据)
4、分析原因
通过查询聚簇因子发现,两个表的聚簇因子差别很大,基于rn的索引在rn是顺序排列的表中,clustering_factor的值相差很大。
在表中数据有时候属于无序状态,这个时候的CLUSTERING_FACTOR比较接近NUM_ROWS,说明如 果扫描整个表,每次都要根据Index来读取相应行的RowID,这个时候的IO操作很多,自然检索时间会比较长。如果数据有序的 话,CLUSTERING_FACTOR比较接近BLOCKS,说明相邻的数据在一个块中,减少了IO操作数量,自然检索时间会大大降低。

shell常见使用技巧

1、正则表达式判断(bash shell)

if [[ $PARTITION_NAME =~ '^P_((20[0-9]{4})|MAX)$' ]] ; then
echo 'yes'
else
echo 'no'
fi

重点:=~[[]]

2、shell编程读取文件中的行,并循环处理

cat PARTITION_NAME.cnf | while read P_LINE
do
PARTITION_NAME=`echo $P_LINE|awk  '{print $1}'`
echo $PARTITION_NAME
:
do

重点:while read

3.kill每个关键字进程

ps -ef|grep xifenfei|grep -v grep|awk '{print $2}'|xargs kill -9

重点:awk和xargs使用

4.删除几天前文件

find ./ -type f -name "*.txt" -mtime +1|xargs rm -rf
find ./ -type f -name "*.log" -mtime +1 -exec rm -fr {} \;

重点:find/mtime/xargs(exec )

MYSQL修改密码

方法一
(适用于管理员或者有全局权限的用户重设其它用户的密码)
进入命令行模式
mysql -u root mysql
mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=’name’;
mysql> FLUSH PRIVILEGES;
mysql> QUIT
方法二
(应用同上,只是方法不同)
mysql -u root mysql
mysql> SET PASSWORD FOR name=PASSWORD(‘new password’);
mysql> QUIT
方法三
mysqladmin -u root “old password” “new password”

ORA-38760: 此数据库实例无法启用闪回数据库

SQL> startup
ORACLE 例程已经启动。
Total System Global Area 368263168 bytes
Fixed Size 1374668 bytes
Variable Size 276825652 bytes
Database Buffers 83886080 bytes
Redo Buffers 6176768 bytes
数据库装载完毕。
ORA-38760: 此数据库实例无法启用闪回数据库
SQL> alter database flashback off;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> alter database flashback on;
数据库已更改。
说明:如果出现以下错误,处理如下
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-38760: This database instance failed to turn on flashback database
SQL> select name from v$restore_point;
If so, drop them:
SQL> drop restore point ;
SQL> alter database flashback off;
.

ORA-01207/ORA-00338恢复

1、模拟环境
拷贝出来控制文件,然后对数据库进行一些操作,然后关闭数据库,使用拷贝出来的控制文件替换原控制文件,启动数据库
出现类此错误:
ORA-00338: 日志 2 (用于线程 1) 比控制文件更新
ORA-00312: 联机日志 2 线程 1: ‘E:\ORACLE\ORADATA\XFF\REDO02’
或者
ORA-01122: 数据库文件 1 验证失败
ORA-01110: 数据文件 1: ‘E:\ORACLE\ORADATA\XFF\SYSTEM01.DBF’
ORA-01207: 文件比控制文件更新 – 旧的控制文件
2、处理思路
1)创建控制文件
1.1)alter database backup controlfile to trace;
1.2)生成控制文件脚本

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "XFF" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 584
LOGFILE
  GROUP 1 'E:\ORACLE\ORADATA\XFF\REDO01'  SIZE 10M BLOCKSIZE 512,
  GROUP 2 'E:\ORACLE\ORADATA\XFF\REDO02'  SIZE 10M BLOCKSIZE 512,
  GROUP 3 'E:\ORACLE\ORADATA\XFF\REDO03'  SIZE 10M BLOCKSIZE 512
DATAFILE
  'E:\ORACLE\ORADATA\XFF\SYSTEM01.DBF',
  'E:\ORACLE\ORADATA\XFF\SYSAUX01.DBF',
  'E:\ORACLE\ORADATA\XFF\UNDOTBS01.DBF',
  'E:\ORACLE\ORADATA\XFF\USERS01.DBF',
  'E:\ORACLE\ORADATA\XFF\EXAMPLE01.DBF',
  'E:\ORACLE\ORADATA\XFF\O_ORACLE.DBF',
  'E:\ORACLE\ORADATA\XFF\XIFENFEI01.DBF',
  'E:\ORACLE\ORADATA\XFF\P_TEST01.DBF',
  'E:\ORACLE\ORADATA\XFF\SYS_MG01.DBF',
  'E:\ORACLE\ORADATA\XFF\P101.DBF',
  'E:\ORACLE\ORADATA\XFF\P201.DBF',
  'E:\ORACLE\ORADATA\XFF\P301.DBF',
  'E:\ORACLE\ORADATA\XFF\OGG01.DBF',
  'E:\ORACLE\ORADATA\XFF\SPOT01.DBF'
CHARACTER SET ZHS16GBK
;

1.3)关闭数据库
shutdown abort;
1.4)删除现在的控制文件
1.5)执行生成控制文件脚本
2)恢复数据库
recover database;
3)打开数据库
alter database open;
4)添加临时文件
alter tablespace temp add tempfile
‘E:\ORACLE\ORADATA\XFF\TEMP01.DBF’ size 20m reuse;
说明:可以使用备份的控制文件进行恢复
1:startup mount;
2:recover database using backup controlfile until cancel;
然后根据情况,指定archive log和redo file。
3:alter database open resetlogs;

latch: cache buffers chains

当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们称其这hash chains,chain在中文的意为链条或串的意思,表达就是关连性.如果一个进程想访问或修改hash chain上的block,它首先要获得”cache buffers chains” latch。
原因一:低效率的SQL语句(主要体现在逻辑读过高)
cache buffers chains latch很大程度与逻辑读有关,所以要观注v$sql中BUFFER_GETS/EXECUTIONS大的语句。
同时每一个逻辑读需要一个latch get 操作及一个cpu操作,这样的sql也会很耗cpu资源。
原因二:热块(访问过于频繁)
找出热点块方法一:

--找出p1raw
select p1,p1raw from v$session_wait where event='latch: cache buffers chains';
--找到对象
SELECT /*+ RULE */
 E.OWNER || '.' || E.SEGMENT_NAME SEGMENT_NAME,
 E.PARTITION_NAME,
 E.EXTENT_ID EXTENT#,
 X.DBABLK - E.BLOCK_ID + 1 BLOCK#,
 X.TCH,
 L.CHILD#
  FROM SYS.V$LATCH_CHILDREN L, SYS.X$BH X, SYS.DBA_EXTENTS E
 WHERE X.HLADDR = '00000002576EE018'--p1raw
   AND E.FILE_ID = X.FILE#
   AND X.HLADDR = L.ADDR
   AND X.DBABLK BETWEEN E.BLOCK_ID AND E.BLOCK_ID + E.BLOCKS - 1
 ORDER BY X.TCH DESC;

找出热点块方法二:

--直接找出热点块
SELECT OBJECT_NAME, SUBOBJECT_NAME
  FROM DBA_OBJECTS
 WHERE DATA_OBJECT_ID IN
       (SELECT DATA_OBJECT_ID
          FROM (SELECT OBJ DATA_OBJECT_ID, FILE#, DBABLK, CLASS, STATE, TCH
                  FROM X$BH
                 WHERE HLADDR IN (SELECT ADDR
                                    FROM (SELECT ADDR
                                            FROM V$LATCH_CHILDREN
                                           ORDER BY (GETS + MISSES + SLEEPS) DESC)
                                   WHERE ROWNUM < 10)
                 ORDER BY TCH DESC)
         WHERE ROWNUM < 10);