
پکیج DBMS_TRACE یکی از ابزارهای کمتر مطرحشده اما فوقالعاده قدرتمند در Oracle است که امکان ردگیری مرحلهبهمرحله مسیر اجرای کدهای PL/SQL را فراهم میکند.
بسیاری از توسعهدهندگان تنها از DBMS_OUTPUT یا DBMS_PROFILER برای Debug استفاده میکنند، در حالی که DBMS_TRACE قابلیت مشاهدهی دقیق ورود و خروج از Unitها، خطوط اجرا شده، و حتی Exceptionها را فراهم میکند.
اگر در حال توسعه یا نگهداری سیستمهای بزرگ بانکی، Billing، CRM، یا اپلیکیشنهای سازمانی هستید، درک و استفاده از DBMS_TRACE میتواند تفاوت قابلتوجهی در کیفیت Debug و تحلیل کد ایجاد کند.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی در این پکیج DBMS_TRACE صحبت خواهیم کرد.
پکیج DBMS_FLASHBACK به شما اجازه میدهد در سطح آمادهسازی Session، نمایی از دادهها را به هر لحظه از گذشته بازگردانید — بدون اینکه نیاز به Backup یا Restore داشته باشید. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
پکیج DBMS_TRACE چیست و چرا اهمیت دارد؟
DBMS_TRACE یک پکیج داخلی در اوراکل است که برای ثبت دقیق مسیر اجرای PL/SQL طراحی شده.
برخلاف پروفایلر که روی زمان اجرای کد تمرکز دارد، DBMS_TRACE روی رفتار و مسیر اجرا تمرکز میکند.
با استفاده از این ابزار میتوانی:
- مسیر اجرای توابع، پروسیجرها و پکیجها را ببینی
- ورودی و خروجی هر Unit را ردیابی کنی
- Exceptionها را با محل دقیق وقوعشان پیدا کنی
- تریگرهای زنجیرهای را تحلیل کنی
- Call Tree واقعی کد را مشاهده کنی
در پروژههای بزرگ، این ابزار یک ناجی تمامعیار است.
پیشنیازهای استفاده از پکیج DBMS_TRACE
برای استفاده از این پکیج به دسترسیهای زیر نیاز دارید:
GRANT EXECUTE ON DBMS_TRACE TO myuser;
GRANT SELECT ON sys.plsql_trace_runs TO myuser;
GRANT SELECT ON sys.plsql_trace_events TO myuser;
جداول مهم:
• PLSQL_TRACE_RUNS
• PLSQL_TRACE_EVENTS
این دو جدول تمام دادههای Trace را ذخیره میکنند.
سطوح Trace در پکیج DBMS_TRACE
DBMS_TRACE امکان فعالسازی Trace با سطحهای مختلف را فراهم میکند:
- ALL_CALLS — ثبت ورود/خروج از Unitها
- ALL_EXCEPTIONS — ثبت Exceptionها
- ALL_LINES — ثبت تکتک خطوط (سنگین)
- ALL_STEPS — کاملترین حالت (فقط برای Debug عمیق)
فعالسازی Trace:
BEGIN
DBMS_TRACE.SET_PLSQL_TRACE(DBMS_TRACE.ALL_CALLS);
END;
غیرفعالسازی Trace:
BEGIN
DBMS_TRACE.CLEAR_PLSQL_TRACE();
END;
مثال پکیج DBMS_TRACE برای Trace
۱. تعریف پکیج
CREATE OR REPLACE PACKAGE demo_pkg IS
FUNCTION add_two_numbers(a NUMBER, b NUMBER) RETURN NUMBER;
PROCEDURE run_test;
END demo_pkg;
۲. بدنه پکیج
CREATE OR REPLACE PACKAGE BODY demo_pkg IS
FUNCTION add_two_numbers(a NUMBER, b NUMBER) RETURN NUMBER IS
result NUMBER;
BEGIN
result := a + b;
RETURN result;
END;
PROCEDURE run_test IS
x NUMBER;
BEGIN
x := add_two_numbers(10, 20);
DBMS_OUTPUT.PUT_LINE('Result=' || x);
END;
END demo_pkg;
۳. اجرای پکیج
BEGIN
demo_pkg.run_test;
END;
چطور Trace ایجاد شده را بخوانیم؟
کوئری پایه برای مشاهده همه Eventها:
SELECT runid, timestamp, unit_owner, unit_name, event, line#
FROM plsql_trace_events
ORDER BY timestamp;
این خروجی نشان میدهد:
- وارد کدام unit شد
- از کدام خارج شد
- کدام خط اجرا شد
- زمان دقیق رویداد
مثال کاربردیتر: Trace آخرین Run ثبتشده
SELECT e.timestamp,
e.event,
e.unit_name,
e.line#
FROM plsql_trace_runs r
JOIN plsql_trace_events e USING(runid)
WHERE r.runid = (SELECT MAX(runid) FROM plsql_trace_runs)
ORDER BY e.timestamp;
این کوئری همیشه آخرین Trace را نمایش میدهد.
ردگیری یک سناریوی خاص
اگر میخواهی فقط اجرای یک بخش خاص از سیستم را Trace کنی:
DECLARE
v_runid NUMBER;
BEGIN
DBMS_TRACE.CLEAR_PLSQL_TRACE();
DBMS_TRACE.SET_PLSQL_TRACE(DBMS_TRACE.ALL_CALLS);
demo_pkg.run_test;
SELECT MAX(runid) INTO v_runid FROM plsql_trace_runs;
DBMS_OUTPUT.PUT_LINE('Trace Run ID: ' || v_runid);
END;
/
سپس:
SELECT * FROM plsql_trace_events WHERE runid = :v_runid;
کاربردهای واقعی پکیج DBMS_TRACE در پروژههای سازمانی
- Debug پکیجهای پیچیده در سیستمهای بانکی
- ردیابی Triggerهای زنجیرهای
- حدس مسیر اجرای انتقال پول یا تراکنشها
- Debug رفتار Queryهای Dynamic SQL
- فهمیدن شاخههایی از کد که اصلاً اجرا نمیشوند
- بررسی رفتار Session هنگام وقوع خطا یا Deadlock
۱۰ نکته طلایی برای استفاده بهتر از پکیج DBMS_TRACE
- قبل از شروع Trace، حتماً CLEAR بزن
- در محیط Production فقط از ALL_CALLS استفاده کن
- ALL_LINES فقط برای Debug عمیق در Dev
- خروجی را همیشه به ترتیب Timestamp مرتب کن
- با RunID آخر Trace را پیدا کن
- خروجی Trace را در یک جدول کمکی کپی کن
- Trace فایل فیزیکی تولید نمیکند
- در پکیجهای بزرگ قابلیت رسم Call Tree دارد
- نتایج را با Profiler ترکیب کن
- از DBMS_OUTPUT برای جایگزینی Trace استفاده نکن
سوالات متداول درباره پکیج DBMS_TRACE در اوراکل
DBMS_TRACE رفتار مسیر اجرای کد را نشان میدهد؛ یعنی مشخص میکند کدام پروسیجر، فانکشن یا خط دقیقاً اجرا شده و ترتیب اتفاقها چه بوده است.
در مقابل، DBMS_PROFILER فقط برای زمانسنجی و Performance است.
اگر دنبال خطایابی، فهمیدن Call Tree یا رخدادهای غیرمنتظره هستی، DBMS_TRACE ابزار اصلی است؛ اما برای بهینهسازی سرعت کد، Profiler انتخاب بهتر است.
در حد خیلی کم، بله.
اگر از سطح ALL_CALLS استفاده شود، سربار Trace کاملاً قابلقبول است و در اکثر سیستمهای عملیاتی هم بهکار میرود.
اما استفاده از ALL_LINES یا ALL_STEPS چون تکتک خطوط را ثبت میکند، سنگین است و باید فقط در محیط توسعه استفاده شود.
بنابراین انتخاب سطح Trace مهمترین عامل در حفظ Performance است.
سادهترین روش این است که قبل از اجرای همان بخش موردنظر، Trace را فعال کنی، کد را اجرا کنی، و بلافاصله بعد از آن Trace را غیرفعال کنی.
بهعنوان مثال:
DBMS_TRACE.CLEAR_PLSQL_TRACE();
DBMS_TRACE.SET_PLSQL_TRACE(DBMS_TRACE.ALL_CALLS);
my_package.process_payment(…);
DBMS_TRACE.CLEAR_PLSQL_TRACE();
بعد از اجرا، با انتخاب آخرین RunID میتوانی Trace کامل همان سناریو را ببینی.
این تکنیک دقیقاً همان روش حرفهایها در پروژههای بانکی است.
Oracle تمام اطلاعات Trace را در دو جدول ذخیره میکند:
• PLSQL_TRACE_RUNS
• PLSQL_TRACE_EVENTS
برای مشاهده آخرین Trace فقط کافیست این کوئری را اجرا کنی:
SELECT e.event, e.unit_name, e.line#, e.timestamp
FROM plsql_trace_events e
WHERE e.runid = (SELECT MAX(runid) FROM plsql_trace_runs)
ORDER BY e.timestamp;
این گزارش دقیقاً نشان میدهد:
- وارد چه Unit شدی
- چه خطی اجرا شده
- چه Exceptionی رخ داده
- ترتیب واقعی اجرای کد چه بوده
همین گزارش، قلب Debug واقعی در Oracle است.
جمعبندی
DBMS_TRACE یک ابزار بینظیر برای توسعهدهندگان و DBAهاست که تلاش میکنند رفتار واقعی کدهای PL/SQL را بفهمند. این ابزار مسیر اجرا را با دقت ثبت میکند و برای Debug پروژههای بزرگ و پیچیده گزینهای حیاتی است.
📥 اگر سوالی داری در مورد پکیج DBMS_TRACE در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید