多租户最佳实践和已知问题 (文档 ID 2047555.1)

适用于:

Oracle Database - Enterprise Edition - 版本 12.1.0.1 到 12.1.0.1 [发行版 12.1]
本文档所含信息适用于所有平台

用途

关于多租户选项的最佳实践以及一些常见问题。

详细信息

 1. 连接 Container 或者 Pluggable 实例时的 tnsnames

对于 pluggable 数据库来说,应当配置 tnsnames.ora,比如在 tnsnames.ora 中添加一个 tns 条目:

PDB_OMF_1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = MFarag-OEL)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = pdb_omf_1)
    )
  )

 另外也可以采用如下的简单连接语法:

 

SYS@mfarag-oel/PDB_OMF_1>CONN A/A@mfarag-oel/PDB_OMF_1
Connected.
A@mfarag-oel/PDB_OMF_1>conn xx/xx@mfarag-oel/XX
Connected.
XX@mfarag-oel/XX>

 

在 $ORACLE_HOME/sqlplus/admin 目录下的 glogin.sql 脚本里添加如下的条目:

 

set sqlprompt "_USER'@'_CONNECT_IDENTIFIER'>'"

 

2. 当 Container 是可插拔的情况下,总是采用 OMF(Oracle Managed Files)来管理 pluggable 数据库:

SYS@CDB>create pluggable database pdbomf admin user a identified by a ;

 

 CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdb_adm IDENTIFIED BY Password1 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/pdb2/');

 

请注意如果您没有使用 OMF,那么需要设置 FILE_NAME_CONVERT(filename_pattern,replacement_filename_pattern),如果您没有设置这些参数,那么数据库将首先采用 OMF 来生成文件名,如果您没有采用 OMF,那么数据库会使用PDB_FILE_NAME_CONVERT 初始化参数来生成文件名,如果该参数也没有设置,那么会发生错误。


 

SYS@CDB>select CON_ID,DBID,GUID,NAME,OPEN_MODE
    from V_$CONTAINERS ;

    CON_ID       DBID GUID
---------- ---------- --------------------------------
NAME                           OPEN_MODE
------------------------------ ----------
         1 1949193435 DD7C48AA5A4504A2E04325AAE80A403C
CDB$ROOT                       READ WRITE

         2 4075234582 EC25D0EC10347332E043CC8DAB0A7AE1
PDB$SEED                       READ ONLY

         3 3255612964 EC25E0FB670B76A8E043CC8DAB0A08D8
PDB                            READ WRITE


    CON_ID       DBID GUID
---------- ---------- --------------------------------
NAME                           OPEN_MODE
------------------------------ ----------
         4 3244820336 EC276A999A790163E043CC8DAB0AD357
PDBOMF                         MOUNTED

.
.
SYS@CDB>alter session set container=pdbomf ;

Session altered.

SYS@CDB>alter pluggable database open ;

Pluggable database altered.

 

 

3. 在需要修改 Pluggable 数据库的名字时,需要将其启动到 Restricted 模式

 

SYS@CDB>conn sys@pdb_omf_1 as sysdba
Enter password:                      
Connected.                           
       
SYS@pdb_omf_1>alter pluggable database close ;


SYS@pdb_omf_1>alter pluggable database open restricted;


SYS@pdb_omf_1>alter pluggable database pdbomf rename  global_name to pdb_omf_1 ;

 

 4. 插拔数据库:

SYS@CDB1>alter pluggable database y close immediate ;

SYS@CDB1>alter pluggable database y unplug into '/home/oracle/XDESC.xml' ;

SYS@CDB1>drop pluggable database y ;

SYS@CDB1>create pluggable database y using '/home/oracle/XDESC.xml' nocopy ;

  

 5. 一步启动 Pluggable 数据库:

 

SYS@CDB>select CON_ID,GUID,NAME,OPEN_MODE
    from V$containers;                  

    CON_ID GUID                             NAME
---------- -------------------------------- ------------------------------
OPEN_MODE                                                                 
----------                                                                
         1 DD7C48AA5A4504A2E04325AAE80A403C CDB$ROOT                      
READ WRITE                                                                

         2 EC25D0EC10347332E043CC8DAB0A7AE1 PDB$SEED
READ ONLY                                           

         3 EC2B4C003E221F09E0438636AF0AA57B X
MOUNTED                                      


    CON_ID GUID                             NAME
---------- -------------------------------- ------------------------------
OPEN_MODE                                                                 
----------                                                                
         4 EC276A999A790163E043CC8DAB0AD357 PDB_OMF_1                     
MOUNTED                                                                   


SYS@CDB>alter pluggable database all open ;


SYS@CDB>select CON_ID,GUID,NAME,OPEN_MODE
    from V$containers               
                         

    CON_ID GUID                             NAME
---------- -------------------------------- ------------------------------
OPEN_MODE
----------
         1 DD7C48AA5A4504A2E04325AAE80A403C CDB$ROOT
READ WRITE

         2 EC25D0EC10347332E043CC8DAB0A7AE1 PDB$SEED
READ ONLY

         3 EC2B4C003E221F09E0438636AF0AA57B X
READ WRITE


    CON_ID GUID                             NAME
---------- -------------------------------- ------------------------------
OPEN_MODE
----------
         4 EC276A999A790163E043CC8DAB0AD357 PDB_OMF_1
READ WRITE

 

 注意: 启动 CDB 时,默认会把所有的 PDB 置为 mount 状态。

6. 在运行一些脚本的时候,采用 catcon 这个 perl 脚本来选择特定数据库或者选择全部 pluggable 和 container 数据库:

例如: 运行 awrinfo 脚本来获取所有数据库中 sysaux 下 AWR 的使用情况

$cd $ORACLE_HOME/rdbms/admin

$ perl catcon.pl -u SYS -U SYS -d $ORACLE_HOME/rdbms/admin -l '/home/oracle'  -b catblock_output awrinfo.sql

--确认以上脚本是在所有的数据库上运行的:

$cd /home/oracle
$ grep -i "CURRENT CONTAINER" *
catblock_output0.log:==== Current Container = CDB$ROOT ====
catblock_output0.log:==== Current Container = PDB$SEED ====
catblock_output1.log:==== Current Container = XX ====
catblock_output2.log:==== Current Container = PDB_OMF_1 ====

  

注意:采用 -c 选项来指定该脚本在特定的数据库上运行。

7. 如何使用 non-seed 模板来创建 CDB + Pluggable 数据库:

 

$ dbca -silent -createDatabase -templateName Custom_DB_.dbt -gdbName FOFO -sid FOFO -createAsContainerDatabase true -numberOfPDBs 1 -pdbName pdb_silent  -sysPassword -systemPassword   -listeners listener
Enter PDBADMIN

 注意:以上命令采用 non-seed Custome_DB_ template 为模板静默创建名称为 FOFO 的 CDB 和一个名称为 pdb_silent 的 PDB。


8. 将"_datafile_write_errors_crash_instance"参数值修改为 FALSE

 

SQL>alter system set "_datafile_write_errors_crash_instance"=FALSE

 

**这样做的好处是可以在 PDB 由于某些原因丢失数据文件后,允许 CDB 继续运行。

注意: 只对 PDB 的非系统数据文件有效。

 

9. 如何检查一个参数是否已经在 PDB 中被修改过?

 

SYS@CDB>column PDB_NAME format a20
SYS@CDB>column NAME format a20
SYS@CDB>column VALUE$ format a20
SYS@CDB>select p.PDB_NAME,s.name,s.value$
        from cdb_pdbs p , pdb_spfile$ s
        where p.CON_UID=s.PDB_UID


PDB_NAME               NAME                 VALUE$
-------------------- -------------------- --------------------
XX                    cursor_sharing       'SIMILAR'
YY_NEW                cursor_sharing       'SIMILAR'

 

**注意: 不能通过 alertlog 来检查 PDB 初始化参数的非默认值。

 

 

参考

NOTE:1575186.1 - Syntax Error Encountered During The Creation Of A Pluggable Database
NOTE:1511619.1 - Oracle Multitenant Option - 12c : Frequently Asked Questions
NOTE:1516202.1 - How to Monitor Process Memory Usage on Pluggable Databases
请使用浏览器的分享功能分享到微信等