目录
- [一. 背景](#一. 背景)
- [二. 操作简介](#二. 操作简介)
- [三. 投入数据](#三. 投入数据)
- [四. 效果展示](#四. 效果展示)
一. 背景
项目中要求进行性能测试,需要向指定的表中投入几百万条数据。
在数据投入的过程中发现投入的数据不对,需要紧急停止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
对应的sid
和serial#
oracle
SELECT sid, serial#, username, program from v$session where SQL_ID = '查询到的SQL_ID';
⏹杀死session,终止SQL的执行
💥注意,要杀死一个session,需要两个条件 → SID
和 SERIAL#
。
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