با معرفی معماری Multitenant به عنوان تنها معماری پشتیبانیشده در نسخههای جدید اوراکل، انتقال دیتابیسهای قدیمی Non-CDB به ساختار Pluggable Database (PDB) یک ضرورت است. در این مقاله، فرآیند کامل انتقال یک دیتابیس 19c از نوع Non-CDB به یک PDB در دیتابیس کانتینر (CDB) نسخه 26ai را با استفاده از روش Remote Clone از طریق Database Link به صورت گامبهگام بررسی میکنیم.
گام اول: آمادهسازی دیتابیس مبدا (19c Non-CDB)
ابتدا در دیتابیس مبدا کاربری ایجاد میکنیم که دسترسیهای لازم برای عملیات کلون را داشته باشد.
CREATE USER clone_admin IDENTIFIED BY StrongPassword;
GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO clone_admin;
نکته مهم: دیتابیس مبدا باید حتماً در حالت READ ONLY قرار گیرد تا در حین کلونگیری، تراکنش جدیدی ثبت نشود و یکپارچگی دادهها حفظ گردد.
گام دوم: ایجاد Database Link در دیتابیس مقصد (26ai CDB)
وارد دیتابیس کانتینر (CDB) نسخه 26ai میشویم و یک Database Link به دیتابیس 19c مبدا ایجاد میکنیم.
SQL> conn / as sysdba
Connected.
CREATE DATABASE LINK link_to_19c CONNECT TO clone_admin IDENTIFIED BY StrongPassword USING '19C_SOURCE';
گام سوم: اجرای عملیات Remote Clone
اکنون با استفاده از دیتابیس لینک، PDB جدید را از روی Non-CDB مبدا کلون میکنیم. استفاده از کلمه کلیدی NON$CDB به اوراکل میفهماند که مبدا یک دیتابیس کانتینری نیست.
CREATE PLUGGABLE DATABASE my_new_pdb FROM NON$CDB@link_to_19c;
کلمه کلیدی non$cdb یکی از مراحل تبدیل به pdb را انجام مید هد.
پس از پایان این دستور، PDB در حالت MOUNTED ایجاد میشود، اما به دلیل تفاوت نسخه، مستقیماً قابل استفاده نیست و باید آپگرید شود.
گام چهارم: قرار دادن PDB در وضعیت آپگرید
برای شروع عملیات آپگرید، باید کانتینر را تغییر داده و دیتابیس را در حالت UPGRADE باز کنیم:
ALTER SESSION SET CONTAINER = my_new_pdb;
ALTER PLUGGABLE DATABASE OPEN UPGRADE;
گام پنجم: اجرای فرآیند آپگرید با dbupgrade
اکنون در سطح سیستمعامل، با استفاده از ابزار dbupgrade فرآیند ارتقای دیکشنری 19c به 26ai را فقط برای همین PDB جدید استارت میزنیم:
$ORACLE_HOME/bin/dbupgrade -c my_new_pdb
در حین اجرای این عملیات، اگر وضعیت PDBها را بررسی کنید، مشاهده میکنید که PDB جدید در وضعیت MIGRATE و تحت محدودیت (RESTRICTED=YES) قرار دارد. این خروجی نشان میدهد که عملیات در حال انجام است:
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB26 MOUNTED
4 MY_NEW_PDB MIGRATE YES
5 TEST1PDB MOUNTED
پس از پایان اسکریپت آپگرید، در فایل لاگ خروجی موفقیتآمیز و زمان اجرای آن (مثلاً حدود ۲۴ دقیقه) ثبت میشود:
Grand Total Upgrade Time: [0d:0h:23m:55s] \ 1435s
گام ششم: اجرای اسکریپت تبدیل Non-CDB به PDB (بسیار مهم)
حتی پس از آپگرید، دیتابیس ما هنوز متادیتاهای یک Non-CDB را دارد و کاملاً با ساختار Multitenant همگام نشده است. برای پاکسازی دیکشنری از متادیتاهای تکراری و تبدیل نهایی آن به یک PDB واقعی، باید اسکریپت زیر را اجرا کنیم:
ALTER SESSION SET CONTAINER = my_new_pdb;
@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
(اجرای این اسکریپت بسته به حجم دیتابیس ممکن است زمانبر باشد).
گام هفتم: بررسی خطاهای Plug-in
پس از پایان عملیات آپگرید و تبدیل، باید مطمئن شویم که هیچ خطای ساختاری و مغایرتی وجود ندارد:
SELECT message, action FROM pdb_plug_in_violations WHERE status <> 'RESOLVED';
no rows selected
خالی بودن این خروجی نشان میدهد فرآیند انتقال به درستی انجام شده است.
گام هشتم: خروج از حالت MIGRATE و باز کردن نهایی PDB
در نهایت، برای خروج از وضعیت میانی (MIGRATE/RESTRICTED)، باید PDB را بسته و به صورت نرمال باز کنیم:
SQL> conn / as sysdba
SQL> ALTER PLUGGABLE DATABASE my_new_pdb CLOSE IMMEDIATE;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE my_new_pdb OPEN;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB26 MOUNTED
4 MY_NEW_PDB READ WRITE NO
5 TEST1PDB MOUNTED
همانطور که در خروجی نهایی مشخص است، MY_NEW_PDB در حالت READ WRITE و بدون محدودیت در دسترس است. فرآیند انتقال یک دیتابیس Non-CDB قدیمی به PDB در نسخه جدید اوراکل به صورت کامل و ایمن به اتمام رسید.