همانطو که می دانید اوراکل در نسخه 21cء، Non-CDB را ساپورت نمی کند بنابرین برای ارتقا یک دیتابیس Non-CDB به نسخه 21c، ابتدا باید آن را به PDB تبدیل کرد و پس از آن، PDB را به نسخه 21c ارتقا داد.
قابلیت Replay Upgrade که از قابلیتهای جدید اوراکل در نسخه 21c است، این امکان را می دهد تا بخشهای از عملیات ارتقا Non-CDB به صورت خودکار انجام شود. برای مثال، بعد از plug کردن Non-CDB به یک دیتابیس CDB، نیازی به اجرای اسکریپت noncdb_to_pdb.sql نخواهد بود و در زمان open کردن PDB، نسخه PDB به 21c ارتقا پیدا خواهد کرد.
در ادامه این متن، مراحل ارتقا non-cdb از نسخه 18c به نسخه 21c را با کمک قابلیت Replay Upgrade مشاهده می کنید.
مرحله اول: دیتابیس non-cdb را در حالت Read-Only قرار می دهیم:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup open read only
ORACLE instance started.
Total System Global Area 1442839376 bytes
Fixed Size 8657744 bytes
Variable Size 905969664 bytes
Database Buffers 520093696 bytes
Redo Buffers 8118272 bytes
Database mounted.
Database opened.
مرحله دوم: در این مرحله، از طریق پروسیجر DBMS_PDB.DESCRIBE، فایل XMLای حاوی متادیتا دیتابیس NON-CDB را ایجاد می کنیم:
SQL> exec DBMS_PDB.DESCRIBE(‘/home/oracle/noncdb18c.xml’);
PL/SQL procedure successfully completed.
مرحله سوم: دیتابیس نسخه 18c را shutdown و instance مربوط به 21c را استارت می کنیم:
SQL*Plus: Release 18.0.0.0.0 – Production on Sun Sep 26 18:51:30 2021
SQL> shut abort
ORACLE instance shut down.
SQL*Plus: Release 21.0.0.0.0 – Production on Sun Sep 26 20:02:59 2021
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1438645216 bytes
Fixed Size 9698272 bytes
Variable Size 562036736 bytes
Database Buffers 339738624 bytes
Redo Buffers 2883584 bytes
In-Memory Area 524288000 bytes
Database mounted.
Database opened.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
4 PDB1 READ WRITE NO
مرحله چهارم: با اجرای بلاک زیر در اوراکل 21c بررسی می کنیم که دیتابیس non-cdb با محیط جدید سازگار هست یا نه؟
SET SERVEROUTPUT ON;
DECLARE
compatible CONSTANT VARCHAR2(3) := CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => ‘/home/oracle/noncdb18c.xml’)
WHEN TRUE THEN ‘YES’
ELSE ‘NO’
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(compatible);
END;
/
NO
همانطور که می بینید، پاسخ منفی هست! دلایل عدم سازگاری را می توانیم از طریق ویوی PDB_PLUG_IN_VIOLATIONS ببینیم:
SQL> select MESSAGE,type,status from PDB_PLUG_IN_VIOLATIONS;
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.
WARNING PENDING
PDB’s version does not match CDB’s version:PDB’s version 18.0.0.0.0. CDB’s version 21.0.0.0.0.
ERROR PENDING
CDB parameter processes mismatch: Previous 1300 Current 300
WARNING PENDING
CDB parameter sga_target mismatch: Previous 1376M Current 1372M
WARNING PENDING
CDB parameter compatible mismatch: Previous ‘18.0.0’ Current ‘21.0.0’
WARNING PENDING
Interim patch 27923415/22239273 (OJVM RELEASE UPDATE: 18.3.0.0.180717 (27923415)): Not installed in the CDB but installed in the PDB
ERROR PENDING
No release updates are installed in the CDB but ‘18.3.0.0.0 Release_Update 180628094’ is installed in the PDB
ERROR PENDING
لیست violationها را در قسمت فوق مشاهده می کنید که البته بعضی از آنها اهمیت چندانی ندارند. مهمترین انها، اجرای اسکریپت noncdb_to_pdb.sql و عدم تطابق نسخه PDB با CDB هست.
مرحله پنجم: با فایل xml ایجاد شده(مرحله دوم) در دیتابیس CDB21c یک PDB ایجاد می کنیم:
SQL> Create pluggable database noncdb18c using ‘/home/oracle/noncdb18c.xml’ nocopy;
Pluggable database created.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 NONCDB18C MOUNTED
4 PDB1 READ WRITE NO
مرحله ششم: با اجرای دستور زیر، pdb ایجاد شده که در واقع یک non-cdb هم هست، به نسخه 21c ارتقا یافته و به صورت نرمال open خواهد شد البته اجرای این دستور، حدودا 25 دقیقه به طول می انجامد! و این دستور، منجر به اجرا شدن اسکریپت noncdb_to_pdb.sql هم می شود.
SQL> alter pluggable database NONCDB18C open;
Pluggable database altered.
Elapsed: 00:25:29.81
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 NONCDB18C READ WRITE NO
4 PDB1 READ WRITE NO
در alert log جزییاتی از انچه که در زمان اجرای این دستور اتفاق افتاده را مشاهده می کنید:
NONCDB18C(3):Starting Upgrade on PDB Open
2021-09-26T20:42:33.009910+03:30
NONCDB18C(3):alter pluggable database application APP$CDB$CATALOG begin install ‘18.0.0.0.0’ on error capture
NONCDB18C(3):ORA-65229 signalled during: alter pluggable database application APP$CDB$CATALOG begin install ‘18.0.0.0.0’ on error capture…
NONCDB18C(3):alter pluggable database application APP$CDB$CATALOG end install ‘18.0.0.0.0’
NONCDB18C(3):Completed: alter pluggable database application APP$CDB$CATALOG end install ‘18.0.0.0.0’
2021-09-26T20:42:34.145255+03:30
NONCDB18C(3):alter pluggable database application APP$CDB$CATALOG begin upgrade
‘18.0.0.0.0’ to ‘21.0.0.0.0.partial’ on error capture
NONCDB18C(3):Completed: alter pluggable database application APP$CDB$CATALOG begin upgrade
‘18.0.0.0.0’ to ‘21.0.0.0.0.partial’ on error capture
2021-09-26T20:42:47.222716+03:30
2021-09-26T20:58:34.612594+03:30
NONCDB18C(3):SERVER COMPONENT id=OWM: status=UPGRADED, version=21.3.0.0.0, timestamp=2021-09-26 20:58:34 Container=NONCDB18C Id=3
NONCDB18C(3):SERVER COMPONENT id=RAC: status=UPGRADED, version=21.3.0.0.0, timestamp=2021-09-26 20:58:35 Container=NONCDB18C Id=3
NONCDB18C(3):SERVER COMPONENT id=JAVAVM: status=UPGRADED, version=21.3.0.0.0, timestamp=2021-09-26 20:59:26 Container=NONCDB18C Id=3
NONCDB18C(3):SERVER COMPONENT id=XML: status=UPGRADED, version=21.3.0.0.0, timestamp=2021-09-26 21:01:00 Container=NONCDB18C Id=3
NONCDB18C(3):SERVER COMPONENT id=CATJAVA: status=UPGRADED, version=21.3.0.0.0, timestamp=2021-09-26 21:01:16 Container=NONCDB18C Id=3
NONCDB18C(3):SERVER COMPONENT id=XDB: status=UPGRADED, version=21.3.0.0.0, timestamp=2021-09-26 21:02:22 Container=NONCDB18C Id=3
NONCDB18C(3):SERVER COMPONENT id=ORDIM: status=UPGRADED, version=21.3.0.0.0, timestamp=2021-09-26 21:03:54 Container=NONCDB18C Id=3
در پایان با مشاهده ویوی PDB_PLUG_IN_VIOLATIONS، خواهیم دید که خطاهای گزارش شده در حالت RESOLVED قرار گرفته اند:
SQL> select count(*) from PDB_PLUG_IN_VIOLATIONS where name=’NONCDB18C’ and status=’RESOLVED‘;
20