基於19C PDB建立方式彙總 標準化文件

sjw1933發表於2023-02-09

描述    

 

 

Creating from scratch

使用種子容器或應用程式種子的檔案在CDB中建立PDB。此技術將與種子容器關聯的檔案複製到新位置,並將複製的檔案與新的PDB關聯,這是預設的建立機

 

Cloning

透過克隆源PDB或非CDB建立PDB。源可以是本地CDB中的PDB,遠端CDB中的PDB,此技術將與源關聯的檔案複製到新位置,並將複製的檔案與新的PDB關聯。

 

Relocate a PDB to a different CDB

此技術是在最少停機時間或沒有停機時間的情況下移動 PDB 的最快方法。否則,拔出源 PDB 會導致 PDB 中斷,直到將 PDB 插入目標 CDB 為止。

該操作將與PDB關聯的檔案移動到新位置,將PDB新增到目標CDB,然後開啟PDB。

 

Plug an unplugged PDB into a CDB

透過使用描述PDB的XML後設資料檔案和與PDB關聯的檔案來建立PDB,以將其插入CDB。

 

 

 

 

從種子容器中建立pdb

描述

使用PDB $ SEED檔案在CDB根目錄中建立PDB,複製PDB$SEED檔案到新位置,並與新建PDB關聯。

 

建立

 

SQL>CREATE PLUGGABLE DATABASE salespdb 

ADMIN USER dbhang IDENTIFIED BY dbhang;

//

該方法必須為CDB 啟用了OMF ,或者PDB_FILE_NAME_CONVERT 設定了初始化引數,

否則會報錯:

ORA-65016: FILE_NAME_CONVERT must be specified

可以使用file_name_convert 引數指定.

也可以使用create_file_dest 引數指定

 

 

 

 

 

CDB 開啟OMF 功能

 

建立出來的檔案為OMF檔案管理格式:

SQL> alter session set container=testpdb;
Session altered.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/oracle/app/oradata/orcl/ORCL/AA2EA0F75BFC6CFBE053D8C7A8C01395/datafile/o1_mf_sy
stem_hjmx322m_.dbf
/oracle/app/oradata/orcl/ORCL/AA2EA0F75BFC6CFBE053D8C7A8C01395/datafile/o1_mf_sy
saux_hjmx322v_.dbf
/oracle/app/oradata/orcl/ORCL/AA2EA0F75BFC6CFBE053D8C7A8C01395/datafile/o1_mf_un
dotbs1_hjmx322w_.dbf

 


 

CDB 設定pdb_file_name_convert 引數

 

alter system set 

pdb_file_name_convert='/oracle/app/oradata/orcl/pdbseed','/oracle/app/oradata/orcl/testpdb';

目錄可以不存在,會自動建立。

 

建立時指定create_file_dest 引數

SQL>
CREATE PLUGGABLE DATABASE test2pdb 
ADMIN USER dbhang IDENTIFIED BY dbhang
create_file_dest='/oracle/app/oradata/orcl/test2pdb/';


 

 

Create_file_dest 位置必須事先被建立好,否則會報如下錯誤:

ERROR at line 1:

ORA-65165: missing or invalid path for file creation

/oracle/app/oradata/orcl/test2pdb/

ORA-01262: Stat failed on a file destination directory

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

 

建立PDB 時的子句選項

CREATE PLUGGABLE DATABASE salespdb   ADMIN USER salesadm IDENTIFIED BY password  STORAGE (MAXSIZE 2G)  DEFAULT TABLESPACE sales     DATAFILE '/disk1/oracle/dbs/salespdb/sales01.dbf' SIZE 250M     AUTOEXTEND ON    PATH_PREFIX = '/disk1/oracle/dbs/salespdb/'    FILE_NAME_CONVERT = ('/disk1/oracle/dbs/pdbseed/',                          '/disk1/oracle/dbs/salespdb/');

 

ADMIN USER: 建立用於執行管理任務的本地使用者

STORAGE MAXSIZE  可插拔資料庫可使用空間的最大值

DEFAULT :新建使用者的預設永久表空間:

DATAFILE :預設表空間資料檔案的路徑和名稱

PATH_PREFIX :設定可插拔資料庫新增的資料檔案必須儲存在該目錄或其子目錄中。

 

克隆現存的PDB

描述

三種方式:

克隆本地PDB

克隆遠端PDB

克隆遠端非CDB

 

克隆本地PDB

先連線根容器,然後將源PDB 切換為只讀模式:

SQL> alter pluggable database salespdb close;
Pluggable database altered.
SQL> alter pluggable database salespdb open read only;
Pluggable database altered.


 

如果CDB不在本地撤消模式下,則源PDB必須處於開啟的只讀模式。如果CDB處於本地撤消模式,則此要求不適用。

如果CDB不在ARCHIVELOG模式下,則源PDB必須處於只讀模式。如果CDB處於ARCHIVELOG模式,則此要求不適用。

 

建立:

SQL>
Create pluggable database salespdb from orclpdb  //from後無法接種子容器
file_name_convert = ('/oracle/app/oradata/orcl/orclpdb','/oracle/app/oradata/orcl/salespdb');


 

如果啟用Oracle託管檔案,或設定PDB_FILE_NAME_CONVERT初始化引數。

該FILE_NAME_CONVERT子句和該CREATE_FILE_DEST子句不是必需的。

 

克隆時,源PDB必須處於開啟狀態,不可為mount模式,

要麼read only 要麼為read write

ORA-65036: pluggable database ORCLPDB not open in required mode 

 

克隆遠端PDB

源CDB:

SQL> select con_id,name from v$containers;

    CON_ID NAME

---------- --------------------

         1 CDB$ROOT

         2 PDB$SEED

         3 ORCLPDB

         4 SALESPDB

 

 

在源CDB中建立DBlink連線使用者:

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

SQL> grant  CREATE PLUGGABLE DATABASE to c##byh 

SQL> grant create session,connect,resource,sysoper to c##byh

// 官方要求必須存在CREATE PLUGGABLE DATABASE許可權

 

 

在目的CDB中建立連線遠端PDB的DBLINK:

SQL> create database link salespdb
          connect to c##byh identified by byh
          using 'orcl2';
Database link created.

 

 

連線源CDB將PDB置為redo only狀態:

[oracle@server1 admin]$ sqlplus sys/oracle@orcl2 as sysdba
SQL> alter pluggable database salespdb close;
Pluggable database altered.
SQL> alter pluggable database salespdb open read only;
Pluggable database altered.


 

 

 

使用SYS使用者連線目的CDB,然後透過克隆遠端PDB,建立新的PDB:

[oracle@server1 admin]$ sqlplus / as sysdba
SQL>create pluggable database salespdb2
from salespdb@salespdb
file_name_convert = ('/oracle/app/oradata/orcl/salespdb','/oracle/app/oradata/orcl/salespdb2');
Pluggable database created.


 

遇到的錯誤:

錯誤1:

ERROR at line 1:

ORA-17628: Oracle error 1031 returned by remote Oracle server

ORA-01031: insufficient privileges

原因就是源PDB 使用者許可權不夠  注意CREATE PLUGGABLE DATABASE  以及sysoper 許可權

 

錯誤2:

// PDB 中建立使用者無法連線,使用DBLINK 遠端克隆時會報如下錯誤:

ORA-17627: ORA-01017: invalid username/password; logon denied

ORA-17629: Cannot connect to the remote database server

 

克隆非CDB

要求:

CDB 和非CDB 必須執行Oracle Database 12c 1 版(12.1.0.2 )或更高版本。

CDB 和非CDB 必須執行相同的Oracle 資料庫版本。

新建立的PDB 的資料塊大小必須與CDB 相匹配。

 

 

在源庫非CDB建立DBLINK連線使用者

SQL> select cdb from v$database;      

CDB

---

NO

 

SQL> create user byh identified by byh;

給使用者授予許可權:

SQL> grant  CREATE PLUGGABLE DATABASE to byh 

SQL> grant create session,connect,resource,sysoper to byh

 

建立DBlink:

SQL> create database link prod

          connect to byh identified by byh

          using 'prod';

Database link created.

 

源庫狀態:

SQL> select open_mode from v$database;

OPEN_MODE

--------------------

READ WRITE

 

如果非CDB處於NOARCHIVELOG模式下,則必須以只讀模式開啟它。如果非CDB處於ARCHIVELOG模式,則可以將其開啟為只讀或讀/寫狀態。

 

目標庫進行克隆

SQL>create pluggable database testpdb

from prod@prod

file_name_convert = ('/oracle/app/oradata/PROD/','/ora19c/app/oracle/oradata/ORA19C/ORA19C/testpdb/');

 

Pluggable database created.

 

'/oracle/app/oradata/PROD/'    非CDB資料庫的資料檔案存放路徑

'/ora19c/app/oracle/oradata/ORA19C/ORA19C/testpdb/'  目標庫新建PDB存放路徑

 

連線該PDB並執行指令碼:

SQL> alter session set container=testpdb;

Session altered.

 

必須執行該指令碼後才可開啟資料庫:

 SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

 

 

新建的PDB 是無法直接open read only 狀態開啟,必須需要先open read write 一次,將其與CDB 整合。

SQL> alter database open read only;

alter database open read only

*

ERROR at line 1:

ORA-65085: cannot open pluggable database in read-only mode

 

SQL> alter database open read write;

後續就可read only 開啟

 

插拔PDB

描述

     在將可插拔資料庫插入另一個CDB前,必須先將其從CDB中拔出。拔出是指使可插拔資料庫不再與CDB關聯,並生成一個描述可插拔資料庫已拔出狀態的XML檔案。將來使用這個XML檔案,可以將可插拔資料庫插入到另一個CDB中。

插拔遠端PDB

確定拔出的PDB

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

 

SQL> select con_id,name from v$containers;

    CON_ID NAME

---------- --------------------

         1 CDB$ROOT

         2 PDB$SEED

         3 ORCLPDB

         4 SALESPDB

 

拔出PDB 生成XML 檔案

SQL> alter pluggable database salespdb close immediate;

Pluggable database altered.

 

SQL> alter pluggable database salespdb unplug into '/home/oracle/salespdb.xml';

Pluggable database altered.

 

[oracle@server2 ~]$ ll salespdb.xml 

-rw-r--r-- 1 oracle oinstall 7336 Jul 12 23:31 salespdb.xml

XML 檔案複製到遠端CDB

將其複製到遠端的CDB 中,並將其插入

[oracle@server2 ~]$ scp salespdb.xml 192.168.199.216:/home/oracle/

[oracle@server1 ~]$ ls salespdb.xml 

salespdb.xml

 

插入前檢查相容性

在將可插拔資料庫插入CDB前,必須檢查可插拔資料庫與CDB之間的相容性。

DBMS_PDB 軟體包可以檢查這些相容性。

使用該軟體包檢查相容性時,你必須提供拔出可插拔資料庫時建立的XML檔案的名稱和儲存目錄。

 

set serveroutput on
declare
hold_var boolean;
begin
hold_var := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file=> '/home/oracle/salespdb.xml');
if hold_var then
dbms_output.put_line('YES');
else
dbms_output.put_line('NO');
end if;
end;
/
 
YES
PL/SQL procedure successfully completed.


 

如果這兩個資料庫之間沒有相容性問題,執行這段程式碼會輸出YES。如果存在相容性問題,執行這段程式碼會輸出NO。

查詢PDB_PLUG_IN_VIOLATIONS檢視,可以詳細瞭解它們不相容的原因。

 

PDB 的資料檔案打包複製

資料檔案打包:

SQL> alter session set container=salespdb;
Session altered.
 
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/oracle/app/oradata/orcl/salespdb/system01.dbf
/oracle/app/oradata/orcl/salespdb/sysaux01.dbf
/oracle/app/oradata/orcl/salespdb/undotbs01.dbf
/oracle/app/oradata/orcl/salespdb/users01.dbf
 
[oracle@server2 orcl]$ tar cvf salespdb.tar.gz salespdb/
[oracle@server2 orcl]$ scp salespdb.tar.gz 192.168.199.216:/oracle/app/oradata/orcl/
 
[oracle@server1 orcl]$ tar xf salespdb.tar.gz


 

在目的CDB 中插入PDB

[oracle@server1 ~]$ sqlplus / as sysdba
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
 
SQL>create pluggable database salespdb
using '/home/oracle/salespdb.xml'
Nocopy
Tempfile reuse;
Pluggable database created.
 
不指定nocopy:
ORA-65005: missing or invalid file name pattern for file -
/oracle/app/oradata/orcl/salespdb/system01.dbf
 
不指定TEMPFILE REUSE;
ERROR at line 1:
ORA-27038: created file already exists
ORA-01119: error in creating database file
'/oracle/app/oradata/orcl/salespdb/temp01.dbf'


 

插拔非CDB

SQL> alter session set container=testpdb;

Session altered.

 

必須執行該指令碼後才可開啟資料庫:

 SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

描述

Relocating a PDB  是 Oracle 在 12C 中推出的一種新的資料遷移方式,在採用 Relocate 時可以使用最短的停機時間在不同的CDB 之間直接遷移 PDB 。

Oracle 12.1  中 Relocate 遷移資料時,需要源庫處於 read only 狀態,但由於 12.2 中 local undo 的推出,可以實現完全線上遷移, 源庫的 PDB 在 read-write 模式下就可以 Relocate 到遠端 CDB 中, 源 PDB 中的 DML 事務不會受到任何影響

 

流程

確認重定位的PDB

源端:
SQL> show pdbs;
    CON_ID CON_NAME    OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED       READ ONLY  NO
         3 PDB1            READ WRITE NO
         4 PDB3            READ WRITE NO
         5 SALESPDB       MOUNTED
目標端:
SQL> show pdbs;
    CON_ID CON_NAME     OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED       READ ONLY  NO
         3 PDB1            MOUNTED
         6 SALESPDB       READ WRITE NO


 

需求:將PDB3 進行relocate 至目標端

建立DBLINK

在源端根容器下建立公有使用者:

SQL> create user c##byh identified by byh;
User created.
SQL> grant CREATE PLUGGABLE DATABASE to c##byh container=all;
SQL> grant create session,connect,resource,sysoper to c##byh container=all;
在目標端建立DBLINK:
SQL> 
create database link PDB3
connect to c##byh identified by byh
using 'orcl2';
 
在源端建立一個測試表:
SQL> create table test (id number);
Table created.
SQL> insert into test values(1);
1 row created.
SQL> commit;
Commit complete.


目標端relocate

目標端進行 relocate

SQL> 
CREATE PLUGGABLE DATABASE PDB3 FROM PDB3@PDB3 RELOCATE AVAILABILITY MAX;
ERROR at line 1: ORA-65016: FILE_NAME_CONVERT must be specified
SQL> CREATE PLUGGABLE DATABASE PDB3 FROM PDB3@PDB3 RELOCATE AVAILABILITY MAX FILE_NAME_CONVERT=('/oracle/app/oradata/orcl/pdb3','/oracle/app/oradata/orcl/pdb3')
Pluggable database created.


源端與目標端狀態對比

檢視源端PDB3 狀態:

SQL> show pdbs;
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
 
---------- ------------------------------ ---------- ----------
 
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
         4 PDB3                           READ WRITE NO
         5 SALESPDB                       MOUNTED


檢視目標端PDB3 狀態:

SQL> show pdbs;
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
 
---------- ------------------------------ ---------- ----------
 
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           MOUNTED
         4 PDB3                           MOUNTED
         6 SALESPDB                       READ WRITE NO


在源端再開啟一個事務:

SQL> create table test2 as select * from dba_objects;
Table created.
 
SQL> insert into test2 select * from test2;
72703 rows created.
 
SQL> /     
145406 rows created.
 
SQL> /
290812 rows created.
SQL> commit;
SQL> delete from test2;
SQL> commit;
Commit complete.
SQL> create table test3 as select * from dba_objects;
Table created.


目標端PDB 啟動

目標端啟動:

SQL> alter session set container=pdb3;

Session altered.

SQL> alter database open; alter database open 

* ERROR at line 1: ORA-65106: Pluggable database #4 (PDB3) is in an invalid state.

使用CDB 啟動:

SQL>alter pluggable database pdb3 open

源端與目標端狀態再次對比

在源端檢視PDB 的狀態:

SQL> show pdbs; 
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
 
---------- ------------------------------ ---------- ----------
 
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           MOUNTED
         4 PDB3                           MOUNTED
         5 SALESPDB                       MOUNTED
嘗試在源端開啟PDB3:
SQL> alter pluggable database pdb3 open;
alter pluggable database pdb3 open
*
ERROR at line 1:
ORA-65086: cannot open/close the pluggable database
目標端 PDB狀態:
SQL> show pdbs;        
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           MOUNTED
         4 PDB3                           READ WRITE NO
         6 SALESPDB                       READ WRITE NO
 
SQL> alter session set container=pdb3;
Session altered.
 
 
SQL> select count(*) from test2;
  COUNT(*)
     0
 
SQL> select count(*) from test3;
 
  COUNT(*)
     72704


總結

1 .在目標 PDB  執行“ create pluggable database  xxx relocate  ”完成後,源 CDB  和目標 CDB  會同時存在 2   Relocate PDB  ,此時目標 CDB  中該 PDB  處於 MOUNT  狀態,而源庫的 PDB  仍然處於 READ WRITE  狀態。當在目標 CDB  中的 PDB  執行 OPEN  時,源 PDB  會停止且 Oracle  會自動 KILL  掉源 PDB  連線的所有會話,並同步且應用源 PDB  的日誌到目標 PDB  ,同時也會回滾未提交的事務,應用完成後   PDB  庫的所有資料檔案將會自動刪除,源庫會被刪除**  ,目標 PDB  可以對外提供服務。

 

2.  PDB relocate  的基本實現方式 hot clone  和透過 dblink  的增量 redo apply  。線上 Pdb Relocate  需要在目標 CDB  中建立一個database link  指向源庫的 CDB  ,需要 DBLINK  使用的 common  使用者有 create pluggable database  的許可權, relocate  AVAILABILITY  (高用選項)有 normal|max|high  ,當目標庫使用 create pluggable database relocate  選項時,源庫會一直在 read-write open  狀態,甚至到 create pdb  的命令完成,源 PDB   READ-WRITE OPEN  )上的使用者 DML  事務都不會有任何影響。當目標庫的 CREATE PDB RELOCATE  完成時,會在源 CDB  和目標 CDB  存在 2   relocate   PDB  ,只不過在目標 CDB  中該 PDB   mount  狀態,此時源庫的 DML  生成的 redo  日誌會用作後期的 PDB  切換, PDB  的切換操作是在目標 CDB  中的 PDB open read-write  時,此時源 PDB  會暫停,並且 KILL  掉源 PDB  庫連線的會話,同步並應用源庫 PDB   redo  到目標 PDB  ,並且應用undo  資料回滾未提交的事務,當應用完成後源 pdb  庫的所有資料檔案將會自動刪除,目標 PDB  事務繼續,在這短暫的操作期間如果使用 AVAILABILITY  如果有新的連線請求, Oracle  可以跳過連線到新 PDB  上,實現了移動 PDB  的零停機。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23825935/viewspace-2934639/,如需轉載,請註明出處,否則將追究法律責任。

相關文章