Oracle容器数据库PDB克隆

梁铭图 2021-11-12 17:44:00
作者介绍

梁铭图,新炬网络首席架构师。具有十余年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有Oracle OCM和ACE Director、Togaf企业架构师(鉴定级)、IBM CATE等认证,曾获dbaplus年度MVP、华为云MVP等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。

 

背景

 

在实际运维工作中,我们经常会接到各种数据复制和迁移的需求,例如将生产数据库复制一份到测试环境或者数据分析的环境。这时候,我们会有很多工具和手段都相关数据的复制,如datapump,备份的异地恢复等。自从Oracle 12C容器数据库的引入,使我们使我们实现了一个更便捷的方式实施完整的数据复制过程。

 

Oracle容器数据库

 

从Oracle 12C的发布起,Oracle就已经引入了CDB与PDB的新特性,实现以oracle数据库为基础的多租户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。



 

  • CDB组件(Components of a CDB)

 

一个CDB数据库容器包含了下面一些组件:

 

  • ROOT组件

 

ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。

 

  • SEED组件

 

Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。

 

  • PDBS

 

CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。

 

这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。

 

克隆PDB方法

 

CLONEDB 提供了一种方法,可以轻松快速地在网络附加存储上(NAS)创建数据库副本,使用数据库集成的配置方法:克隆生产数据库是一种常用技术,可以帮助开发和测试应用程序及其周围环境的更改。在新的操作系统发布、存储软件或应用程序版本安装在生产环境之前,需要使用生产数据进行整体的测试。这通常是通过将生产数据库复制到测试环境来完成的。此外,在测试环境中,生产数据库的副本也被制作到应用程序开发人员正在创建或修改应用程序并对其进行测试的开发环境中。所有这些副本都需要大量的存储来分配和管理。使用微小配置,CLONEDB大大减少了生产数据库克隆所需的存储量。

 

PDB克隆还可以用做应用程序的分离和主机更换,比如之前因为数据量小将两个程序的表放到同一个数据库,后来因为业务量增加需要将一个程序的表单独放到一个库内,这时候可以用PDB克隆方式进行分离,分离后将其他程序的表删除即可。主机跟换则是在新主机创建好容器数据库后将PDB通过远程克隆启用。

 

1)本地克隆PDB

 

PDB克隆需要满足归档模式和本地UNDO为启用状态:


检查是否启用归档:



检查本地UNDO:



如果未开启归档模式和本地UNDO需要先启用。

 

开始克隆前停用业务保证数据一致并将原PDB设置为read only状态:

 

  •  
  •  
  •  
alter session set container=OLD_PDB;alter pluggable database OLD_PDB close immediate instances=all;alter pluggable database OLD_PDB OPEN READ ONLY;

 

克隆PDB:
 

  •  
create pluggable database NEW_PDB from OLD_PDB PARALLEL 6;

 

该过程LOD_PDB只有几百GB并且没有ADG的情况下10几分钟就可以完成。如果有ADG的情况下需要等备库同步完成才能正常启用NEW_PDB.

 

克隆完成后需要启OLD_PDB和NEW_PDB:

 

OLD_PDB:

 

  •  
  •  
  •  
alter pluggable database OLD_PDB open READ WRITE;alter session set container=OLD_PDB;alter pluggable database OLD_PDB open;

 

NEW_PDB:

 

  •  
  •  
alter session set container=NEW_PDB;alter pluggable database NEW_PDB open;

 

检查是否存在失效对象并对比原库,如果有新增失效对象需要手动编译失效对象。克隆完成删除多余的表后数据库分离成功(需要业务提供需要的表再进行过滤删除)。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
select 'drop table '||owner||'.'||TABLE_NAME||' ;'FROM dba_tablesWHERE OWNER in ('username') AND TABLE_NAME NOT IN ('table_01','table_02');

 

2)非本地克隆PDB

 

  • 使用db_link方式克隆pdb:

 

在老库创建c##link_pdb用户并授权:

 

  •  
  •  
  •  
create user c##link_pdb identified by linkpdb container=all;grant CREATE PLUGGABLE DATABASE to c##link_pdb container=all;grant connect,resource,cdb_dba,sysoper to c##link_pdb container=all;

 

在目标库创建TNS:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
cd $ORACLE_HOME/network/admin

old_pdb=  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = old_pdb)    )  )

 

创建db_link:

 

  •  
create database link new_pdb_link connect to c##link_pdb identified by linkpdb using 'old_pdb)';

 

克隆pdb:

 

  •  
  •  
alter session set pdb_file_name_convert='old_pdb','new_pdb';create pluggable database new_pdb from old_pdb@new_pdb_link;

 

克隆完成后开启OLD_PDB和NEW_PDB(与本地克隆方式一致)。

 

  • 使用插拔的方式克隆pdb:

 

原库关闭NEW_PDB并生成XML文件:

 

  •  
  •  
alter pluggable database NEW_PDB close immediate instances=all;alter pluggable database NEW_PDB unplug into '/home/oracle/NEW_PDB.xml'; 

 

备份NEW_PDB库并将备份文件复制到目标库:

 

  •  
  •  
  •  
rman target /set command id to 'NEW_PDB';BACKUP INCREMENTAL LEVEL 0 FOR TRANSPORT ALLOW INCONSISTENT PLUGGABLE DATABASE NEW_PDB FORMAT '/home/oracle/NEW_PDB.bak';

 

目标库恢复:

 

  •  
  •  
  •  
rman target /SET COMMAND ID TO 'NEW_PDB';RESTORE FOREIGN DATAFILE 00123 TO NEW,00124 TO NEW,00118 TO NEW,00119 TO NEW,00120 TO NEW,00122 TO NEW,00121 TO NEW  FROM BACKUPSET '/home/oracle/NEW_PDB.bak';

 

将PDB插入到目标库CDB:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
CREATE PLUGGABLE DATABASE NEW_CDB AS CLONE USING '/home/oracle/NEW_CDB.xml'SOURCE_FILE_NAME_CONVERT = ('+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/system.294.1099865729','+DATA/NEW_CDB/NEW_PDB/system01.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/sysaux.295.1099865729','+DATA/NEW_CDB/NEW_PDB/sysaux.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/undotbs1.299.1099865729','+DATA/NEW_CDB/NEW_PDB/undotbs1.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/undo_2.300.1099865729','+DATA/NEW_CDB/NEW_PDB/undo_2.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/users.298.1099865729','+DATA/NEW_CDB/NEW_PDB/users.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/TEMPFILE/temp.285.1099865737','+DATA/NEW_CDB/NEW_PDB/temp.dbf')FILE_NAME_CONVERT=NONE NOCOPY;

 

小结

 

克隆PDB的方法是我们常用的数据复制方式之一,它相比于其他常用的工具如datapump等,有着速度快而且操作比较简便等特点,特别适合于一些小型数据库的数据快速复制工作。

最新评论
访客 2023年08月20日

230721

访客 2023年08月16日

1、导入Mongo Monitor监控工具表结构(mongo_monitor…

访客 2023年08月04日

上面提到: 在问题描述的架构图中我们可以看到,Click…

访客 2023年07月19日

PMM不香吗?

访客 2023年06月20日

如今看都很棒

活动预告