源库
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
目的库
SQL> select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for Linux: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
SQL> select cdb from v$database;
CDB
---
YES
步骤
3.1 (源库)导出元数据
grant read,write on directory FILE_PATH to TEST;
grant exp_full_database to TEST;
alter tablespace TESTDATA read only;
alter tablespace TESTINDEX read only;
expdp TEST/TEST dumpfile=TEST_metadata.dmp directory=FILE_PATH transport_tablespaces= TESTDATA,TESTINDEX logfile=TEST_export.log;
3.2 (目标库)创建PDB等
- 在CDB数据库中创建一个PDB
$sqlplus / as sysdba;
SQL> create pluggable database PDBSYD admin user PDBSYD identified by Passwod123456 roles=(connect) file_name_convert=('/data/T24CDB/T24CDB/pdbseed','/data/T24CDB/T24CDB/PDBSYD');
- 打开PDB
SQL> alter pluggable database PDBSYD open;
- 切换到PDB会话
SQL> alter session set container= PDBSYD;
- 创建PDB的私有用户
SQL> create user SYDADMIN identified by SYDADMIN;
- 授权SYDADMIN对directory对象的权限
SQL> grant DBA_PATH to SYDADMIN;
SQL> grant exp_full_database to SYDADMIN;
3.3 (目标库)配置链接到PDB的tns串
vim tnsnames.ora
PDBSYD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 99.13.213.50)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PDBSYD)
)
)
- 用tnsping 测试链接串
$ tnsping PDBSYD
- 测试SYDADMIN用户直接登录到PDB
[oracle@oceansvn01 12chome1]<20190801 16:06:28>$ sqlplus SYDADMIN/SYDADMIN@pdbsyd
SQL*Plus: Release 12.1.0.2.0 Production on Thu Aug 1 16:06:30 2019
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Last Successful login time: Thu Aug 01 2019 15:57:55 +08:00
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 con_name;
CON_NAME
------------------------------
PDBSYD
SQL>
3.3 拷贝源库的元数据与表空间文件
可使用scp、ftp等工具拷贝源库导出的元数据和表空间文件,并正确设置文件属性(chown),此处从略。
3.4 (目标库)直接导入到PDB
$ impdp SYDADMIN/SYDADMIN@pdbsyd dumpfile=CMBASOC1_metadata_01.dmp directory=DBA_PATH logfile=CMBASOC_import1.log transport_datafiles=/data/T24CDB/T24CDB/PDBSYD/cmbasoc1_index.dbf,/data/T24CDB/T24CDB/PDBSYD/cmbasoc1_data.dbf;
结尾
- 把源库的表空间设置为read write
alter tablespace TESTDATA read write;
alter tablespace TESTINDEX read write;
总结
CDB架构作为ORACLE官方主推的特性,可想而知官方对12c以前non-CDB架构的支持力度将越来越低。因而,将生产数据库从non-CDB架构迁移成高版本的CDB架构将是近几年DBA的主要工作之一。
前博讲诉了通过DB LINK方式直接将非non-CDB架构数据库整体迁移成CDB架构,但其有诸多弊端,如迁移后non-CDB数据库揉成一个PDB,其中包括non-CDB架构中的SYSTEM/SYSAUX/USER等多个表空间文件,占用大量磁盘空间,且据说noncdb_to_pdb.sql容易失败。
本文从另外一个维度讲诉non-CDB到CDB的迁移,将迁移精确到表空间,大大的节省了时间和空间,且支持跨DB版本迁移。