SQL Quarantine in Oracle Database 19c
Oracle Database 19c introduced an extension of Runaway Query Management called SQL Quarantine.
oracle 19cconfigurationintermediate
by OracleDba
21 views
Oracle Database 19c introduced an extension of Runaway Query Management called SQL Quarantine.
123456789101112131415161718192021222324252627
export ORACLE_SID=cdb1
export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES
sqlplus / as sysdba <<EOF
alter system set "_exadata_feature_on"=true scope=spfile;
shutdown immediate;
startup;
exit;
EOF
export ORACLE_SID=cdb1
export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES
sqlplus / as sysdba <<EOF
alter system reset "_exadata_feature_on" scope=spfile;
shutdown immediate;
startup;
exit;
EOF12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
CONN sys/SysPassword1@//localhost:1521/pdb1 AS SYSDBA
--DROP USER testuser1 CASCADE;
CREATE USER testuser1 IDENTIFIED BY testuser1 QUOTA UNLIMITED ON users;
GRANT CREATE SESSION, CREATE PROCEDURE TO testuser1;
BEGIN
DBMS_RESOURCE_MANAGER.clear_pending_area;
DBMS_RESOURCE_MANAGER.create_pending_area;
-- Create plan
DBMS_RESOURCE_MANAGER.create_plan(
plan => 'long_running_query_plan',
comment => 'Plan to handle long running queries.');
-- Create consumer groups
DBMS_RESOURCE_MANAGER.create_consumer_group(
consumer_group => 'normal_cg',
comment => 'Consumer group for normal sessions.');
-- Assign consumer groups to plan and define priorities
DBMS_RESOURCE_MANAGER.create_plan_directive (
plan => 'long_running_query_plan',
group_or_subplan => 'normal_cg',
comment => 'Normal Priority',
mgmt_p1 => 100,
switch_group => 'CANCEL_SQL',
switch_time => 60,
switch_for_call => TRUE);
DBMS_RESOURCE_MANAGER.create_plan_directive(
plan => 'long_running_query_plan',
group_or_subplan => 'OTHER_GROUPS',
comment => 'Default',
mgmt_p2 => 100);
DBMS_RESOURCE_MANAGER.validate_pending_area;
DBMS_RESOURCE_MANAGER.submit_pending_area;
END;
/
BEGIN
DBMS_RESOURCE_MANAGER_PRIVS.grant_switch_consumer_group(
grantee_name => 'testuser1',
consumer_group => 'normal_cg',
grant_option => FALSE);
DBMS_RESOURCE_MANAGER.set_initial_consumer_group('testuser1', 'normal_cg');
END;
/
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'long_running_query_plan';
COLUMN username FORMAT A30
COLUMN resource_consumer_group FORMAT A30
SELECT username, resource_consumer_group
FROM v$session
WHERE username = 'TESTUSER1';
CONN testuser1/testuser1@//localhost:1521/pdb1
CREATE OR REPLACE FUNCTION burn_cpu (p_mins IN NUMBER)
RETURN NUMBER
AS
l_start_time DATE;
l_number NUMBER := 1;
BEGIN
l_start_time := SYSDATE;
LOOP
EXIT WHEN SYSDATE - l_start_time > (p_mins/24/60);
l_number := l_number + 1;
END LOOP;
RETURN 0;
END;
/
SELECT burn_cpu (5) FROM dual;
SQL> SELECT burn_cpu (5) FROM dual;
Error starting at line : 1 in command -
SELECT burn_cpu (5) FROM dual
Error report -
ORA-00040: active time limit exceeded - call aborted
SQL>
SQL> SELECT burn_cpu (5) FROM dual;
Error starting at line : 1 in command -
SELECT burn_cpu (5) FROM dual
Error report -
ORA-56955: quarantined plan used
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142
COLUMN sql_text FORMAT A30
COLUMN sql_quarantine FORMAT A40
SELECT sql_text, sql_id, plan_hash_value, child_number, sql_quarantine, avoided_executions
FROM v$sql
WHERE sql_quarantine IS NOT NULL;
SQL_TEXT SQL_ID PLAN_HASH_VALUE CHILD_NUMBER SQL_QUARANTINE AVOIDED_EXECUTIONS
------------------------------ ------------- --------------- ------------ ---------------------------------------- ------------------
SELECT burn_cpu (5) FROM dual gs59hr0xtjrf8 1388734953 0 SQL_QUARANTINE_8zpc9pwdmb8vr125daea2 1
SELECT burn_cpu (5) FROM dual gs59hr0xtjrf8 1388734953 1 SQL_QUARANTINE_8zpc9pwdmb8vr125daea2 0
SQL>
COLUMN sql_text FORMAT A30
COLUMN name FORMAT A40
SELECT sql_text, name, plan_hash_value, enabled
FROM dba_sql_quarantine;
SQL_TEXT NAME PLAN_HASH_VALUE ENA
------------------------------ ---------------------------------------- --------------- ---
SELECT burn_cpu (5) FROM dual SQL_QUARANTINE_8zpc9pwdmb8vr125daea2 308129442 YES
SQL>
COLUMN sql_text FORMAT A30
COLUMN cpu_time FORMAT A10
COLUMN io_megabytes FORMAT A10
COLUMN io_requests FORMAT A10
COLUMN elapsed_time FORMAT A10
COLUMN io_logical FORMAT A10
SELECT sql_text, cpu_time, io_megabytes, io_requests, elapsed_time, io_logical
FROM dba_sql_quarantine;
SQL_TEXT CPU_TIME IO_MEGABYT IO_REQUEST ELAPSED_TI IO_LOGICAL
------------------------------ ---------- ---------- ---------- ---------- ----------
SELECT burn_cpu (5) FROM dual 60
SQL>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
SET SERVEROUTPUT ON
-- Quarantine all execution plans for a SQL statement.
DECLARE
l_sql_quarantine VARCHAR2(100);
BEGIN
l_sql_quarantine := sys.DBMS_SQLQ.create_quarantine_by_sql_text(
sql_text => TO_CLOB('SELECT burn_cpu (5) FROM dual')
);
DBMS_OUTPUT.put_line('l_sql_quarantine=' || l_sql_quarantine);
END;
/
-- Quarantine a specific execution plan for a SQL statement.
DECLARE
l_sql_quarantine VARCHAR2(100);
BEGIN
l_sql_quarantine := sys.DBMS_SQLQ.create_quarantine_by_sql_text(
sql_text => TO_CLOB('SELECT burn_cpu (5) FROM dual'),
plan_hash_value => '1388734953'
);
DBMS_OUTPUT.put_line('l_sql_quarantine=' || l_sql_quarantine);
END;
/
-- Quarantine all execution plans for a SQL_ID.
DECLARE
l_sql_quarantine VARCHAR2(100);
BEGIN
l_sql_quarantine := sys.DBMS_SQLQ.create_quarantine_by_sql_id(
sql_id => 'gs59hr0xtjrf8'
);
DBMS_OUTPUT.put_line('l_sql_quarantine=' || l_sql_quarantine);
END;
/
-- Quarantine a specific execution plan for a SQL_ID.
DECLARE
l_sql_quarantine VARCHAR2(100);
BEGIN
l_sql_quarantine := sys.DBMS_SQLQ.create_quarantine_by_sql_id(
sql_id => 'gs59hr0xtjrf8',
plan_hash_value => '1388734953'
);
DBMS_OUTPUT.put_line('l_sql_quarantine=' || l_sql_quarantine);
END;
/
SELECT sql_text, name, plan_hash_value, cpu_time, io_megabytes, io_requests, elapsed_time, io_logical
FROM dba_sql_quarantine;
SQL_TEXT NAME PLAN_HASH_VALUE CPU_TIME IO_MEGABYT IO_REQUEST ELAPSED_TI IO_LOGICAL
------------------------------ ---------------------------------------- --------------- ---------- ---------- ---------- ---------- ----------
SELECT burn_cpu (5) FROM dual SQL_QUARANTINE_8zpc9pwdmb8vr ALWAYS ALWAYS ALWAYS ALWAYS ALWAYS
SELECT burn_cpu (5) FROM dual SQL_QUARANTINE_8zpc9pwdmb8vr125daea2 308129442 60
SELECT burn_cpu (5) FROM dual SQL_QUARANTINE_8zpc9pwdmb8vr52c669e9 1388734953 ALWAYS ALWAYS ALWAYS ALWAYS ALWAYS
SQL>
BEGIN
sys.DBMS_SQLQ.alter_quarantine(
quarantine_name => 'SQL_QUARANTINE_8zpc9pwdmb8vr',
parameter_name => 'CPU_TIME',
parameter_value => '60');
sys.DBMS_SQLQ.alter_quarantine(
quarantine_name => 'SQL_QUARANTINE_8zpc9pwdmb8vr52c669e9',
parameter_name => 'CPU_TIME',
parameter_value => '60');
END;
/
SELECT sql_text, plan_hash_value, cpu_time, io_megabytes, io_requests, elapsed_time, io_logical
FROM dba_sql_quarantine;
SQL_TEXT NAME PLAN_HASH_VALUE CPU_TIME IO_MEGABYT IO_REQUEST ELAPSED_TI IO_LOGICAL
------------------------------ ---------------------------------------- --------------- ---------- ---------- ---------- ---------- ----------
SELECT burn_cpu (5) FROM dual SQL_QUARANTINE_8zpc9pwdmb8vr 60
SELECT burn_cpu (5) FROM dual SQL_QUARANTINE_8zpc9pwdmb8vr125daea2 308129442 60
SELECT burn_cpu (5) FROM dual SQL_QUARANTINE_8zpc9pwdmb8vr52c669e9 1388734953 60
SQL>
BEGIN
sys.DBMS_SQLQ.drop_quarantine('SQL_QUARANTINE_8zpc9pwdmb8vr');
sys.DBMS_SQLQ.drop_quarantine('SQL_QUARANTINE_8zpc9pwdmb8vr125daea2');
sys.DBMS_SQLQ.drop_quarantine('SQL_QUARANTINE_8zpc9pwdmb8vr52c669e9');
END;
/12345678910111213141516171819202122232425262728293031323334353637383940414243444546
BEGIN
sys.DBMS_SQLQ.create_stgtab_quarantine(staging_table_name => 'my_quarantine_defs',
staging_table_owner => 'testuser1',
tablespace_name => NULL);
END;
/
SET SERVEROUTPUT ON
DECLARE
l_number NUMBER;
BEGIN
l_number := sys.DBMS_SQLQ.pack_stgtab_quarantine (
staging_table_name => 'my_quarantine_defs',
staging_table_owner => 'testuser1',
name => '%',
sql_text => '%',
enabled => NULL);
DBMS_OUTPUT.put_line('l_number=' || l_number);
END;
/
l_number=3
PL/SQL procedure successfully completed.
SQL>
SET SERVEROUTPUT ON
DECLARE
l_number NUMBER;
BEGIN
l_number := sys.DBMS_SQLQ.unpack_stgtab_quarantine (
staging_table_name => 'my_quarantine_defs',
staging_table_owner => 'testuser1',
name => '%',
sql_text => '%',
enabled => NULL);
DBMS_OUTPUT.put_line('l_number=' || l_number);
END;
/
l_number=3
PL/SQL procedure successfully completed.
SQL>Please to add comments
No comments yet. Be the first to comment!