我们的文章会在微信公众号"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命令(保持优雅的同时又不失效率)

脚本的参数说明

脚本的使用方法简单得像点外卖一样,来看看这个"数据库外卖菜单":

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")

参数说明(通俗版):

-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


DBA必备神器:让Oracle关库不再心惊胆战!的更多相关文章

  1. Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据

    Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据 PRM 全称为ParnassusData Recovery Manager ,由 诗檀软 ...

  2. (转)Oracle数据库DBA必备基本技能

    [Oracle数据库DBA必备基本技能] shutdown Normal 需要等待所有的用户断开连接 Immediate 等待用户完成当前的语句 Transactional    等待用户完成当前的事 ...

  3. 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库

    工欲善其事,必先利其器 本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 原文地址:http ...

  4. DBA必备:MySQL数据库常用操作和技巧

    DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...

  5. sublime text3 --前端工程师必备神器

    sublime text3 --前端工程师必备神器 导读目录: 下载与Emmet插件安装 sublime text3 中cssrem安装与使用 sublime Text 3的中文文件名显示为方框的问题 ...

  6. OGG 从Oracle备库同步数据至kafka

    OGG 从Oracle备库同步数据至kafka Table of Contents 1. 目的 2. 环境及规划 3. 安装配置JDK 3.1. 安装jdk 3.2. 配置环境变量 4. 安装Data ...

  7. Oracle 建库

    Oracle得安装就不多说了 不过还是建议直接去官网下  其他渠道可能会导致安装问题  具体自己慢慢体会吧  !  下面主要说下怎么用Oracle建库并且建用户角色 Database configur ...

  8. DG修复:异常关库导致的数据库启动失败ORA-01110及GAP修复

    问题描述:正在应用的备库是一套11.2.0.4的rac环境,但是被直接crsctl stop cluster集群强制关库,重新启动之后导致数据库启动失败,报错 Errors in file /u01/ ...

  9. 尝试加载 Oracle 客户端库时引发 BadImageFormatException

    尝试加载 Oracle 客户端库时引发 BadImageFormatException 工程师给计算机诊断,就像医生给病人诊断一样,很多同样的症状,可能是由多种截然不同的原因导致的.   最近进行C# ...

  10. HubSpot – 网站开发必备的 jQuery 信息提示库

    HubSpot 一款功能丰富的 jQuery 消息提示插件.它可以帮助你个性化显示您的应用程序的事务性消息.您可以轻松地包裹 Ajax 请求进度,成功和错误消息,还可以添加操作链接到您的消息中. Hu ...

随机推荐

  1. SuiGo智能博客系统

    一款由Golang+Vue开发的博客类网站,支持大模型对话编写智能博客,同时适配PC和移动端. 功能点说明 系统主要包括 1.博客功能:博客编写也可对话AI模型协助编写.查询.编辑页面.详情页面.分享 ...

  2. Ollama——大语言模型本地部署的极速利器

    1.概述 Ollama 是一款开源跨平台大模型工具,主要用于在本地便捷部署和运行大型语言模型(LLM),核心目标是降低用户使用大模型的门槛,同时保障数据隐私.核心功能与特点如下: (1)本地部署,隐私 ...

  3. Joker 智能开发平台再推重磅新品,引领开发新潮流

    自 Joker 智能开发平台的前端可视化版本惊艳亮相后,便迅速在行业内掀起热潮,其创新的理念与出色的性能,为开发者和企业打造了高效.便捷的开发新路径,备受瞩目与好评.如今,Joker 智能开发平台即将 ...

  4. ShardingSphere分组聚合,数据异常问题

    在使用ShardingSphere分组聚合时是,出现了数据汇总不正确问题.我这里只进行了分表,未进行分库.使用的是广播查询,因为是定时任务统计,无法使用到分片键.进行分组的字段是两个 1. SQL查询 ...

  5. 【网络协议】深入理解HTTP协议

    # 协议 协议就是一种双方提前约定好采用某种形式,以某种规格,利用某种物体把数据传输出去:而另一方再以同样的规则和流程去接收数据的约定制度或者规章. 现代网络是由多种运行在不同平台上的异构系统组成的. ...

  6. study Rust-2【环境与配置,随机数】

    Rust教程资料很多.但是,这是教程学习资料感觉挺好!推荐给你https://doc.rust-lang.org/stable/book/ (简体中文译本)在线阅读 学习rust开始有点感觉了.美好的 ...

  7. Linux内存管理神器:smem工具

    大家好,我是良许. 今天给大家分享一款 Linux 系统里的内存管理神器:smem . smem 是Linux系统上的一款可以生成多种内存耗用报告的命令行工具.与现有工具不一样的是 smem 可以报告 ...

  8. 卸载重装vscode

    最近工作需要长期用到python,但我的老电脑又实在拉不起pycharm那配置,干脆就用vscode了,但本来我的vscode是用来写c/c++的,安装配置一通乱搞,现在也不知道怎么配置回来了. 干脆 ...

  9. python,去掉“xa0”和“\r\n”

    爬小说网站,输出内容有时候会出现下图字符 首先,去掉"xa0" s = 'T-shirt\xa0\xa0短袖圆领衫,体恤衫\xa0' out = "".join ...

  10. strftime()函数的用法

    strftime()函数的用法 strftime()函数可以把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其它形式的字符串.strftime()的语法是strftime(格式, 日期/ ...