Oracle 12c远程克隆PDB的问题及修复(r12笔记第78天)
Oracle 12c里面的PDB迁移还是有很多花样的,玩法很多,如果想达到一种平滑方式的迁移,克隆远程PDB也是一种方法,保证网络畅通,即可远程克隆PDB到指定的目标容器数据库中,当然这种方式还是推荐数据量不大的PDB。
要实现远程克隆,主要就是创建DB link,然后使用create pluggable database语句指定db link复制的路径即可。当然这个过程中还是可能出现一大堆的问题。我就抛砖引玉,提一个比较有代表性的。
首先在目标端容器数据库创建DB link,指向源端的PDB
create public database link tcymob1_new12c connect to pdb_mgr identified by oracle using 'tcymob1';
接着在目标端容器数据库远程克隆PDB
CREATE PLUGGABLE DATABASE pdb4 FROM test_pdb ? FILE_NAME_CONVERT = file_name_convert=('/U01/app/oracle/oradata/dbcadb','/U01/app/oracle/oradata/dbcadb/pdb4');
当然很不幸,抛出了下面的错误,这个错误如果在12.2中测试很可能不会碰到,但是在12.1和12.2之间切换,那还是很可能有的,因为其中的一个重要原因就是undo了。
ORA-17628: Oracle error 65035 returned by remote Oracle server
ORA-65035: unable to create pluggable database from
我们看看错误分析:
$ oerr ora 65035
65035, 00000, "unable to create pluggable database from %s"
// *Cause: An attempt was made to clone a pluggable database that did not have
// local undo enabled.
// *Action: Enable local undo for the PDB and and retry the operation.
为了进一步验证,我们到源端,查看源容器数据库的信息
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB2_PROXY MOUNTED
5 TCYMOB0 READ WRITE NO
6 TCYMOB1 READ WRITE NO
查看database_properties,或者查看dba_data_files都可以,源库中的undo是共享模式的,接下来的问题就会变为如果把share undo改为local undo
修复share undo为local undo核心的命令就是alter database undo local,但是要实现这样一个目标还是需要花些功夫的。
我们先启动源数据库到upgrade模式。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup upgrade
然后在root容器下执行undo的切换命令。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter database local undo on;
Database altered.
然后启动源容器数据库即可。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
再次查看,对应的undo文件已经是PDB级别,即local模式了。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB2_PROXY MOUNTED
5 TCYMOB0 MOUNTED
6 TCYMOB1 MOUNTED
SQL> alter session set container=tcymob1;
Session altered.
SQL> select name from v$datafile where name like '%undo%';
NAME
---------------------------------------------------------------
/U01/app/oracle/oradata/new12c/NEW12C/datafile/o1_mf_undotbs1_dkbv7dro_.dbf
再次尝试就可以看到,问题引刃而解。
- 设置Windows默认中文、Putty掉线解决、SublimeText3常用设置
- 通过oracle类比MySQL中的字节字符问题(r4笔记第44天)
- Spring MVC的配置和使用
- Oracle总结【SQL细节、多表查询、分组查询、分页】
- 关于内存异常的一个猜想(r4笔记第43天)
- WebSocket就是这么简单
- 09(01)总结final,多态,抽象类,接口
- 01 Mybatis 的配置和使用
- Oracle总结【视图、索引、事务、用户权限、批量操作】
- 02 使用Mybatis的逆向工程自动生成代码
- 关于ORA-12801,ORA-27090的简单分析(r4笔记第58天)
- Oracle总结【PLSQL学习】
- 01 Maven构建的项目中,把.xml等配置文件添加到编译目录
- Java 语法清单-快速回顾
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 商业数据分析从入门到入职(5)Python基本语法和数据类型
- JavaScript 同步和异步的执行机制问题
- Vue 与小程序:父组件给子组件传值的区别
- Canvas悟空推箱子
- Spring Cloud 之服务网关 Zuul (一)
- React进阶篇(八)react redux
- 通过一个简单例子理解JavaScript闭包和this对象
- Spring Cloud 之服务网关 Gateway (一)
- Hacking with iOS: SwiftUI Edition - Hot Prospects项目(二)
- HarmonyOS-对Android开发者也太友好了吧
- 你还在使用复杂的 zkclient 开发 zookeeper 么?是时候用 Curator 了 !
- 如何通俗理解类和类型的差别?
- 如何理解变量?
- 装逼篇 | 抖音超火的九宫格视频是如何生成的,Python 告诉你答案
- 能否详细讲讲字符串呢?