دیتابیس اوراکل

دیتابیس اوراکل
طبقه بندی موضوعی

۱ مطلب در تیر ۱۴۰۰ ثبت شده است

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 کنید.