1.1、多租户存储结构
Oracle 12c引入的多租户架构(Multitenant)对存储管理产生了深远影响。一个CDB(Container Database)可以包含多个PDB(Pluggable Database),每个PDB拥有独立的表空间和数据文件。
|--------------|---------------|-----------------------------|
| 容器 | 说明 | 包含的表空间 |
| CDBROOT** | 根容器,管理所有PDB | SYSTEM, SYSAUX, UNDO |
| **PDBSEED | PDB模板 | SYSTEM, SYSAUX(只读) |
| PDB_xxx | 可插拔数据库,独立业务单元 | SYSTEM, SYSAUX, TEMP, 用户表空间 |
1.2、 PDB 存储管理
sql
-- 创建PDB
CREATE PLUGGABLE DATABASE pdb_sales
ADMIN USER pdb_admin IDENTIFIED BY "xxx"
DEFAULT TABLESPACE pdb_sales_data
DATAFILE '+DATA' SIZE 5G AUTOEXTEND ON
FILE_NAME_CONVERT = ('+DATA/CDB/', '+DATA/PDB_SALES/');
-- 打开PDB
ALTER PLUGGABLE DATABASE pdb_sales OPEN;
-- 在PDB中创建表空间
ALTER SESSION SET CONTAINER = pdb_sales;
CREATE TABLESPACE ts_orders
DATAFILE '+DATA/PDB_SALES/ts_orders01.dbf' SIZE 10G;
-- PDB存储配额管理
ALTER SESSION SET CONTAINER = cdb$root;
ALTER USER pdb_sales_user QUOTA 50G ON ts_orders;
-- 跨容器查询存储使用情况
SELECT p.name pdb_name,
ROUND(SUM(s.bytes)/1024/1024/1024, 2) total_gb
FROM cdb_segments s
JOIN v$containers p ON s.con_id = p.con_id
GROUP BY p.name
ORDER BY total_gb DESC;
实例:PDB 存储隔离与迁移
**S --- Situation(场景):**某SaaS平台使用Oracle 19c多租户架构,一个CDB托管30个PDB(每个客户一个PDB)。其中pdb_customer_a的存储需求激增,需要从当前CDB迁移到独立的高配CDB。
**T --- Task(任务):**在线将pdb_customer_a从源CDB拔出并插入到目标CDB,确保数据完整性和最小停机时间。
A --- Action(行动):
1、源CDB中检查PDB兼容性:
BEGIN
DBMS_PDB.CHECK_PLUGGABLE(pdb_descr_file => 'pdb_customer_a.xml');
END;
2、关闭 PDB 并拔出:
ALTER PLUGGABLE DATABASE pdb_customer_a CLOSE;
ALTER PLUGGABLE DATABASE pdb_customer_a UNPLUG INTO '/tmp/pdb_customer_a.xml';
3、传输数据文件和XML到目标服务器;
4、目标CDB中插入
CREATE PLUGGABLE DATABASE pdb_customer_a
USING '/tmp/pdb_customer_a.xml'
SOURCE_FILE_NAME_CONVERT = ( '+DATA/SOURCE/', '+DATA/TARGET/');
5、打开PDB并验证数据。
R --- Result **(结果):**PDB迁移完成,总停机时间约15分钟(主要是数据文件传输时间)。迁移后客户A在新CDB中独享更多资源,查询性能提升约3倍。源CDB资源释放后,其他PDB性能也有改善。