我们的文章会在微信公众号"Oracle恢复实录"和博客网站同步更新,欢迎关注收藏。也欢迎大家转载,但请在文章开始处标注文章出处,谢谢!
由于博客中包含大量代码,建议通过网页浏览以获得更好的阅读体验。
脚本的诞生背景
"关闭数据库不就是一条shutdown immediate命令的事吗?"------相信这是很多DBA的第一反应。实在不行,再来个shutdown abort,那不是手到擒来?没错,理论上确实如此。但现实往往比理论更有"戏剧性"...
还记得我的"第一次"吗?不,不是你们想的那个第一次!我说的是第一次在生产环境关闭数据库。那是在2010年,作为一名刚毕业3个月的菜鸟DBA,在某省移动担任Oracle驻场工程师。某个深夜,我需要重启一个我一直在优化的营业厅数据库。
那时的我,年少不知操作险,信心满满地向厂商和甲方承诺:"重启?小事一桩!给我10分钟就够了!"
然而,现实给了我一记响亮的耳光。午夜12点,我信心满满地敲下shutdown immediate,然后...然后就傻眼了。数据库纹丝不动,alert日志安静如鸡,仿佛在说:"年轻人,你太天真了!"
几分钟过去了,数据库依然稳如泰山。这时候,我的"危机感雷达"开始疯狂报警:心跳加速✓,手心冒汗✓,脑门冒汗✓。打电话求助领导?糟糕,现场值班模式,VPN还没开!
更要命的是,应用厂商在群里开始轮番轰炸:"还要多久?""出什么问题了?""能不能快点?"。很快,他们放弃了线上交流,直接杀到我工位旁"围观"。想象一下,一群人站在你身后,盯着你的屏幕,而你的键盘手还在微微发抖,衣服已经被汗水浸透...这场景,简直比恐怖片还刺激!
最终,这场"战役"在20分钟后才结束。说实话,非常感谢当晚的应用厂商和甲方同事。虽然他们的"围观"给了我不小的压力,但他们始终在安慰我:"别紧张,慢慢来"。(虽然他们心里可能在想:这小子靠谱吗?)
在之后的职业生涯中,随着对数据库和操作系统的理解越来越,我发现这种情况并不罕见。很多同事朋友也遇到过类似的"惊魂时刻",有时甚至导致变更计划被迫取消。于是在2014年,我把自己的经验教训和向各路大神学习到的智慧,整合成了一个shell版本的一键关库脚本。后来,在2016年学习Perl时,我把它改写成了Perl版本。到了2024年,在学习Go语言时,我又顺手把它改成了Go版本。(没错,这个脚本经历了三次重生,比凤凰还能涅槃)
脚本的功能
这个脚本就像是一个"数据库关闭管家",它考虑了以下场景:
- 既能关单库,也能关全库(就像一键关灯和一键关所有灯的区别)
- 多库关闭时可以并行处理(就是传说中的"分身术")
- 通过ckpt进程智能识别ORACLE_HOME环境(不用手动设置环境变量,懒人福音!)
- 根据输入的实例名精准关闭(不会误伤其他数据库,很有礼貌的脚本)
- 多实例关闭时互不影响(一个实例出问题,其他实例表示:关我啥事?)
- 所有操作都会生成SQL脚本后再执行(方便debug,就像留下作案现场一样)
关闭过程主要包含三个步骤:
- 日志切换(如果是备库就跳过,毕竟备库也要面子)
- 杀进程(温柔或暴力,由你选择)
- 关闭数据库(最后的最后)
关闭模式有两种:
- shutdown abort模式:简单粗暴,不切换日志,不杀进程,直接关!(就像拔电源一样干脆)
- shutdown immediate模式:温柔优雅,该切换切换,该清理清理(讲究人用的模式)
默认采用shutdown immediate模式,并使用操作系统kill命令(保持优雅的同时又不失效率)
脚本的参数说明
脚本的使用方法简单得像点外卖一样,来看看这个"数据库外卖菜单":
plain_text
yihan:shutdown yihan$ ./shutdown --h
Usage: shutdown [-s htz1] [-h help] [-d] [-ec ORA-12345] [-ic ORA-00060] [-f mode]
Options:
the script encounters an error, please contact: 18081072613 (same number for phone and WeChat).
Shutdown modes (-f):
a: Abort mode - Uses shutdown abort without session termination
k: Kill mode - Uses OS kill for LOCAL=NO sessions before shutdown immediate
n: Normal mode - Uses alter system kill session before shutdown immediate
-d Enable script debugging
-ec string
Manual input error code,Comma-spaced multiple values
-f string
Shutdown mode: a (abort), k (os kill), n (normal kill) (default "k")
-h display help information
-ic string
Manual input ignore code,Comma-spaced multiple values
-s string
instance name you will shutdown,0 will shutdown all instance (default "htz")
参数说明(通俗版):
plain_text
-d 开启调试模式,就像打开显微镜一样,让你看清每一步操作(所有命令都会乖乖记录在log文件里)
-ec 遇到这些ORA错误就立刻停止(就像遇到红灯要停车一样)
-ic 遇到这些ORA错误就装作没看见(就像对某些bug睁一只眼闭一只眼 )
-s 要关闭哪个数据库?输入0就是包场,全部关掉!(默认只关名叫htz的库)
-f 选择关闭模式:
a - 暴力模式(就像拔电源)
k - 温柔模式,用操作系统方式请走用户
n - 绅士模式,用数据库命令优雅地请走用户
温馨提示:ec和ic这两个参数目前处于"休假状态",是历史版本的遗产。(就像你爸妈给你留的古董电话,虽然不用了但还是舍不得扔)
下载方式
本脚本是用Go语言写的(没错,就是那个带着萌萌哒吉祥物的语言),目前只编译了Linux版本。至于AIX和HP_UX平台...emmm,等我有测试环境了再说!(不是我不想,实在是巧妇难为无米之炊啊!)
获取脚本有两种方式(任选其一即可):
- 关注公众号并回复"shutdown"(最简单的方式)
- 加我微信18081072613(想顺便聊聊天的可以选这个)
问题反馈
脚本用着不爽?有bug想吐槽?想要新功能?随时联系我!我的态度是:您说得对,我马上改!(除非您说得不对...)
特别声明:这个脚本是我的一片心意,专门用来帮助大家提高工作效率、减少故障率的。请不要用它来赚钱或者参加招投标哦!(不然我会很伤心的)
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613