ارتقای نسخه تایم‌زون (Timezone) در Oracle PDB برای رفع خطای ORA-39405 در Data Pump

در مدیریت دیتابیس‌های اوراکل، انتقال داده‌ها بین محیط‌های مختلف با استفاده از ابزار Data Pump (expdp/impdp) امری بسیار رایج است. اما گاهی اوقات، تفاوت در نسخه‌های فایل تایم‌زون (Timezone File Version) بین دیتابیس مبدأ و مقصد می‌تواند باعث بروز خطا و توقف عملیات شود. در این مقاله به بررسی خطای ORA-39405 و نحوه ارتقای تایم‌زون در سطح PDB می‌پردازیم.

چرا نسخه تایم‌زون CDB و PDB متفاوت است؟

از اوراکل نسخه 12c به بعد و با معرفی معماری Multitenant، دیتابیس‌ها به دو بخش Container Database (CDB) و Pluggable Database (PDB) تقسیم شدند.

نسخه تایم‌زون در این معماری می‌تواند در سطح CDB و PDB متفاوت باشد.

شرح مشکل: خطای ORA-39405 در Data Pump

هنگامی که سعی می‌کنید یک فایل Dump را (که از دیتابیسی با نسخه تایم‌زون بالاتر گرفته شده) در دیتابیسی با نسخه پایین‌تر Import کنید، اوراکل خطای زیر را برمی‌گرداند:

ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version 41 into a target database with TSTZ version 32.

در این سناریو، فایل Dump از دیتابیسی با نسخه تایم‌زون 4141 گرفته شده است، در حالی که PDB مقصد (ODITESTPDB) دارای نسخه تایم‌زون 3232 است. از آنجا که اوراکل Import از نسخه بالاتر به پایین‌تر را پشتیبانی نمی‌کند، عملیات متوقف می‌شود.

راه حل: ارتقای تایم‌زون PDB به آخرین نسخه موجود

برای حل این مشکل، باید نسخه تایم‌زون PDB مقصد را با استفاده از پکیج DBMS_DST ارتقا دهیم. با اجرای کوئری

SELECT DBMS_DST.get_latest_timezone_version() FROM dual;

متوجه شدیم که سرور از نسخه 42 پشتیبانی می‌کند.

در ادامه مراحل گام‌به‌گام برای ارتقای تایم‌زون PDB از نسخه 3232 به 4242 آورده شده است:

گام ۱: آماده‌سازی (Prepare Window)

ابتدا به PDB مورد نظر متصل شده و فاز آماده‌سازی را برای نسخه 4242 شروع و پایان می‌دهیم.

ALTER SESSION SET CONTAINER = ODITESTPDB;
EXEC DBMS_DST.BEGIN_PREPARE(42);
EXEC DBMS_DST.END_PREPARE;

گام ۲: باز کردن PDB در حالت UPGRADE

برای اعمال تغییرات ساختاری، PDB باید بسته شده و در حالت آپگرید باز شود.

ALTER PLUGGABLE DATABASE CLOSE;
ALTER PLUGGABLE DATABASE OPEN UPGRADE;

گام ۳: شروع فاز آپگرید

دستور شروع آپگرید را اجرا می‌کنیم:

EXEC DBMS_DST.BEGIN_UPGRADE(42);

گام ۴: بازگرداندن PDB به حالت عادی و به‌روزرسانی داده‌ها

پس از شروع آپگرید، PDB را می‌بندیم و در حالت عادی (READ WRITE) باز می‌کنیم. سپس باید جداولی که دارای دیتای وابسته به تایم‌زون هستند را آپگرید کرده و در نهایت فاز آپگرید را ببندیم.

ALTER PLUGGABLE DATABASE CLOSE;
ALTER PLUGGABLE DATABASE OPEN;

VAR num_failures NUMBER;
BEGIN
    DBMS_DST.UPGRADE_DATABASE(:num_failures);
END;
/
PRINT num_failures; 

VAR fail_count NUMBER;
BEGIN
    DBMS_DST.END_UPGRADE(:fail_count);
END;
/
PRINT fail_count; 

گام ۵: تایید ارتقا

در نهایت با اجرای کوئری زیر بررسی می‌کنیم که نسخه تایم‌زون تغییر کرده باشد:

SELECT version FROM v$timezone_file;

اگر خروجی عدد 42 را نشان داد، عملیات با موفقیت به پایان رسیده است. حالا می‌توانید دستور impdp خود را مجدداً و بدون برخورد با خطای ORA-39405 اجرا کنید.