Hot clone گرفتن یک Remote PDB و یا NOn CDB در پایگاه داده اوراکل ۱۲CR2

Hot clone  گرفتن یک Remote PDB و یا NOn CDB در پایگاه داده اوراکل ۱۲CR2

در نسخه‌ی ابتدایی Oracle Database 12c Release 1 (12.1.0.1)، remote cloning یا بازسازی مجدد از راه دور به عنوان یک ویژگی معرفی شده بود اما کار نمی‌کرد.

در نسخه‌ی ۱۲٫۱٫۰٫۲ نه‌تنها این مشکل برطرف شد بلکه قابلیت ساخت PDB به عنوان یک نمونه از ریموت پایگاه ‌داده‌ی non-CDB را نیز اضافه کرده است.

بزرگ ترین مشکل در remote cloning، وجود پیش‌نیاز در قرار دادن منبع source PDB یا Non-CDB در حالت read-only mode قبل از شروع پروسه‌ی cloning است.

این امر این ویژگی را برای سیستم‌های تولیدی بلااستفاده کرد و سطح down-time معمولا غیر قابل قبول است. Oracle Database 12c Release 2 این پیش‌نیاز را حذف کرده است که برای اولین‌بار Hot Cloning کردن PDB یا Non-CDB ها را امکان‌پذیر کرده است.

Artarad_Multitenant

پیش‌نیازها
پیش‌نیازها برای cloning کردن یک PDB یا Non-CDB ریموت، بسیار شبیه به هم هستند بنابراین آن‌ها را با هم بررسی می‌کنم.

در این متن واژه‌ی “محلی” به مقصد CDB موردنظر اشاره می‌کند که PDB، Cloned شده را در خود جای می‌دهد. واژه‌ی “ریموت” اشاره به PDB یا Non-CDB می‌کند که منبع یک clone هستند.

کاربر پایگاه‌داده‌ی محلی می‌بایست اجازه‌ی CREATE PLUGGABLE DATABASE (ساخت پایگاه‌داده‌ی PLUGGABLE ) را در root container داشته باشد.
CDB ریموت باید از حالت محلی local undo mode استفاده کند. در غیر این صورت شما باید PDB یا Non-CDB ریموت را در حالت read-only mode باز کنید.
پایگاه‌داده‌ی ریموت باید در حالت archivelog mode باشد. در غیر این صورت شما باید PDB یا Non-CDB ریموت را در حالت read-only mode باز کنید.
پایگاه‌ داده‌ی محلی باید یک لینک پایگاه‌داده (database link) به پایگاه‌داده‌ی ریموت داشته باشد. اگر پایگاه‌داده‌ی ریموت PDB باشد، database link می‌تواند با استفاده از یک کاربر معمولی، PDB یا کانتینر اپلیکیشینی که از یک کاربر محلی استفاده می‌کند، به CDB ریموت هدایت شود.
کاربری که در پایگاه‌داده‌ی ریموت است و database link به آن متصل می‌شود باید اجازه‌ی CREATE PLUGGABLE DATABASE داشته باشد.
پایگاه‌داده‌ی ریموت و محلی می‌بایست Endianness یکسان داشته باشند.
پایگاه‌داده‌ی ریموت و محلی یا باید آپشن‌های یکسان را نصب داشته باشند و یا اینکه پایگاه‌داده‌ی ریموت زیرمجموعه‌ای از آن‌چه در پایگاه‌داده‌ی محلی موجود است داشته باشد.
چنانچه character set، CDB محلی AL32UTF8 باشد، پایگاه‌داده‌ی ریموت می‌تواند هر character set دلخواهی باشد. اگر CDB محلی از AL32UTF8 استفاده نمی‌کند، character set پایگاه‌داده‌ی ریموت و محلی باید مطابقت داشته باشند.
اگر پایگاه داده‌ی ریموت از Transparent Data Encryption (TDE) استفاده می‌کند، CDB محلی باید قبل از سعی برای عملیات clone، به طور مناسب سازمان‌دهی شود. در غیر این صورت با یک PDB جدید مواجه خواهید شد که تنها در حالت محدود restricted mode باز می‌شود.
گفته شده که باگ ۱۹۱۷۴۹۴۲ در نسخه‌ی ۱۲٫۲ رفع شده است. من نمی‌توانم صحت این موضوع را تأیید کنم اما نباید دیگر مشکلی در این زمینه باشد. tablespace های پیش‌فرض برای هر کاربر عادی در ریموت PDB می‌بایست در CDB محلی موجود باشد. اگر اینطور نبود، tablespace های ناموجود را در root container، PDB محلی ایجاد کنید. اگر اینکار را انجام ندهید، PDB جدید شما تنها در حالت محدود restricted mode باز می‌شود. (باگ ۱۹۱۷۴۹۴۲)
اگر از یک non-CDB بازسازی مجدد یا همان cloning را انجام می‌دهید، هر دو پایگاه‌داده‌های ریموت و محلی باید از ورژن ۱۲٫۱٫۰٫۲ یا بالاتر استفاده کنند.

در نمونه‌های زیر من سه پایگاه داده دارم که روی یک دستگاه مجازی اجرا می‌شوند. اما می‌توانستند روی سرورهای مجازی یا فیزیکی جداگانه نیز اجرا شوند.

cdb1: پایگاه‌داده‌ی محلی که نهایتا clones ها را در خود جای می‌دهد.
db12c: non-CDB ریموت
cdb3: CDB ریموت، استفاده شده برای بازسازی مجدد یک PDB ریموت. (pdb5)

عملیات cloning یک PDB ریموت

به CDB ریموت متصل شوید و PDB ریموت را برای cloning آماده کنید.

export ORAENV_ASK=NO

export ORACLE_SID=cdb3

. oraenv

export ORAENV_ASK=YES

sqlplus / as sysdba

یک user در پایگاه‌داده‌ی ریموت برای استفاده با database link ایجاد کنید. در این مورد ما از یک local user یا کاربر محلی در PDB ریموت استفاده می‌کنیم.

CREATE USER c##remote_clone_user IDENTIFIED BY remote_clone_user CONTAINER=ALL;

GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO c##remote_clone_user CONTAINER=ALL;

چک کنید که CDB ریموت در حالت‌های local undo mode و archivelog mode باشد.

CONN / AS SYSDBA

COLUMN property_name FORMAT A30

COLUMN property_value FORMAT A30

SELECT property_name, property_value

FROM database_properties

WHERE property_name = ‘LOCAL_UNDO_ENABLED’;

PROPERTY_NAME PROPERTY_VALUE

—————————— ——————————

LOCAL_UNDO_ENABLED TRUE

SQL>

SELECT log_mode

FROM v$database;

LOG_MODE

————

ARCHIVELOG

SQL>

به این دلیل که CDB ریموت در در حالت‌های local undo mode و archivelog mode است، نیازی نیست تا پایگاه‌داده‌ی ریموت را در حالت read-only mode قرار دهیم.

CDB3=

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = my-server.my-domain)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = cdb3)

)

)

به پایگاه‌داده‌ی محلی متصل شوید تا عملیات Clone را آغاز کنید.

export ORAENV_ASK=NO

export ORACLE_SID=cdb1

. oraenv

export ORAENV_ASK=YES

sqlplus / as sysdba

در پایگاه‌داده‌ی محلی یک database link در جهت پایگاه‌داده‌ی ریموت بسازید.

DROP DATABASE LINK clone_link;

CREATE DATABASE LINK clone_link

CONNECT TO c##remote_clone_user IDENTIFIED BY remote_clone_user USING ‘cdb3’;

— Test link.

DESC user_tables@clone_link

با عملیات cloning کردن PDB ریموت، یک PDB جدید در پایگاه‌داده‌ی محلی ایجاد کنید. در این مورد ما از Oracle Managed Files (OMF) استفاده می‌کنیم پس نیازی نیست تا از پارامتر FILE_NAME_CONVERT برای تبدیل نام فایل‌ها استفاده کنیم.

CREATE PLUGGABLE DATABASE pdb5new FROM pdb5@clone_link;

Pluggable database created.

SQL>

می‌بینیم که PDB ریموت جدید ساخته شده است اما در حالت MOUNTED قرار دارد.

 

COLUMN name FORMAT A30

SELECT name, open_mode FROM v$pdbs WHERE name = ‘PDB5NEW’;

NAME OPEN_MODE

—————————— ———-

PDB5NEW MOUNTED

SQL>

PDB در حالت read-write mode باز شده است تا عملیات را کامل کند.

ALTER PLUGGABLE DATABASE pdb5new OPEN;

SELECT name, open_mode FROM v$pdbs WHERE name = ‘PDB5NEW’;

NAME OPEN_MODE

—————————— ———-

PDB5NEW READ WRITE

SQL>

با هر PDB clone چک کنید که common users و tablespace موقت، همانطور که لازم است سازمان‌دهی شده باشند.
عملیات cloning کردن یک Non-CDB ریموت

 

به پایگاه‌داده‌ی ریموت متصل شوید تا آن را برای cloning آماده کنید.

export ORAENV_ASK=NO

export ORACLE_SID=db12c

. oraenv

export ORAENV_ASK=YES

sqlplus / as sysdba

یک user در پایگاه‌داده‌ی ریموت برای استفاده با database link ایجاد کنید.

CREATE USER remote_clone_user IDENTIFIED BY remote_clone_user;

GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO remote_clone_user;

چک کنید که non-CDB ریموت در حالت archivelog mode باشد.

SELECT log_mode

FROM v$database;

LOG_MODE

————

ARCHIVELOG

SQL>

ما در اوراکل ۱۲٫۱ قبل از ادامه دادن، پایگاه‌داده‌ی ریموت را به read-only mode سوئیچ می‌کردیم. اما این کار در اوراکل ۱۲٫۲ که پایگاه‌داده‌ی منبع را در archivelog mode آماده کرده است، نیاز نیست.

به سرور محلی سوئیچ کنید و یک tnsnames.ora در جهت پایگاه‌داده‌ی ریموت ایجاد کنید تا در شرط USING ، در database link استفاده شود.

DB12C =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = my-server.my-domain)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = db12c)

)

)

به پایگاه‌داده‌ی محلی متصل شوید تا عملیات Clone را آغاز کنید.

export ORAENV_ASK=NO

export ORACLE_SID=cdb1

. oraenv

export ORAENV_ASK=YES

sqlplus / as sysdba

در پایگاه‌داده‌ی محلی یک database link در جهت پایگاه‌داده‌ی ریموت بسازید.

DROP DATABASE LINK clone_link;

CREATE DATABASE LINK clone_link

CONNECT TO remote_clone_user IDENTIFIED BY remote_clone_user USING ‘db12c’;

— Test link.

DESC user_tables@clone_link

با عملیات cloning کردن non-CDB ریموت، یک PDB جدید در پایگاه‌داده‌ی محلی ایجاد کنید. در این مورد ما از Oracle Managed Files (OMF) استفاده می‌کنیم پس نیازی نیست تا از پارامتر FILE_NAME_CONVERT برای تبدیل نام فایل‌ها استفاده کنیم. از آنجایی که هیچ PBD برای نام‌گذاری نیست ما از NON$CDB به جای نام PBD استفاده می‌کنیم.

CREATE PLUGGABLE DATABASE db12cpdb FROM NON$CDB@clone_link;

Pluggable database created.

SQL>

می‌بینیم که PDB ریموت جدید ساخته شده است اما در حالت MOUNTED قرار دارد.

COLUMN name FORMAT A30

SELECT name, open_mode FROM v$pdbs WHERE name = ‘DB12CPDB’;

NAME OPEN_MODE

—————————— ———-

DB12CPDB MOUNTED

SQL>

از آنجایی که PBD به عنوان یک clone از non-CDB ساخته شده است، قبل از این که بتواند باز شود نیاز است تا اسکریپت $ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql را اجرا کنیم تا محیط را آماده کنیم.

ALTER SESSION SET CONTAINER=db12cpdb;

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

حال PDB ریموت می‌تواند در read-write mode باز شود.

ALTER PLUGGABLE DATABASE db12cpdb OPEN;

SELECT name, open_mode FROM v$pdbs WHERE name = ‘DB12CPDB’;

NAME OPEN_MODE

—————————— ———-

DB12CPDB READ WRITE

SQL>

با هر PDB clone چک کنید که common users و tablespace موقت، همانطور که لازم است سازمان‌دهی شده باشند.

ضمیمه

این تست‌ها در free trial سرویس Oracle Database Cloud Service اجرا شده‌اند، جایی که نمونه‌ی CDB1 و پایگاه‌داده‌ی PDB1 pluggable database به عنوان بخشی از ساختار سرویس ساخته شده بودند. نمونه‌های اضافی بر روی دستگاه مجازی مشابه با استفاده از دستور‌های زیر ساخته شده‌اند. من دستورهای DBCA را نیز اضافه کردم تا نمونه‌ی CDB1 را برای کامل بودن بسازد و حذف کند. در حقیقت کاربردی نداشتند.

# Empty local container (cdb1).

dbca -silent -createDatabase \

-templateName General_Purpose.dbc \

-gdbname cdb1 -sid cdb1 -responseFile NO_VALUE \

-characterSet AL32UTF8 \

-sysPassword OraPasswd1 \

-systemPassword OraPasswd1 \

-createAsContainerDatabase true \

-numberOfPDBs 1 \

-pdbName pdb1 \

-pdbAdminPassword OraPasswd1 \

-databaseType MULTIPURPOSE \

-automaticMemoryManagement false \

-totalMemory 2048 \

-storageType FS \

-datafileDestination “/u01/app/oracle/oradata/” \

-redoLogFileSize 50 \

-initParams encrypt_new_tablespaces=DDL \

-emConfiguration NONE \

-ignorePreReqs

# Remote container (cdb3) with PDB (pdb5).

dbca -silent -createDatabase \

-templateName General_Purpose.dbc \

-gdbname cdb3 -sid cdb3 -responseFile NO_VALUE \

-characterSet AL32UTF8 \

-sysPassword OraPasswd1 \

-systemPassword OraPasswd1 \

-createAsContainerDatabase true \

-numberOfPDBs 1 \

-pdbName pdb5 \

-pdbAdminPassword OraPasswd1 \

-databaseType MULTIPURPOSE \

-automaticMemoryManagement false \

-totalMemory 2048 \

-storageType FS \

-datafileDestination “/u01/app/oracle/oradata/” \

-redoLogFileSize 50 \

-initParams encrypt_new_tablespaces=DDL \

-emConfiguration NONE \

-ignorePreReqs

# Non-CDB instance (db12c).

dbca -silent -createDatabase \

-templateName General_Purpose.dbc \

-gdbname db12c -sid db12c -responseFile NO_VALUE \

-characterSet AL32UTF8 \

-sysPassword OraPasswd1 \

-systemPassword OraPasswd1 \

-createAsContainerDatabase false \

-databaseType MULTIPURPOSE \

-automaticMemoryManagement false \

-totalMemory 2048 \

-storageType FS \

-datafileDestination “/u01/app/oracle/oradata/” \

-redoLogFileSize 50 \

-initParams encrypt_new_tablespaces=DDL \

-emConfiguration NONE \

-ignorePreReqs

# Delete the instances.

#dbca -silent -deleteDatabase -sourceDB cdb1 -sysDBAUserName sys -sysDBAPassword OraPasswd1

dbca -silent -deleteDatabase -sourceDB cdb3 -sysDBAUserName sys -sysDBAPassword OraPasswd1

dbca -silent -deleteDatabase -sourceDB db12c -sysDBAUserName sys -sysDBAPassword OraPasswd1

همانطور که پیشتر توضیح داده شد در تمام موارد از Oracle Managed Files (OMF) استفاده شده است بنابراین نیازی به هرگونه تغییر نام نبود. همچنین، پایگاه‌داده‌های منبع به archivelog mode سوئیچ شده‌اند.

export ORAENV_ASK=NO

export ORACLE_SID=cdb3

. oraenv

export ORAENV_ASK=YES

sqlplus / as sysdba <<EOF

ALTER SYSTEM SET db_create_file_dest = ‘/u01/app/oracle/oradata’;

SHUTDOWN IMMEDIATE;

STARTUP MOUNT;

ALTER DATABASE ARCHIVELOG;

ALTER DATABASE OPEN;

ALTER PLUGGABLE DATABASE pdb5 OPEN;

ALTER PLUGGABLE DATABASE pdb5 SAVE STATE;

EXIT;

EOF

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *