基於19C PDB建立方式彙總 標準化文件
描述
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 19c CDB vs pdb 建立Oracle
- 1.3.2.2.1. 插拔方式建立PDB
- 基於LINUX7的21C單機 標準化實施文件Linux
- 1.3.2.2 Creation of a PDB by Plugging In(通過插入的方式建立PDB)
- 1.3.2.3. 透過Relocating方式建立PDB
- 1.3.2.1.2.1. 通過快照方式建立PDB
- 1.3.2.3. 通過Relocating方式建立PDB
- oracle 19c建立非OMF檔案命名格式的PDBOracle
- 1.3.2.1. 通過克隆Cloning方式建立PDB
- 基於oracle linux的 DBI/DBD 標準化安裝OracleLinux
- 12C關於CDB、PDB建立AWR的方法和總結
- 基於Xml 的IOC 容器-準備文件物件XML物件
- oracle 19c pdb遷移Oracle
- 基於Maven建立SpringBoot的2種方式MavenSpring Boot
- [譯] Android效能優化:APK瘦身方式大彙總Android優化APK
- Oracle 建立PDB-Plugging In an Unplugged PDBOracle
- Windows提權方式彙總Windows
- ORACLE RAC的全自動 打補丁標準化文件Oracle
- 基於Linux的oracle 12cR2 RAC 標準化安裝(一)LinuxOracle
- 基於Linux的oracle 12cR2 RAC 標準化安裝(二)LinuxOracle
- 基於Linux的oracle 12cR2 RAC 標準化安裝(三)LinuxOracle
- 基於Linux的oracle 12cR2 RAC 標準化安裝(四)LinuxOracle
- Java9 新特性彙總——基於 JDK11 程式碼彙總。。。更新中JavaJDK
- 【PDB】Oracle 建立pdb說明(create pluggable database)OracleDatabase
- 基於混合雲管理標準化模型,消除差異化與互操作性難題模型
- gateway官網文件解讀(六) 彙總Gateway
- 產品經理需要的文件彙總
- c語言指標彙總C語言指標
- GB標準文件爬蟲下載程式爬蟲
- Vue 元件命名,CSS的標準文件流Vue元件CSS
- 精準送達目標客戶——基於極光平臺優化Android通知優化Android
- Git Commit 標準化GitMIT
- **【求助】關於抽樣和標準化的問題**
- 【scikit-learn基礎】--『預處理』之 標準化
- 運維監控指標彙總運維指標
- 19c pdb如何儲存啟動狀態
- 1.3.2. 建立一個PDB
- 1.3.2.4 建立一個代理PDB