در این مقاله قصد داریم یک Pluggable Database (PDB) را از اوراکل 19c به نسخه جدیدتر (26ai/23ai) ارتقا دهیم. روشهای مختلفی برای این کار وجود دارد، در این مقاله روش Unplug/Plug به همراه کپی دستی فایلها (ASM to ASM) را انتخاب کردهایم. در مقاله های دیگر، روشهای دیگر هم تست می کنیم.
هدف اصلی این روش: حفظ کامل فایلهای دیتابیس در سرور مبدأ است تا در صورت شکست فرآیند ارتقا، بتوانیم به راحتی و بدون از دست رفتن دادهها به نسخه 19c بازگردیم (Rollback).
پیشنیازها و مشخصات محیط
- سرور مبدأ: اوراکل 19c، دیسکگروپ +DATA
- سرور مقصد: اوراکل 26ai/23ai، دیسکگروپ +DATADG
گام اول: شناسایی فایلها و Unplug کردن PDB در سرور مبدأ (19c)
ابتدا وارد PDB مورد نظر (TEST1PDB) میشویم تا مسیر دقیق دیتافایلها را استخراج کنیم. این مسیرها برای کپی کردن فایلها به سرور مقصد ضروری هستند. فایلهای Temp را نادیده بگیرید، زیرا نیازی به کپی کردن آنها نیست.
SQL> ALTER SESSION SET CONTAINER = TEST1PDB;
SQL> SELECT name FROM v$datafile;
NAME
--------------------------------------------------------------------------------
+DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/system.287.1231562351
+DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/sysaux.288.1231562351
+DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/undotbs1.289.1231562351
+DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/users.292.1231562359
سپس به CDB$ROOT بازگشته، PDB را میبندیم و آن را Unplug میکنیم تا فایل XML تنظیمات تولید شود:
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;
SQL> ALTER PLUGGABLE DATABASE TEST1PDB CLOSE IMMEDIATE;
SQL> ALTER PLUGGABLE DATABASE TEST1PDB UNPLUG INTO '/tmp/test1pdb_source.xml';
گام دوم: ایجاد مسیر مقصد و کپی فایلها بین دو سرور
در سرور مقصد (از طریق Grid کاربر)، یک دایرکتوری جدید برای PDB ایجاد میکنیم:
ASMCMD [+] > mkdir +DATADG/TEST1PDB_DATA
حالا در سرور مبدأ، با استفاده از asmcmd cp دیتافایلها را به سرور مقصد کپی میکنیم:
[oracle@dc1 ~]$ asmcmd cp +DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/system.287.1231562351 sys/
[oracle@dc1 ~]$ asmcmd cp +DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/sysaux.288.1231562351 sys/
[oracle@dc1 ~]$ asmcmd cp +DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/undotbs1.289.1231562351 sys/
[oracle@dc1 ~]$ asmcmd cp +DATA/VAHIDDB/5059EE96CD6E0E8AE0632938A8C00F2B/DATAFILE/users.292.1231562359 sys/
نکته بسیار مهم در مورد نامگذاری OMF: ابزار asmcmd cp اجازه کپی فایل با فرمت نامگذاری OMF اوراکل (نامهایی که دارای نقطه . هستند) را نمیدهد و با خطای ORA-15046 مواجه میشوید. برای دور زدن این محدودیت، در مسیر مقصد نام فایلها را با جایگزین کردن نقطه با خطتیره پایین (مانند system_287_123456) مشخص کردیم. البته روشهای جایگزینی مانند استفاده از پکیج DBMS_FILE_TRANSFER نیز وجود دارد که این چالش را ندارند.
سپس فایل XML را نیز از طریق شبکه به سرور مقصد منتقل میکنیم:
[oracle@dc1 ~]$ scp /tmp/test1pdb_source.xml
گام سوم: ویرایش فایل XML (انطباق مسیرها)
فایل test1pdb_dest.xml در سرور مقصد باید ویرایش شود تا اوراکل بتواند فایلهای کپی شده را پیدا کند. تگهای <path> در این فایل را باید پیدا کرده و به مسیرهای جدید تغییر دهید.
- برای دیتافایلها: مسیرها باید دقیقاً با نامهایی که در ASM مقصد ایجاد کردید (دارای _) مطابقت داشته باشد. (مثلاً +DATADG/TEST1PDB_DATA/system_287_123456).
- برای فایل Temp: نیازی به کپی فایل Temp نبود. کافیست در فایل XML، نام دیسکگروپ مسیر Temp را به +DATADG تغییر دهید و نام فایل را به همان شکل رها کنید. اوراکل هنگام Plug کردن، یک Tempfile جدید برای شما ایجاد خواهد کرد.
(با توجه به فایل test1pdb_dest.xml که بررسی شد، مسیرها به درستی به فرمت +DATADG/... تغییر یافتهاند).
گام چهارم: Plug کردن PDB در نسخه 26ai
وارد محیط دیتابیس 26ai شده و PDB را با استفاده از فایل ویرایش شده و حتماً با پارامتر NOCOPY پلاگ میکنیم:
SQL> CREATE PLUGGABLE DATABASE TEST1PDB USING '/tmp/test1pdb_dest.xml' NOCOPY;
Pluggable database created.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
5 TEST1PDB MOUNTED
گزینه NOCOPY به اوراکل میگوید که از همان فایلهایی که در ASM کپی کردهایم و در XML آدرس دادیم استفاده کند.
گام پنجم: ارتقا (Upgrade) دیتابیس
حال باید PDB را در حالت UPGRADE باز کنیم تا بتوانیم دیکشنریهای آن را به نسخه 26ai بروزرسانی کنیم:
SQL> ALTER PLUGGABLE DATABASE TEST1PDB OPEN UPGRADE;
از محیط SQL*Plus خارج شده و ابزار ارتقا را از خط فرمان سیستمعامل اجرا میکنیم:
[oracle@oracle26ai tmp]$ $ORACLE_HOME/bin/dbupgrade -c TEST1PDB
نکته در مورد زمان ارتقا: همانطور که در لاگها مشاهده میشود (Grand Total Upgrade Time: [0d:0h:17m:12s]) این فرآیند حدود ۱۷ دقیقه زمان برده است. زمانبر بودن اجرای dbupgrade حتی برای یک دیتابیس خالی کاملاً طبیعی است؛ زیرا اوراکل دیتاهای شما را ارتقا نمیدهد، بلکه در حال کامپایل و جایگزین کردن هزاران پکیج، ویو و آبجکتهای سیستمیِ خود (Data Dictionary) در دیتابیس جدید است.
بخشی از خروجی:
Manual upgrade using dbupgrade is desupported as of Oracle Database 23.4. Oracle recommends using AutoUpgrade to upgrade your database. Refer to My Oracle Support Note 2485457.1 for details on AutoUpgr ade.
Argument list for [/u01/app/oracle/product/26/dbhome/rdbms/admin/catctl.pl]
For Oracle internal use only A = 0
Run in c = TEST1PDB
Do not run in C = 0
Input Directory d = 0
Echo OFF e = 1
Simulate E = 0
Forced cleanup F = 0
Log Id i = 0
Child Process I = 0
Log Dir l = 0
Priority List Name L = 0
Upgrade Mode active M = 0
SQL Process Count n = 0
SQL PDB Process Count N = 0
Open Mode Normal o = 0
Start Phase p = 0
End Phase P = 0
Reverse Order r = 0
AutoUpgrade Resume R = 0
Script s = 0
Serial Run S = 0
Classic Upgrade t = 0
RO User Tablespaces T = 0
Zip Logs w = 0
Upgrade PDBs in Upgrade mode x = 0
Display Phases y = 0
Debug catcon.pm z = 0
Debug catctl.pl Z = 0
Manual upgrade using catctl.pl is desupported as of Oracle Database 23.4. Oracle recommends using AutoUpgrade to upgrade your database.
catctl.pl VERSION: [23.0.0.0.0]
STATUS: [Production]
BUILD: [RDBMS_23.26.1.0.0DBRU_LINUX.X64_260116.1]
..............................
Number of Cpus = 4
Database Name = cdb26
DataBase Version = 23.0.0.0.0
TEST1PDB Open Mode = [MIGRATE]
Generated PDB Inclusion:[TEST1PDB]
CDB$ROOT Open Mode = [OPEN]
Components in [TEST1PDB]
Installed [APS CATALOG CATJAVA CATPROC CONTEXT DV JAVAVM OLS ORDIM OWM SDO XDB XML XOQ]
Not Installed [APEX EM LCTR MGW ODM RAC WK]
DataBase Version = 23.0.0.0.0
------------------------------------------------------
Start Time:[2026_04_26 06:32:17]
Container Lists Inclusion:[TEST1PDB] Exclusion:[]
.....................................................................................
Serial Phase #:99 [TEST1PDB] Files:1 Time: 0s
****** Bounce the database post-migration ******
***************** Post Upgrade *****************
**************** Summary report ****************
Serial Phase #:103 [TEST1PDB] Files:1 Time: 1s
*** End PDB Application Upgrade Post-Shutdown **
Serial Phase #:104 [TEST1PDB] Files:2 Time: 0s
Grand Total Time: 1025s [TEST1PDB]
LOG FILES: (/u01/app/oracle/product/26/dbhome/cfgtoollogs/cdb26/upgrade20260426063212/catupgrdtest1pdb*.log)
Upgrade Summary Report Located in:
/u01/app/oracle/product/26/dbhome/cfgtoollogs/cdb26/upgrade20260426063212/upg_summary.log
Time: 1032s For PDB(s)
Grand Total Time: 1032s
LOG FILES: (/u01/app/oracle/product/26/dbhome/cfgtoollogs/cdb26/upgrade20260426063212/catupgrd*.log)
Grand Total Upgrade Time: [0d:0h:17m:12s]
گام ششم: بررسی سلامت دیتابیس پس از ارتقا
پس از اتمام فرآیند، مجدداً وارد دیتابیس شده، PDB را باز میکنیم و آبجکتهای نامعتبر را مجدداً کامپایل (Recompile) میکنیم:
SQL> ALTER PLUGGABLE DATABASE TEST1PDB OPEN;
SQL> ALTER SESSION SET CONTAINER = TEST1PDB;
SQL> EXEC utl_recomp.recomp_serial();
در نهایت برای اطمینان از سلامت دیتابیس، سه دستور کلیدی زیر را اجرا میکنیم:
۱. بررسی وضعیت کامپوننتها (باید UPGRADED/VALID باشند):
SQL> SELECT comp_name, version, status FROM dba_registry;
-- (خروجی نشاندهنده موفقیت و نسخه 23.0.0.0.0 است)
Oracle Database Catalog Views
23.0.0.0.0 UPGRADED
Oracle Database Packages and Types
23.0.0.0.0 UPGRADED
Oracle Real Application Clusters
23.0.0.0.0 UPGRADED
SQL> SELECT comp_name, version, status FROM dba_registry;
-- (خروجی نشاندهنده موفقیت و نسخه 23.0.0.0.0 است)
۲. اطمینان از عدم وجود آبجکت نامعتبر:
SQL> SELECT count(*) FROM dba_objects WHERE status = 'INVALID';
COUNT(*)
----------
0
البته این موضوع در مبدا هم باید فارغ از هرگونه invalid object باشد. در بهترین حالت همان تعداد invalid object مبدا را به ما بر می گرداند.
۳. بررسی وضعیت PDB (باید READ WRITE و بدون محدودیت باشد):
SQL> SELECT name, open_mode, restricted FROM v$pdbs;
NAME OPEN_MODE RES
---------- ---------- ---
TEST1PDB READ WRITE NO
نتیجهگیری
عملیات ارتقا با موفقیت انجام شد! از آنجایی که ما فایلهای اصلی 19c در دیسکگروپ +DATA را دستنخورده باقی گذاشتیم، در صورتی که در میانه این مسیر (مثلاً در گام پنجم) خطای جبرانناپذیری رخ میداد، به سادگی میتوانستیم فایل XML اولیه (test1pdb_source.xml) را در سرور 19c مجدداً به صورت NOCOPY پلاگ کنیم تا دیتابیس قدیمی در کمتر از چند دقیقه به مدار بازگردد.
پیوست: نحوه انجام بازگشت (Rollback) در سرور مبدأ (19c)
چنانچه در سرور مقصد با مشکل مواجه شدید و نیاز بود دیتابیس را در سرور مبدأ مجدداً در دسترس قرار دهید، با توجه به اینکه PDB قبلاً Unplug شده است، وضعیت آن در دیتابیس مبدأ MOUNTED (غیرقابل باز شدن) باقی مانده و در صورت تلاش برای Plug مجدد با خطای ORA-65012 مواجه میشوید.
برای رفع این مورد و بازگشت موفق، ابتدا باید متادیتای PDB را پاک کرده (حتماً با حفظ دیتافایلها) و سپس مجدداً آن را با فایل XML اولیه Plug کنید. لاگ اجرایی این عملیات به شرح زیر است:
SQL> DROP PLUGGABLE DATABASE TEST1PDB KEEP DATAFILES;
Pluggable database dropped.
SQL> CREATE PLUGGABLE DATABASE TEST1PDB USING '/tmp/test1pdb_source.xml' NOCOPY;
Pluggable database created.
SQL> ALTER PLUGGABLE DATABASE TEST1PDB OPEN;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 PDB1 MOUNTED
5 PDB2 MOUNTED
6 TEST1PDB READ WRITE NO
SQL>