锁表导致系统挂了,谨慎DDL操作

作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、
高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理

文章目录

    • 1.故障现象
    • 2.排查过程
      • 2.1 阻塞的队列排查
      • 2.2 SQL对应的文本
    • 3.故障处理
      • 3.1 session定位
      • 3.2 服务器进程KILL
      • 3.3 Oracle删除列正确的方式
    • 4.负载均衡的解读
    • 4.总结

突发故障,业务系统挂了,只因为业务人员在高峰期做了DDL操作,导致锁,数据库夯住!

作为DBA,要为客户做好节前的最后保障,这不本来想提前可以回家的,突发故障,业务系统挂了,只因为业务人员在高峰期做了DDL操作,导致锁,数据库夯住!

1.故障现象

首先产线反馈应用出现卡顿,开发人员客户端无法连接,出现以下报错。


操作系统: OEL7.9
数据库:ODA 19.20.0.0.0(RAC)DB Error MSG=[ORA-01013]: 
user requested cancel of current operation
ORA-00060: 
deadlock detected while waiting for resource

2.排查过程

所有的故障都是变化(变更)引起的,那么问题发生的第一时刻就联系了IT部门,得知业务人员在下午业务高峰期间,对核心业务表做了相关的DDL操作!那么基本可以判断是锁的问题了。

2.1 阻塞的队列排查

select aa.snap_id,
aa.session_id,
aa.blocking_session,
aa.session_serial#, 
aa.blocking_session_status,
aa.event,aa.program,aa.sql_id
from DBA_HIST_ACTIVE_SESS_HISTORY aa
where 1=1
and SAMPLE_TIME >
TO_TIMESTAMP ('2024-09-14 14:00:00','yyyy-mm-dd hh24:mi:ss')
and SAMPLE_TIME 
<TO_TIMESTAMP ('2024-09-14 15:00:00','yyyy-mm-dd hh24:mi:ss')检查历史会话发现大量tx锁,
锁对象id是389517(id对应的表名是materialot),
阻塞的session为5993
定位被锁的对象
select * from dba_objects where object_id=389517

同时在AWR报告能详细的看到这些信息,列出的锁表时出现的等待事件以及GC等待事件跟故障现象匹配。

2.2 SQL对应的文本

select sql_text from 
gv$sqlarea where sql_id='dd6uizh6v0d20' 
ALTER TABLE materialot DROP COLUMN TWHOUNT;
很明显,开发人员做了列的删除,造成锁导致数据库夯住

有时候如果出现SQL文本找不出来的情况怎么办呢?一般是因为出现硬解析错误导致,就像曾经其他客户出现的一个故障,也是行锁,但是怎么都找不到对应的SQL,那么就只能通过日志挖掘找相关的事务了,以下分享一下日志挖掘的步骤

1.添加归档日志
execute dbms_logmnr.add_logfile(logfilename=>
'/mccdb/archivelog/1_269564_839952465.dbf',
options=>dbms_logmnr.addfile);2.启动日志挖掘
execute dbms_logmnr.start_logmnr(options=>
dbms_logmnr.dict_from_online_catalog);3.日志在内存中,转储在表中
create table prod.test as select * from v$logmnr_contents;4.结束日志挖掘
execute dbms_logmnr.end_logmnr;

3.故障处理

3.1 session定位

死锁标准处理方式如下:
SELECT SESS.SID,  
SESS.SERIAL#,  
LO.ORACLE_USERNAME,  
LO.OS_USER_NAME,  
AO.OBJECT_NAME 被锁对象名, 
LO.LOCKED_MODE 锁模式, 
sess.LOGON_TIME 登录数据库时间,
'ALTER SYSTEM KILL SESSION ''' 
|| SESS.SID || ','||SESS.SERIAL#||'''' FREESQL
FROM V$LOCKED_OBJECT LO,  DBA_OBJECTS AO,  V$SESSION SESS 
WHERE AO.OBJECT_ID = LO.OBJECT_ID 
AND LO.SESSION_ID = SESS.SID 
ORDER BY sid, sess.serial#;alter system kill session '2039,31796';

3.2 服务器进程KILL

复制完执行可能会报错:
ORA-00031: session marked for kill,
这表示ORACLE已经把它标记为一个杀死的进程,
但暂时无法将其彻底杀死,
这个时候需要我们执行下面的sql,
查出它在服务器上的进程id:# sid 为上面sql 查出来的 sid
select spid, osuser, s.programfrom v$session s,v$process pwhere s.paddr=p.addrand s.sid=''2039' 通过上方 sql 可以得到服务器上的进程 id,
登录数据库所在服务器,
利用 kill 命令将其杀死即可:kill -9 12009(查出来的spid)

3.3 Oracle删除列正确的方式


DDL这些操作可能改变表的结构,
Oracle会在这些操作进行时锁定表,以防止其他事务对表的访问我们需要把字段先设置为UNUSED,
然后再业务低的时候删掉
ALTER TABLE TEST SET UNUSED(COL1);
ALTER TABLE TEST DROP UNUSED  COLUMN;

4.负载均衡的解读

在这里要跟大家在解读一下最近群里讨论比较多的Oracle RAC关于负载均衡的配置方式,

从这套库来看,节点1的报告期内连接数为674, 节点2的报告期内连接数为593,两个节点会话分配较为均匀,这是因为应用配置了LOAD_BALANCE为yes.

生产上我们是建议这样配置的,通过2个VIP来做负载均衡,而不是用scanip,因为大多数是没有配置dns,所以scanip放到/etc/hosts里其实起不到作用负载均衡作用的,只有放到dns里才能轮巡。

jdbc:oracle:thin:@(DESCRIPTION =(
ADDRESS_LIST =(FAILOVER=on)
(LOAD_BALANCE=yes)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.21)
(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.22)
(PORT = 1521)))
(CONNECT_DATA =(SERVER = DEDICATED)
(SERVICE_NAME = test)))
真正的负载均衡由两部分配置完成:
一个是服务 service
一个就是连接串

4.总结

请谨慎DDL操作,可能导致其他DML操作被长时间锁定,这可能会对繁忙的系统造成严重问题,并且相关的执行计划也会随之发生变化!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/423806.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整合Redis和RedisCacheManger

整合redis springboot在现在的版本中操作Redis数据库用到了lettuce&#xff0c;而不是Jedis&#xff0c;他们各有各的特点。Jedis以Redis命令作为方法名称&#xff0c;学习成本低&#xff0c;简单实用。但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使…

2-94 基于matlab的最佳维纳滤波器的盲解卷积算法

基于matlab的最佳维纳滤波器的盲解卷积算法。维纳滤波将地震子波转换为任意所需要的形态。维纳滤波不同于反滤波&#xff0c;它是在最小平方的意义上为最 佳。基于最佳纳滤波理论的滤波器算法是莱文逊(Wiener—Levinson)算法。程序提供了4种子波和4种期望输出&#xff1a;零延迟…

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数 一、环境说明二、页面之间相互传参 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、页面之间相互传参 说明&#xff1a; 页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页…

用Kimi输出流程图

1.输入 我希望设计一个ERP系统&#xff0c;请帮我简单列一个流程图&#xff0c;用mermaid输出2.输出

这才几天,京东又又又又又又加薪了!

京东 今天的最新消息&#xff0c;京东又又又又又加薪了。 距离我们 京东宣布大幅上调校招薪资 的推文发布才一周多点的时间&#xff0c;京东又宣布加薪了。 好家伙&#xff0c;算上这次&#xff0c;光 2024 年京东就已经宣布了 6 次调薪了&#xff1a; 2024 年初&#xff0c;京…

全志T113方案OTA

1、目前使用的flash为128M&#xff0c;比较小&#xff0c;使用AB升级方式感觉空间不够&#xff0c;所以使用recovery升级linux 2、添加recovery分区 全志提供的SDK本来是不支持打包recovery分区的&#xff0c;需要修改sys_partition.fex&#xff0c;size也需要修改&#xff0c…

Springcould -第一个Eureka应用 --- day02

标题 Eureka工作原理Spring Cloud框架下的服务发现Eureka包含两个组件&#xff0c;分别是&#xff1a;Eureka Server与Eureka Client。Eureka Server&#xff1a;Eureka Client&#xff1a; 搭建Eureka Server步骤&#xff1a;步骤1&#xff1a;创建项目&#xff0c;引入依赖步…

第307题|快速掌握 反常积分敛散性判定的方法|武忠祥老师每日一题

解题思路&#xff1a;先判断这个反常积分的敛散性&#xff0c;再讨论a的取值范围; 判断反常积分的敛散性&#xff0c;我们通常有三个方法&#xff1a; &#xff08;1&#xff09;根据定义&#xff0c;通常在原函数比较好求的情况下&#xff0c;可以根据定义 &#xff08;2&am…

Web3的崛起与智能合约的角色

随着Web3的发展&#xff0c;去中心化网络逐渐取代了以往的集中控制互联网模式。这一转变不仅强调了用户的自治权和隐私保护&#xff0c;还引入了智能合约这一核心技术。智能合约基于区块链技术&#xff0c;能够自动执行合约条款&#xff0c;无需中介干预&#xff0c;从而确保了…

低代码-赋能新能源汽车产业加速前行

在“双碳”战略目标的引领下&#xff0c;全球新能源汽车产业正经历着前所未有的发展和变革&#xff0c;新能源汽车整车制造成为绿色低碳转型的重要领域。在政府的大力扶持下&#xff0c;新能源整车制造领域蓬勃发展&#xff0c;已成为全球汽车产业不可逆转的重要趋势。新能源汽…

数据结构修炼——顺序表和链表的OJ题练习

目录 一、顺序表相关OJ题1 移除元素题目解析 2 合并两个有序数组题目解析 二、链表相关OJ题1 移除链表元素题目解析 2 反转链表题目解析 3 链表的中间结点题目解析 4 合并两个有序链表题目解析 5 链表的回文结构题目解析 6 相交链表题目解析 7 环形链表的判断题目解析 8 环形链…

性能诊断的方法(五):架构和业务诊断

关于性能诊断的方法&#xff0c;我们可以按照“问题现象—直接原因—问题根源”这样一个思路去归纳。我们先从问题的现象去入手&#xff0c;包括时间的分析、资源的分析和异常信息的分析。接下来再去分析产生问题现象的直接原因是什么&#xff0c;这里我们归纳了自上而下的资源…

动态规划前---选----

前言&#xff1a;基本的算法思路还是先看数据范围&#xff0c;接着看能不能用动态规划来做&#xff0c;刚刚好这个题目可以套用前—选— 题目地址 #include<bits/stdc.h> using namespace std;#define int long long int n,m; const int N (int)305; int dp[N][N]; // 前…

Android V 广播注册和配置注意事项问题

现象 在Android V平台上&#xff0c;应用注册非Protected广播时&#xff0c;如果没有加导出flag会抛出异常导致进程crash。 E/AndroidRuntime: FATAL EXCEPTION: main java.lang.SecurityException: com.demo.myapplication: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORT…

MySQL record 03 part

插入表数据&#xff1a; 一般情况下&#xff0c;向表中添加新的记录&#xff0c;应该包含此表的所有字段&#xff0c;也就是应该给表的所有字段添加值&#xff0c; 1.使用insert into语句&#xff0c;指定字段名&#xff08;可以是所有的字段&#xff0c;也可以是某几个字段&am…

scratch中秋节——孔明灯祈福

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 中秋节是中国的传统佳节&#xff0c;象征着团圆与美好。在这个特别的节日里&#xff0c;除了赏月、吃月饼&#xff0c;放飞孔明灯也是一种独特的祈福方式。而如今&#xff0c;你可以在小虎鲸Scratch资源站…

【Redis】主从复制 - 源码

因为主从复制的过程很复杂, 同时核心逻辑主要集中在 replication.c 这个文件中, 避免篇幅过大, 所以将主从复制中涉及这个文件的代码集中到了另一篇文章。 在当前文章主要分析主从复制的大体代码逻辑, 如果需要了解整体的过程, 可以配合 Redis 主从复制 - relication 源码分析 …

粘塑性自洽模型(VPSC)在复合工艺中的应用

关键词&#xff1a;晶体塑性 VPSC织构模拟 复合工艺 本期将继续介绍粘塑性自洽模型(VPSC)在金属变形过程的应用。VPSC适用于各种金属材料(如铝合金、钢材、镁合金)&#xff0c;各种加载方式(如单向拉伸、单向压缩、剪切、平面应变、双向拉伸等)下的宏观力学性能和微观结构演化…

Git撤销push

继续Git系列&#xff0c;看下push的取消&#xff0c;基本到这里了。 先看文章&#xff1a; git push了怎么撤销-git-PHP中文网 第一种方法&#xff1a; 看起来是再提交一次&#xff0c;并没有撤销或者说删除上次错误提交的版本。只是不明白&#xff0c;为什么这里要强制推送…

Python+Pytest框架,“conftest.py文件编写如何获取token和获取日志“?

1、新增"conftest.py" import pytest import loggingfrom api_keyword.api_key import ApiKey from config import *# 获取token # 1. 正常的请求对应的接口并且提取数据 # 2. pytest.fixture()测试夹具&#xff08;测试前置、后置操作&#xff09;pytest.fixture(s…