artarad_oracle_db

بازسازی اشیاء اسکیمای نامعتبر در اوراکل

مقدمه
عملیاتی مانند ارتقا، اعمال Patch و تغییرات DDL می تواند اشیاء اسکیما را نامعتبر کند. عملیات ذکر شده فرایند کامپایل را خراب نمی کند و مطابق فراخوانی اشیاء بطور اتوماتیک کامپایل و معتبر می شود، اما این مورد می تواند زمان غیرقابل قبولی را بگیرد مخصوصا در مواردی که پیچیدگی وابستگی وجود دارد. به همین دلیل منطقی است که قبل از فراخوانی کاربر اشیاء را بازسازی کند. این همچنین شما را قادر می سازد تا اگر تغییری باعث خرابی کد شما شده را شناسایی کنید. در این مقاله روش های بازسازی اشیاء اسکیمای نامعتبر در اوراکل را فراهم کرده ایم.


شناسایی اشیاء نامعتبر
از ویو DBA_OBJECTS می توان برای شناسایی اشیاء نامعتبر توسط کوئری زیر استفاده کرد.

COLUMN object_name FORMAT A30

SELECT owner,

object_type,

object_name,

status

FROM dba_objects

WHERE status = ‘INVALID’

ORDER BY owner, object_type, object_name;

با استفاده از این اطلاعات می توانید تصمیم بگیرید که کدام یک از روش‌های بازسازی برای شما مناسب است.

رویکرد دستی
زمانی که تعداد اشیاء شما کم است ممکن است از بازسازی دستی استفاده کنید که مناسب است. مثال های زیر دستور کامپایل چند نوع شئ را نشان می‌دهد:

ALTER PACKAGE my_package COMPILE;

ALTER PACKAGE my_package COMPILE BODY;

ALTER PROCEDURE my_procedure COMPILE;

ALTER FUNCTION my_function COMPILE;

ALTER TRIGGER my_trigger COMPILE;

ALTER VIEW my_view COMPILE;

توجه کنید که بدنه پکیج هم مانند مشخصات پیکج کامپایل شده است.
یک رویکرد جایگزین برای بازسازی اشیاء استفاده از پکیج DBMS_DDL است.

EXEC DBMS_DDL.alter_compile(‘PACKAGE’, ‘MY_SCHEMA’, ‘MY_PACKAGE’);

EXEC DBMS_DDL.alter_compile(‘PACKAGE BODY’, ‘MY_SCHEMA’, ‘MY_PACKAGE’);

EXEC DBMS_DDL.alter_compile(‘PROCEDURE’, ‘MY_SCHEMA’, ‘MY_PROCEDURE’);

EXEC DBMS_DDL.alter_compile(‘FUNCTION’, ‘MY_SCHEMA’, ‘MY_FUNCTION’);

EXEC DBMS_DDL.alter_compile(‘TRIGGER’, ‘MY_SCHEMA’, ‘MY_TRIGGER’);

این روش به بازسازی اشیاء PLSQL محدود می شود، بنابراین نمی توان برای Viewها استفاده شود.

اسکریپت های سفارشی
دربعضی از موقعیت ها ممکن است که مجبور باشید بسیاری از اشیاء نامعتبر شده را یکجا کامپایل کنید. یک رویکرد ایجاد یک اسکریپت سفارشی برای شناسایی و کامپایل اشیاء نامعتبر شده است. مثال زیر برای شناسایی و بازسازی پکیج و بدنه پکیج می‌باشد:

SET SERVEROUTPUT ON SIZE 1000000

BEGIN

FOR cur_rec IN (SELECT owner,

object_name,

object_type,

DECODE(object_type, ‘PACKAGE’, 1,

‘PACKAGE BODY’, 2, 2) AS recompile_order

FROM dba_objects

WHERE object_type IN (‘PACKAGE’, ‘PACKAGE BODY’)

AND status != ‘VALID’

ORDER BY 4)

LOOP

BEGIN

IF cur_rec.object_type = ‘PACKAGE’ THEN

EXECUTE IMMEDIATE ‘ALTER ‘ || cur_rec.object_type ||

‘ “‘ || cur_rec.owner || ‘”.”‘ || cur_rec.object_name || ‘” COMPILE’;

ElSE

EXECUTE IMMEDIATE ‘ALTER PACKAGE “‘ || cur_rec.owner ||

‘”.”‘ || cur_rec.object_name || ‘” COMPILE BODY’;

END IF;

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.put_line(cur_rec.object_type || ‘ : ‘ || cur_rec.owner ||

‘ : ‘ || cur_rec.object_name);

END;

END LOOP;

END;

/

این رویکرد زمانی خوب است که برای انجام کار خاصی استفاده شود، اما باید توجه داشت که ممکن است چندین بار با توجه به ترتیبی که آن ها کامپایل می‌شوند، کامپایل شوند. احتمالاً ایده بهتر این است که از راه هایی که اوراکل پیشنهاد می‌دهد استفاده کنید.

UTL_RECOMP
در پکیج UTL_RECOMP دو رویه استفاده شده است برای بازسازی اشیاء نامعتبر شده. همانطور که از نام رویه پیداست رویه RECOMP_SERIAL همه اشیاء باطل شده در یک لحظه بازسازی می کند، درحالی که رویه RECOMP_PARALLEL همان کار را با استفاده از تعداد مشخصی پارالل انجام می دهد. تعریف آن ها به شکل زیر است:

PROCEDURE RECOMP_SERIAL(

schema IN VARCHAR2 DEFAULT NULL,

flags IN PLS_INTEGER DEFAULT 0);

PROCEDURE RECOMP_PARALLEL(

threads IN PLS_INTEGER DEFAULT NULL,

schema IN VARCHAR2 DEFAULT NULL,

flags IN PLS_INTEGER DEFAULT 0);

راهنمای استفاده از پارامترها:
SCHEMA: اسکیمایی که اشیاء نامعتبر شده آن باید بازسازی شوند، و اگر NULL باشد تمام اشیاء باطل شده دیتابیس، بازسازی می شوند.
THREADS: تعدادی از threads استفاده شده در عملیات پارالل. اگر NULL باشد برای مقدار آن از پارامترjob_queue_processes استفاده شده می‌شود.
FLAGS: فقط برای تشخیص داخلی و تست. بهترین مقدار برای آن معمولا مطابق تعداد هسته های موجود در CPUها است.
مثال های زیر نشان می دهد که چگونه این رویه ها استفاده می شوند:

— Schema level.

EXEC UTL_RECOMP.recomp_serial(‘SCOTT’);

EXEC UTL_RECOMP.recomp_parallel(4, ‘SCOTT’);

— Database level.

EXEC UTL_RECOMP.recomp_serial();

EXEC UTL_RECOMP.recomp_parallel(4);

— Using job_queue_processes value.

EXEC UTL_RECOMP.recomp_parallel();

EXEC UTL_RECOMP.recomp_parallel(NULL, ‘SCOTT’);

تعدادی محدودیت در استفاده از این پکیج وجود دارد که عبارت اند از:
-پارالل های اجرا شده با استفاده از JOB QUEUE انجام می شود. همه ی JOBهای موجود تا زمان اتمام عملیات غیرفعال می-شوند.
-پکیج باید در SQLPLUS و با کاربر SYS اجرا شود، یا یک کاربر با امتیاز SYSDBA.
-این پکیج انتظار دارد STANDARD ، DBMS_STANDARD ، DBMS_JOB و DBMS_RANDOM حاضر و معتبر باشند.
-اجرای عملیات DDL در همان زمان اجرای پکیج ممکن است با نتیجه آن بن بست (Deadlock) رخ دهد.

utlrp.sql و utlprp.sql
اسکریپت های utlrp و utlprp توسط اوراکل برای بازسازی تمام اشیاء نامعتبر در دیتابیس تهیه شده است. آن ها معمولاً بعد از تغییرات گسترده در دیتابیس مانند اعمال پچ یا آپگرید اجرا می شوند. مکان آن ها در دایرکتوری $ORACLE_HOME/rdbms/admin و داخل پکیج UTL_RECOMP می باشد. اسکریپت utlrp به سادگی اسکریپت utlprp با پارامتر خط فرمان ۰ فراخوانی می کند. اسکریپت utlptp یک عدد صحیح می‌پذیرد که سطح پارلل ها را مشخص می‌کند. بشکل زیر:
۰ : سطح پارالل ها بر اساس پارامتر CPU_COUNT حاصل می شود.
۱ : بازسازی اشیاء به شکل سریالی انجام می شود، یک شئ دریک زمان.
N : بازسازی با تعداد پارالل N انجام می شود.
هر دو اسکریپت باید با کاربر SYS اجرا شود، یا یک کاربر با امتیاز SYSDBA تا صحیح کار کنند.

DBMS_UTILITY.compile_schema
رویه COMPILE_SCHEMA در پکیج DBMS_UTILITY تمام رویه ها، تابع ها، تریگرها و پکیج های موجود در اسکیمای مشخص شده را کامپایل می کند، مثال زیر نشان می دهد که چطور در SQLPLUS فراخوانی می شود:

EXEC DBMS_UTILITY.compile_schema(schema => ‘SCOTT’, compile_all => false);

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

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

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