1. 从零开始:PDB到底是什么,为什么运维要管它?
如果你刚接触Oracle 12c或更高版本,听到CDB、PDB这些词可能有点懵。别急,我用大白话给你捋一捋。你可以把传统的Oracle数据库想象成一个独栋别墅,所有东西都在这一个房子里。而Oracle 12c引入的多租户架构,就像一栋高级公寓楼。这栋公寓楼本身,就是CDB,也就是容器数据库。楼里的每一套独立的、带自己水电表的公寓,就是一个PDB,即可插拔数据库。
我们运维人员每天打交道的,其实就是这些“公寓”。为什么这个设计很重要?因为它彻底改变了数据库的管理模式。以前,公司有十个应用,可能就得建十个独栋别墅(十个独立的数据库实例),每个都要单独维护、备份、打补丁,资源浪费严重。现在好了,一栋公寓楼(一个CDB实例)里可以住进几十套公寓(几十个PDB),它们共享大楼的基础设施(如后台进程、内存的SGA),但每家每户的数据又是完全隔离的,互不干扰。这对我们来说,最直观的好处就是运维效率的飙升和硬件成本的骤降。
所以,日常运维中,“开启”和“关闭”PDB就成了像进出自家房门一样频繁的操作。比如,你要给某个PDB做备份,肯定得先把它关掉吧?备份完再打开。或者,某个应用需要停机维护,你关掉对应的PDB就行,完全不影响楼里其他“住户”。再比如,数据库服务器半夜要重启,你总不希望重启后,所有PDB都自动开门营业吧?有些测试环境的PDB可能就需要保持关闭状态。把这些操作玩熟了,你才能真正驾驭这套多租户架构。
2. 实战第一步:关闭PDB的“正确姿势”与深度避坑
关闭PDB听起来就是一句命令的事,但里面的门道可不少。踩过坑的都知道,一个不小心,就可能遇到会话卡住、关不掉,甚至影响其他PDB的情况。下面我把几种关闭方法掰开揉碎了讲。
2.1 单机环境下的关闭操作
首先,记住一个黄金法则:操作PDB之前,先确认你在哪个容器里。就像你要关3楼的电闸,总不能跑到2楼去拉闸吧?所以,第一步通常是连接到CDB的根容器。
-- 切换到CDB的根容器
alter session set container=cdb$root;
接下来,关闭一个名叫 PDB_PROD 的PDB,最常用的命令是:
alter pluggable database PDB_PROD close;
这条命令是“温和”的关闭。它会等待这个PDB里所有活跃的用户会话自己结束,就像 politely 请客人离开房间,等客人都走了再关门。这在白天业务低峰期可能没问题。
但更多时候,尤其是在生产环境做紧急维护或定时任务时,我们等不起。这时候就要用“强制清场”模式:
alter pluggable database PDB_PROD close immediate;
我强烈推荐你始终使用 close immediate。它会立即终止所有当前会话,回滚未提交的事务,然后干净地关闭PDB。这避免了因为某个长查询或僵死会话导致关闭命令无限期等待的尴尬局面。我吃过亏,有一次用普通 close 等了一个多小时,最后查日志才发现有个被遗忘的测试连接一直挂着。
关完之后怎么确认?除了命令不报错,最好去查一下PDB的状态:
select name, open_mode from v$pdbs where name = 'PDB_PROD';
<


1491

被折叠的 条评论
为什么被折叠?



