DBA必备神器:让Oracle关库不再心惊胆战!

我们的文章会在微信公众号"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版本。(没错,这个脚本经历了三次重生,比凤凰还能涅槃)

脚本的功能

这个脚本就像是一个"数据库关闭管家",它考虑了以下场景:

  1. 既能关单库,也能关全库(就像一键关灯和一键关所有灯的区别)
  2. 多库关闭时可以并行处理(就是传说中的"分身术")
  3. 通过ckpt进程智能识别ORACLE_HOME环境(不用手动设置环境变量,懒人福音!)
  4. 根据输入的实例名精准关闭(不会误伤其他数据库,很有礼貌的脚本)
  5. 多实例关闭时互不影响(一个实例出问题,其他实例表示:关我啥事?)
  6. 所有操作都会生成SQL脚本后再执行(方便debug,就像留下作案现场一样)

关闭过程主要包含三个步骤:

  1. 日志切换(如果是备库就跳过,毕竟备库也要面子)
  2. 杀进程(温柔或暴力,由你选择)
  3. 关闭数据库(最后的最后)

关闭模式有两种:

  1. shutdown abort模式:简单粗暴,不切换日志,不杀进程,直接关!(就像拔电源一样干脆)
  2. 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,等我有测试环境了再说!(不是我不想,实在是巧妇难为无米之炊啊!)

获取脚本有两种方式(任选其一即可):

  1. 关注公众号并回复"shutdown"(最简单的方式)
  2. 加我微信18081072613(想顺便聊聊天的可以选这个)

问题反馈

脚本用着不爽?有bug想吐槽?想要新功能?随时联系我!我的态度是:您说得对,我马上改!(除非您说得不对...)

特别声明:这个脚本是我的一片心意,专门用来帮助大家提高工作效率、减少故障率的。请不要用它来赚钱或者参加招投标哦!(不然我会很伤心的)

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等

电话、微信、QQ:18081072613


相关推荐
JUNIOR_MU3 个月前
【VMware VCF】启动和关闭 VMware Cloud Foundation 环境的正确顺序。
shutdown·vsphere·vsan·vcenter server·vcf·vmware cloud foundation·nsx manager·vi workload domain·vcls·startup·management workload domain·nsx edge·aira operations for logs·vsphere replication·live site recovery·aira suite lifecycle·workspace one access·aira operations·aira automation·vsphere supervisor
也许明天_Martina1 年前
每天学习一个Windows命令或Linux命令——shutdown
linux·windows·linux命令·shutdown
书香度年华2 年前
【计算机网络】网络编程接口 Socket API 解读(11)
linux·计算机网络·socket·shutdown·close