forked from carlos-sierra/cscripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcollect_ORA-13831_diagnostics 2.sql
More file actions
127 lines (127 loc) · 4.61 KB
/
collect_ORA-13831_diagnostics 2.sql
File metadata and controls
127 lines (127 loc) · 4.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
-- collect_ORA-13831_diagnostics.sql (2020/03/10)
-- Collects ORA-13831 diagnostics. inputs PDB and SQL_ID.
SPO collect_ORA-13831_diagnostics.log
SET HEA ON LIN 500 PAGES 100 TAB OFF FEED OFF ECHO OFF VER OFF TRIMS ON TRIM ON TI OFF TIMI OFF;
ALTER SESSION SET container = CDB$ROOT;
SELECT name pdb_name FROM v$containers WHERE open_mode = 'READ WRITE' ORDER BY 1;
PRO 1. Enter PDB_NAME failing with ORA-13831:
DEF pdb_name = '&1.';
UNDEF 1;
PRO 2. Enter SQL_ID failing with ORA-13831:
DEF sql_id = '&2.';
UNDEF 2;
SET FEED ON ECHO ON VER ON TI ON TIMI ON;
-- connect to pdb
ALTER SESSION SET container = &&pdb_name.;
-- prepares backup owner
DEF repo_owner = 'C##IOD';
COL default_tablespace NEW_V default_tablespace NOPRI;
SELECT default_tablespace FROM dba_users WHERE username = UPPER('&&repo_owner.');
ALTER USER &&repo_owner. QUOTA UNLIMITED ON &&default_tablespace.;
-- backup SPM metadata (for subsequent datapump)
COL backup_timestamp NEW_V backup_timestamp NOPRI;
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') backup_timestamp FROM DUAL;
CREATE TABLE &&repo_owner..sqllog$_&&backup_timestamp. AS SELECT * FROM sys.sqllog$;
CREATE TABLE &&repo_owner..smb$config_&&backup_timestamp. AS SELECT * FROM sys.smb$config;
CREATE TABLE &&repo_owner..sql$_&&backup_timestamp. AS SELECT * FROM sys.sql$;
CREATE TABLE &&repo_owner..sql$text_&&backup_timestamp. AS SELECT * FROM sys.sql$text;
CREATE TABLE &&repo_owner..sqlobj$_&&backup_timestamp. AS SELECT * FROM sys.sqlobj$;
CREATE TABLE &&repo_owner..sqlobj$data_&&backup_timestamp. AS SELECT * FROM sys.sqlobj$data;
CREATE TABLE &&repo_owner..sqlobj$auxdata_&&backup_timestamp. AS SELECT * FROM sys.sqlobj$auxdata;
--CREATE TABLE &&repo_owner..sqlobj$plan_&&backup_timestamp. AS SELECT * FROM sys.sqlobj$plan;
-- needed to avoid ORA-00997: illegal use of LONG datatype on column "other"
CREATE TABLE &&repo_owner..sqlobj$plan_&&backup_timestamp. AS SELECT
signature
,category
,obj_type
,plan_id
,statement_id
,xpl_plan_id
,timestamp
,remarks
,operation
,options
,object_node
,object_owner
,object_name
,object_alias
,object_instance
,object_type
,optimizer
,search_columns
,id
,parent_id
,depth
,position
,cost
,cardinality
,bytes
,other_tag
,partition_start
,partition_stop
,partition_id
,TO_LOB(other) other -- TO_LOB() needed to avoid ORA-00997: illegal use of LONG datatype
,distribution
,cpu_cost
,io_cost
,temp_space
,access_predicates
,filter_predicates
,projection
,time
,qblock_name
,other_xml
FROM sys.sqlobj$plan;
-- not needed as long as event 13831 is already on. be aware this trace is verbose.
--ALTER SYSTEM SET events='13831 trace name errorstack level 3';
-- development asked for this SPM trace
ALTER SYSTEM SET EVENTS 'trace[SQL_Plan_Management][sql:&&sql_id.]';
-- sleeping few seconds is plenty to trap hard-parse of sql that executes often
EXEC DBMS_LOCK.sleep(10);
-- support asked for this CBO (10053) trace, in addition to SPM trace
ALTER SYSTEM SET EVENTS 'trace[SQL_Optimizer.*][sql:&&sql_id.]';
-- sleeping few seconds so we trap some sesisons with both SPM and CBO traces
EXEC DBMS_LOCK.sleep(10);
-- disable both traces
ALTER SYSTEM SET EVENTS 'trace[SQL_Optimizer.*][sql:&&sql_id.] off';
ALTER SYSTEM SET EVENTS 'trace[SQL_Plan_Management][sql:&&sql_id.] off';
-- gets signature so we can disable baselines for this sql
VAR signature NUMBER;
-- most times sql is in memory, so we get signature from v$sql
BEGIN
SELECT exact_matching_signature INTO :signature FROM v$sql WHERE sql_id = '&&sql_id.' AND ROWNUM = 1;
END;
/
-- sometimes sql is not in memory but on awr, so we get sql_text from awr and we compute signature
DECLARE
l_sql_text CLOB;
BEGIN
IF :signature IS NULL THEN
SELECT sql_text INTO l_sql_text FROM dba_hist_sqltext WHERE sql_id = '&&sql_id.' AND ROWNUM = 1;
:signature := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(l_sql_text);
END IF;
END;
/
-- disable all baselines for signature
DECLARE
l_plans INTEGER;
BEGIN
FOR i IN (SELECT sql_handle, plan_name
FROM dba_sql_plan_baselines
WHERE signature = :signature
AND enabled = 'YES'
ORDER BY signature, plan_name)
LOOP
l_plans := DBMS_SPM.alter_sql_plan_baseline(sql_handle => i.sql_handle, plan_name => i.plan_name, attribute_name => 'ENABLED', attribute_value => 'NO');
END LOOP;
END;
/
-- end
COL trace_directory NEW_V trace_directory NOPRI;
SELECT value trace_directory FROM v$diag_info WHERE name = 'Diag Trace';
SET FEED OFF ECHO OFF VER OFF TI OFF TIMI OFF;
PRO 1. verify on alert log ORA-13831 is no longer raised
PRO 2. collect all traces updated after &&backup_timestamp on &&trace_directory.
PRO 3. datapump &&repo_owner..*_&&backup_timestamp. tables (8) from &&pdb_name.
SPO OFF;
QUIT;