[Oracle19C 数据库管理] 创建PDB

使用PDB$SEED模板创建PDB

通过PDB$SEED创建PDB数据库,将会触发以下动作:

  1. 将文件从PDB$SEED文件夹复制到新创建的PDB数据库文件夹中。
  2. 创建表空间
    • SYSTEM
    • SYSAUX
    • UNDO
  3. 创建默认用户
    • sys
    • system
  4. 创建以数据库命名的服务。

使用FILE_NAME_CONVERT来通过PDB$SEED创建PDB

  1. 为新建的PDB创建存放目录,存放于$ORACLE_BASE/oradata/<cdb数据库> 。

  2. 使用具有CREATE PLUGGABBLE DATABASE权限的用户登录到CDB$ROOT下。

  3. CREATE PLUGGABLE DATABASE pdb3
    ADMIN USER admin1 IDENTIFIED BY oracle ROLES=(CONNECT)
    FILE_NAME_CONVERT=('PDBSEED所在目录', '新的PDB数据目录');

  4. 创建后可以使用SHOW PDBS查看是否成功创建。

  5. 使用sys登录CDB$ROOT, 执行以下命令检查PDB的创建情况。
    启动PDB 并保持开启状态。
    ALTER PLUGGABLE DATABASE <新PDB数据库名> OPEN;
    ALTER PLUGGABLE DATABASE <新PDB数据库名> SAVE STATE;
    COLUMN CON_ID FORMAT A10
    COLUMN PDB_NAME FORMAT A20
    COLUMN STATUS FORMAT A20
    COLUMN FILE_NAME FOR A40
    SET LINESIZE 100
    SELECT CON_ID, PDB_NAME, STATUS FROM CDB_PDBS;
    SELECT CON_ID, TABLESPACE_NAME FROM CDB_TABLESPACES;
    SELECT CON_ID, TABLESPACE_NAME, FILE_NAME FROM CDB_DATA_FILES;

  6. 登录新的PDB
    查看新的PDB有没有注册到Listener
    lsnrctl status

使用简单命名登录
sqlplus sys@:<port_name>/<新PDB数据库名> as sysdba

使用netmgr-> local -> service naming创建一个新的本地命名条目。
sqlplus sys@<PDB本地命名> as sysdba

通过PDB$SEED创建PDB并使用OMF管理数据库文件

第一种方式 设置DB_CREATE_FILE_DEST初始化参数

  1. 使用sys登录到CDB$ROOT。
  2. ALTER SESSION SET DB_CREATE_FILE_DEST='<新的pdb目录>'
  3. CREATE PLUGGABLE DATABASE pdb4
    ADMIN USER admin1 identified by oracle ROLES=(CONNECT);

第二种方式 在CREATE PLUGGABLE DATABASE中添加CREATE_FILE_DEST参数

  1. 使用sys登录到CDB$ROOT
  2. CREATE PLUGGABLE DATABASE pdb5
    ADMIN USER admin1 identified by oracle ROLES=(CONNECT)
    CREATE_FILE_DEST='<新的pdb目录>';

通过PDB创建PDB

可以设置初始化参数,DB_CREATE_FILE_DEST或者PDB_FILE_NAME_CONVERT来设置新的pdb的路径。
也可以在创建PDB的时候,使用CREATE_FILE_DEST或者FILE_NAME_CONVERT子句来指定路径(这样更好)。

通过PDB创建PDB

CREATE PLUGGABLE DATABASE 新PDB名称 FROM 旧PDB名称。

旧PDB需要是OPEN状态才能被复制。

通过设置DB_CREATE_FILE_DEST初始化参数复制PDB

mkdir /u01/app/oracle/oradata/ORCLCDB/pdb3

ALTER SYSTEM SET db_create_file_dest='/u01/app/oracle/oradata/ORCLCDB/pdb3';
CREATE PLUGGABLE DATABASE pdb3 FROM pdb1;

通过子句复制PDB

mkdir /u01/app/oracle/oradata/ORCLCDB/pdb4

CREATE PLUGGABLE DATABASE pdb4 FROM pdb1
CREATE_FILE_DEST='/u01/app/oracle/oradata/ORCLCDB/pdb4';

通过在线克隆PDB创建PDB

  1. 创建新PDB的文件目录。
  2. 在新PDB的CDB$ROOT下创建一个到源PDB的CDB$ROOT的DATA LINK。
  3. 使用CREATE PLUGGABLE DATABASE创建PDB
    CREATE PLUGGABLE DATABASE 新PDB FROM 源PDB名@DBLINK名
    FILE_NAME_CONVERT=('源PDB','新PDB')
    REFRESH MODE MANUAL | EVERY XXX MINUTES;
  4. 新的PDB关闭的时候,可以进行手工刷新或者按照计划刷新。
将testcdb的pdbsource克隆到pdbnew
1. 创建新的pdb的文件目录
mkdir $ORACLE_BASE/oradata/TESTCDB/pdbnew

2. 在新PDB的CDB$ROOT下创建一个到源PDB的CDB$ROOT的DATA LINK。
SQL> CREATE DATABASE LINK clone_pdbsource_pdbnew
  2  CONNECT TO system IDENTIFIED BY oracle
  3  USING 'testcdb';

Database link created.


3. 使用CREATE PLUGGABLE DATABASE创建PDB
SQL> CREATE PLUGGABLE DATABASE pdbnew FROM pdbsource@clone_pdbsource_pdbnew
  2  FILE_NAME_CONVERT=('/u01/app/oracle/oradata/TESTCDB/pdbsource','/u01/app/oracle/oradata/TESTCDB/pdbnew')
  3  REFRESH MODE MANUAL;

Pluggable database created.

4. 查看系统中的pdb
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           MOUNTED
         9 PDBSOURCE                      READ WRITE NO
        10 PDBNEW                         MOUNTED     <===新创建的pdbnew默认是close

5. 查看PDBNEW的状态。
SQL> COLUMN PDB_NAME FORMAT A20;
SQL> COLUMN STATUS FORMAT A20;
SQL> select pdb_name , status from cdb_pdbs where pdb_name = 'PDBNEW';

PDB_NAME             STATUS
-------------------- --------------------
PDBNEW               REFRESHING

6. 使用READ ONLY方式可以开启PDBNEW。
SQL> ALTER PLUGGABLE DATABASE pdbnew OPEN READ ONLY;

Pluggable database altered.

7. 切换到新创建的PDBNEW,可以查看数据。
SQL> alter session set container=pdbnew;

Session altered.

SQL> select * from test;

        ID
----------
         1

8. 将数据库切换到CLOSE模式
SQL> ALTER PLUGGABLE DATABASE pdbnew CLOSE;

Pluggable database altered.

9. 在pdbsource中进行数据的更新。
SQL> alter session set container=pdbsource;

Session altered.

SQL> update test set id=2;

1 row updated.

SQL> commit;

Commit complete.


10. 在pdbnew中手工刷新数据

SQL> alter session set container=CDB$ROOT;

SQL> ALTER PLUGGABLE DATABASE pdbnew REFRESH;

Pluggable database altered.

11. 重新打开pdbnew并查询,看到数据已经更新。

SQL> ALTER PLUGGABLE DATABASE pdbnew OPEN READ ONLY;

Pluggable database altered.

SQL> ALTER SESSION SET CONTAINER=pdbnew;

Session altered.

SQL> SELECT * FROM TEST;

        ID
----------
         2

之后删除DATABASE LINK并不会影响数据同步。

通过RELOCATE创建PDB

将ORCLCDB中的PDB1 迁移到 TESTCDB的PDBRELOCATE

  1. 在源数据库和目标数据库中,确认本地UNDO是启用的。
  2. 在目标数据库的文件夹下,创建新的文件夹用来存放迁移过来的数据。
  3. 在目标数据库的文件夹下,创建DATABASE LINK,连接到源数据库的CDB$ROOT。
  4. 给与源数据库中的SYSTEM具有SYSOPER权限。
    GRANT SYSOPER TO SYSTEM CONTAINER=ALL;
  5. 新数据库中,使用以下命令迁移数据库。
    CREATE PLUGGABLE DATABASE 新PDB FROM 源PDB@DBLINK名 RELOCATE
    FILE_NAME_CONVERT=('源数据路径','新数据路径');
  6. 查询新的PDB状态,如果是RELOCATING,还在迁移过程中。
    SELECT PDB_NAME, STATUS FROM CDB_PDBS;
  7. 可以使用ALTER PLUGGABLE DATABASE 新数据库 OPEN READ ONLY 打开数据库。
    ALTER PLUGGABLE DATABASE 新数据库 OPEN READ ONLY;
  8. 如果输入库迁移时间很久,可以使用强制打开的方式打开新数据库,新数据库是读写状态,旧数据库被关闭并删除。
    ALTER PLUGGABLE DATABASE 新数据库 OPEN READ WRITE FORCE;
源数据库下,修改一下SQL提示符
SQL> SET SQLPROMPT 'ORCLCDB>'

目标数据库下,修改一下SQL提示符
SQL> SET SQLPROMPT 'TESTCDB>'


源数据库下,查看本地UNDO状态
ORCLCDB>COLUMN PROPERTY_NAME FORMAT A30;
ORCLCDB>COLUMN PROPERTY_VALUE FORMAT A20;
ORCLCDB>SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='LOCAL_UNDO_ENABLED';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ --------------------
LOCAL_UNDO_ENABLED             TRUE


目标数据库下,查看本地UNDO状态。
TESTCDB>COLUMN PROPERTY_NAME FORMAT A30;
TESTCDB>COLUMN PROPERTY_VALUE FORMAT A20;
TESTCDB>SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='LOCAL_UNDO_ENABLED';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ --------------------
LOCAL_UNDO_ENABLED             TRUE

在目标数据库的数据目录下,创建存放迁移数据库的数据目录
mkdir $ORACLE_BASE/oradata/TESTCDB/pdbrelocate

创建到orclcdb的DATABASE LINK。
TESTCDB>CREATE DATABASE LINK link_orclcdb
  2  CONNECT TO system IDENTIFIED BY oracle
  3  USING 'orclcdb';

进行relocate报错的时候,需要在源数据库给SYSTEM用户SYSOPER的权限。
TESTCDB>CREATE PLUGGABLE DATABASE pdbrelocate FROM pdbsource@link_orclcdb
  2  RELOCATE
  3  FILE_NAME_CONVERT=('/u01/app/oracle/oradata/ORCLCDB/pdbsource','/u01/app/oracle/oradata/TESTCDB/pdbrelocate');
CREATE PLUGGABLE DATABASE pdbrelocate FROM pdbsource@link_orclcdb
*
ERROR at line 1:
ORA-17628: Oracle error 1031 returned by remote Oracle server
ORA-01031: insufficient privileges

在源数据库对SYSTEM授权
ORCLCDB>GRANT SYSOPER TO SYSTEM CONTAINER=ALL;

Grant succeeded.

在目标数据库上重新执行迁移数据库操作。
SQL> CREATE PLUGGABLE DATABASE pdbrelocate FROM pdbsource@link_orclcdb RELOCATE
  2  FILE_NAME_CONVERT=('/u01/app/oracle/oradata/ORCLCDB/pdbsource','/u01/app/oracle/oradata/TESTCDB/pdbrelocate');

Pluggable database created.

查看新创建的PDB的状态正在进行迁移。
SQL> select pdb_name, status from cdb_pdbs;

PDB_NAME             STATUS
-------------------- --------------------
PDB1                 NORMAL
PDB$SEED             NORMAL
PDBRELOCATE          RELOCATING

其他有Session在的时候,relocate的时间会很长,可以通过以下方式强制在目标服务器使用READ WRITE方式打开数据库。
这样操作后,源服务器的数据库会关闭并且被drop掉。

SQL> ALTER PLUGGABLE DATABASE pdbrelocate OPEN READ WRITE FORCE;

Pluggable database altered.

SQL> select pdb_name, status from cdb_pdbs;

PDB_NAME         STATUS
-------------------------
PDBRELOCATE      NORMAL

源服务器上不再能够看到被迁移的pdbsource这个数据库。

试验结束后,关闭并删除创建的PDBRELOCATE
SQL> ALTER PLUGGABLE DATABASE pdbrelocate CLOSE;

Pluggable database altered.

SQL> DROP PLUGGABLE DATABASE pdbrelocate INCLUDING DATAFILES;

Pluggable database dropped.

posted on 2023-01-10 20:59  LeoZhangJing  阅读(3102)  评论(0编辑  收藏  举报

导航