قابلیت 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;