开Bug必备,wrong result问题必备。不解释,直接贴action plan。
1)在以下文档中下载并安装最新的 SQLT:
SQLT (SQLTXPLAIN) – Tool that helps to diagnose SQL statement performing poorly (Doc ID 215187.1)
Install SQLT:
# cd sqlt/install
# sqlplus / as sysdba
SQL> START sqcreate.sql
2)生成SQLT report(包含不带数据的testcase,如果生成带数据的,请直接跳到第3步):
cd sqlt/run
sqlplus / as sysdba
START sqltxtract.sql <SQL_ID> <======替换<SQL_ID>成你想要生成报告的SQL ID.
比如:
START sqltxtract.sql bkvbqs9tjpufv
如果是12c以上版本,使用SYSDBA是无法正确生成报告的,必须赋权或者使用其他用户:
sqlplus / as sysdba
GRANT INHERIT PRIVILEGES ON USER SYS TO SQLTXADMIN;
START sqltxtract.sql bkvbqs9tjpufv
或者使用其他用户
sqlplus oracle/oracle
START sqltxtract.sql bkvbqs9tjpufv
…
中间过程忽略,在这一步输入SQLTXPLAIN用户的密码(希望你还记得安装时输入过的)
Paremeter 2:
SQLTXPLAIN password (required)
Enter value for 2: <====输入SQLTXPLAIN用户的密码(希望你还记得安装时输入过的)
其他一路回车
…
在当前目录下生成以下文件:
ls -l
-rw-r–r– 1 oracle dba 2592472 Nov 9 14:18 sqlt_s48357_xtract_bkvbqs9tjpufv.zip
-rw-r–r– 1 oracle dba 238 Nov 9 14:18 sqlt_s48357_purge.sql
如何使用这个报告呢?
在目标机器解压:
unzip sqlt_s48357_xtract_bkvbqs9tjpufv.zip -d s48357
[oracle@nascds18 run]$ cd s48357
[oracle@nascds18 s48357]$ ls
sqlt_s48357_10053_explain.trc sqlt_s48357_readme.html
sqlt_s48357_10053_i1_c0_extract.trc sqlt_s48357_sql_detail_active.html
sqlt_s48357_cell_state.zip sqlt_s48357_sqldx.zip
sqlt_s48357_driver.zip sqlt_s48357_tc_script.sql
sqlt_s48357_lite.html sqlt_s48357_tc_sql.sql
sqlt_s48357_log.zip sqlt_s48357_tcx.zip
sqlt_s48357_main.html sqlt_s48357_tc.zip
sqlt_s48357_opatch.zip sqlt_s48357_trc.zip
unzip sqlt_s48357_tc.zip -d tc
cd tc
./xpress.sh
…
3/7 Press ENTER to import SQLT repository for statement_id 48357.
SQL> HOS imp SQLTXPLAIN FILE=sqlt_s48357_exp.dmp LOG=sqlt_s48357_imp.log TABLES=sqlt% IGNORE=Y
Import: Release 12.2.0.1.0 – Production on Thu Nov 9 14:21:58 2017
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
Password:
<====输入SQLTXPLAIN用户的密码(希望你还记得安装时输入过的)
Export file created by EXPORT:V12.02.00 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing SQLTXPLAIN’s objects into SQLTXPLAIN
. importing SQLTXPLAIN’s objects into SQLTXPLAIN
. . importing table “SQLT$_SQL_STATEMENT” 1 rows imported
. . importing table “SQLT$_AUX_STATS$” 13 rows imported
. . importing table “SQLT$_DBA_AUTOTASK_CLIENT” 1 rows imported
. . importing table “SQLT$_DBA_AUTOTASK_CLIENT_HST” 20 rows imported
. . importing table “SQLT$_DBA_HIST_SNAPSHOT” 198 rows imported
. . importing table “SQLT$_DBA_OBJECTS” 1 rows imported
. . importing table “SQLT$_DBA_OPTSTAT_OPERATIONS” 3054 rows imported
. . importing table “SQLT$_DBA_SEGMENTS” 1 rows imported
. . importing table “SQLT$_DBA_TAB_COLS” 1 rows imported
. . importing table “SQLT$_DBA_TAB_MODIFICATIONS” 1 rows imported
. . importing table “SQLT$_DBA_TAB_STATISTICS” 1 rows imported
. . importing table “SQLT$_DBA_TABLES” 1 rows imported
. . importing table “SQLT$_DBA_TABLESPACES” 5 rows imported
. . importing table “SQLT$_DBMS_XPLAN” 77 rows imported
. . importing table “SQLT$_GV$NLS_PARAMETERS” 19 rows imported
. . importing table “SQLT$_GV$OBJECT_DEPENDENCY” 2 rows imported
. . importing table “SQLT$_GV$PARAMETER2” 428 rows imported
. . importing table “SQLT$_GV$PARAMETER_CBO” 505 rows imported
. . importing table “SQLT$_GV$PQ_SLAVE” 8 rows imported
. . importing table “SQLT$_GV$PQ_SYSSTAT” 20 rows imported
. . importing table “SQLT$_GV$PX_PROCESS” 8 rows imported
. . importing table “SQLT$_GV$PX_PROCESS_SYSSTAT” 15 rows imported
. . importing table “SQLT$_GV$SQL” 1 rows imported
. . importing table “SQLT$_GV$SQL_OPTIMIZER_ENV” 1 rows imported
. . importing table “SQLT$_GV$SQL_PLAN” 2 rows imported
. . importing table “SQLT$_GV$SQL_SHARED_CURSOR” 1 rows imported
. . importing table “SQLT$_GV$SQLAREA” 1 rows imported
. . importing table “SQLT$_GV$SQLAREA_PLAN_HASH” 1 rows imported
. . importing table “SQLT$_GV$SQLSTATS” 1 rows imported
. . importing table “SQLT$_GV$SQLSTATS_PLAN_HASH” 1 rows imported
. . importing table “SQLT$_GV$SQLTEXT_WITH_NEWLINES” 1 rows imported
. . importing table “SQLT$_GV$SYSTEM_PARAMETER” 426 rows imported
. . importing table “SQLT$_LOG” 922 rows imported
. . importing table “SQLT$_METADATA” 3 rows imported
. . importing table “SQLT$_NLS_DATABASE_PARAMETERS” 20 rows imported
. . importing table “SQLT$_OUTLINE_DATA” 28 rows imported
. . importing table “SQLT$_PLAN_EXTENSION” 4 rows imported
. . importing table “SQLT$_PLAN_INFO” 16 rows imported
. . importing table “SQLT$_SQL_PLAN_TABLE” 2 rows imported
. . importing table “SQLT$_V$SESSION_FIX_CONTROL” 1301 rows imported
. . importing table “SQLT$_WRI$_ADV_TASKS” 1 rows imported
. . importing table “SQLT$_WRI$_OPTSTAT_AUX_HISTORY” 36 rows imported
Import terminated successfully with warnings.
…
最终会生成一个TCxxxxxx用户,就是你文件名里的这个号码sqlt_s48357_xtract_bkvbqs9tjpufv.zip,表在该用户下,但是没数据:
SQL> select * from TC48357.test;
no rows selected
3)生成包含数据的SQLT report(请注意原表中的数据不要太大,或者使用tcb_sampling_percent取百分比的数据):
主要增加了以下设置:
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_data’, ‘TRUE’);
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_pkg_body’, ‘TRUE’);
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_sampling_percent’, ’10’);
请注意表中数据不要太大,清理数据的同时请保持能够重现问题。
请注意使用tcb_sampling_percent可能会导致无法重现问题。基于这个原因,以下步骤去掉了这个设置,您可以根据需要增加。
更早版本的设置请参考:
How to Use SQLT (SQLTXPLAIN) to Create a Testcase Containing Application Data (Doc ID 1465741.1)
以下是具体步骤:
cd sqlt/run
sqlplus / as sysdba
START sqltxtract.sql <SQL_ID> <======替换<SQL_ID>成你想要生成报告的SQL ID.
比如:
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_data’, ‘TRUE’);
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_pkg_body’, ‘TRUE’);
START sqltxtract.sql bkvbqs9tjpufv
如果是12c以上版本,使用SYSDBA是无法正确生成报告的,必须赋权或者使用其他用户:
sqlplus / as sysdba
GRANT INHERIT PRIVILEGES ON USER SYS TO SQLTXADMIN;
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_data’, ‘TRUE’);
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_pkg_body’, ‘TRUE’);
START sqltxtract.sql bkvbqs9tjpufv
或者使用其他用户
sqlplus oracle/oracle
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_data’, ‘TRUE’);
EXEC sqltxadmin.sqlt$a.set_sess_param(‘tcb_export_pkg_body’, ‘TRUE’);
START sqltxtract.sql bkvbqs9tjpufv
…
…
中间过程忽略,在这一步输入SQLTXPLAIN用户的密码(希望你还记得安装时输入过的)
Paremeter 2:
SQLTXPLAIN password (required)
Enter value for 2: <====输入SQLTXPLAIN用户的密码(希望你还记得安装时输入过的)
其他一路回车
…
在当前目录下生成以下文件:
ls -l
-rw-r–r– 1 oracle dba 2055250 Nov 9 15:17 sqlt_s48361_xtract_bkvbqs9tjpufv.zip
-rw-r–r– 1 oracle dba 238 Nov 9 15:17 sqlt_s48361_purge.sql
如何使用这个报告呢?
在目标机器解压:
unzip sqlt_s48361_xtract_bkvbqs9tjpufv.zip -d s48361
[oracle@nascds18 run]$ cd s48361
[oracle@nascds18 s48357]$ ls
sqlt_s48361_10053_explain.trc sqlt_s48361_readme.html
sqlt_s48361_10053_i1_c0_extract.trc sqlt_s48361_sql_detail_active.html
sqlt_s48361_cell_state.zip sqlt_s48361_sqldx.zip
sqlt_s48361_driver.zip sqlt_s48361_tcb.zip
sqlt_s48361_lite.html sqlt_s48361_tc_script.sql
sqlt_s48361_log.zip sqlt_s48361_tc_sql.sql
sqlt_s48361_main.html sqlt_s48361_tcx.zip
sqlt_s48361_opatch.zip sqlt_s48361_tc.zip
sqlt_s48361_perfhub_0001__.html sqlt_s48361_trc.zip
unzip sqlt_s48361_tc.zip -d tc
cd tc
./xpress.sh
…
3/7 Press ENTER to import SQLT repository for statement_id 48357.
SQL> HOS imp SQLTXPLAIN FILE=sqlt_s48357_exp.dmp LOG=sqlt_s48357_imp.log TABLES=sqlt% IGNORE=Y
Import: Release 12.2.0.1.0 – Production on Thu Nov 9 14:21:58 2017
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
Password:
<====输入SQLTXPLAIN用户的密码(希望你还记得安装时输入过的)
然后使用unzip sqlt_s48361_tcb.zip文件,tcb才会包含数据:
unzip sqlt_s48361_tcb.zip -d tcb
cd tcb
[oracle@nascds18 tcb]$ ls
sqlt_s48361_tcb_dpexp.dmp sqlt_s48361_tcb_prmimp.sql sqlt_s48361_tcb_ts.xml
sqlt_s48361_tcb_dpexp.log sqlt_s48361_tcb_README.txt sqlt_s48361_tcb_xplf.sql
sqlt_s48361_tcb_dpexp.sql sqlt_s48361_tcb_smrpt.html sqlt_s48361_tcb_xplo.sql
sqlt_s48361_tcb_dpimp.sql sqlt_s48361_tcb_sql.xml sqlt_s48361_tcb_xpls.sql
sqlt_s48361_tcb_main.xml sqlt_s48361_tcb_ssimp.sql sqlt_s48361_tcb_xpl.txt
sqlt_s48361_tcb_ol.xml sqlt_s48361_tcb_.trc
检查下这些文件所在的文件夹:
pwd
/home/oracle/sqlt/run/s48361/tcb
sqlplus / as sysdba
create directory imp_tc as ‘/home/oracle/feng/sqlt/run/s48361/tcb’;<====将这个文件夹建成目录
grant read on directory imp_tc to TC48361;
grant write on directory imp_tc to TC48361;
connect TC48361/TC48361
begin
dbms_sqldiag.import_sql_testcase(directory=>’IMP_TC’, filename =>’sqlt_s48361_tcb_main.xml’);
end;
/
SQL> select * from TC48361.test;
A
———-
1
<===========数据被导入
