[Oracle19C 数据库管理] 创建PDB
使用PDB$SEED模板创建PDB
通过PDB$SEED创建PDB数据库,将会触发以下动作:
- 将文件从PDB$SEED文件夹复制到新创建的PDB数据库文件夹中。
- 创建表空间
- SYSTEM
- SYSAUX
- UNDO
- 创建默认用户
- sys
- system
- 创建以数据库命名的服务。
使用FILE_NAME_CONVERT来通过PDB$SEED创建PDB
-
为新建的PDB创建存放目录,存放于$ORACLE_BASE/oradata/<cdb数据库> 。
-
使用具有CREATE PLUGGABBLE DATABASE权限的用户登录到CDB$ROOT下。
-
CREATE PLUGGABLE DATABASE pdb3
ADMIN USER admin1 IDENTIFIED BY oracle ROLES=(CONNECT)
FILE_NAME_CONVERT=('PDBSEED所在目录', '新的PDB数据目录'); -
创建后可以使用SHOW PDBS查看是否成功创建。
-
使用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; -
登录新的PDB
查看新的PDB有没有注册到Listener
lsnrctl status
使用简单命名登录
sqlplus sys@
使用netmgr-> local -> service naming创建一个新的本地命名条目。
sqlplus sys@<PDB本地命名> as sysdba
通过PDB$SEED创建PDB并使用OMF管理数据库文件
第一种方式 设置DB_CREATE_FILE_DEST初始化参数
- 使用sys登录到CDB$ROOT。
- ALTER SESSION SET DB_CREATE_FILE_DEST='<新的pdb目录>'
- CREATE PLUGGABLE DATABASE pdb4
ADMIN USER admin1 identified by oracle ROLES=(CONNECT);
第二种方式 在CREATE PLUGGABLE DATABASE中添加CREATE_FILE_DEST参数
- 使用sys登录到CDB$ROOT
- 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
- 创建新PDB的文件目录。
- 在新PDB的CDB$ROOT下创建一个到源PDB的CDB$ROOT的DATA LINK。
- 使用CREATE PLUGGABLE DATABASE创建PDB
CREATE PLUGGABLE DATABASE 新PDB FROM 源PDB名@DBLINK名
FILE_NAME_CONVERT=('源PDB','新PDB')
REFRESH MODE MANUAL | EVERY XXX MINUTES; - 新的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
- 在源数据库和目标数据库中,确认本地UNDO是启用的。
- 在目标数据库的文件夹下,创建新的文件夹用来存放迁移过来的数据。
- 在目标数据库的文件夹下,创建DATABASE LINK,连接到源数据库的CDB$ROOT。
- 给与源数据库中的SYSTEM具有SYSOPER权限。
GRANT SYSOPER TO SYSTEM CONTAINER=ALL; - 新数据库中,使用以下命令迁移数据库。
CREATE PLUGGABLE DATABASE 新PDB FROM 源PDB@DBLINK名 RELOCATE
FILE_NAME_CONVERT=('源数据路径','新数据路径'); - 查询新的PDB状态,如果是RELOCATING,还在迁移过程中。
SELECT PDB_NAME, STATUS FROM CDB_PDBS; - 可以使用ALTER PLUGGABLE DATABASE 新数据库 OPEN READ ONLY 打开数据库。
ALTER PLUGGABLE DATABASE 新数据库 OPEN READ ONLY; - 如果输入库迁移时间很久,可以使用强制打开的方式打开新数据库,新数据库是读写状态,旧数据库被关闭并删除。
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 阅读(3739) 评论(0) 编辑 收藏 举报