这TM也能出事?我真是服了!

今天真是他妈的倒了血霉了!上午刚来,屁股还没坐热,就被DBA那SB玩意儿叫过去,说数据库连不上了,应用死活起不来,让老子过去看看。我心里就一万只草泥马奔腾而过,这种JB问题也来找我?数据库连不上,第一反应不应该是自己查日志,看是不是密码过期,或者网络问题吗?
到了现场,那孙子还在那儿抓耳挠腮,我就问他,你TM倒是说说,啥情况?他支支吾吾地说,就是…就是…应用报错,说连接不上数据库。我直接怼他:“连不上就看日志啊!你TM是摆设吗?日志呢?拿来我看看!”
日志拿过来,一眼就看到ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。 这TM不是TNS配置有问题吗?listener不知道你请求的服务。我深吸一口气,告诉自己冷静,这SB玩意儿可能真的一窍不通。
我就问他:“你改过tnsnames.ora文件没?” 他说:“改过啊,昨天晚上改的。” 我TM就想一巴掌扇死他,改完TNS文件,listener没 reload,你指望它能找到新的service name? 这TM是DBA的基本素养好吧?
然后我就开始检查tnsnames.ora文件,一看,我艹,更离谱的事情发生了!这SB玩意儿把SERVICE_NAME写成了SID! 难怪listener找不到服务! 我指着文件,对着他的鼻子吼:“你TM脑子被驴踢了吗? SERVICE_NAME和SID都分不清? 你怎么当上DBA的?走后门进来的?”
他还在那儿狡辩:“我…我以为都一样…” 我真是无语了,这TM根本不是“以为都一样”的问题,这是基本概念都没搞清楚! Oracle的SERVICE_NAME是用来在listener上注册服务的,而SID是数据库实例的唯一标识。它们虽然都指向同一个数据库实例,但是用途完全不同!
更可气的是,这孙子改完TNS文件,没重启应用服务器,也没刷新连接池! 我TM真是要被气死了! 一通操作下来,解决问题的方法简单的令人发指:
1. 修改tnsnames.ora文件,将SID改成正确的SERVICE_NAME. (例如,把 SID = ORCL 改成 SERVICE_NAME = ORCL.example.com)
2. 登录数据库服务器,执行lsnrctl reload 命令,重新加载listener配置。
3. 重启应用服务器,或者至少刷新连接池。
就这么简单的三步,这SB愣是搞了一上午! 我真想把他的工牌摘下来,扔到垃圾桶里!
技术结论:
这种傻逼错误,根本不应该发生。tnsnames.ora 文件是连接Oracle数据库的基础。记住,SERVICE_NAME和SID不是一个东西,用错的后果就是连接失败。修改tnsnames.ora之后,必须reload listener,并且重启应用或者刷新连接池,确保新的配置生效。 别TM以为DBA就是个点点鼠标的活儿,基本功不扎实,迟早要出事! 以后谁TM再犯这种低级错误,我就直接让他滚蛋! 简直是浪费老子的时间!