Oracle Administrator’s Guide(Oracle 19c):2.11 Cloning a Database

2024年 4月 29日 55.5k 0

介绍克隆 Oracle 数据库的各种方法。

在非多租户环境中使用 CloneDB 克隆数据库

CloneDB 允许您在非多租户环境中多次克隆数据库,而无需将数据文件复制到多个不同的位置。相反,CloneDB 使用的是写时复制技术,因此只有修改过的块才需要额外的磁盘存储。

关于使用 CloneDB 克隆数据库

为了测试或其他目的,通常需要克隆生产数据库。

克隆生产数据库的常见原因包括:

  • 部署使用数据库的新应用程序,或更新现有应用程序
  • 在运行数据库的系统上计划的操作系统升级
  • 用于数据库安装的新存储
  • 报告
  • 旧数据分析

在部署新应用程序、执行操作系统升级或使用新存储之前,需要进行彻底的测试,以确保数据库在新的条件下正常工作。克隆可以通过在一个或多个测试环境中复制生产数据文件来实现,但是这些复制通常需要分配和管理大量的存储空间。

使用 CloneDB,您可以多次克隆数据库,而无需将数据文件复制到几个不同的位置。相反,Oracle 数据库使用写时复制技术在 CloneDB 数据库中创建文件,因此只有在 CloneDB 数据库中修改的块需要额外的磁盘存储空间。

用这种方法克隆数据库有以下优点:

  • 它减少了测试所需的存储量。
  • 它支持为各种目的快速创建多个数据库克隆。

CloneDB 数据库使用数据库备份的数据文件。使用备份数据文件可确保 CloneDB 实例不访问生产数据文件,并确保 CloneDB 实例不会竞争生产数据库的资源,例如 CPU 和 I/O 资源。

使用 CloneDB 克隆数据库

可以使用 CloneDB 克隆数据库

在克隆数据库之前,必须满足以下先决条件:

  • 每个 CloneDB 数据库必须使用 Direct NFS Client,生产数据库的备份必须位于 NFS 卷上。

    Direct NFS Client 允许 Oracle 数据库直接访问网络连接存储 (NAS) 设备,而不是使用操作系统内核 NFS 客户端。这个 CloneDB 数据库特性在支持 Direct NFS Client 的平台上可用。

  • 至少需要 2 MB 额外的系统全局区域(SGA)内存来跟踪CloneDB数据库中修改的块。

  • 需要存储数据库备份和每个CloneDB数据库中更改的块。

    数据库备份所需的存储取决于执行备份的方法。一个完整的RMAN备份需要最多的存储空间。使用存储设备的特性执行的存储快照符合存储设备的要求。一个备份可以支持多个CloneDB数据库。

    每个CloneDB数据库所需的存储量取决于该数据库中的写活动。修改的每个块都需要一个可用的存储块。因此,总存储需求取决于随时间推移在CloneDB数据库中修改的块的数量。

本节描述创建一个 CloneDB 数据库所需的步骤,并使用这些示例数据库和目录:

  • 生产数据库 PROD1 的 Oracle home 是 /u01/prod1/oracle。
  • 数据库备份的文件在 /u02/oracle/backup/prod1 中。
  • CloneDB 数据库 CLONE1 的 Oracle home 是 /u03/clone1/oracle。

使用CloneDB克隆数据库:

  1. 创建生产数据库的备份。

    • 在线备份
      如果您执行在线备份,那么请确保您的生产数据库处于 ARCHIVELOG 模式,并且所有必要的归档重做日志文件都已保存并可被 CloneDB 数据库环境访问。

    • 离线全量备份
      如果执行完全脱机备份,那么请确保 CloneDB 数据库环境可以访问备份文件。

    • 备份数据库文件
      如果在 RMAN 中指定 BACKUP AS COPY,则 RMAN 将每个文件复制为镜像副本,镜像副本是创建在磁盘上的数据库文件的位对位副本。镜像副本与使用操作系统命令(如 Linux 上的 cp 或 Windows 上的 COPY)创建的副本完全相同,但被记录在 RMAN 存储库中,因此 RMAN 可以使用映像副本。可以使用 RMAN 在数据库打开时进行镜像复制。确保复制的数据库文件可以被 CloneDB 数据库环境访问。

  2. 如果不存在文本初始化参数文件(PFILE),则创建该文件。
    如果您正在使用服务器参数文件(SPFILE),那么在生产数据库上运行以下语句来创建 PFILE:

    CREATE PFILE FROM SPFILE;

  3. 创建用于克隆生产数据库的 SQL 脚本。

    在后面的步骤中,您将使用一个或多个 SQL 脚本创建 CloneDB 数据库。要创建 SQL 脚本,可以使用 oracle 提供的 Perl 脚本 clonedb.pl,也可以手动创建 SQL 脚本。

    要使用 clonedb.pl Perl 脚本,请完成以下步骤:

    1. 在操作系统提示符下设置以下环境变量:

      MASTER_COPY_DIR - 指定包含步骤 1 中创建的备份的目录。确保此目录只包含生产数据库的数据文件备份。

      CLONE_FILE_CREATE_DEST - 指定将创建 CloneDB 数据库文件的目录,包括数据文件、日志文件、控制文件。

      CLONEDB_NAME - 指定 CloneDB 数据库的名称。

      S7000_TARGET - 如果 NFS 主机为备份和 CloneDB 数据库提供的文件系统是 Sun Storage 7000,那么指定主机的名称。否则,不要设置此环境变量。仅当必须使用存储快照进行克隆时,才设置此环境变量。您可以为 Direct NFS Client 使用S7000存储数组,而无需设置此变量。

    2. 运行 clonedb.pl Perl 脚本。

      该脚本位于 $ORACLE_HOME/rdbms/install 目录中,并具有以下语法:

      $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/install/clonedb.pl
      prod_db_pfile [sql_script1] [sql_script2]

      指定以下选项:

      prod_db_pfile - 指定生产数据库的 PFILE 的完整路径。

      sql_script1 - 为 clonedb.pl 生成的第一个 SQL 脚本指定名称。默认值为 crtdb.sql。

      sql_script2 - 为 clonedb.pl 生成的第二个 SQL 脚本指定名称。默认值为 dbren.sql。

      clonedb.pl 脚本将生产数据库的 PFILE 复制到 CloneDB 数据库的目录中。它还会创建两个用于创建 CloneDB 数据库的 SQL 脚本。

    3. 检查 clonedb.pl Perl 脚本生成的两个 SQL 脚本,并在必要时进行更改。

    4. 修改 CloneDB 数据库环境的初始化参数,然后保存文件。

      更改任何特定于 CloneDB 数据库环境的初始化参数,例如控制 SGA 大小、PGA 目标、cpu 数量等的参数。必须将 CLONEDB 参数设置为 TRUE,初始化参数文件包含该参数。

    5. 在 SQL*Plus 中,使用 SYSDBA 管理权限连接到 CloneDB 数据库。

    6. 运行 clonedb.pl Perl 脚本生成的 SQL 脚本。

      例如,如果脚本使用默认名称,那么在 SQL 提示符下运行以下脚本:

      crtdb.sql
      dbren.sql

    要手动创建 SQL 脚本,请完成以下步骤:

    1. 使用 SYSDBA 或 SYSBACKUP 管理权限连接到数据库。

    2. 通过完成以下步骤从生产数据库生成备份控制文件脚本:

      执行如下 SQL 语句:

      ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

      此语句生成一个跟踪文件,该文件包含创建控制文件的 SQL 语句。包含 CREATE CONTROLFILE 语句的跟踪文件存储在由 DIAGNOSTIC_DEST 初始化参数确定的目录中。请检查数据库告警日志,了解此跟踪文件的名称和位置。

    3. 打开上面步骤中生成的跟踪文件,并将跟踪文件中的 STARTUP NOMOUNTCREATE CONTROLFILE 语句复制到新的 SQL 脚本中。

    4. 通过以下方式编辑在上面步骤中创建的新 SQL 脚本:

      将数据库的名称更改为您正在创建的CloneDB数据库的名称。例如,更改 PROD1CLONE1

      将日志文件的位置更改为 CloneDB 数据库环境中的目录。例如,将 /u01/prod1/oracle/dbs/t_log1.f 更改为 /u03/clone1/oracle/dbs/t_log1.f。

      将数据文件的位置更改为备份位置。例如,将 /u01/prod1/oracle/dbs/t_db1.f 更改为 /u02/oracle/backup/prod1/t_db1.f。

      下面是由 ALTER DATABASE BACKUP CONTROLFILE TO TRACE 语句生成的原始语句示例:

      STARTUP NOMOUNT
      CREATE CONTROLFILE REUSE DATABASE "PROD1" NORESETLOGS ARCHIVELOG
      MAXLOGFILES 32
      MAXLOGMEMBERS 2
      MAXDATAFILES 32
      MAXINSTANCES 1
      MAXLOGHISTORY 292
      LOGFILE
      GROUP 1 '/u01/prod1/oracle/dbs/t_log1.f' SIZE 25M BLOCKSIZE 512,
      GROUP 2 '/u01/prod1/oracle/dbs/t_log2.f' SIZE 25M BLOCKSIZE 512
      -- STANDBY LOGFILE
      DATAFILE
      '/u01/prod1/oracle/dbs/t_db1.f',
      '/u01/prod1/oracle/dbs/t_ax1.f',
      '/u01/prod1/oracle/dbs/t_undo1.f',
      '/u01/prod1/oracle/dbs/t_xdb1.f',
      '/u01/prod1/oracle/dbs/undots.dbf'
      CHARACTER SET WE8ISO8859P1
      ;

      修改后的 SQL 脚本语句示例如下:

      STARTUP NOMOUNT PFILE=/u03/clone1/oracle/dbs/clone1.ora
      CREATE CONTROLFILE REUSE DATABASE "CLONE1" RESETLOGS ARCHIVELOG
      MAXLOGFILES 32
      MAXLOGMEMBERS 2
      MAXDATAFILES 32
      MAXINSTANCES 1
      MAXLOGHISTORY 292
      LOGFILE
      GROUP 1 '/u03/clone1/oracle/dbs/t_log1.f' SIZE 25M BLOCKSIZE 512,
      GROUP 2 '/u03/clone1/oracle/dbs/t_log2.f' SIZE 25M BLOCKSIZE 512
      -- STANDBY LOGFILE
      DATAFILE
      '/u02/oracle/backup/prod1/t_db1.f',
      '/u02/oracle/backup/prod1/t_ax1.f',
      '/u02/oracle/backup/prod1/t_undo1.f',
      '/u02/oracle/backup/prod1/t_xdb1.f',
      '/u02/oracle/backup/prod1/undots.dbf'
      CHARACTER SET WE8ISO8859P1
      ;

      如果在数据文件上创建了存储级别快照,则可以使用存储快照名称替换 RMAN 备份文件名。

    5. 编辑 SQL 脚本后,将其保存到 CloneDB 数据库环境可访问的位置。

      记下新的 SQL 脚本的名称和位置。您将在后续步骤中运行该脚本。在本例中,假设脚本的名称为create_clonedb1.sql

    6. 将文本初始化参数文件(PFILE)从生产数据库环境复制到 CloneDB 数据库环境。
      例如,将文本初始化参数文件从 /u01/prod1/oracle/dbs 拷贝到 /u03/clone1/oracle/dbs。文件的名称和位置必须与修改后的 SQL 脚本中的 STARTUP NOMOUNT 命令中指定的名称和位置匹配。以上面第 4 步骤为例,该文件为 /u03/clone1/oracle/dbs/clone1.ora。

    7. 修改 CloneDB 数据库环境的初始化参数,然后保存文件。

      添加 CLONEDB 参数,并确保将此参数设置为 TRUE。更改特定于 CloneDB 数据库环境的任何其他初始化参数,例如控制 SGA 大小,PGA 目标,CPU 数量等的参数。

    8. 在 SQL*Plus 中,使用 SYSDBA 管理权限连接到 CloneDB 数据库。

    9. 运行您在第 6 步中保存的 SQL 脚本。 .

      例如,在 SQL*Plus 中输入:

      @create_clonedb1.sql

    10. 对于备份位置中的每个数据文件,请运行包中的 CLONEDB_RENAMEFILE 过程 DBMS_DNFS 并在 CloneDB 数据库环境中指定适当的位置。

      例如,如果备份数据文件是 /u02/oracle/backup/prod1/t_db1.f 且 CloneDB 数据库数据文件是 /u03/clone1/oracle/dbs/t_db1.f,请运行以下过程:

      BEGIN
      DBMS_DNFS.CLONEDB_RENAMEFILE(
      srcfile => '/u02/oracle/backup/prod1/t_db1.f',
      destfile => '/u03/clone1/oracle/dbs/t_db1.f');
      END;
      /

  4. 如果您是从联机备份创建 CloneDB 数据库,则恢复 CloneDB 数据库。如果执行完全脱机备份或 BACKUP AS COPY 备份,则不需要执行此步骤。

    以 CloneDB 数据库为例,执行如下 SQL 语句:

    RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;

    该语句提示输入备份执行期间的归档重做日志文件。

  5. 通过运行以下 SQL 语句打开数据库:

    ALTER DATABASE OPEN RESETLOGS;

CloneDB 数据库已经可以使用了。

要创建生产数据库的其他 CloneDB 数据库,为每个克隆数据库重复步骤 3-5。

使用 CloneDB 克隆数据库后

创建了 CloneDB 数据库之后,就可以以使用生产数据库的几乎任何方式使用它了。最初,CloneDB 数据库为每个数据文件使用最小的存储空间。对 CloneDB 数据库中的行进行更改会导致按需分配存储空间。

您可以使用相同的备份文件创建多个 CloneDB 数据库。这种备份可以通过 RMAN 或存储级快照进行。如果在数据文件上创建了存储级快照,那么可以用存储快照名称替换 RMAN 备份文件名称。

你可以使用 V$CLONEDFILE 视图来显示关于 CloneDB 数据库中每个数据文件的信息。这些信息包括备份中的数据文件名称、CloneDB 数据库中相应的数据文件名称、从备份文件中读取的块的数量以及针对备份文件发出的请求的数量。

因为 CloneDB 数据库使用备份文件作为后端存储,所以备份文件必须对每个 CloneDB 数据库可用,以便它运行。如果备份文件变得不可用,那么 CloneDB 数据库将返回错误。

当您完成对 CloneDB 数据库的使用时,您可以销毁 CloneDB 数据库环境。您可以在不影响生产数据库环境和备份环境的情况下删除克隆数据库环境中的所有文件。

在多租户环境中克隆数据库

可以在多租户环境中克隆数据库。

使用 ASM (Oracle Automatic Storage Management) 克隆数据库

Oracle ASM (Oracle Automatic Storage Management)支持在多租户容器数据库(CDB)中克隆可插拔数据库(PDB)。Oracle ASM 不支持克隆 non-CDB。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论