如何解决Oracle中GRANT语句执行缓慢的性能问题

酷雪大大_1210

酷雪大大_1210

2026-06-18

271人浏览

原创

grant被阻塞时应优先查v$session与v$lock组合定位阻塞源,重点关注l1.type为ddl/dml且l1.lmode=6的排他锁及blocking_sid非空的会话;若alter system kill session无效,需通过v$process.spid获取os进程号并执行kill -9或orakill终结。

grant被阻塞时如何快速定位阻塞源

grant语句卡住,大概率不是sql本身慢,而是被其他会话持有的ddl锁(如ddl lock)或事务锁阻塞。oracle在执行grant前会尝试获取目标对象的排他锁,若该对象正被另一个未提交的事务修改(比如正在alter table或truncate),就会一直等待。

直接查v$session和v$lock组合比看OEM更快:

SELECT s1.sid, s1.serial#, s1.username, s1.osuser, s1.program,
       s2.sid blocking_sid, s2.serial# blocking_serial,
       l1.type, l1.lmode, l2.request
FROM v$lock l1
JOIN v$session s1 ON l1.sid = s1.sid
LEFT JOIN v$lock l2 ON l1.id1 = l2.id1 AND l1.id2 = l2.id2 AND l2.request > 0
LEFT JOIN v$session s2 ON l2.sid = s2.sid
WHERE l1.block = 1 OR l2.sid IS NOT NULL;
  • 重点关注l1.type = 'DML'或'DDL'且l1.lmode = 6(排他锁)的行
  • blocking_sid列非空即为阻塞源;若为空但l2.request > 0,说明存在锁等待链
  • 用SELECT sql_id FROM v$session WHERE sid = <blocking_sid></blocking_sid>拿到阻塞语句,再查v$sql确认是否是长事务或未提交的DDL

为什么ALTER SYSTEM KILL SESSION有时无效

ALTER SYSTEM KILL SESSION只是发中断信号,目标会话需主动响应。若它正持锁且处于“uninterruptible sleep”状态(如等待IO、归档日志写满、或卡在内核态),信号会被忽略,v$session.status会显示KILLED但sid仍存在,锁也不释放。

此时必须走操作系统级终结:

  • 先通过v$process.spid拿到OS进程号:
    SELECT p.spid, s.sid, s.serial#, s.username 
    FROM v$session s JOIN v$process p ON s.paddr = p.addr 
    WHERE s.sid = <blocking_sid>;</blocking_sid>
  • 在数据库服务器上执行kill -9 <spid></spid>(Linux/Unix)或orakill <inst_name><spid></spid></inst_name>(Windows)
  • 注意:不要直接kill -9监听进程(如tnslsnr)或PMON,只杀用户会话对应spid

GRANT操作本身引发的性能陷阱

Grant本身不耗资源,但某些授权行为会触发隐式元数据刷新或审计日志写入,尤其在以下场景下明显变慢:

Crypto Sniper Oracle
Crypto Sniper Oracle

机构级量化市场预言机,提供订单簿失衡(OBI)、VWAP分析、自动化报告及Telegram预警。

下载
  • 对含大量列或约束的大表执行GRANT SELECT ON big_table TO user:Oracle需校验每一列权限,若表有上百列+多个虚拟列,开销陡增
  • 目标用户已拥有SELECT ANY TABLE等系统权限:Grant仍会检查权限继承链,遇到复杂角色嵌套(如A→B→C→D)时解析变慢
  • 启用细粒度审计(FGA)或统一审计策略覆盖该对象:每次Grant都触发审计记录写入,若审计表空间IO瓶颈,Grant就卡住
  • 使用GRANT ... WITH GRANT OPTION:需额外验证授权链合法性,比普通Grant多一次递归检查

规避方法:优先用角色批量授权(GRANT role_name TO user),避免逐对象Grant;禁用无关审计策略后再执行关键授权。

容易被忽略的底层依赖问题

Grant卡顿常被当成纯数据库问题,但实际可能源于更底层的资源争用:

  • 重做日志切换频繁:若log file switch (checkpoint incomplete)等待高,Grant这类DDL操作也会因无法写日志而挂起——查v$system_event确认
  • UNDO表空间不足:Grant虽不产生大量undo,但若系统undo段正被长事务占满,新事务无法分配回滚段,Grant会卡在事务初始化阶段
  • 数据库链接(DB Link)指向的远端库不可达:若当前用户有通过DB Link访问的同名对象,Grant前会尝试解析远程对象元数据,超时导致延迟

真正棘手的是混合型问题:比如阻塞会话本身正因IO慢而卡在写日志,你Kill了它,但底层磁盘问题没解决,下一个Grant照样卡。所以看到Grant慢,先盯v$sysstat里physical writes和redo log space requests是否异常飙升,再决定是杀会话还是调存储。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

oracle

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

881

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

2453

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

2490

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1429

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

2033

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

2649

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4249

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

237

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

686

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程