PLUGGABLE DATABASE

همانطور که می دانید تا قبل از اوراکل 12c، این امکان وجود داشت تا اطلاعات هر کاربر به صورت فیزیکی مستقل از دیگر کاربران ذخیره شود و نیز از نظر امنیتی این اطلاعات دور از دسترس دیگر کاربران قرار بگیرد و در صورت لزوم این قابلیت وجود داشت تا اطلاعات کاربر به بانک اطلاعاتی دیگری منتقل شود و از بانک جاری حذف شود به طور مثال ممکن بود از طریق Transportable Tablespace ، tablespace مربوط به کاربر را در صورت عدم وابستگی به دیگر tablespaceها، به بانک دیگری منتقل کرد ولی در عین حال ساختار موجود در نسخه های قبلی بسیار مستعد اختلاط بود و همه کاربران به یک data dictionary واحد وابسته بودند و همچنین انتقال بخشی از اطلاعات به بانک دیگر، با محدودیتهایی مواجه بود.

حال در اوراکل 12c، ویژگی جدیدی ارائه شد که نه تنها مشکلات مذکور را مرتفع می کند بلکه قابلیتهای جدیدی را هم به همراه دارد این ویژگی pluggable database(PDB) نام دارد.

 

 معماری این ویژگی به این صورت است که در ابتدا container ای با عنوان root container ایجاد می شود که وجود آن برای ادامه حیات بانک اطلاعاتی ضروری می باشد و اشیاها و متاداده های مربوط به اوراکل در این container نگهداری می شوند همچنین داده های کاربری در این Container ذخیره نمی شوند سپس container یا container های دیگری از نوع PDB(pluggable database) ایجاد می شوندکه قرار است اطلاعات کاربر در درون آن قرار بگیرد حال متناسب با نیاز، می توان pdbهای دیگری را هم به بانک اضافه کرد تعداد PDBها حداکثر می تواند به 253 برسد.

 

البته pdb به دو نوع application PDB و seed PDB قابل تقسیم است که application PDB حاوی اطلاعات کاربری می باشد و به ازای هر برنامه کاربردی، می توان از یک PDB مجزا استفاده کرد به طوری که هر کدام از این PDBها ساختار مستقلی از دیگری داشته باشند همچنین seed PDB یک template آماده می باشد که برای ساخت سریع PDB application به کار می رود.

نکته حائز اهمیت در این معماری، عدم امکان جابجایی برای ROOT container و قابلیت جابجایی پذیری برای PDB می باشد.

 

هر container دارایtablespace  system مخصوص به خود می باشد یعنیdata dictionaryای که اطلاعات و ساختار کلی بانک را نگهداری می کند از دیتا دیکشنری مربوط به اطلاعات کاربران مجزا می باشد. البته کاربران موجود در PDBها، قابلیت رویت متاداده غیرکاربری مربوط به خود را دارا می باشند به طور مثال، کاربر usef در PDB1، تنها می تواند اطلاعات datafile مربوط به pdb خود را در ویوی v$datafile ببیند(البته در صورت داشتن دسترسی) ولی امکان مشاهده اطلاعات دیگر containerها را به این شیوه نخواهد داشت.

SQL> select name from v$datafile;

+DATA01/USEF/DATAFILE/undotbs1.259.916159325

+DATA01/USEF/36A71C1B64C22204E055000000000001/DATAFILE/system.269.916159755

+DATA01/USEF/36A71C1B64C22204E055000000000001/DATAFILE/sysaux.270.916159755

+DATA01/USEF/36A71C1B64C22204E055000000000001/DATAFILE/users.272.916159853

در یک دسته بندی کلی می توان گفت:

  1. redo logوcontrol file بین همه containerها مشترک می باشند و به container خاصی اختصاص ندارند.

  2. rootcontainer حاوی TEMP tablespaceپیش فرض و UNDOها می باشد.

  3. هر یک از PDBها می توانند tempfile مختص به خود را داشته باشند که در زمان unplug باید حفظ شود.

  4. Applicationtablespaceها در درون PDBها موجود هستند.

انتقال و دسترسی اطلاعات بین pdbهای مختلف از طریق db-link قابل انجام خواهد بود.

برای گرفتن اطلاعات در مورد اشیاهای مختلف موجود در بانک، می توان از ویوهای دیکشنری در سطوح مختلف استفاده کرد که جامع ترین آمارها توسط ویوهایی ارائه می شود که با cdb_ شروع می شوند برای مثال برای دیدن همه ی اشیای کاربری متعلق به pdb_usef ، از طریق container root، می توان از دستور زیر استفاده کرد:

select owner,object_name from cdb_objects l where l.ORACLE_MAINTAINED=’N’ and l.SHARING=’NONE’ and l.CON_ID in (select CON_ID from cdb_pdbs ll where ll.PDB_NAME=’PDB_USEF’) ;

حال اگر به یکی از pdbها وصل شده باشیم می توانیم از ویوهای dba_، all_ و یا در نهایت user_ استفاده کنیم. فیلدی که در بیشتر ویوها اضافه شده است، CON_ID می باشد.

 

نکته 1: زمانی که pdbها در حالت close باشند، cdb_ اطلاعاتی در مورد اشیاهای آنها نشان نخواهد داد.

نکته 2: از مزایای ویژگی pluggable database می توان انتقال راحت داده، کاهش هزینه از بعد سخت افزاری، بهبود زمان ارتقا، مجزاسازی و در عین حال یکپارچه سازی اطلاعات و … را نام برد.

 

مدیریت pluggable database

در زمان ایجاد هر کدام از PDBها، سرویسی هم برای آن ایجاد می شود که برای اتصال به pdb می توان از آن استفاده کرد. برای مشاهده سرویسهای موجود در بانک اطلاعاتی، می توان از دستور زیر استفاده کرد:

select name,pdb from v$services order by 2;

در صورت لزوم می توان به pdb مورد نظر وصل شد و سپس سرویس جدیدی را ایجاد کرد:

sqlplus “sys/sys@salak_pdb as sysdba”

EXEC DBMS_SERVICE.CREATE_SERVICE(‘PDB1′,’PDB1’)

EXEC DBMS_SERVICE.START_SERVICE(‘PDB1’)

برای اتصال به یک pdb روشهای مختلفی قابل استفاده می باشد از جمله این طروق، می توان به موارد زیر اشاره کرد:

  • روش اتصال آسان(easy connect):

شکل کلی:

CONNECT username/password@net_service_name

مثالها:

sqlplus “sys/sys@192.168.232.10:1521/pdb1 as sysdba”

connect sys/sys@192.168.232.10:1521/pdb1 as sysdba;

  • روش tnsnames:

PDB1 =

  (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.232.10)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (service_name = pdb1) ) )

sqlplus “sys/sys@pdb1 as sysdba”

  • تغییر container در سطح session:

alter session set container=pdb1;

بعد از اتصال می توان از دستور زیر برای تعیین اسامی PDB و container استفاده کرد:

show pdbs

show con_name

همچنین در صورتی که از sqlplus برای اتصال به بانک استفاده می شود، می توان فایل glogin.sql مربوط به Sqlplus  را طوری تنظیم کرد تا همیشه اسم pdb مورد نظر در خط فرمان موجود باشد:

vi $ORACLE_HOME/sqlplus/admin/glogin.sql

define gname=idle

column global_name new_value gname

set heading off

set termout off

col global_name noprint

select upper(sys_context (‘userenv’, ‘con_name’) || ‘@’ || sys_context(‘userenv’, ‘db_name’)) global_name from dual;

set sqlprompt ‘&gname> ‘

set heading on

set termout on

حال در صورت ورود به sqlplus، خط فرمان به صورت زیر نشان داده می شود:

sqlplus “sys/sys@USEF_PDB as sysdba”

USEF_PDB@USEF>

به طور پیش فرض در هر زمانی که بانک اطلاعاتی restart می شود(در نسخه 12.1.0.1)، هیچ کدام از pdbها در حالت open قرار نمی گیرند و برای تغییر حالت آنها از mount به open، می توان از دستور زیر استفاده کرد:

alter pluggable database all open;

alter pluggable database pdb1,usef_cdb1 open;

همچنین برای close کردن آنها، از دستور زیر استفاده می شود:

alter pluggable database all close;

برای اینکه PDBها به صورت خودکار در حالت open قرار بگیرند، می توان از تریگر هم بهره گرفت:

CREATE OR REPLACE TRIGGER open_pdb

  AFTER STARTUP ON DATABASE

BEGIN

   EXECUTE IMMEDIATE ‘ALTER PLUGGABLE DATABASE ALL OPEN’;

END open_pdb;

/

دستور زیر pdb را در حالت فقط خواندنی قرار می دهد:

ALTER PLUGGABLE DATABASE usef_pdb OPEN READ ONLY;

دستور زیر pdb را در حالت خواندنی/نوشتنی باز می کند:

ALTER PLUGGABLE DATABASE ALL OPEN READ WRITE FORCE;

برای بستن همه PDBها به جز usef_pdb1,usef_pdb2 به صورت immediate از دستور زیر استفاده می شود:

ALTER PLUGGABLE DATABASE ALL EXCEPT usef_pfb1,usef_pdb2 CLOSE IMMEDIATE;

نام یک PDB را به روش زیر می توان تغییر داد:

sqlplus “sys/sys@USEF_PDB as sysdba”

SQL> alter pluggable database close immediate;

SQL> alter pluggable database open restricted;

SQL> alter pluggable database rename global_name to new_pdb1;

SQL> startup force;

 

حذف و ایجاد PDB:

ایجاد pdb به طروق مختلفی قابل انجام است که در اینجا به دو شیوه ساخت اشاره خواهیم کرد.

روش اول: با اتصال به CDB و وارد کردن دستور زیر، می توانیم PDBایی با اسم pdb_usef ایجاد کنیم:

CREATE PLUGGABLE DATABASE pdb_usef ADMIN USER usef IDENTIFIED BY a;

در این روش از PDB$SEED برای ایجاد PDB جدید استفاده می شود.

روش دوم: تکثیر(clone) از طریق یکی از pdbهای موجود، روش دیگری برای افزودن pdb جدید به بانک اطلاعاتی می باشد که در ادامه مراحل انجام آن آورده شده است:

ابتدا به PDB مورد نظر وصل می شویم و به صورت نمونه از یکی از جداول موجود در آن پرس و جویی می گیریم تا عملیات تکثیر برای ما روشن تر باشد:

sqlplus “sys/sys@pdb1 as sysdba”

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         4 PDB1                           READ WRITE NO

SQL> select count(*) from usef.tbl1;

    200000

سپس PDB مورد نظر را در وضیعت read only قرار می دهیم:

SQL>  alter pluggable database PDB1  open read only force;

Pluggable database altered.

برای نمایش فایلهایی که قرار است تکثیر شوند، از دستور زیر استفاده می کنیم:

SQL> select name from v$datafile;

NAME

——————————————————————————–

/u01/oracle/oradata/USEF_CDB/datafile/o1_mf_undotbs1_c87f0hmn_.dbf

/u01/oracle/oradata/USEF_CDB/pdb1/datafile/system01.dbf

/u01/oracle/oradata/USEF_CDB/pdb1/datafile/sysaux01.dbf

/u01/oracle/oradata/USEF_CDB/pdb1/datafile/users01.dbf

در نهایت به ROOT container متصل می شویم تا کلونینگ یا تکثیر را انجام دهیم:

sqlplus “/as sysdba”

create pluggable database pdb_clone from PDB1 file_name_convert=(‘/u01/oracle/oradata/USEF_CDB/pdb1/datafile’,’/u01/oracle/oradata/USEF_CDB/pdb_clone/datafile’);

حال PDB جدید را در لیست PDBها خواهیم دید:

SQL> show pdbs;             

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 USEF_CDB1                      MOUNTED

         4 PDB1                           READ ONLY  NO

         5 PDB_CLONE                      MOUNTED

PDB_CLONE را با دستور زیر باز می کنیم:

SQL> alter pluggable database PDB_CLONE open;

Pluggable database altered.

برای اتصال به این pdb، فایل tnsnames.ora را تنظیم می کنیم:

PDB_CLONE=

  (DESCRIPTION =  (ADDRESS = (PROTOCOL = TCP)(HOST = 10.45.109.5)(PORT = 1521))

      (CONNECT_DATA =

     (SERVER = DEDICATED)

      (service_name=PDB_CLONE)  )  )

در نهایت به PDB_CLONE متصل شده و با پرس و جو از جدول usef.tbl1، از صحت انجام کار مطمئن می شویم:

sqlplus “sys/sys@PDB_CLONE as sysdba”

SQL>  select count(*) from usef.tbl1;

  COUNT(*)

———-

    200000

برای حذف pluggable database از دستورات زیر استفاده می شود:

alter pluggable database pdb1 close;

drop pluggable database pdb1 including datafiles;

عبارت INCLUDING DATAFILES سبب حذف فایلهای مربوط به PDB می شود و KEEP DATAFILES مانع حذف دیتافایلها به صورت فیزیکی خواهد شد که می توان از آن برای برای اتصال مجدد استفاده کرد.

 

مدیریت کاربران در PDB:

در این مدل از بانک اطلاعاتی دو نوع user می توان ایجاد کرد که نوع اول آن، کاربر محلی(local user) می باشد که در یک PDB ایجاد می شود و در PDBهای دیگر اعتباری ندارد. هر کاربر محلی تنها می تواند اطلاعات PDB مربوط به خودش را ببیند(با توجه به میزان دسترسی کاربر) که این موضوع از لحاظ امنیتی، یک امتیاز محسوب می شود. نوع دیگر از user، کاربر عمومی(common user) می باشد که در سطح CDB ساخته می شود و می توان با استفاده از آن، pdbها را هم مدیریت کرد اسامی این نوع از کاربرها، با عبارت C## شروع می شوند. برای انجام کارهای مدیریتی از قبیل plug/unplug، باز و بسته کردن PDB و … باید به کاربر عمومی وصل شد.

ایجاد کاربر عمومی:

SQL> create user c##usef identified by usef;

User created.

اعطای مجوز به کاربر عمومی:

SQL> grant connect to c##usef container=all;

Grant succeeded.

عبارت CONTAINER=ALL سبب می شود تا این کاربر بتواند به همه pdbها connect شود.

نمایش لیست کاربران عمومی:

SQL>  col USERNAME format a30;

SQL> select con_id,username,common from cdb_users where username like’C##%’;

    CON_ID USERNAME                       COM

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

         1 C##usef                        YES

         4 C##usef                        YES

ایجاد کاربر محلی:

sqlplus “sys/sys@pdb1 as sysdba”

SQL> create user usef2 identified by usef2;

User created.

اعطای مجوز به کاربر محلی:

SQL> grant connect to usef2 ;

Grant succeeded.

نکته: تقسیم بندی مربوط به انواع کاربران، در مورد roleها هم صدق می کند یعنی دو نوع role به اسامی محلی و عمومی وجود دارد که role محلی در سطح هر PDB تعریف می شود و خارج از آن PDB ناشناخته می باشد و roleهای عمومی در سطح همه containerها شناخته شده هستند و تنها توسط کاربران عمومی درroot container قابل تعریف هستند.

دستورات ایجاد role:

create role c##glob_usef;

create role loc_usef;

اعطای مجوز به roleها:

in ROOT:

grant connect to  c##glob_usef;

in PDB:

grant connect to  loc_usef;

OR

grant c##glob_usef to loc_usef;

دستورات حذف user:

drop user  c##usef;

drop user usef2;

 

مدیریت tablespace در PDB

همانطور که قبلا اشاره شد، هر pdb شامل tablespace و datafileهای خاص به خود می باشد و مدیریت این tablespace ها و دیتافایلها، با ساختار قبلی اندکی تفاوت دارد در ادامه بعضی از دستورات مدیریت tablespace در سطح PDB آورده شده است:

برای ساخت tablespace مربوط به هر کدام از pdbها، باید به آن pdb وصل شد و سپس دستور ساخت را صادر کرد:

create tablespace usef_tbs1 datafile ‘+DATA01’ size 100m;

 برای تغییر tablespace پیش فرض یک pdb، می توان از دستور زیر استفاده کرد:

ALTER PLUGGABLE DATABASE DEFAULT TABLESPACE octbs;

همچنین می توان با دستور زیر، حجم حداکثر همه tablespaceها را به مقدار چهار گیگابایت تغییر داد:

ALTER PLUGGABLE DATABASE STORAGE (MAXSIZE 4G);

با دستور زیر این محدودیت حذف می شود:

ALTER PLUGGABLE DATABASE STORAGE (MAXSIZE unlimited);

البته این کار برای temp هم ممکن است حداکثر میزان فضایی که هر PDB می تواند از shared temporary tablespace استفاده کند:

ALTER PLUGGABLE DATABASE STORAGE (MAX_SHARED_TEMP_SIZE 50M);

تغییر اندازه یک datafile:

ALTER PLUGGABLE DATABASE PDB_USEF datafile  12 resize 500m;

offline کردن یک datafile:

ALTER PLUGGABLE DATABASE PDB_USEF datafile  15 offline ;

ایجاد یک temporary tablespace جدید برای یک PDB:

create TEMPORARY TABLESPACE ttt tempfile ‘+DATA01’ size 100m;

تغییر temp tablespace پیش فرض:

ALTER PLUGGABLE DATABASE DEFAULT TEMPORARY TABLESPACE ttt;

نکته: هر یک از PDBها را می توان به صورت مجزا در حالت begin backup قرار داد:

ALTER PLUGGABLE DATABASE PDB_USEF  begin backup;

 

پارامترها در CDB

در این محیط بعضی از پارامترها قابلیت تغییر در سطح pdb را دارند که این پارامترها را می توان با دستور زیر مشاهده کرد:

select  * from v$parameter where  ispdb_modifiable=’TRUE’

برای مثال می توان مقدار پارامتر open_cursors را در سطح یک pdb تغییر داد:

alter system set open_cursors=5000;

این تغییر در data dictionary باقی می ماند و با راه اندازی مجدد(restart) بانک، از بین نمی رود. حال با دستور زیر می توان مقدار این پارامتر را در سطوح مختلف ملاحظه کرد:

select VALUE, ISPDB_MODIFIABLE, CON_ID from V$SYSTEM_PARAMETER where name =’open_cursors’;

1000       TRUE       0

5000       TRUE       3

همچنین جدولی با اسم PDB_SPFILE$ در این زمینه وجود دارد که اطلاعات مربوط به پارامترهای مرتبط با pdbهای مختلف را نشان می دهد:

col container_name for a10

col parameter for a20

col value$ for a30

select container.name container_name, par.name PARAMETER, par.value$ from pdb_spfile$ par, v$containers container where par.pdb_uid = container.con_uid and par.name = ‘open_cursors’;

CONTAINER_ PARAMETER            VALUE$

———- ——————– ————

PDB_USEF   open_cursors         5000

همچنین می توان با اتصال به pdb مربوطه، مقدار پارامتر را در آن pdb ملاحظه کرد:

show parameter open_cursors

 

unplug/plug کردن pdb:

همانطور که قبلا اورده شد، یکی از مزیتهای استفاده از pluggable database راحتی در انفصال و اتصال pdbها از/به بانک می باشد. برای این کار، ابتدا باید pdb مورد نظر close شود:

show pdbs

alter pluggable database PDB1  close instances=all;

سپس با استفاده از دستور زیر، فایلی که حاوی اطلاعات متاداده می باشد، ساخته خواهد شد و می توان با استفاده از آن، دوباره این PDB را plug کرد.

alter pluggable database pdb1 unplug into ‘/u01/oracle/oradata/USEF_CDB/pdb1/datafile/pdb1.xml’;

Pluggable database altered.

به دو طریق plug، یک pdb قابل تصور می باشد plug به همان بانک قبلی و یا به بانک جدید. برای انتقال pdb به بانک جدید، می توانیم سناریوی زیر را طی کنیم:

SQL> Create pluggable database pdb1 using ‘/u01/oracle/oradata/USEF_CDB/pdb1/datafile/pdb1.xml’ nocopy;

Pluggable database created.

SQL>  alter pluggable database pdb1 open;

Pluggable database altered.

SQL> select count(*) from usef.tbl1;

    200000

 

انتقال از non-cdb به cdb:

برای انتقال بانک از non-cdb به حالت cdb، روشهای مختلفی وجود دارد از قبیل:

 expdp/impdp، TTS، استفاده از پکیج DBMS_PDB و replication

آسان ترین طریق انجام این کار، استفاده از پکیج DBMS_PDB می باشد و استفاده از Replication هم پیچیدگی کار را بیشتر خواهد کرد. در ادامه نحوه انجام این کار با استفاده از روش DBMS_PDB اورده شده است.

 

DBMS_PDB

برای استفاده از این روش، بانک اطلاعاتی باید در نسخه 12c قرار داشته باشد در این روش با استفاده از پروسیجر describe، یک فایل XML ایجاد می شود و در نهایت از طریق این فایل، می توان بانک اطلاعاتی را به صورت یک pdb به یک CDB متصل نمود. مراحل انجام این کار، به صورت زیر می باشد:

ابتدا بانک non-cdb را در حالت فقط خواندنی باز می کنیم تا کسی نتواند تغییرات جدیدی در بانک ایجاد کند.

در non-cdb

SQL> SHUTDOWN IMMEDIATE;

STARTUP OPEN READ ONLY;

متاداده مربوط به بانک را در یک فایل xml قرار می دهیم تا از آن برای ساخت pdb در بانک جدید استفاده کنیم این فایل شامل مشخصات دیتافایلها می باشد:

BEGIN

  DBMS_PDB.DESCRIBE(

    pdb_descr_file => ‘/u01/oracle/oradata/USEF_NONCDB/datafile/non-cdb.xml’);

END;

/

بعد از ایجاد فایل xml، بانک را shutdown می کنیم:

SHUTDOWN IMMEDIATE;

در cdb

به بانک cdb وصل می شویم و pdbای را با استفاده از فایل xml ایجاد می کنیم.

create pluggable database non_cdb as clone USING  ‘/u01/oracle/oradata/USEF_NONCDB/datafile/non-cdb.xml’ NOCOPY TEMPFILE REUSE;

همانطور که در قسمت زیر می بینید، بانک non-cdb به یکی از pdbهای یک بانک cdb تبدیل شده است.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 USEF_CDB1                      READ WRITE NO

         4 NON_CDB                        MOUNTED

برای اتصال به این pdb، فایل tnsnames.ora را تنظیم می کنیم.

NON_CDB =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = localhosts)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = NON_CDB)  ) )

 

برای حذف اطلاعاتی که در محیط PDB دیگر به آن نیازی نیست، باید ابتدا به pdb مورد نظر وصل شویم و سپس اسکریپت زیر را اجرا کنیم:

sqlplus “sys/sys@NON_CDB as sysdba”

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

حال pdb را در حالت open قرار می دهیم.

SQL> alter pluggable database non_cdb open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 USEF_CDB1                      READ WRITE NO

         4 NON_CDB                        READ WRITE NO

 

PDB و rman

در محیط CDB، به دلیل اینکه redo log بین همه PDBها مشترک می باشد، نمی توان archivelog را در سطح pdb فعال و غیرفعال کرد ولی این امکان وجود دارد تا در سطح PDB بکاپ گیری و بازیابی انجام شود این کار هم از طریق اتصال به CDB قابل انجام است و هم می توانیم با اتصال به یک PDB خاص به rman وصل شده و سپس بکاپ گیری را انجام دهیم.

دستورات مورد استفاده در نسخه های قبلی اعم از BACKUP DATABASE،  RESTORE DATABASE، DATABASE RECOVER در این محیط هم قابل استفاده می باشند و متناسب با نحوه ورود به RMAN، عملکرد خواهند داشت به طور مثال، اگر به RMAN به صورت زیر وارد شویم، تنها برای PDB1 بکاپ و ریکاوری انجام می شود:

rman target “sys/sys@pdb1”

در صورت ورود با دستور زیر، دامنه کاری RMAN برابر با CDB خواهد بود:

rman target /

برای اینکه از همه pdbها و ROOT container بکاپ گرفته شود، می توان از دستور قدیمی زیر استفاده کرد:

rman target /

BACKUP DATABASE;

حال اگر بکاپ ROOT به تنهایی مورد نیاز باشد، می توان از دستور زیر استفاده کرد:

rman target /

BACKUP PLUGGABLE DATABASE “CDB$ROOT”;

اگر بکاپ ROOT بعلاوه یک PDB خاص مورد نیاز باشد، می توان از دستور زیر استفاده کرد:

rman target /

BACKUP PLUGGABLE DATABASE “CDB$ROOT”, pdb1;

و اگر backup در سطح چند pdb خاص مورد نیاز باشد، دستور زیر مفید می باشد:

rman target /

BACKUP PLUGGABLE DATABASE usef_pdb,pdb1;

برای بازیابی هم می توان از دستور زیر استفاده کرد:

RECOVER PLUGGABLE DATABASE pdb1;

بکاپ گیری از یک tablespace مربوط به PDB1:

BACKUP TABLESPACE pdb1:users,pdb_usef:tbs1;

سناریوی زیر روال کاملتری از بکاپ گیری و بازیابی یک pdb را نشان می دهد.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         4 PDB1                                MOUNTED

rman target “sys/sys@pdb1”

RMAN> backup database format ‘/u01/oracle/usef_backup/%U.bkp’;

 

Starting backup at 31-DEC-15

input datafile file number=00012 name=/u01/oracle/oradata/USEF_CDB/pdb1/datafile/sysaux01.dbf

channel ORA_DISK_1: starting piece 1 at 31-DEC-15

input datafile file number=00011 name=/u01/oracle/oradata/USEF_CDB/pdb1/datafile/system01.dbf

channel ORA_DISK_2: starting piece 1 at 31-DEC-15

input datafile file number=00013 name=/u01/oracle/oradata/USEF_CDB/pdb1/datafile/users01.dbf

piece handle=/u01/oracle/usef_backup/0nqq7k9r_1_1.bkp tag=TAG20151231T200619 comment=NONE

channel ORA_DISK_3: backup set complete, elapsed time: 00:00:01

channel ORA_DISK_1: finished piece 1 at 31-DEC-15

piece handle=/u01/oracle/usef_backup/0lqq7k9r_1_1.bkp tag=TAG20151231T200619 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15

channel ORA_DISK_2: finished piece 1 at 31-DEC-15

piece handle=/u01/oracle/usef_backup/0mqq7k9r_1_1.bkp tag=TAG20151231T200619 comment=NONE

channel ORA_DISK_2: backup set complete, elapsed time: 00:00:15

Finished backup at 31-DEC-15

Starting Control File and SPFILE Autobackup at 31-DEC-15

piece handle=/u01/oracle/fast_recovery_area/USEF_NEW/autobackup/2015_12_31/o1_mf_s_899928394_c8bpdmob_.bkp comment=NONE

Finished Control File and SPFILE Autobackup at 31-DEC-15

در اینجا برای انجام تست ریکاوری، تمامی datafileهای مربوط به pdb1 را حذف می کنیم.

rm -rf /u01/oracle/oradata/USEF_CDB/pdb1/datafile/*

در ادامه pdb1 را بازیابی می کنیم.

shutdown abort

startup mount

rman target /

run{

 restore pluggable database PDB1;

recover pluggable database PDB1;

}

Starting restore at 31-DEC-15

channel ORA_DISK_1: restoring datafile 00013 to /u01/oracle/oradata/USEF_CDB/pdb1/datafile/users01.dbf

channel ORA_DISK_1: reading from backup piece /u01/oracle/usef_backup/0nqq7k9r_1_1.bkp

/u01/oracle/oradata/USEF_CDB/pdb1/datafile/system01.dbf

channel ORA_DISK_2: reading from backup piece /u01/oracle/usef_backup/0mqq7k9r_1_1.bkp

channel ORA_DISK_3: restoring datafile 00012 to /u01/oracle/oradata/USEF_CDB/pdb1/datafile/sysaux01.dbf

channel ORA_DISK_3: reading from backup piece /u01/oracle/usef_backup/0lqq7k9r_1_1.bkp

channel ORA_DISK_1: piece handle=/u01/oracle/usef_backup/0nqq7k9r_1_1.bkp tag=TAG20151231T200619

channel ORA_DISK_2: piece handle=/u01/oracle/usef_backup/0mqq7k9r_1_1.bkp tag=TAG20151231T200619

channel ORA_DISK_3: piece handle=/u01/oracle/usef_backup/0lqq7k9r_1_1.bkp tag=TAG20151231T200619

Finished restore at 31-DEC-15

starting media recovery

media recovery complete, elapsed time: 00:00:00

همانطور که می بینید، pdb1 به راحتی بازیابی شد و حال با دستور زیر، pdb1 را در حالت read write قرار می دهیم:

alter database open;

alter pluggable database PDB1 open;

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         4 PDB1                           READ WRITE NO

نکته 1: برای انتقال فایل به صورت سازگار، در سطح PDB هم می توان از begin backup استفاده کرد:

sqlplus “sys/sys@pdb_usef as sysdba”

alter pluggable database pdb_usef begin backup;

alter pluggable database pdb_usef end backup;

نکته 2: instance recovery در سطح CDB انجام می شود و در سطح PDB بی معناست.

shut abort

Tue Nov 15 11:15:37 2016

ALTER PLUGGABLE DATABASE CLOSE ABORT

Tue Nov 15 11:15:37 2016

Immediate Kill Session#: 305, Serial#: 27992

Immediate Kill Session: sess: 0x11a897930  OS pid: 23293

Immediate Kill Session#: 366, Serial#: 53643

Immediate Kill Session: sess: 0x11b76fed0  OS pid: 23278

ALTER SYSTEM: Flushing buffer cache inst=0 container=4 local

Pluggable database PDB_USEF closed

Completed: ALTER PLUGGABLE DATABASE CLOSE ABORT

startup

Tue Nov 15 11:16:04 2016

ALTER PLUGGABLE DATABASE  OPEN

Database Characterset for PDB_USEF is AR8MSWIN1256

Opening pdb PDB_USEF (4) with no Resource Manager plan active

Tue Nov 15 11:16:09 2016

Pluggable database PDB_USEF opened read write

Completed: ALTER PLUGGABLE DATABASE  OPEN

 

سناریوهای بازیابی در صورت خرابی فایلها:

  1. Temp File: از دست رفتن temp datafile در سطح CDB و PDB مسئله مهمی نیست و با راه اندازی مجدد instance، دوباره ایجاد می شود همچنین می توان آن را به صورت دستی ایجاد کرد.

create TEMPORARY TABLESPACE fff tempfile ‘/u01/oracle/temp01.dbf’ size 100m;

ALTER PLUGGABLE DATABASE DEFAULT TEMPORARY TABLESPACE fff;

rm -rf /u01/oracle/temp01.dbf

select * from source$ f,source$ g order by 1,2,3;

ERROR at line 1:

ORA-01116: error in opening database file 206

ORA-01110: data file 206: ‘/u01/oracle/temp01.dbf’

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

startup force   èPDB_USEF

diag_adl:Re-creating tempfile /u01/oracle/temp01.dbf

  1. Control File: سناریوی بازیابی کنترل فایل در این محیط شبیه به محیط non-CDB می باشد و pdb در این مورد نقشی ندارد:

RMAN> backup as copy current controlfile format ‘/u01/oracle/cont.ctl’;

rm -rf Current.260.916159377

RMAN> rman target /

RMAN> STARTUP NOMOUNT;

RMAN> restore controlfile to  ‘+DATA01/USEF/CONTROLFILE/current.260.916159377’  from ‘/u01/oracle/cont.ctl’;

channel ORA_DISK_1: copied control file copy

Finished restore at 15-NOV-16

RMAN> RECOVER DATABASE;

RMAN> ALTER DATABASE OPEN RESETLOGS;

  1. Redo Log File: سناریوی بازیابی redo log در این محیط شبیه به محیط non-CDB می باشد.

  2. Root SYSTEM : سناریوی بازیابی شبیه به بانک non-CDB می باشد و pdb در این مورد موثر نیست. در اینجا نیاز به down time در حد کل بانک الزامی می باشد.

rm -rf +DATA01/USEF/DATAFILE/system.257.916159259

RMAN> STARTUP MOUNT;

RMAN> RESTORE datafile 1;

Full restore complete of datafile 1 +DATA01/USEF/DATAFILE/system.257.927981743.  Elapsed time: 0:00:11

  checkpoint is 10326682

  last deallocation scn is 2858459

  Undo Optimization current scn is 368200

RMAN> recover datafile 1;

alter database open;

ALTER PLUGGABLE DATABASE ALL OPEN;

  1. Root SYSAUX: در این صورت تنها downtime در سطح sysaux tablespace خواهیم داشت:

rm -rf +DATA01/USEF/DATAFILE/sysaux.256.916159217

startup mount

alter database datafile 3 offline;

ALTER TABLESPACE sysaux OFFLINE IMMEDIATE;

RMAN> RESTORE TABLESPACE sysaux;

Full restore complete of datafile 3 +DATA01/USEF/DATAFILE/sysaux.256.927983875.  Elapsed time: 0:00:34

  checkpoint is 10528705

  last deallocation scn is 10321079

RMAN> RECOVER TABLESPACE sysaux;

ALTER TABLESPACE sysaux ONLINE;

  1. PDB SYSTEM: با از دست دادن دیتافایل system یکی از pdbها، CDB باز می شود و تنها pdb مربوطه در حالت mount باقی خواهد ماند:

rm -rf +DATA01/USEF/376BF99919E53E22E055000000000001/DATAFILE/system.277.917005283

startup force;

alter pluggable database all open;

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 PDB1                           READ WRITE NO

         4 PDB_USEF                       MOUNTED

برای رفع مشکل باید:

rman target sys/sys@pdb_usef

RMAN> RESTORE datafile 12;        

RMAN> recover database;

alter database open;

 

  1. PDB Non-SYSTEM: سناریوی بازیابی شبیه به بانک non-CDB می باشد.

 

flashback و PDB

flashback در محیط CDB در سطح کل بانک اعمال می شود و برای فعال کردن آن هم باید طریق سابق را طی نمود:

SHUTDOWN IMMEDIATE

 STARTUP MOUNT

alter system set db_recovery_file_dest_size=5g ;

alter system set db_recovery_file_dest=’/u01/oracle/flash’;

 ALTER SYSTEM SET  DB_FLASHBACK_RETENTION_TARGET=555;

 ALTER DATABASE FLASHBACK ON;

 ALTER DATABASE OPEN;

به مثال زیر توجه کنید:

ابتدا جدولی ایجاد می کنیم:

sqlplus “usef/abc@pdb_usef”

create table new as select name from v$datafile;

برای انجام تست نیاز داریم تا بدانیم current_scn چند می باشد:

select l.current_scn from v$database l;

   10838992

جدول ایجاد شده را حذف می کنیم:

drop table new;

عملیات flashback را روی بانک اطلاعاتی انجام می دهیم:

STARTUP MOUNT force;

FLASHBACK DATABASE TO SCN 10838992;

برای اطمینان از صحت کار، بانک را با دستور زیر باز می کنیم:

ALTER DATABASE OPEN READ ONLY;

ALTER PLUGGABLE DATABASE ALL OPEN READ ONLY;

بعد از حصول اطمینان، در نهایت بانک اطلاعاتی را برای اعمال تغییرات باز می کنیم:

alter database open resetlogs;

ALTER PLUGGABLE DATABASE ALL OPEN;

حال بررسی می کنیم تا ببینیم جدول محذوف بازیابی شده است یا خیر؟

select * from new;

+DATA01/USEF/DATAFILE/undotbs1.259.916159325

+DATA01/USEF/376BF99919E53E22E055000000000001/DATAFILE/system.277.927989403

+DATA01/USEF/376BF99919E53E22E055000000000001/DATAFILE/sysaux.279.917005289

+DATA01/USEF/376BF99919E53E22E055000000000001/DATAFILE/usef_tbs1.282.927896327

 

CDB و data guard

طریقه راه اندازی data gurad در محیط CDB همانند محیط non-CDB می باشد یعنی به همان شیوه سابق می توان از طریق duplicate برای کل بانک اطلاعاتی data guard پیاده سازی کرد. نمونه ای از logهای مربوط به ایجاد data guard را در ادامه خواهیم دید:

channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_AUX_DISK_1: restoring datafile 00001 to +DATA02

channel ORA_AUX_DISK_2: starting datafile backup set restore

channel ORA_AUX_DISK_2: using network backup set from service usef

channel ORA_AUX_DISK_2: specifying datafile(s) to restore from backup set

…..

channel ORA_AUX_DISK_2: restore complete, elapsed time: 00:00:40

…..

datafile 1 switched to datafile copy

input datafile copy RECID=13 STAMP=928145087 file name=+DATA02/SS/DATAFILE/system.260.928145019

در صورتی که در بانک اطلاعاتی pdb جدیدی ساخته شود، به صورت خودکار این pdb در data guard هم ایجاد می شود. فرض کنید در محیط primary با دستور زیر pdb جدیدی را ایجاد کردیم:

CREATE PLUGGABLE DATABASE pdb_usef ADMIN USER us IDENTIFIED BY usef;

حال با رجوع به log alert مربوط به data guard، نحوه ایجاد این pdb در محیط data guard را خواهیم دید:

Recovery created pluggable database PDB_USEF

Recovery copied files for tablespace SYSTEM

Recovery successfully copied file +DATA02/SS/417EF3C2D7971FC7E053049B200A354A/DATAFILE/system.289.928148081 from +DATA02/SS/4168D3E589657BC7E053049B200A4A00/DATAFILE/system.261.928145031

Successfully added datafile 12 to media recovery

Datafile #12: ‘+DATA02/SS/417EF3C2D7971FC7E053049B200A354A/DATAFILE/system.289.928148081’

Thu Nov 17 10:55:02 2016

Recovery copied files for tablespace SYSAUX

Recovery successfully copied file +DATA02/SS/417EF3C2D7971FC7E053049B200A354A/DATAFILE/sysaux.290.928148087 from +DATA02/SS/4168D3E589657BC7E053049B200A4A00/DATAFILE/sysaux.265.928145035

Thu Nov 17 10:55:02 2016

Successfully added datafile 13 to media recovery

Datafile #13: ‘+DATA02/SS/417EF3C2D7971FC7E053049B200A354A/DATAFILE/sysaux.290.928148087’

Media Recovery Waiting for thread 1 sequence 40 (in transit)

دستور زیر نشان می دهد که این pdb در محیط data guard هم اعمال شده است:

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 USEF_PDB                       READ ONLY  NO

         4 PDB_USEF                       MOUNTED

 

CDB و RAC

وضیعت هر یک از pdbها متناسب  با هر instance می تواند متفاوت باشد به طور مثال pdb1 می تواند در instance 1 در حالت open قرار بگیرد و در instance 2 در حالت mount قرار داشته باشد. برای دیدن وضیعت هر pdb در instanceهای مختلف، می توانیم از ویوی gv$pdbs استفاده کنیم:

SQL> select inst_id,name,open_mode from gv$pdbs where name =’USEF_PDB’;

  INST_ID NAME                           OPEN_MODE

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

         1 USEF_PDB                       MOUNTED

         2 USEF_PDB                       READ WRITE

برای باز شدن pdb به صورت خواندنی/نوشتنی در یک instance می توان از دستور زیر استفاده کرد:

ALTER PLUGGABLE DATABASE usef_pdb OPEN READ WRITE INSTANCES =(‘usef1’);

همچنین برای باز شدن pdb در همه instanceها باید:

alter pluggable database all open  instances=all;

برای افزودن سرویس برای یک pdb خاص، می توان از دستور زیر استفاده کرد:

srvctl add service -d usef -pdb usef_pdb -s p_srv -r usef1 -a usef2 -P BASIC

برای استارات این سرویس هم از دستور زیر استفاده می شود:

srvctl start service -d usef -s p_srv

حال بعد از تنظیم فایل tnanmaes.ora(که قبلا اورده شد)، از طریق این سرویس به pdb مربوطه متصل می شویم:

sqlplus “sys/sys@p_srv as sysdba”

با دستور زیر، می توان مشخص کرد که با این دستور، به کدام pdb متصل شده ایم:

SQL> select sys_context(‘userenv’,’con_name’) from dual;

USEF_PDB

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.