Repairing SQL Failures with the SQL Repair Advisor
وقتی یک دستور SQL به یک critical error برخورد میکند و failed میشود، یکی از راهها این است که برای برطرف کردن خطای آن از SQL Repair Advisor کمک بگیریم. SQL Repair Advisor آن دستور SQL را آنالیز میکند و اگر بتواند برای برطرف کردن خطای پیش آمده یک patch ارائه میدهد. اگر شما آن patch را apply کنید، optimizer با جایگزین کردن یک plan جدید سعی میکند در اجراهای بعدی آن خطا را برطرف کند.
SQL Repair Advisor را از 2 طریق میتوان اجرا کرد:
1. Cloud Cntrol
2. DBMS_SQLDIAG package subprograms
Running the SQL Repair Advisor Using the DBMS_SQLDIAG Package Subprograms
با استفاده از subprogramهای پکیج DBMS_SQLDIAG میتوانیم SQL Repair Advisor را اجرا کنیم:
CREATE_DIAGNOSIS_TASK: ایجاد یک diagnostic task
EXECUTE_DIAGNOSIS_TASK: اجرای diagnostic task که در مرحله قبل ایجاد شده است.
ACCEPT_SQL_PATCH: اگر در مرحله قبل patch پیشنهاد شده باشد، با استفاده از این subprogram میتوان آن patch را apply کرد.
نکته مهم: از اوراکل 19c میتوان بجای استفاده از سه subprogram بالا، تنها با استفاده از یک subprogram با نام SQL_DIAGNOSE_AND_REPAIR همه کارهای بالا را انجام داد.
مراحل استفاده از DBMS_SQLDIAG:
1- ایجاد یک diagnosis task با نام error_task
DECLARE rep_out CLOB; t_id VARCHAR2(50); BEGIN t_id := DBMS_SQLDIAG.CREATE_DIAGNOSIS_TASK ( sql_text => 'DELETE FROM t t1 WHERE t1.a = ''a'' AND ROWID <> (SELECT MAX(ROWID) FROM t t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.d = t2.d)', task_name => 'error_task', problem_type => DBMS_SQLDIAG.PROBLEM_TYPE_COMPILATION_ERROR); END; |
2- اجرای error_task:
DBMS_SQLDIAG.EXECUTE_DIAGNOSIS_TASK ('error_task'); |
3- تولید report برای error_task:
DECLARE rep_out CLOB; BEGIN rep_out := DBMS_SQLDIAG.report_diagnosis_task ('error_task', DBMS_SQLDIAG.type_text); DBMS_OUTPUT.put_line ('Report : ' || rep_out); END; |
4- apply کردن patch در صورت وجود:
SQL Patch شبیه SQL Profile است با این تفاوت که برخلاف SQL Profile برای رفع خطاهای compilation و execution استفاده میشود.
EXECUTE DBMS_SQLDIAG.ACCEPT_SQL_PATCH(task_name => 'error_task', task_owner => 'SYS', replace => TRUE); |
میتوانید با استفاده از Cloud Control و subprogramهای ALTER_SQL_PATCH و DROP_SQL_PATCH در پکیج DBMS_SQLDIAG، اقدام به حذف کردن و یا disable کردن patchهای ایجاد شده نمایید.
5- اجرای مجدد آن دستور sql و تست patch ایجاد شده
نکته: با استفاده از پکیج DBMS_SQLDIAG میتوانید از patch ایجاد شده در یک دیتابیس export بگیرید و در یک دیتابیس دیگر import کنید.