概念描述
Oracle 12c及以上版本的多租户架构中,如果在CDB根容器有事务没有提交,在PDB中进行维护操作时将出现ORA-65023: active transaction exists in container CDB$ROOT。
测试验证
1、连接到CDB中
SQL> conn / as sysdba show con_name CON_NAME ------------------------------ CDB$ROOT
2、在CDB启动一个事务
SQL> create table xf(c number); insert into xf values(1) ;
在CDB的根容器CDB$ROOT模拟了一个事务没有提交。 3、切换到PDB中
SQL> alter session set container=PDBXF;
4、关闭PDB
SQL>alter pluggable database close; ORA-65023: active transaction exists in container CDB$ROOT
由于根容器中有事务没有提交,根容器中的挂起事务仍处于挂起状态PDB无法正常关闭,报错为ORA-65023: active transaction exists in container CDB$ROOT。当另一个容器中有活动事务时,语句试图在当前容器中创建新事务。
解决办法:切换到具有活动事务的容器中,并在尝试发出任何将尝试在另一个容器中创建新事务的语句之前提交、回滚或分离活动事务。 5、切换到根容器
SQL> alter session set container=cdb$root; commit;
在根容器cdb$root 将事务commit。 6、再次关闭PDB
SQL> alter session set container=PDBXF; SQL>alter pluggable database close; Pluggable Database closed. SQL> sho pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDBXF MOUNTED
由于根容器中没有活动事务,这次客户正常关闭PDB。
知识总结
CDB环境中,如果根容器中有活动事务,在PDB进行关闭等维护时会无法完成;生产环境,建议尽可能不要在CDB的cdb$root创建事务,避免因根容器的事务影响PDB的维护。
-the end-
