克隆创建PDB--(2)远程克隆创建PDB

本文介绍了使用 Oracle 12c R2 版本进行 Pluggable Database (PDB) 的远程克隆过程,包括配置监听器、创建数据库链接、解决权限问题以及最终实现 PDB 的远程克隆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


[oracle@12cr2 dbs]$ export ORACLE_SID=newcdb
[oracle@12cr2 dbs]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jun 4 15:26:43 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area  838860800 bytes
Fixed Size                  8798312 bytes
Variable Size             310382488 bytes
Database Buffers          515899392 bytes
Redo Buffers                3780608 bytes
Database mounted.
Database opened.
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO

源CDB:       zylong        源PDB:     TEST_PDB
目标CDB:   newcdb      目标PDB:  NEW_TEST_PDB

1. 配置目标端的监听

[oracle@12cr2 dbs]$ lsnrctl status

Service "test_pdb" has 1 instance(s).
  Instance "zylong", status READY, has 1 handler(s) for this service...

[oracle@12cr2 admin]$ vi tnsnames.ora
TEST_PDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.81)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = test_pdb)
    )
  )

[oracle@12cr2 admin]$ tnsping TEST_PDB

TNS Ping Utility for Linux: Version 12.2.0.1.0 - Production on 04-JUN-2017 15:36:03
Copyright (c) 1997, 2016, Oracle.  All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.81)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = test_pdb)))
OK (0 msec)

2. 目标端测试监听连接出现的小问题

[oracle@12cr2 ~]$ sqlplus pdb_mgr/oracle@TEST_PDB
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jun 4 15:42:13 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 SEED_PDB                       MOUNTED
         4 NONCDB_PDP                     MOUNTED
         5 CLON_PDB                       MOUNTED
         6 TEST_PDB                       READ WRITE YES
         7 PDB4                           READ WRITE YES

SQL> alter session set container=test_pdb;
Session altered.

SQL> shutdown immediate
Pluggable Database closed.

SQL> startup
Warning: PDB altered with errors.
Pluggable Database opened.

SQL> select name,cause,type,message,status from PDB_PLUG_IN_VIOLATIONs order by name;

NAME
-------------------------------------------------------------------------------
CAUSE                                                            TYPE
---------------------------------------------------------------- ---------
MESSAGE
-------------------------------------------------------------------------------
STATUS
---------
TEST_PDB
Sync Failure                                                     ERROR
Sync PDB failed with ORA-959 during 'create user c##cdbadmin identified by * def
ault tablespace users temporary tablespace temp container = all'
PENDING
##这是之前创建的common user,当前PDB中没有USERS表空间,为了不影响实验,将此user删除
SQL> conn / as sysdba
Connected.
SQL> drop user c##cdbadmin cascade;
User dropped.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1207959552 bytes
Fixed Size                  8792152 bytes
Variable Size             436209576 bytes
Database Buffers          754974720 bytes
Redo Buffers                7983104 bytes
Database mounted.
Database opened.

SQL> Alter pluggable database test_pdb open;
Pluggable database altered.

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 SEED_PDB                       MOUNTED
         4 NONCDB_PDP                     MOUNTED
         5 CLON_PDB                       MOUNTED
         6 TEST_PDB                       READ WRITE NO
         7 PDB4                           MOUNTED
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

3. 目标端测试监听连接

[oracle@12cr2 ~]$ sqlplus pdb_mgr/oracle@TEST_PDB
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jun 4 15:51:12 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL>

4. 目标端创建DBLINK

[oracle@12cr2 admin]$ export ORACLE_SID=newcdb
[oracle@12cr2 admin]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jun 4 15:57:25 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> create public database link testpdb_newcdb connect to pdb_mgr identified by oracle using 'TEST_PDB';
Database link created.

5. 目标端测试DBLINK出现的小问题

SQL> select cdb from v$database@testpdb_newcdb;
select cdb from v$database@testpdb_newcdb
                *
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-02063: preceding line from TESTPDB_NEWCDB

[oracle@12cr2 admin]$ export ORACLE_SID=zylong
[oracle@12cr2 ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jun 4 16:09:43 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> alter session set container=test_pdb;
Session altered.

SQL> grant dba to pdb_mgr;
Grant succeeded.
##授予DBA权限之后,在dblink端的报错窗口查询依然报错,必须退出后重连:
[oracle@12cr2 admin]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jun 4 16:16:22 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> select cdb from v$database@testpdb_newcdb;
CDB
---
YES

SQL> select name from v$pdbs@testpdb_newcdb;
NAME
-------------------------------------------------------------------------------
TEST_PDB

6. 远程克隆PDB

SQL> CREATE PLUGGABLE DATABASE testpdb_newcdb FROM test_pdb@testpdb_newcdb
  2  file_name_convert=('/u01/app/oracle/oradata/zylong/test_pdb','/u01/app/oracle/oradata/newcdb/testpdb_newcdb');
Pluggable database created.

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

<think>我们正在处理一个Oracle数据库克隆任务:从11g远程克隆到19c的PDB。根据引用[1]:我们可以使用dbms_pdb.describe过程来生成源PDB的元数据描述文件。但注意:11g中没有PDB的概念(因为CDB/PDB是从12c开始引入的),所以11g的数据库是非CDB架构。因此,我们需要先将11g的非CDB数据库转换为PDB,然后才能克隆到19c的CDB中。步骤概述:1.在11g数据库中,由于是独立数据库(非CDB),我们需要将其转换为一个可插拔的数据库(PDB)。但是11g本身不支持PDB,所以这一步实际上需要在12c以上的版本中进行转换。因此,可能需要先升级到12c或更高版本,然后再进行转换,或者我们可以使用另一种方法:创建一个新的PDB,并通过数据泵导出导入的方式迁移数据。但是这里要求是“远程克隆”,所以我们需要寻找类似的方法。2.引用[3]提到了在克隆PDB后可能遇到的监听注册问题,所以克隆完成后需要关注监听配置。然而,由于源端是11g(非CDB),我们不能直接使用dbms_pdb包(因为11g没有这个包)。所以我们需要采用不同的方法。根据Oracle的文档,从非CDB迁移到PDB有两种方法:a)使用导出/导入(数据泵)b)使用数据库链接和CREATEPLUGGABLEDATABASE...FROMNON$CDB(这个方法仅在12.2以后支持)由于我们要远程克隆到19c,而19c支持12.2的特性,所以我们可以尝试使用第二种方法,但是源端是11g,所以需要先将源端升级到12c以上?不,实际上,我们可以通过创建一个到11g的数据库链接,然后在目标19cCDB中创建一个新的PDB,源是非CDB。但是,注意:CREATEPLUGGABLEDATABASE...FROMNON$CDB这个语句要求源数据库至少是12.1.0.2,并且需要将源数据库置于只读模式并生成一个xml文件。而我们的源是11g,无法满足这个要求。因此,更实际的方法可能是:步骤1:将11g数据库升级到19c,但这样就不是克隆了,而是升级整个数据库。这不一定符合要求。或者,我们可以通过中间步骤:先将11g的数据用数据泵导出,然后在19c的PDB中导入。这种方法虽然不是“克隆”,但可行。但是用户明确要求“远程克隆”,所以我们需要尝试使用远程克隆的方式。重新审视:从Oracle12.2开始,支持远程克隆非CDB数据库(源数据库必须是12c以上,且必须被置为只读,并执行一些操作)。所以11g不能直接作为源。因此,可能的步骤是:1.先将11g数据库升级(或迁移)到12c(非CDB)。2.在12c的数据库中,将其转换为PDB(通过生成xml描述文件,然后在目标CDB中创建)。3.然后,再使用12c的PDB克隆到19c(但这样需要两次操作,且第一次是升级到12c)。另一种思路:使用传输表空间(TTS)进行迁移。但TTS要求源端和目标端字符集相同,且版本限制(需要源端的版本等于或低于目标端,11g到19c是可行的,但需要做兼容性检查)。考虑到复杂度,这里给出一个使用数据泵导出导入的步骤(虽然不是克隆,但较为简单且可行):步骤:1.在11g数据库上使用expdp(数据泵导出)导出数据。2.在19c的CDB中创建一个新的PDB(比如叫TESTPDB)。3.将导出的数据泵文件传输到19c服务器上(或通过网络直接导入)。4.在19c的TESTPDB中使用impdp导入。但是用户要求的是“远程克隆”,而且引用[1]中提到了dbms_pdb.describe,引用[3]提到了克隆PDB后配置监听的问题,所以我们还是尝试寻找克隆的方法。如果我们必须用克隆方法,那么我们必须先将11g升级到12.2以上,然后使用以下步骤:1.将源11g数据库升级到12.2以上(比如19c)成为非CDB数据库。2.在升级后的数据库中,执行:BEGINDBMS_PDB.DESCRIBE(pdb_descr_file=>'/path/to/xml/noncdb.xml');END;/然后关闭数据库。3.在目标19c的CDB中,使用这个xml文件创建新的PDB:CREATEPLUGGABLEDATABASEnewpdbUSING'/path/to/xml/noncdb.xml'COPY...;但是这里需要注意的是,源数据库的数据文件需要可访问(比如通过NFS挂载)。然而,这种方法需要停机,并且需要升级源数据库,对于生产环境可能不可行。因此,综合来看,对于11g到19c的PDB,推荐使用数据泵方式。但如果我们想尝试使用远程克隆(不升级源库),是否有办法?目前Oracle官方没有直接支持远程克隆11g非CDB到19cPDB的方法。结论:由于Oracle11g本身不具备PDB特性,我们无法直接使用远程克隆功能(该功能要求源数据库为12.2以上版本的非CDB或PDB)。因此,我们需要采用其他迁移方法,如数据泵导入导出。详细步骤(数据泵方式):1.在11g数据库上执行导出:expdpsystem/password@11g_sourceFULL=YESdirectory=DATA_PUMP_DIRdumpfile=fulldb.dmplogfile=expdp.log注意:11g可能需要设置兼容性参数,如果19c的字符集与11g不同,还需要注意字符集转换问题。2.在19cCDB中创建一个新的PDB(例如:TESTPDB)。CREATEPLUGGABLEDATABASEtestpdbADMINUSERpdbadminIDENTIFIEDBYpassword;ALTERPLUGGABLEDATABASEtestpdbOPEN;3.将导出的dump文件(fulldb.dmp)传输到19c服务器上(如果导出时指定了目录,确保该目录在19c上存在且可用)。4.在19c上使用impdp导入到新的PDB:impdpsystem/password@19c_target/testpdbFULL=YESdirectory=DATA_PUMP_DIRdumpfile=fulldb.dmplogfile=impdp.log注意:可能需要使用remap_schema或remap_tablespace等参数进行重新映射。克隆完成后,还需要配置监听,如引用[3]中提到的,确保新的PDB能够动态注册到监听:在PDB中设置LOCAL_LISTENER参数,并修改listener.ora和tnsnames.ora文件。但是,如果用户坚持要使用克隆方法(尽管源是11g不可行),我们可以建议先将源升级到12.2,然后使用克隆,但这个过程非常复杂。因此,根据当前情况,我们推荐使用数据泵方式。相关问题:1.使用数据泵从Oracle11g迁移到19c时需要注意哪些兼容性问题?2.在Oracle19c中创建PDB的方法有哪些?3.如何配置监听使得新的PDB能够被远程访问?注意:如果用户有特殊要求必须使用克隆,请用户补充信息。</think> ### Oracle 11g 远程克隆至 Oracle 19c PDB 步骤指南 由于Oracle 11g是非CDB架构,而Oracle 19c使用CDB/PDB架构,**无法直接远程克隆**。需先通过中间升级转换,以下是完整流程: --- #### **核心步骤** 1. **源库准备 (Oracle 11g)** - 将11g数据库升级至12c或以上版本(因PDB克隆需源端≥12.1) - 生成元数据描述文件(XML): ```sql -- 以只读模式打开源库 STARTUP MOUNT; ALTER DATABASE OPEN READ ONLY; -- 生成描述文件(需Oracle≥12.1) BEGIN DBMS_PDB.DESCRIBE(pdb_descr_file => '/path/to/source.xml'); END; / ``` - 关闭源库 2. **目标库操作 (Oracle 19c CDB)** ```sql -- 创建数据库链接(需源端文件系统可访问) CREATE DATABASE LINK src_link CONNECT TO sys IDENTIFIED BY <password> USING 'source_tns'; -- 创建PDB远程克隆) CREATE PLUGGABLE DATABASE newpdb FROM <source_db>@src_link FILE_NAME_CONVERT = ('/source/path/', '/target/path/'); ``` 3. **兼容性处理** - 执行PDB兼容性检查: ```sql ALTER PLUGGABLE DATABASE newpdb OPEN UPGRADE; EXEC DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/path/to/source.xml'); ``` - 若不兼容需在PDB运行`noncdb_to_pdb.sql`脚本(需Oracle≥12.2) 4. **监听注册**[^3] ```sql ALTER SESSION SET CONTAINER = newpdb; ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(PORT=1521))'; ``` - 更新`listener.ora`和`tnsnames.ora`添加PDB服务名 --- #### **备选方案(推荐)** 若无法升级源库,使用**数据泵迁移**: ```bash # 源端11g导出 expdp system/pwd FULL=YES DIRECTORY=dpump_dir DUMPFILE=11g_full.dmp # 目标19c创建PDB CREATE PLUGGABLE DATABASE newpdb ADMIN USER admin IDENTIFIED BY pwd; # 目标端导入 impdp system/pwd@newpdb FULL=YES DIRECTORY=dpump_dir DUMPFILE=11g_full.dmp ``` --- #### **注意事项** 1. 源端需开启归档模式[^2] 2. 字符集/字节序必须一致 3. 目标CDB需开启`ENABLE_PLUGGABLE_DATABASE` 4. 克隆过程需停机(对生产影响大) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值