zoukankan      html  css  js  c++  java
  • oracle 12C的新特性-CDB和PDB

    1.前言

    CDB与PDB是Oracle 12C引入的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为ContainerDatabase,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。
    关于CDB与PDB的关系图

    12c中 oracle引入了容器数据库 CDB(container database),和可插拔数据库 PDB(pluggable database)。oracle 将CDB看成一个容器,用来存放数据库。
    在CDB中可以有多个PDB,其中存在一个root根容器(PDB$ROOT)、一个种子容器(PDB$SEED)和多个PDBS。所有的PDB共用一个硬件系统资源、sga和pga、redo、临时段、控制文件、参数文件、还原段(还可对每个PDB单独指定)。

    PDB$ROOT:根容器用来做所有容器的跟,用来对每个PDB进行统一管理,sqlplus / as  sysdba连接进来默认是连接的根容器,需要切换到其他的PDB容器才可以对单独的PDB操作。其中有 system数据文件、sysaux数据文件、(undo数据文件、temp数据文件、redo、控制文件)。一般不存放生产数据文件

    PDB$SEED:种子容器作为插入PDB的模板而存在,每个CDB都有一个种子容器,且不可对其中对象进行修改。其中有 system数据文件、sysaux数据文件、其他数据文件。

    PDB:新插入容器,该容器用来存放数据库。其中有 system数据文件、sysaux数据文件、其他数据文件。12c中可以插入多个容器进行统一管理,来减少BDA的工作量。其中的数据库可以插入或拔出。

    用户:12c中PDB$ROOT中的普通目录可以通过权限分配来访问一个或多个指定的PDB容器,最大权限用户是sysdba。其中PDB也可单独创建普通用户来管理该容器的数据库。

    PDB资源管理:12c中将多个数据库运行在一个硬件资源上,CDB性能上得到优化。在CDB中为每个PDB确定使用CPU最低份额,CDB会按照一个PDB份额/分配的总份额数*100%,来保证PDB最低份额数。

    容器管理

    连接数据库

    [oracle@master ~]$ sqlplus / as sysdba

    查询该容器是CDB 还是非CDB

    SQL> select name,cdb,open_mode,con_id from v$database;
    
    NAME      CDB OPEN_MODE                CON_ID
    --------- --- -------------------- ----------
    ORCL      YES READ WRITE                    0

    查看当前容器

    SQL> show con_name;
    
    CON_NAME
    ------------------------------
    CDB$ROOT

    查看所创建的PDB

    SQL>  show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 PDBORCL                        MOUNTED

    创建一个新PDB

    SQL> create pluggable database pdb1 admin user pdb1 identified by pdb1 file_name_convert=('/u01/app/oracle/oradata/orcl/pdbseed/','/u01/app/oracle/oradata/orcl/pdb1/');
    
    Pluggable database created.
    
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 PDBORCL                        MOUNTED
             4 PDB1                           MOUNTED

    启动一个创建好的PDB

    SQL> alter pluggable database pdb1 open;
    
    Warning: PDB altered with errors.
    
    SQL> select message,time from pdb_plug_in_violations;
    
    MESSAGE
    --------------------------------------------------------------------------------
    TIME
    ---------------------------------------------------------------------------
    Sync PDB failed with ORA-959 during 'CREATE USER c##dm_ca IDENTIFIED BY * PROFIL
    E DEFAULT DEFAULT TABLESPACE casdb ACCOUNT UNLOCK container = all'
    26-DEC-18 11.26.27.070262 AM
    
    
    SQL> alter session set container=pdb1;
    
    Session altered.
    
    SQL> create tablespace users datafile '/u01/app/oracle/oradata/orcl/pdb1/users01.dbf' size 800M;
    
    Tablespace created.
    
    SQL> alter pluggable database pdb1 close;
    
    Pluggable database altered.
    
    SQL> alter pluggable database pdb1 open;
    
    Warning: PDB altered with errors.             #还是会报错,不知是何原因了,查看没有报错信息
    
    SQL> select message,time from pdb_plug_in_violations;
    
    no rows selected
    
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             4 PDB1                           READ WRITE YES

    也可以通过sqlplus使用传统的startup和shutdown命令来启动和关闭PDB

    SQL> alter session set container=pdb1;
    Session altered.
    SQL>
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             4 PDB1                           MOUNTED
    SQL> startup
    
    Warning: PDB altered with errors.
    
    Pluggable Database opened.
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             4 PDB1                           READ WRITE YES
    SQL> shutdown immediate;
    Pluggable Database closed.
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             4 PDB1                           MOUNTED
    SQL> alter session set container=CDB$ROOT;
    
    Session altered.

    配置监听文件

    监听文件目录在$ORACLE_HOME/network/admin

    [oracle@master admin]$ cat tnsnames.ora 
    # tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora
    # Generated by Oracle configuration tools.
    
    ORCL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = master)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl)
        )
      )
    
    PDBORCL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = master)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = PDBORCL)
        )
      )
    
    PDB1 =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = PDB1)
        )
      )
    listener.ora 文件内容
    [oracle@master admin]$ cat listener.ora 
    # listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/listener.ora
    # Generated by Oracle configuration tools.
    
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (GLOBAL_DBNAME = orcl)
          (ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
          (SID_NAME = ORCL)
        )
       (SID_DESC=
          (GLOBAL_DBNAME = PDB1)
          (SID_NAME = PDB1)
        ) ) LISTENER
    = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = master)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /u01/app/oracle

    测试一下

    [oracle@master admin]$ tnsping pdb1
    
    TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 26-DEC-2018 11:55:36
    
    Copyright (c) 1997, 2014, Oracle.  All rights reserved.
    
    Used parameter files:
    /u01/app/oracle/product/12.1.0/db_1/network/admin/sqlnet.ora
    
    
    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = PDB1)))
    OK (0 msec)

    连接pdb1

    方法一:
    [
    oracle@master admin]$ sqlplus sys/admin@pdb1 as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Wed Dec 26 14:23:22 2018 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> startup Warning: PDB altered with errors. Pluggable Database opened. SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 4 PDB1 READ WRITE YES SQL>
    方法二:
    [oracle@master ~]$ sqlplus pdb1/pdb1@pdb1

    SQL*Plus: Release 12.1.0.2.0 Production on Wed Dec 26 15:27:35 2018

    Copyright (c) 1982, 2014, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

    SQL>

    oracle12C中在启动数据库的时候,PDB并不会随着CDB而启动。不过我们可以通过创建一个触发器让PDB能够随CDB启动。如下:

    SQL> alter session set container=CDB$ROOT;
    
    Session altered.
    
    SQL> SHOW CON_NAME  
    
    CON_NAME
    ------------------------------
    CDB$ROOT
    SQL> CREATE OR REPLACE TRIGGER open_pdbs
       AFTER STARTUP ON DATABASE
       BEGIN
       EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN';
       END open_pdbs;
        /
    Trigger created.

    重新启动数据库:

    [oracle@master ~]$ sqlplus / as sysdba
    
    SQL*Plus: Release 12.1.0.2.0 Production on Wed Dec 26 14:32:11 2018
    
    Copyright (c) 1982, 2014, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
    
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 PDBORCL                        READ WRITE NO
             4 PDB1                           READ WRITE YES

    确实已经随着数据库启动,pdb1也启动起来。

    但是,RESTRICTED 为YES

    我重新创建一个pdb2

    SQL> show con_name;
    
    CON_NAME
    ------------------------------
    CDB$ROOT
    SQL> create pluggable database pdb2 admin user pdb2 identified by pdb2 file_name_convert=('/u01/app/oracle/oradata/orcl/pdbseed/','/u01/app/oracle/oradata/orcl/pdb2/');
    
    Pluggable database created.
    
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 PDBORCL                        READ WRITE NO
             4 PDB1                           READ WRITE YES
             5 PDB2                           MOUNTED
    SQL> alter pluggable database pdb2 open;
    
    Pluggable database altered.
    
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 PDBORCL                        READ WRITE NO
             4 PDB1                           READ WRITE YES
             5 PDB2                           READ WRITE NO

    pdb2完全正确。

    pdb1解决如下:

    SQL> select message from pdb_plug_in_violations where name='PDB1';
    
    MESSAGE
    --------------------------------------------------------------------------------
    Sync PDB failed with ORA-959 during 'CREATE USER c##dm_ca IDENTIFIED BY * PROFIL
    E DEFAULT DEFAULT TABLESPACE casdb ACCOUNT UNLOCK container = all'
    
    Sync PDB failed with ORA-1918 during 'drop user c##dm_ca cascade'
    
    SQL> alter session set container=PDB1;
    
    Session altered.
    
    SQL> select name from v$tablespace;
    
    NAME
    ------------------------------
    UNDOTBS1
    SYSTEM
    SYSAUX
    TEMP
    USERS
    
    SQL> create tablespace casdb datafile '/u01/app/oracle/oradata/orcl/pdb1/casdb01.dbf' size 800M;
    
    Tablespace created.
    
    SQL> conn / as sysdba
    Connected.
    
    SQL> alter pluggable database pdb1 close;
    
    Pluggable database altered.
    
    SQL>  alter pluggable database pdb1 open;
    
    Pluggable database altered.
    
    SQL> show pdbs;
    
        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 PDBORCL                        READ WRITE NO
             4 PDB1                           READ WRITE NO
             5 PDB2                           READ WRITE NO
    SQL> 
  • 相关阅读:
    c#两级菜单menu的动态实现
    单引号写入数据库,并结合写成函数和动静态类中方法对比小结
    google地图路径查询
    c# 图像旋转
    google地图简单
    asp.net gridview 添加属性
    linq to entity Oracle 执行存储过程或函数
    c# 判断非法字符
    c# 写入文件
    google map Inspecting DirectionsResults
  • 原文地址:https://www.cnblogs.com/hello-wei/p/10179313.html
Copyright © 2011-2022 走看看