Oracle中的多租户架构(CDB与PDB):资源管理和隔离的新方式

Oracle中的多租户架构(CDB与PDB):资源管理和隔离的新方式

欢迎来到Oracle多租户架构讲座

大家好,欢迎来到今天的讲座!今天我们要聊的是Oracle数据库的多租户架构,特别是CDB(Container Database)和PDB(Pluggable Database)。如果你曾经管理过多个独立的数据库实例,或者在云环境中部署过多个应用,那么你一定会对这个话题感兴趣。让我们一起探索如何通过CDB和PDB来实现更高效、更灵活的资源管理和隔离。

1. 什么是多租户架构?

在传统的Oracle数据库中,每个数据库都是一个独立的实例,拥有自己的数据文件、控制文件、重做日志等。这种架构虽然简单直接,但在某些场景下会显得有些笨重。比如,当你需要为多个部门或客户创建独立的数据库时,每个数据库都需要单独的硬件资源、内存配置和维护工作。这不仅增加了管理的复杂性,还可能导致资源浪费。

为了解决这些问题,Oracle引入了多租户架构,它允许你在同一个物理数据库实例中运行多个逻辑数据库。这些逻辑数据库被称为可插拔数据库(PDB),而整个容器化的数据库则被称为容器数据库(CDB)。通过这种方式,你可以将多个PDB“插入”到同一个CDB中,共享底层的资源,同时保持每个PDB的独立性和安全性。

2. CDB vs PDB:它们到底是什么?

2.1 容器数据库(CDB)

CDB是多租户架构的核心,它相当于一个“容器”,可以容纳多个PDB。CDB本身也是一个数据库,但它并不存储用户数据,而是负责管理所有PDB的元数据、全局资源和服务。你可以把CDB看作是一个“超级管理员”,它负责协调各个PDB之间的资源分配、安全管理和服务启动。

  • CDB$ROOT:这是CDB的根容器,包含了所有PDB的元数据和公共对象。它是CDB的核心部分,所有的PDB都依赖于它。
  • PDB$SEED:这是一个模板PDB,用于快速创建新的PDB。你可以把它看作是一个“克隆模板”,所有的新PDB都可以基于它进行创建。

2.2 可插拔数据库(PDB)

PDB是CDB中的逻辑数据库,每个PDB都可以独立运行,拥有自己的用户、表空间、模式和应用程序。尽管它们共享CDB的底层资源,但每个PDB看起来就像是一个独立的数据库。你可以为不同的部门、项目或客户提供各自的PDB,确保它们的数据和操作相互隔离。

  • 独立性:每个PDB都有自己的数据字典、用户权限和配置参数,因此你可以为不同的PDB设置不同的安全策略和性能优化。
  • 灵活性:你可以随时创建、删除、备份或恢复PDB,而不会影响其他PDB的正常运行。
  • 资源共享:多个PDB可以共享CDB的内存、CPU和其他资源,从而提高整体的资源利用率。

3. 多租户架构的优势

多租户架构不仅仅是简单的“打包”多个数据库,它带来了许多实际的好处:

3.1 资源共享与优化

在传统的单实例架构中,每个数据库都有自己独立的SGA(System Global Area)和PGA(Program Global Area),即使这些数据库的负载不高,它们仍然会占用大量的内存和CPU资源。而在多租户架构中,多个PDB可以共享CDB的资源池,只有在需要时才会分配资源。这样不仅可以减少硬件成本,还可以提高资源的利用率。

3.2 简化管理

想象一下,如果你有10个独立的数据库实例,每个实例都需要单独配置、监控和备份。这不仅会增加管理的复杂性,还会带来更多的错误风险。而在多租户架构中,所有的PDB都由同一个CDB统一管理,你可以通过CDB集中配置参数、应用补丁和执行备份操作。这样一来,管理多个PDB就像管理一个数据库一样简单。

3.3 快速部署与迁移

由于PDB是以“插拔”的方式存在于CDB中的,因此你可以非常快速地创建、克隆或迁移PDB。例如,你可以使用CREATE PLUGGABLE DATABASE命令从PDB$SEED快速创建一个新的PDB,或者使用ALTER PLUGGABLE DATABASE命令将现有的PDB迁移到另一个CDB中。这种灵活性使得多租户架构非常适合云环境和DevOps场景。

4. 如何创建和管理PDB

接下来,我们来看一些实际的操作示例,教你如何创建和管理PDB。

4.1 创建PDB

要创建一个新的PDB,首先需要确保你已经有一个CDB。然后,你可以使用以下SQL命令来创建PDB:

-- 创建一个名为pdb1的PDB
CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1_admin IDENTIFIED BY password
  FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDB1/pdbseed/', '/u01/app/oracle/oradata/CDB1/pdb1/')
  STORAGE (MAXSIZE 2G)
  PATH_PREFIX = '/u01/app/oracle/oradata/CDB1/pdb1';

在这个例子中,我们创建了一个名为pdb1的PDB,并指定了管理员用户pdb1_admin及其密码。FILE_NAME_CONVERT参数用于指定PDB的数据文件路径,STORAGE参数用于限制PDB的最大存储空间。

4.2 打开和关闭PDB

创建PDB后,默认情况下它是处于关闭状态的。你可以使用以下命令来打开或关闭PDB:

-- 打开PDB
ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- 关闭PDB
ALTER PLUGGABLE DATABASE pdb1 CLOSE;

如果你想一次性打开或关闭所有PDB,可以使用以下命令:

-- 打开所有PDB
ALTER PLUGGABLE DATABASE ALL OPEN;

-- 关闭所有PDB
ALTER PLUGGABLE DATABASE ALL CLOSE;

4.3 查看PDB状态

要查看当前CDB中所有PDB的状态,可以查询V$PDBS视图:

SELECT CON_ID, NAME, OPEN_MODE FROM V$PDBS;

输出结果可能如下所示:

CON_ID NAME OPEN_MODE
2 PDB$SEED READ ONLY
3 PDB1 READ WRITE
4 PDB2 MOUNTED

4.4 备份和恢复PDB

备份和恢复PDB也非常简单。你可以使用RMAN(Recovery Manager)工具来备份整个PDB,或者只备份特定的数据文件。以下是一个简单的RMAN备份命令:

RMAN> BACKUP PLUGGABLE DATABASE pdb1;

要恢复PDB,可以使用以下命令:

RMAN> RESTORE PLUGGABLE DATABASE pdb1;
RMAN> RECOVER PLUGGABLE DATABASE pdb1;

5. 资源管理和隔离

多租户架构的一个重要特性是能够为每个PDB提供独立的资源管理。你可以为每个PDB设置不同的资源限制,确保它们不会相互干扰。Oracle提供了多种资源管理工具,其中最常用的是Resource Manager

5.1 使用Resource Manager

Resource Manager允许你为不同的PDB分配CPU、内存和其他资源。你可以通过创建资源计划(Resource Plan)来定义每个PDB的资源分配策略。以下是一个简单的资源计划示例:

-- 创建资源计划
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN(
    plan => 'MY_PDB_PLAN',
    comment => 'Resource plan for PDBs'
  );
END;
/

-- 为PDB1分配70%的CPU资源
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'MY_PDB_PLAN',
    group_or_subplan => 'PDB1',
    comment => 'PDB1 resource directive',
    cpu_p1 => 70
  );
END;
/

-- 为PDB2分配30%的CPU资源
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'MY_PDB_PLAN',
    group_or_subplan => 'PDB2',
    comment => 'PDB2 resource directive',
    cpu_p1 => 30
  );
END;
/

通过这种方式,你可以确保PDB1获得更多的CPU资源,而PDB2则获得较少的资源。你还可以根据实际需求调整这些配置,以适应不同的业务场景。

5.2 数据库服务隔离

除了资源管理,Oracle还提供了数据库服务隔离功能,允许你为每个PDB创建独立的服务。通过这种方式,你可以将不同的应用程序连接到不同的PDB,而不会相互干扰。以下是创建数据库服务的示例:

-- 为PDB1创建服务
BEGIN
  DBMS_SERVICE.CREATE_SERVICE(
    service_name => 'pdb1_service',
    network_name => 'pdb1_service'
  );
END;
/

-- 启动服务
BEGIN
  DBMS_SERVICE.START_SERVICE('pdb1_service');
END;
/

现在,你可以通过pdb1_service连接到PDB1,而不会影响其他PDB的正常运行。

6. 总结

通过今天的讲座,我们了解了Oracle多租户架构的基本概念和优势。CDB和PDB的组合为我们提供了一种全新的资源管理和隔离方式,使得我们在云环境和多租户场景下能够更加高效地管理和部署数据库。无论是资源共享、简化管理还是快速部署,多租户架构都为我们带来了极大的便利。

当然,多租户架构也有一些需要注意的地方,比如资源竞争和性能调优。但只要我们合理规划和配置,就能够充分发挥它的潜力。希望今天的讲座对你有所帮助,如果你有任何问题或想法,欢迎在评论区留言!

谢谢大家,我们下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注