首頁  >  文章  >  資料庫  >  實例解析Oracle容器資料庫的安裝與使用

實例解析Oracle容器資料庫的安裝與使用

WBOY
WBOY轉載
2022-07-11 13:35:212792瀏覽

這篇文章為大家帶來了關於Oracle的相關知識,其中主要整理了容器資料庫的安裝和使用的相關問題,其中包括了Oracle容器資料庫基本知識、容器資料庫的安裝及使用和容器資料庫的創建等等內容,下面一起來看一下,希望對大家有幫助。

實例解析Oracle容器資料庫的安裝與使用

推薦教學:《Oracle影片教學

Oracle 19c的安裝與使用

Oracle容器資料庫基本知識

  容器資料庫,又稱為可插入資料庫,又可以稱為多租戶容器資料庫
  Oracle Multitenant Container Database(CDB)
  CDB是Oracle 12C引入的特性,指的是可以容納一個或多個可插拔資料庫的資料庫,這個特性允許在CDB容器資料庫中建立並且維護多個資料庫,在CDB中創建的資料庫稱為PDB,每個PDB在CDB中是相互獨立存在的,在單獨使用PDB時,與普通資料庫無任何區別
  CDB根容器資料庫的主要作用就是容納所有相關的PDB的元數據,以及在CDB中對所有的PDB進行管理。
  即容器被稱為CDB,容器裡的子資料庫稱為PDB。

容器資料庫的組成

實例解析Oracle容器資料庫的安裝與使用

2.1.1ROOT

  Root容器資料庫,是CDB環境中的根資料庫,在根資料庫中含有主資料字典視圖,其中包含了與Root容器有關的元資料和CDB中所包含的所有的PDB資訊。在CDB環境中被識別為CDB$ROOT,每個CDB環境中只能有一個Root容器資料庫

2.1.2CDB seed

  CDB seed為PDB的種子,其中提供了資料文件,在CDB環境中被標識為PDBSEED,**是創建新的PDB的模板**,你可以連接PDB           SE#ED ##「創#建PD##B #,P

#################################### D######B###############SEED,但是不能執行任何事物,因為PDB$SEED是###只讀的,不可進行修改###。 ######2.1.3PDBs######  PDB資料庫,在CDB環境中每個PDB都是獨立存在的,與傳統的Oracle資料庫基本無差別,每個PDB擁有自己的資料檔案和objects ,唯一的區別在於PDB可以插入到CDB中,以及在CDB中拔出,並且在任何一個時間點之上PDB必須拔出或者插入到一個CDB中,當用戶鏈接PDB時不會感覺到根容器和其他PDB的存在。 ###

2.1.4Application Containers

  Oracle在12cR2版本中,對容器功能進行了增強,在CDB root容器中可以還創建一個叫做Application root的容器,可在其內創建多個依賴於Application root的Application PDBs,架構圖如下:
實例解析Oracle容器資料庫的安裝與使用
簡單來說就是容器裡還能建立容器

根環境的用戶

  在先前的版本中,單一PDB可以有多個用戶,每個用戶又可以有自己的表空間,上升到CDB級別,用戶被分成了兩類:
公用使用者和本機使用者。

  • 公用用戶
    公用用戶是在root資料庫中和所有的PDB資料庫中都存在的用戶,公用用戶必須在根容器中創建,然後此用戶會在所有的現存的PDB中自動創建,公用使用者識別必須以c##或C##開頭,sys和system使用者是Oracle在CDB環境中自動建立的公用使用者。
  • 公用用戶
    本機用戶指的是在PDB中建立的普通用戶,只有在創建它的PDB中才會存在該用戶,且PDB中只能建立本機用戶。

另外值得一提的是,PDB中沒有先前預設的scott使用者了,需要我們重新建立。
還有,透過「sqlplus / as sysdba」登入連線的是CDB。 (重點)

容器資料庫的安裝及使用

安裝

記得先前的版本安裝時的第四步驟要取消勾選容器資料庫嗎
實例解析Oracle容器資料庫的安裝與使用
# 現在,我們只需勾選上即可建立為容器資料庫;

常用指令

在安裝好之後,開啟sqlplus,用管理員帳號登入
sqlplus / as sysdba

查看目前的容器

show con_name;

實例解析Oracle容器資料庫的安裝與使用
可以看到目前是根容器。

檢視資料庫是否為CDB

select name,cdb,open_mode,con_id from v$database;

實例解析Oracle容器資料庫的安裝與使用
Open_mode是讀寫權限

查看CDB中的PDB資訊

show pdbs;

實例解析Oracle容器資料庫的安裝與使用
# 可以看到裡面是種子和預設的PDB。

啟動和關閉已建立好的PDB資料庫

先將會話切換至想用的PDB。

alter session set container = orclpdb;

實例解析Oracle容器資料庫的安裝與使用
這裡有兩套指令
開啟:

alter pluggable database pdb1 open;

實例解析Oracle容器資料庫的安裝與使用
結束:

alter pluggable database pdb1 close;

實例解析Oracle容器資料庫的安裝與使用

實例解析Oracle容器資料庫的安裝與使用

實例解析Oracle容器資料庫的安裝與使用

  • # 傳統的shartup與shutdown 開啟:
shartup;
  • # 關閉:
  • shutdown immediate;
  • 這裡給出SHUTDOWN的幾個參數及意義
  • shutdown normal

    :shutdown的預設方式,a.不允許新的資料庫連接;b.只有當所有連接都斷開後才能關閉,效率較低

    shutdown immidiate###:shutdown的常用方式,a.不允許建立新連接;b.已經建立的連接,如果有未執行完的SQL語句,等待其完成,如果沒有立刻斷開;c.未提交交易全部回滾#########shutdown transactional###:使用率很低#########shutdown abort###:a.未提交交易不回滾;b.終止所有SQL操作;c.所有連線都斷開。資料庫關閉迅速,但是下一次開啟需要進行實例恢復,啟動慢;而且回滾段資料與資料檔案可能不一致。 #########CDB與PDB的切換###
    alter session set container=ORCLPDB; --PDBalter session set container=CDB$ROOT;--CDBshow con_name   --查看当前容器
    ###透過plsql使用######但是,我們日常使用時是用plsql的,這裡與我們平常使用的又有一點區別。 ###

    打开PDB

    首先,还是用管理员账户登录(此时数据库选项里是没有我们想用的PDB的)
    實例解析Oracle容器資料庫的安裝與使用
    打开一个命令窗口吗,看一下当前CDB里PDB的信息
    實例解析Oracle容器資料庫的安裝與使用
    實例解析Oracle容器資料庫的安裝與使用
    利用上面刚学的命令,切换会话,打开想用的PDB,自己做哦

    创建用户并授权

    上面说了,PDB里是没有我们所知道的Scott用户的,这里需要我们重新创建他

    create user scott identified by tiger;--给用户授予权限 grant connect,resource,dba to scott; --删除用户drop user truedata scott;

    创建表空间,为用户指定表空间及为用户授予权限都与以前的使用方式一样。

    配置

    想要用plsql登录PDB,我们需要更改一个配置文件
    實例解析Oracle容器資料庫的安裝與使用
    安装目录下的tnsnames.ora文件,复制里面的ORCL,更改名字即可
    實例解析Oracle容器資料庫的安裝與使用
    然后用plsql登录即可
    實例解析Oracle容器資料庫的安裝與使用
    单个PDB的使用,与我们日常所用的数据库并无区别

    如果连接可插拔数据库时出现:
    ORACLE 正在初始化或关闭。
    这个错误,参考我的博客:
    链接: PLSQL报ORA-01033: ORACLE正在初始化或关闭的解决方法
    或者可能是PDB没打开,参考3.2.4打开即可。

    容器数据库的创建

      PDB数据库的创建可以从现存的数据库中复制数据文件,包括种子容器、可插拔数据库、non-CDB数据库,创建时可以使用CREATE PLUGGABLE、RMAN、DBCA以及EM等。
      在12.1版本中在创建PDB时,Source PDB必须处于read only状态,在12.2版本中,因为undo local mode新特性的推出,在创建PDB时,Source PDB在read write状态,依然可以创建。
      另外在12.2版本中Oracle推出了refresh PDB特性,具有对Source PDB进行增量同步的功能。

    创建方式

    使用CREATE PLUGGABLE命令可以使用以下资源创建PDB:
    CDB seed (PDB$SEED)
    克隆已经存在的PDB
    Local PDB
    Remote PDB
    non-CDB数据库

    	如果把数据库从11g 升级到12c,或者在12c中创建的,就是NON CDB,那么这样的数据库就是普通的单实例,和12c 之前的数据库没有区别

    链接: Oracle 12c系列(七)| Non-CDB转换为PDB

    拔下的PDB

    使用DBCA可以使用以下资源创建PDB:
    DBCA也就是我们常用的数据库配置工具、图形化界面
    CDB seed (PDB$SEED)
    RMAN备份
    拔下的PDB
    示例:(这里只演示使用create pluggable database命令方式创建PDB)

    使用CDB seed创建PDB

    實例解析Oracle容器資料庫的安裝與使用

    1. 在SQL*Plus中输入CREATE PLUGGABLE DATABASE语句
      (这里创建为ypdb1的pdb,管理用户为ypdb1)
    CREATE PLUGGABLE DATABASE ypdb1 ADMIN USER ypdb1 IDENTIFIED BY oracle
    STORAGE (MAXSIZE 2G)DEFAULT TABLESPACE ypdb1
    DATAFILE '/u01/app/oracle/oradata/ora12c/ypdb1/ypdb01.dbf' SIZE 100M AUTOEXTEND ONPATH_PREFIX = '/u01/app/oracle/oradata/ora12c/ypdb1/'FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ora12c/pdbseed', '/u01/app/oracle/oradata/ora12c/ypdb1');

    實例解析Oracle容器資料庫的安裝與使用

    1. 语句执行完毕之后查看创建完成的PDB:
    sys. ora12c>show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED---------- ------------------------------ ---------- ----------
     2 PDB$SEED                       READ ONLY  NO
     3 YPDB1                          MOUNTED

    克隆已经存在的PDB

    这种方式可以通过使用当前CDB中的其他PDB,以及复制远端CDB中的PDB,还可以复制non-CDB数据库创建成PDB。

    Clone a Local PDB
    在Clone本地PDB时需要注意一下几点:
    使用的用户必须拥有’CREATE PLUGGABLE DATABASE’的权限(测试里使用sys用户)
    源PDB不可以是关闭状态
    如果CDB为shared undo,PDB必须为READ-ONLY状态
    如果CDB不是归档模式,那么PDB必须为READ-ONLY状态

    	(说明:如果是Oracle Database 版本为12.1,那么PDB只能为READ-ONLY状态,因在12.1中undo模式,还只能选择shared undo。)
    sys. ora12c>show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED---------- ------------------------------ ---------- ----------
     2 PDB$SEED                       READ ONLY  NO
     3 YPDB1                          READ WRITE NOsys. ora12c>

    这里使用YPDB1做为源PDB,创建的PDB为YPDB2。
    (1) 检查是否为shared undo模式

    COL PROPERTY_NAME FOR A30
    COL PROPERTY_VALUE FOR A30SELECT property_name, property_valueFROM database_propertiesWHERE property_name='LOCAL_UNDO_ENABLED';PROPERTY_NAME                  PROPERTY_VALUE------------------------------ ------------------------------LOCAL_UNDO_ENABLED             TRUE

    (2) 检查是否未archivelog模式

    sys. ora12c>ARCHIVE LOG LISTDatabase log mode              Archive ModeAutomatic archival             Enabled
    Archive destination            /u01/app/oracle/recovery/ora12c/arch
    Oldest online log sequence     21Next log sequence to archive   23Current log sequence           23sys. ora12c>

    (3) 创建验证数据

    zhaoweiqing. ypdb1>CONN /AS SYSDBA
    Connected.sys. ora12c>conn zhaoweiqing/zhaoweiqing@ypdb1Connected.zhaoweiqing. ypdb1>SELECT COUNT(*) FROM t;COUNT(*)----------22198Elapsed: 00:00:00.01zhaoweiqing. ypdb1>

    (4) 执行CREATE PLUGGABLE DATABASE语句(这里使用sys用户连接根容器)

    CREATE PLUGGABLE DATABASE ypdb2 FROM ypdb1
    PATH_PREFIX = '/u01/app/oracle/oradata/ora12c/ypdb2/'FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ora12c/ypdb1/', '/u01/app/oracle/oradata/ora12c/ypdb2/')SERVICE_NAME_CONVERT = ('ypdb1t','ypdb2t');

    (5) 查看创建完成的YPDB2

    sys. ora12c>show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED---------- ------------------------------ ---------- ----------
     2 PDB$SEED                       READ ONLY  NO
     3 YPDB1                          READ WRITE NO
     4 YPDB2                          MOUNTED
    sys. ora12c>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;PDB_ID PDB_NAME                CON_UID STATUS     CREATION_SCN     CON_ID---------- -------------------- ---------- ---------- ------------ ----------
     2 PDB$SEED             1453953285 NORMAL              213          2
     3 YPDB1                2376019304 NORMAL           697945          3
     4 YPDB2                3908707960 NEW              707501          4Elapsed: 00:00:00.02sys. ora12c>

    (6) 检查数据文件

    sys. ora12c>ALTER PLUGGABLE DATABASE YPDB2 OPEN;Pluggable database altered.Elapsed: 00:00:14.02sys. ora12c>SELECT con_id, tablespace_name, file_name FROM cdb_data_files WHERE con_id=4;CON_ID TABLESP FILE_NAME------ ------- ---------------------------------------------------------4 SYSTEM  /u01/app/oracle/oradata/ora12c/ypdb2/system01.dbf4 SYSAUX  /u01/app/oracle/oradata/ora12c/ypdb2/sysaux01.dbf4 DEFTBS  /u01/app/oracle/oradata/ora12c/ypdb2/deftbs01.dbf4 USERTBS /u01/app/oracle/oradata/ora12c/ypdb2/usertbs01.dbf4 UNDO_1  /u01/app/oracle/oradata/ora12c/ypdb2/system01_i1_undo.dbf4 YPDB1   /u01/app/oracle/oradata/ora12c/ypdb2/ypdb01.dbf6 rows selected.Elapsed: 00:00:00.01sys. ora12c>

    (7) 检查service_name

    sys. ora12c>SELECT service_id, name, network_name, enabled, pdb, con_id FROM cdb_services;SERVICE_ID NAME                NETWORK_NAME         ENA PDB           CON_ID---------- ------------------- -------------------- --- --------- ----------
     1 SYS$BACKGROUND                           NO  CDB$ROOT           1
     2 SYS$USERS                                NO  CDB$ROOT           1
     3 ora12c.linux.com    ora12c.linux.com     NO  CDB$ROOT           1
     6 ypdb1.linux.com     ypdb1.linux.com      NO  YPDB1              3
     1 ypdb1t              ypdb1t               NO  YPDB1              3
     1 ypdb2t              ypdb2t               NO  YPDB2              4
     2 ypdb2.linux.com     ypdb2.linux.com      NO  YPDB2              47 rows selected.Elapsed: 00:00:00.00sys. ora12c>

    源PDB中的service_name已经被更改指定的service_name.

    (8) 检查验证数据

    sys. ora12c>conn zhaoweiqing/zhaoweiqing@ypdb2Connected.zhaoweiqing. ypdb2>SELECT COUNT(*) FROM t;COUNT(*)----------22198Elapsed: 00:00:00.11zhaoweiqing. ypdb2>

    克隆远程PDB

    實例解析Oracle容器資料庫的安裝與使用
    Clone远端PDB时需要注意以下几点:

    如果PDB被Clone到的CDB的字符集不是AL32UTF8,那么源与目标字符集必须兼容。

    源端与目标端的字节顺序必须相同。

    连接的用户在CDB中必须拥有’CREATE PLUGGABLE DATABASE’的权限。

    源PDB不可以是关闭状态。

    如果远端CDB为shared undo,源PDB必须为READ-ONLY状态。

    如果远端CDB不是归档模式,源PDB必须为READ-ONLY状态。

    这里测试将win平台ORA12CW中的PDB(ORA12CWPDB)复制到Linux的,目标PDB为PDB2。

    (1) 查看源端与目标的字符集

    col parameter for a30
    col value for a30select * from nls_database_parameters where parameter='NLS_CHARACTERSET'or parameter='NLS_LANGUAGE' or parameter='NLS_NCHAR_CHARACTERSET';```**(2) 查看源端与目标端字节顺序**
    
    ```sqlcol platform_name for a40SELECT d.inst_id, t.platform_id, t.platform_name, t.endian_format, d.name FROM v$transportable_platform t, gv$database dWHERE t.platform_name = d.platform_name;

    (3) 查看源端归档模式

    archive log list

    (4) 查看源端undo模式

    SELECT property_name, property_valueFROM database_propertiesWHERE property_name='LOCAL_UNDO_ENABLED';

    (5) 目标端创建dblink

    CREATE DATABASE LINK ora12cw CONNECT TO system IDENTIFIED BY oracle USING 'ORA12CW';

    (6) 运行CREATE PLUGGABLE DATABASE语句进行复制PDB

    CREATE PLUGGABLE DATABASE pdb2 FROM ORA12CWPDB@ora12cwPATH_PREFIX = '/u01/app/oracle/oradata/ora12cl/pdb2/'FILE_NAME_CONVERT = ('D:\U01\APP\ORACLE\ORADATA\ORA12CW\ORA12CWPDB\', '/u01/app/oracle/oradata/ora12cl/pdb2/');

    (7) 创建完成后目标端查看PDB2

    sys. ora12cl>show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED---------- ------------------------------ ---------- ----------
     2 PDB$SEED                       READ ONLY  NO
     4 PDB2                           MOUNTED 5 PDB1                           MOUNTED
    sys. ora12cl>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;PDB_ID PDB_NAME                CON_UID STATUS     CREATION_SCN     CON_ID---------- -------------------- ---------- ---------- ------------ ----------
     2 PDB$SEED             3409233005 NORMAL          1408788          2
     4 PDB2                 2218727525 NEW             1824437          4
     5 PDB1                 1058019921 NORMAL          1535445          5Elapsed: 00:00:00.00sys. ora12cl>

    (8) 目标查看数据文件

    sys. ora12cl>alter pluggable database pdb2 open;Pluggable database altered.Elapsed: 00:00:14.02sys. ora12cl>SELECT con_id, tablespace_name, file_name FROM cdb_data_files WHERE con_id=4;CON_ID TABLESPACE_NAME FILE_NAME------ --------------- --------------------------------------------------4 SYSTEM          /u01/app/oracle/oradata/ora12cl/pdb2/SYSTEM01.DBF4 SYSAUX          /u01/app/oracle/oradata/ora12cl/pdb2/SYSAUX01.DBF4 UNDOTBS1        /u01/app/oracle/oradata/ora12cl/pdb2/UNDOTBS01.DBF4 USERS           /u01/app/oracle/oradata/ora12cl/pdb2/USERS01.DBF
    Elapsed: 00:00:00.00sys. ora12cl>

    克隆远端的PDB成功。

    克隆本地PDB

    在克隆已有的PDB或者non CDB时,我们也可以将克隆语句中加入NO DATA子句,在使用NO DATA子句时,仅仅会克隆源PDB中的模型定义,并不会克隆PDB中的数据。(Oracle数据库内自动创建的schemas下的对象会被成功克隆,而用户创建的schemas下的对象仅仅会克隆对象的定义结构)。

    测试克隆本地PDB时使用no data子句

    这里将WOQUPDB克隆为PDBTEST.

    (1)源PDB

    sys. woqu>show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED---------- ------------------------------ ---------- ----------
     2 PDB$SEED                       READ ONLY  NO
     3 WOQUPDB                        READ WRITE NOsys. woqu>COL PROPERTY_NAME FOR A30
    sys. woqu>COL PROPERTY_VALUE FOR A30
    sys. woqu>

    (2)检查UNDO模式及归档模式

    sys. woqu>SELECT property_name, property_value2  FROM database_properties3  WHERE property_name='LOCAL_UNDO_ENABLED';PROPERTY_NAME                  PROPERTY_VALUE------------------------------ ------------------------------LOCAL_UNDO_ENABLED             TRUEElapsed: 00:00:00.04sys. woqu>sys. woqu>archive log listDatabase log mode              Archive ModeAutomatic archival             Enabled
    Archive destination            USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence     7Next log sequence to archive   9Current log sequence           9sys. woqu>

    (3)创建测试数据表t,注意这里的t表位于sys用户下

    05:51:10 sys. woqupdb>create table t as select * from dba_objects where rownumselect count(*) from t;COUNT(*)----------10Elapsed: 00:00:00.0105:52:50 sys. woqupdb>

    表t中共有10条数据。
    (4)创建测试数据表t_tab,注意这里的t表位于zhaoweiqing用户下

    05:51:46 zhaoweiqing. woqupdb>create table t_tab as select * from dba_objects where rownumselect count(*) from t_tab;COUNT(*)----------999Elapsed: 00:00:00.0105:52:19 zhaoweiqing. woqupdb>

    (5)使用create pluggable database + NO DATA子句创建pdb:pdbtest

    sys. woqu>CREATE PLUGGABLE DATABASE pdbtest FROM woqupdb NO DATA2  PATH_PREFIX = '/u01/app/oracle/oradata/woqu/pdbtest'3  FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/woqu/woqupdb', '/u01/app/oracle/oradata/woqu/pdbtest');Pluggable database created.Elapsed: 00:00:09.35sys. woqu>

    (6)检查克隆完成的pdbtest

    sys. woqu>show pdbs
    CON_ID CON_NAME    OPEN MODE  RESTRICTED---------- ----------- ---------- ----------
     2 PDB$SEED    READ ONLY  NO
     3 WOQUPDB     READ WRITE NO
     5 PDBTEST     MOUNTED
    sys. woqu>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;PDB_ID PDB_NAME       CON_UID STATUS     CREATION_SCN     CON_ID---------- ----------- ---------- ---------- ------------ ----------
     3 WOQUPDB     1167267009 NORMAL          1443334          3
     2 PDB$SEED     399989944 NORMAL          1408751          2
     5 PDBTEST     3356573055 NEW             1956581          5Elapsed: 00:00:00.05sys. woqu>alter pluggable database pdbtest open;Pluggable database altered.Elapsed: 00:00:07.09sys. woqu>show pdbs
    CON_ID CON_NAME    OPEN MODE  RESTRICTED---------- ----------- ---------- ----------
     2 PDB$SEED    READ ONLY  NO
     3 WOQUPDB     READ WRITE NO
     5 PDBTEST     READ WRITE NOsys. woqu>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;PDB_ID PDB_NAME     CON_UID STATUS CREATION_SCN     CON_ID---------- --------- ---------- ------ ------------ ----------
     3 WOQUPDB   1167267009 NORMAL      1443334          3
     2 PDB$SEED   399989944 NORMAL      1408751          2
     5 PDBTEST   3356573055 NORMAL      1956581          5Elapsed: 00:00:00.02sys. woqu>

    (7)查看测试数据

    sys. woqu>alter session set container=pdbtest;Session altered.Elapsed: 00:00:00.07sys. woqu>show user con_idUSER is "SYS"CON_ID------------------------------5sys. woqu>select count(*) from t;COUNT(*)----------10Elapsed: 00:00:00.00sys. woqu>select count(*) from zhaoweiqing.t_tab;COUNT(*)----------
     0Elapsed: 00:00:00.02sys. woqu>

    通过测试可以看到sys下的对象中的数据依然克隆成功,而自建用户下的对象中数据并没有跟着一起克隆。

    推荐教程:《Oracle视频教程

    以上是實例解析Oracle容器資料庫的安裝與使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除