قابلیت SQL History در اوراکل 23c

قابلیت SQL History در نسخه 23c امکان مشاهده آخرین دستورات اجرا شده توسط sessionها را فراهم می کند(حدودا 50 دستور برای هر session) اوراکل بر اساس این قابلیت، دستوراتی که اجرای آنها به خطا خورده را هم نمایش می دهد.

برای فعال کردن قابلیت SQL History باید پارامتر SQL_HISTORY_ENABLED را به مقدار TRUE تنظیم کرد مقدار پیش فرض این پارامتر برابر با False است:

SQL> show parameter  SQL_HISTORY_ENABLED
NAME                 TYPE   	 VALUE
-------------------- --------- ------- 
sql_history_enabled  boolean 	FALSE

این پارامتر در دو سطح session و system قابل تنظیم است:

SQL> alter system set sql_history_enabled=true;
System altered

بعد از تنظیم این پارامتر، برای مشاهده لیست دستورات اجرا شده می توان از ویوی V$SQL_HISTORY استفاده کرد:

SQL> desc v$sql_history
Name                           Type          Nullable Default Comments 
------------------------------ ------------- -------- ------- -------- 
KEY                            NUMBER        Y                         
SQL_ID                         VARCHAR2(13)  Y                         
ELAPSED_TIME                   NUMBER        Y                         
CPU_TIME                       NUMBER        Y                         
BUFFER_GETS                    NUMBER        Y                         
IO_INTERCONNECT_BYTES          NUMBER        Y                         
PHYSICAL_READ_REQUESTS         NUMBER        Y                         
PHYSICAL_READ_BYTES            NUMBER        Y                         
PHYSICAL_WRITE_REQUESTS        NUMBER        Y                         
PHYSICAL_WRITE_BYTES           NUMBER        Y                         
PLSQL_EXEC_TIME                NUMBER        Y                         
JAVA_EXEC_TIME                 NUMBER        Y                         
CLUSTER_WAIT_TIME              NUMBER        Y                         
CONCURRENCY_WAIT_TIME          NUMBER        Y                         
APPLICATION_WAIT_TIME          NUMBER        Y                         
USER_IO_WAIT_TIME              NUMBER        Y                         
IO_CELL_UNCOMPRESSED_BYTES     NUMBER        Y                         
IO_CELL_OFFLOAD_ELIGIBLE_BYTES NUMBER        Y                         
SQL_TEXT                       VARCHAR2(100) Y                         
PLAN_HASH_VALUE                NUMBER        Y                         
SQL_EXEC_ID                    NUMBER        Y                         
SQL_EXEC_START                 DATE          Y                         
LAST_ACTIVE_TIME               DATE          Y                         
SESSION_USER#                  NUMBER        Y                         
CURRENT_USER#                  NUMBER        Y                         
CHILD_NUMBER                   NUMBER        Y                         
SID                            NUMBER        Y                         
SESSION_SERIAL#                NUMBER        Y                         
IS_FULL_SQLTEXT                VARCHAR2(1)   Y                         
ERROR_SIGNALLED                VARCHAR2(1)   Y                         
ERROR_NUMBER                   NUMBER        Y                         
ERROR_FACILITY                 VARCHAR2(4)   Y                         
STATEMENT_TYPE                 VARCHAR2(5)   Y                         
CON_ID                         NUMBER        Y     

از طریق ستونهای SID و #serial می توانیم session مورد نظر را تعیین کنیم همچنین ستونهای ELAPSED_TIME، SQL_TEXT، ERROR_NUMBER، STATEMENT_TYPE و … هم می توانند بسیار کاربردی باشند.

SQL> select sid from v$mystat where rownum=1;
       SID
----------
        70
SQL> select /*usefzadeh*/ * form ss;
ORA-00923: FROM keyword not found where expected

SQL> select sql_id, sql_text,ELAPSED_TIME,error_facility,error_number, statement_type from v$sql_history where sid=70 and sql_text like '%usefza%';

مثال دیگری را در این زمینه می بینیم:

SQL> select /*vahid2*/ * from sys.user$;
ORA-41900: missing READ privilege on "SYS"."USER$"

select sql_id, sql_text,ELAPSED_TIME,error_facility,error_number, statement_type from v$sql_history where sid=52 and sql_text like '%vahid2%'

*برای دستوراتی که اجرای آنها به خطا خورده ستون error_signalled مقدار Yes را نمایش خواهد داد.

مثال بعدی از یک QUERY است که بدون خطا اجرا شده:

SQL> select /*usef2*/ count(*) from dba_source;
  COUNT(*)
----------
    319284

select sql_id, sql_text,ELAPSED_TIME,error_facility,error_number, statement_type from v$sql_history where sid=70 and sql_text like '%usefza%'

دستورات DML و DDL هم ثبت خواهند شد:

SQL> create table iran1402 as select * from v$datafile;
Table created.

SQL> select sql_id, sql_text,ELAPSED_TIME,error_facility,error_number, statement_type from v$sql_history where sid=56 and sql_text like '%iran%';

SQL> delete iran1402;
9 rows deleted.

SQL>  select sql_id, sql_text,ELAPSED_TIME,error_facility,error_number, statement_type from v$sql_history where sid=%';

به طور پیش فرض تعداد دستوری که موقتا برای هر session ذخیره می شود برابر با 50 می باشد این مقدار از طریق پارامتر sql_history_buffers_ قابل تنظیم است:

select * from (SELECT a.ksppinm  "Parameter",b.ksppstvl "Session_Value",c.ksppstvl "Instance_Value" FROM x$ksppi a, x$ksppcv b, x$ksppsv c
 WHERE a.indx = b.indx AND a.indx = c.indx AND a.ksppinm LIKE '/_%' escape '/') 
 where "Parameter" like '%_sql_history_buffers%'
Parameter            Session_Value        Instance_Value
-------------------- -------------------- ---------------
_sql_history_buffers 50                   50

ویوی v$SQL_HISTORY_STATS اطلاعاتی را در مورد sql history ارائه می کند و مشخص می کند این قابلیت برای کدام container فعال شده و یا به ازای هر container چه تعداد دستور ذخیره شده دارد و …

SQL>  select c.CON_ID,c.TOTAL_BUFFERS,c.USED_SESSIONS,c.SQL_HISTORY_SGA_LIMIT_KB,c.ENTRY_LIMIT_PARAM,c.SQLTEXT_LIMIT,c.ENABLED from v$SQL_HISTORY_STATS c;

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *