oracle 19c建立非OMF檔案命名格式的PDB

wanglinghua0907發表於2024-01-17

問題描述

如果在CDB 最初建立時,啟用了OMF 檔案管理功能進行建立,那麼生成的所有檔案將會使用OMF 檔案命名格式,此時我們應該如何建立出非OMF 檔案命名格式的PDB 呢。

使用file_name_convert 包含全部資料檔案建立PDB

檢視種子容器

// 連線種子容器,檢視db_create_file_dest引數:

SQL> alter session set container=PDB$SEED;

Session altered.

 

SQL> show parameter  db_create_file_dest;

NAME                                     TYPE         VALUE

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

db_create_file_dest            string         +DATA_DISK

// 為OMF檔案管理

 

// 檢視種子容器資料檔案位置

SQL> select name from v$datafile;

NAME

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

+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.265.1044631095

+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.266.1044631095

+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.267.1044631095

 

克隆種子容器

連線至根容器,在根容器進行建立salespdb   

create pluggable database salespdb

admin user byh identified by oracle

file_name_convert = ('+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE',

'+DATA_DISK/ORCL/SALESPDB' );

 

// 如果使用OMF功能,就不需要file_name_convert引數,自動管理建立檔名稱以及位置

create pluggable database salespdb

admin user byh identified by oracle

 

//+DATA_DISK/ORCL/SALESPDB/ 該目錄需要事先被建立

ASMCMD> pwd

+DATA_DISK/ORCL

ASMCMD> mkdir SALESPDB

 

當種子容器的資料檔案檔名為OMF檔名格式,在我們不使用OMF功能建立PDB時,db_file_name_convert必須包含全部的資料檔案,否則會出現如下錯誤

 

create pluggable database salespdb

admin user byh identified by oracle

file_name_convert =('+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.265.1044631095',

'+DATA_DISK/ORCL/SALESPDB/system01.dbf','+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.266.1044631095','+DATA_DISK/ORCL/SALESPDB/sysaux01.dbf','+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.267.1044631095','+DATA_DISK/ORCL/SALESPDB/undotbs1.dbf', '+DATA_DISK/ORCL/A95D17FF830756CDE0539BEEA8C08D7A/TEMPFILE/temp.268.1044631129','+DATA_DISK/ORCL/SALESPDB/temp01.dbf')

 

注意在file_name_convert中加入臨時檔案(否則會出如下錯誤)

檢視新建立PDB 的資料檔案命名

 

SQL> alter session set container=salespdb;

Session altered.

SQL> show con_name;

CON_NAME

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

SALESPDB

SQL> show parameter db_create_file_dest;

NAME                                     TYPE         VALUE

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

db_create_file_dest          string         +DATA_DISK

 

SQL> select name from v$datafile;

NAME

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

+DATA_DISK/ORCL/SALESPDB/system01.dbf

+DATA_DISK/ORCL/SALESPDB/sysaux01.dbf

+DATA_DISK/ORCL/SALESPDB/undotbs1.dbf

 

的引數繼承

啟動新建立的PDB:

SQL> alter session set container=salespdb;

Session altered.

SQL> alter database open;

Database altered.

SQL> show con_name;

CON_NAME

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

SALESPDB

SQL> create tablespace bao;

Tablespace created.

SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='BAO';

FILE_NAME  TABLESPACE_NAME

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

+DATA_DISK BAO

/ORCL/A9AE

0C853DEE18

46E0539BEE

A8C03069/D

ATAFILE/ba

o.294.1044

980091

// 由於此時還沒有修改db_create_file_dest引數,那麼就依然可以使用OMF功能。

 

SQL> drop tablespace bao including contents and datafiles;

 

SQL> show parameter db_create_file_dest;

NAME                                     TYPE         VALUE

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

db_create_file_dest          string         +DATA_DISK

修改這個引數:

SQL> alter system set db_create_file_dest='';

System altered.

SQL> show parameter db_create_file_dest;

NAME                                     TYPE         VALUE

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

db_create_file_dest          string

 

//PDB 級別的引數修改僅在該PDB有效,不會影響其他PDB。

//PDB 級別的初始化引數不是儲存在SPFILE 中,而是儲存在 CDB 的資料字典 PDB_SPFILE$ 內部表中,該引數修改完成後,可以在根容器的pdb_spfile$中檢視

 

SQL> select pdb_uid,name,value$ from pdb_spfile$;  // 在CDB中檢視,在PDB中為空

   PDB_UID NAME                 VALUE$

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

3809949089 db_create_file_dest        ''

 

// 在CDB中檢視PDB_UID

SQL> select con_uid,pdb_name from cdb_pdbs;

   CON_UID PDB_NAME

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

2670145786 PDBBAO

1457981965 PDB$SEED

3809949089 SALESPDB

 

// 再次建立表空間

SQL> create tablespace bao;

create tablespace bao

                    *

ERROR at line 1:

ORA-02199: missing DATAFILE/TEMPFILE clause 

//OMF 管理功能已經關閉。

 

SQL> create tablespace bao datafile '+DATA_DISK/ORCL/SALESPDB/bao.dbf' size 50M;

Tablespace created.

 

結論

說明:

當我們的種子容器或者其他PDB檔案格式為OMF檔名格式,在我們不使用OMF功能建立PDB時,db_file_name_convert必須包含全部的資料檔案,因為是在ASM上。

根據種子容器生成的資料檔案(也就是說透過file_name_convert轉換出來的檔案)為非OMF檔名格式的檔案,但是建立出來的PDB,會繼承根容器的引數配置,根容器的db_create_file_dest引數是設定的,也就是說根容器啟動了OMF管理,新建立出來的PDB也就會繼承這個引數,也是開啟了OMF功能,但是克隆生成的system,sysaux,undo還有temp檔案,屬於非OMF管理生成的檔案(非OMF檔名格式的檔案),我們可以在PDB級別修改這個引數,來關閉OMF檔案管理功能,進而在PDB中建立資料檔案。

 

不指定所有的資料檔案建立PDB

方法描述

那麼如何才能不需要指定所有的資料檔案建立PDB呢

那麼我們就需要構造一個模版,將這個模版中的資料檔案(之前使用OMF功能建立的資料檔案)將其重新命名為非OMF檔名格式

然後再次建立PDB。


使用RMAN copy 資料檔案

CDB 操作:

//mount 狀態

SQL>shutdown immediate

SQL>startup mount

 

RMAN> copy datafile '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.265.1044631095' to '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.dbf';        

RMAN> copy datafile '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.266.1044631095' to '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.dbf';

RMAN> copy datafile '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.267.1044631095' to '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.dbf';

臨時檔案我們無法使用RMAN COPY 故採用作業系統cp命令

ASMCMD> cp TEMP.268.1044631129 TEMP01.dbf        

copying +DATA_DISK/ORCL/A95D17FF830756CDE0539BEEA8C08D7A/TEMPFILE/TEMP.268.1044631129 -> +DATA_DISK/ORCL/A95D17FF830756CDE0539BEEA8C08D7A/TEMPFILE/TEMP01.dbf

 

種子容器資料檔案重新命名

// 進入到PDB$SEED

SQL>alter session set container=PDB$SEED

 

SQL>alter pluggable database rename file '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.265.1044631095' to '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.dbf';

SQL>alter pluggable database rename file '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.266.1044631095' to '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.dbf';

SQL>alter pluggable database rename file '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.267.1044631095' to '+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.dbf';

SQL> alter pluggable database rename file '+DATA_DISK/ORCL/A95D17FF830756CDE0539BEEA8C08D7A/TEMPFILE/TEMP.268.1044631129' to '+DATA_DISK/ORCL/A95D17FF830756CDE0539BEEA8C08D7A/TEMPFILE/TEMP01.dbf'

 

// 重新命名完畢

SQL> select name from v$datafile;

NAME

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

+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.dbf

+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.dbf

+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.dbf

 

建立PDB

再次建立PDB

開啟CDB

SQL> alter database open;

SQL>

create pluggable database salespdb

admin user byh identified by oracle

file_name_convert =('+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE',

'+DATA_DISK/ORCL/SALESPDB','+DATA_DISK/ORCL/A95D17FF830756CDE0539BEEA8C08D7A/TEMPFILE','+DATA_DISK/ORCL/SALESPDB')

 

檢視新建PDB 的資料檔案命名格式

SQL> alter session set container=salespdb;

Session altered.

SQL> select name from v$datafile;

NAME

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

+DATA_DISK/ORCL/SALESPDB/system.dbf

+DATA_DISK/ORCL/SALESPDB/sysaux.dbf

+DATA_DISK/ORCL/SALESPDB/undotbs1.dbf

 

如果CDB關閉了OMF,再次進行建立時,不指定全部的資料檔案結果會如何:

SQL> alter pluggable database SALESPDB close immediate

SQL> drop pluggable database SALESPDB including datafiles

 

SQL> create pluggable database salespdb

admin user byh identified by oracle

file_name_convert =('+DATA_DISK/ORCL/86B637B62FE07A65E053F706E80A27CA/DATAFILE',

'+DATA_DISK/ORCL/SALESPDB')

// 看來之前使用OMF檔案管理功能建立出來的資料檔案(資料檔案命名格式為OMF),即使後面將OMF關閉,也不可以。

克隆現存PDB的方式也可以

[grid@rac1 ~]$ asmcmd

ASMCMD> cd DATA_DISK/

ASMCMD> cd ORCL

ASMCMD> mkdir SALESPDB2

 

create pluggable database salespdb2 from PDB$SEED

 

不可以將種子容器做為源 PDB 來克隆 PDB

根據現存的PDB建立PDB

create pluggable database salespdb2 from PDBBAO

file_name_convert =('+DATA_DISK/ORCL/A95D6F0AF6250D91E0539BEEA8C09172/DATAFILE/system.274.1044632559',

'+DATA_DISK/ORCL/SALESPDB2/system01.dbf','+DATA_DISK/ORCL/A95D6F0AF6250D91E0539BEEA8C09172/DATAFILE/sysaux.275.1044632559','+DATA_DISK/ORCL/SALESPDB2/sysaux01.dbf','+DATA_DISK/ORCL/A95D6F0AF6250D91E0539BEEA8C09172/DATAFILE/undotbs1.273.1044632557','+DATA_DISK/ORCL/SALESPDB2/undo01.dbf','+DATA_DISK/ORCL/A95D6F0AF6250D91E0539BEEA8C09172/DATAFILE/undo_2.277.1044632629','+DATA_DISK/ORCL/SALESPDB2/undo02.dbf'       

 ,'+DATA_DISK/ORCL/A95D6F0AF6250D91E0539BEEA8C09172/DATAFILE/users.278.1044632637','+DATA_DISK/ORCL/SALESPDB2/user01.dbf',

'+DATA_DISK/ORCL/A95D6F0AF6250D91E0539BEEA8C09172/TEMPFILE/temp.276.1044632567','+DATA_DISK/ORCL/SALESPDB2/temp01.dbf')

 

Pluggable database created.

 

SQL> alter session set container=salespdb2;

Session altered.

SQL> select name from v$datafile;

NAME

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

+DATA_DISK/ORCL/SALESPDB2/system01.dbf

+DATA_DISK/ORCL/SALESPDB2/sysaux01.dbf

+DATA_DISK/ORCL/SALESPDB2/undo01.dbf

+DATA_DISK/ORCL/SALESPDB2/undo02.dbf

+DATA_DISK/ORCL/SALESPDB2/user01.dbf

 


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

相關文章