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版本。(没错,这个脚本经历了三次重生,比凤凰还能涅槃)
脚本的功能
这个脚本就像是一个"数据库关闭管家",它考虑了以下场景:
- 既能关单库,也能关全库(就像一键关灯和一键关所有灯的区别)
- 多库关闭时可以并行处理(就是传说中的"分身术")
- 通过ckpt进程智能识别ORACLE_HOME环境(不用手动设置环境变量,懒人福音!)
- 根据输入的实例名精准关闭(不会误伤其他数据库,很有礼貌的脚本)
- 多实例关闭时互不影响(一个实例出问题,其他实例表示:关我啥事?)
- 所有操作都会生成SQL脚本后再执行(方便debug,就像留下作案现场一样)
关闭过程主要包含三个步骤:
- 日志切换(如果是备库就跳过,毕竟备库也要面子)
- 杀进程(温柔或暴力,由你选择)
- 关闭数据库(最后的最后)
关闭模式有两种:
- shutdown abort模式:简单粗暴,不切换日志,不杀进程,直接关!(就像拔电源一样干脆)
- 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,等我有测试环境了再说!(不是我不想,实在是巧妇难为无米之炊啊!)
获取脚本有两种方式(任选其一即可):
- 关注公众号并回复"shutdown"(最简单的方式)
- 加我微信18081072613(想顺便聊聊天的可以选这个)
问题反馈
脚本用着不爽?有bug想吐槽?想要新功能?随时联系我!我的态度是:您说得对,我马上改!(除非您说得不对...)
特别声明:这个脚本是我的一片心意,专门用来帮助大家提高工作效率、减少故障率的。请不要用它来赚钱或者参加招投标哦!(不然我会很伤心的)
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613

DBA必备神器:让Oracle关库不再心惊胆战!的更多相关文章
- Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据
Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据 PRM 全称为ParnassusData Recovery Manager ,由 诗檀软 ...
- (转)Oracle数据库DBA必备基本技能
[Oracle数据库DBA必备基本技能] shutdown Normal 需要等待所有的用户断开连接 Immediate 等待用户完成当前的语句 Transactional 等待用户完成当前的事 ...
- 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库
工欲善其事,必先利其器 本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 原文地址:http ...
- DBA必备:MySQL数据库常用操作和技巧
DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...
- sublime text3 --前端工程师必备神器
sublime text3 --前端工程师必备神器 导读目录: 下载与Emmet插件安装 sublime text3 中cssrem安装与使用 sublime Text 3的中文文件名显示为方框的问题 ...
- OGG 从Oracle备库同步数据至kafka
OGG 从Oracle备库同步数据至kafka Table of Contents 1. 目的 2. 环境及规划 3. 安装配置JDK 3.1. 安装jdk 3.2. 配置环境变量 4. 安装Data ...
- Oracle 建库
Oracle得安装就不多说了 不过还是建议直接去官网下 其他渠道可能会导致安装问题 具体自己慢慢体会吧 ! 下面主要说下怎么用Oracle建库并且建用户角色 Database configur ...
- DG修复:异常关库导致的数据库启动失败ORA-01110及GAP修复
问题描述:正在应用的备库是一套11.2.0.4的rac环境,但是被直接crsctl stop cluster集群强制关库,重新启动之后导致数据库启动失败,报错 Errors in file /u01/ ...
- 尝试加载 Oracle 客户端库时引发 BadImageFormatException
尝试加载 Oracle 客户端库时引发 BadImageFormatException 工程师给计算机诊断,就像医生给病人诊断一样,很多同样的症状,可能是由多种截然不同的原因导致的. 最近进行C# ...
- HubSpot – 网站开发必备的 jQuery 信息提示库
HubSpot 一款功能丰富的 jQuery 消息提示插件.它可以帮助你个性化显示您的应用程序的事务性消息.您可以轻松地包裹 Ajax 请求进度,成功和错误消息,还可以添加操作链接到您的消息中. Hu ...
随机推荐
- FastAPI测试策略:参数解析单元测试
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 探索数千个预构建的 AI 应用,开启你的下一个伟大创意 第一章:核心测试方法论 1.1 三层测试体系架构 # 第一层:模型级测试 def ...
- BUUCTF---robomunication
略有抽象,第一次接触直接上题解吧
- Qt/C++开发经验小技巧311-315
关于流媒体推拉流延时的几点说明. 经常看到一些流媒体相关的程序,号称零延迟,不用怀疑,这肯定吹牛逼的. 搞音视频开发,有个核心的指标就是实时性,也就是延迟多少毫秒,这个问题问的也是最多的. 音视频文件 ...
- 准确理解 JS 的 ++ 运算符
对于刚开始接触前端开发的朋友们来说,可能地一个令人苦恼的问题是关于运算符 ++ 的计算,特别是它还有前置与后置的区别.当它们和一堆运算在一起的时候,常常令人头晕目眩! 我经常性地称它是一个***难人的 ...
- c-primer-plus深入解读系列-从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
前言 小提示:阅读本篇内容,至少需要了解double和float的二进制表示规则. 书中的代码示例如下: #include <stdio.h> int main(void) { float ...
- C#反射与特性{学习笔记}
其实这篇文章主要是想要学习反射,但是反射和特性往往是不分家的,所以也要了解一些特性相关的知识. 简单来说,继承了Attribute类的,就是特性 作用是给类或者方法打个标签 反射是在程序运行时,去读取 ...
- 比df更好用的命令!
大家好,我是良许. 对于分析磁盘使用情况,有两个非常好用的命令:du 和 df .简单来说,这两个命令的作用是这样的: du 命令:它是英文单词 disk usage 的简写,主要用于查看文件与目录占 ...
- 为啥有好多人说 Arduino 是玩具?
作为一个在嵌入式领域摸爬滚打近十年的老兵,我不得不说这个问题触动了我的神经.每次听到有人说"Arduino只是个玩具",我都忍不住想反驳,但冷静下来思考后,我发现这个问题并不是非黑 ...
- 你了解 Java 的逃逸分析吗?
Java 的逃逸分析 1. 定义 逃逸分析(Escape Analysis)是 JVM 的一种优化技术,用于分析对象的作用域,从而决定对象的分配方式或优化手段. 主要目的是判断一个对象是否会逃离当前方 ...
- issue: java.lang.NoClassDefFoundError: javax/el/ELManager
问题描述: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error c ...