Oracle 终止正在执行的SQL

目录

  • [一. 背景](#一. 背景)
  • [二. 操作简介](#二. 操作简介)
  • [三. 投入数据](#三. 投入数据)
  • [四. 效果展示](#四. 效果展示)

一. 背景

项目中要求进行性能测试,需要向指定的表中投入几百万条数据。

在数据投入的过程中发现投入的数据不对,需要紧急停止SQL的执行。


二. 操作简介

👉需要DBA权限👈

⏹从正在执行的SQL文中找出能区别出该SQL文的关键字,通过v$sql表检索出该SQL文对应的SQL_ID

sql 复制代码
SELECT SQL_ID, SQL_TEXT FROM v$sql WHERE SQL_TEXT LIKE '%SQL文片段%';

⏹通过查询到的SQL_ID进一步查询SQL_ID对应的sidserial#

oracle 复制代码
SELECT sid, serial#, username, program from v$session where SQL_ID = '查询到的SQL_ID';

⏹杀死session,终止SQL的执行

💥注意,要杀死一个session,需要两个条件 → SIDSERIAL#

sql 复制代码
alter system kill session '查询到的SID,查询到的SERIAL#';

三. 投入数据

⏹使用dba用户清空共享池,进而清空 v$sql 中的数据,避免之前执行的SQL对本次验证的干扰。

💥此处只是为了验证,生产环境中不要使用,此操作会清空共享池中的所有解析的 SQL 语句和 PL/SQL 程序单元,这可能会对数据库性能产生影响。

sql 复制代码
ALTER SYSTEM FLUSH SHARED_POOL;

⏹向表中投入500万条数据

sql 复制代码
-- 清空表中的数据
truncate table PERSON_TABLE;

# 投入数据
BEGIN
    FOR i IN 1..5000000 LOOP
        INSERT INTO DB_USER.PERSON_TABLE (id, name, age, email, created_date)
        VALUES (
            i,
            'Name_' || i,
            TRUNC(DBMS_RANDOM.VALUE(18, 60)), -- 随机年龄
            'user' || i || '@example.com',
            SYSDATE - DBMS_RANDOM.VALUE(0, 365) -- 随机日期
        );
    END LOOP;
    COMMIT;
END;
/

四. 效果展示

⏹由下图可以看到,正在投入数据的SQL已经停止执行,显示ORA-00028: your session has been killed

相关推荐
S1998_1997111609•X8 小时前
论当今社会主义与人文关怀人格思想下的恶意仿生注入污染蜜罐描述进行函数值非法侵入爬虫的咼忄乂癿〇仺⺋.
数据库·网络协议·百度·ssh·开闭原则
倔强的石头_9 小时前
kingbase备份与恢复实战(六)—— 备份自动化与保留策略:Windows任务计划+日志追溯
数据库
轻刀快马10 小时前
别被 ORM 框架宠坏了:从一场“订单消失”悬案,看懂 MySQL 为什么要强推 InnoDB
数据库·mysql
后端漫漫12 小时前
Redis 客户端工具体系
数据库·redis·缓存
PaperData13 小时前
1988-2025年《中国人口和就业统计年鉴》全年份excel+PDF
数据库·人工智能·数据分析·经管
星河耀银海13 小时前
C语言与数据库交互:SQLite实战与数据持久化
c语言·数据库·sqlite·交互
过期动态14 小时前
MySQL中的约束
android·java·数据库·spring boot·mysql
程序员陆通14 小时前
月烧 400 刀到不到 20 刀:我是怎么把 OpenClaw 的 Token 账单砍掉 95% 的
java·前端·数据库
Shan120514 小时前
站在计算机领域视角看:SQL注入攻击
网络·数据库·sql
轻刀快马14 小时前
别干背八股文了:从一场“双十一秒杀”惨案,看懂 InnoDB 事务、锁与索引的底层齿轮
数据库·sql