源备份
- 最小备份需要所谓的辅助和恢复集。
辅助集由源数据库的控制文件、CDB$ROOT(根的系统数据文件、sysaux 数据文件、撤消数据文件)和 PDB$SEED 以及任何存档日志组成,以使数据文件在恢复后保持一致。
这些是在还原后创建正在运行的容器数据库所必需的。
恢复集包含属于要恢复的 PDB 的所有数据文件。
以下是可以使用的备份命令的示例。
这些命令应按此处指定的顺序运行,以确保所有文件都能成功恢复到一致点。
第一条语句应包含我们希望包含在克隆环境中的所有 PDB。
在此示例中,PDB100 是唯一包含用于克隆的 PDB。
FORMAT 和 TAG 子句必须放在要备份的项目之前,以确保它们适用于每个备份项目。
FORMAT 可以为正在创建的备份的位置指定文件系统或者 ASM,但对于所有备份命令应该相同,因为所有备份文件必须位于 RMAN DUPLICATE 进程的同一目录中。
TAG 用于帮助识别需要复制到目标环境的文件。
必须包含归档日志以确保所有文件都可以成功恢复到一致点。
以下命令将创建一个包含辅助集和恢复集的备份集,仅包括足够的存档日志以允许将数据文件恢复/恢复到一致的时间点。
请注意,KEEP UNTIL TIME 子句不会影响备份可用的时间,它只是告诉源数据库控制文件维护有关备份的信息以及配置备份以使用 REPORT/DELETE OBSOLETE 命令的时间。
在定义的 KEEP UNTIL 日期之后,可以将备份复制到另一个环境并用于克隆。
RMAN> backup keep until time 'sysdate+1' format '+RE1/cdb100/backups/%u' tag 'my_bkup' (database ROOT) (pluggable database 'pdb$seed', pdb100);
注意:如果我们希望在同一目标环境中并行执行多个 PDB 迁移,我们可以在第一个备份命令中包含我们需要的所有 PDB(例如……pdb100、pdb200、pdb300……)。
备份可以复制到目标站点,并且可以在单个副本中全部还原,也可以与每个副本并行运行,还原不同的 PDB。
只要备份集在目标上的存储位置是共享的,我们只需复制文件一次。
每个重复执行都可以并行使用备份集,因为它是只读的。
- 连接到源数据库作为 rman target/并运行在上一步中创建的备份命令:
$ rman target sys RMAN>@bkup.cmd
3、执行备份后,连接源数据库,查询V$BACKUP_PIECE,获取备份文件名(HANDLE),其中TAG列如'[tag in command]'。
这将提供要复制到目标环境的文件列表。
SQL> select handle from v$backup_piece where tag like 'MY_PDB%'; HANDLE ------------------------------------------------------------------------------- +RE1/cdb100/backups/4lq8j2au +RE1/cdb100/backups/4mq8j2c2 +RE1/cdb100/backups/4nq8j2cs +RE1/cdb100/backups/4oq8j2dc +RE1/cdb100/backups/4pq8j2g2 +RE1/cdb100/backups/4qq8j2gb +RE1/cdb100/backups/4sq8j2gs +RE1/cdb100/backups/4tq8j2hv +RE1/cdb100/backups/4uq8j2iq +RE1/cdb100/backups/4vq8j2ja +RE1/cdb100/backups/50q8j2ju +RE1/cdb100/backups/52q8j2k5 12 rows selected.
- 将上述文件传输到目标站点。
这些文件可以 scp 到文件系统或者通过 ASMCMD 复制。
注意:所有文件必须位于同一目录级别的同一目录中,RMAN DUPLICATE 进程才能找到它们。
我们不能拥有包含某些文件的子目录,因为 RMAN 不会遍历其他目录结构。
5.从源数据库的spfile手动创建一个pfile,用于辅助实例。
下面是一个例子。
注释用 # 表示,并提供特定设置的背景信息和方向。
对于标记为“# THIS VALUE CAN BE ADJUSTED ON RESOURCES AVAILABLE”的项目,请注意增加值可能会加快复制过程,减少值可能会减慢复制过程。
我们应该根据 SLA 要求和可用资源确定值。
*.archive_lag_target=0 *.audit_file_dest='/u01/app/oracle/admin/auxcdb/adump' # SET THIS TO A LOCAL FILESYSTEM LOCATION SPECIFIC TO THE DESTINATION SITE *.audit_sys_operations=TRUE *.audit_trail='db' *.cluster_database=false # EVEN THOUGH THE SOURCE IS RAC, CLUSTER_DATABASE MUST BE SET TO FALSE FOR THE AUXILIARY *.compatible='12.1.0.2.0' *.control_files='+DATA/AUXCDB/control01.dbf' # THIS SETTING ALLOWS FOR A NEW CONTROLFILE TO BE CREATED IN ASM *.db_block_checking='false' *.db_block_checksum='typical' *.db_block_size=8192 *.db_create_file_dest='+DATA' # THIS MAY NEED TO BE CHANGED FROM SOURCE *.db_create_online_log_dest_1='+DATA' # THIS MAY NEED TO BE CHANGED FROM SOURCE *.db_domain='' *.db_files=1024 *.db_lost_write_protect='typical' *.db_name='auxcdb' # DB_NAME MUST BE SET TO A NAME DIFFERENT FROM THE SOURCE DATABASE. THE DUPLICATE PROCESS WILL THEN USE THIS NEW NAME AS THE DB_UNIQUE_NAME FOR THE AUXILIARY DATABASE *.db_recovery_file_dest='+RECO' *.db_recovery_file_dest_size=1024g *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=auxcdbXDB)' #THIS VALUE SHOULD BE CHANGED TO MATCH THE AUXILIARY DATABASE *.enable_pluggable_database=true # ENABLE_PLUGGABLE_DATABASE MUST BE SET TO TRUE TO ALLOW CREATION OF A CDB *.fast_start_mttr_target=300 *.filesystemio_options='setall' *.global_names=FALSE *.log_archive_max_processes=4 *.log_archive_min_succeed_dest=1 *.log_buffer=134217728 *.open_cursors=300 *.os_authent_prefix='' *.parallel_adaptive_multi_user=FALSE *.parallel_execution_message_size=16384 *.parallel_max_servers=1280 *.parallel_min_servers=0 *.parallel_threads_per_cpu=1 *.pga_aggregate_target=2048m # THIS VALUE CAN BE ADJUSTED BASED ON RESOURCES AVAILABLE *.processes=300 # THIS VALUE CAN BE ADJUSTED BASED ON RESOURCES AVAILABLE *.recyclebin='on' *.remote_login_passwordfile='exclusive' *.sga_target=6144m # THIS VALUE CAN BE ADJUSTED BASED ON RESOURCES AVAILABLE *.sql92_security=TRUE *.standby_file_management='auto' *.undo_tablespace='UNDOTBS1' #THIS MUST SPECIFY AT LEAST ONE VALID UNDO TABLESPACE NAME FROM THE SOURCE DATABASE *.use_large_pages='ONLY'
以下步骤将向我们展示如何执行容器数据库 (CDB) 的备份,仅包括在不中断应用程序活动到源 PDB 的情况下迁移可插拔数据库 (PDB) 的子集所需的部分。
备份和其中包含的所有数据文件将与单个时间点保持一致。
除了在数据库备份期间,此操作不需要连接到源 CDB。
该过程利用 Oracle 恢复管理器 (RMAN) 功能来创建备份,并在该容器数据库中创建 CDB 和特定 PDB 的克隆。
创建 CDB 克隆后,可以拔出克隆中的 PDB 并将其插入不同的 CDB。
可以在源 CDB 和 PDB 处于活动状态时创建 RMAN 备份。
归档日志包括在备份集,以保证克隆的CDB可以恢复到某个时间点一致。
完成后,备份可以被一些其他异构硬件访问以用于恢复过程。
RMAN DUPLICATE 功能用于创建 CDB 的克隆。
它使用从备份集数据以确定用于恢复和数据文件需要恢复和数据文件应该被跳过,从克隆除去一致性点。
此过程适用于 Oracle RDBMS 12.1.0.2 及更高版本。
注意事项
- 以下步骤假设源和目标环境是单独的硬件并且不共享存储(例如两个单独的 Exadata 数据库机)。但是,相同的环境可以用作源和目标。
- 源环境和目标环境必须是同一平台。
- 源 CDB 可以是 Oracle Real Application Cluster (RAC) 数据库或者单实例数据库。
- 备份可以是源 CDB 的完整备份。此处概述的过程假定一次性操作仅需要备份集中的单个 PDB。
- 该过程不需要连接到源数据库或者 RMAN 目录。不需要有 RMAN 目录。
- RMAN DUPLICATE 进程需要在目标环境中创建一个辅助实例。此辅助实例将始终只是一个单实例数据库。
- RMAN 备份可以写入文件系统或者 ASM。用于 DUPLICATE 进程的 RMAN 备份可以驻留在 ASM 或者文件系统上,而不管它们最初由备份进程写入何处。
- 以下示例将显示在备份集中包含单个 PDB 的过程。可以添加和复制其他 PDB。还可以使用相同的备份集并执行单独的复制过程,每个克隆的 CDB 都有从备份集恢复的不同 PDB。
- 目标环境必须有一个 ORACLE_HOME 补丁到与源环境相同的级别和相同的一次性。
过程
有两个不同的进程作为副本的一部分发生:
- 发生在源环境上的备份。
- 在目标环境中发生的重复。
一般来说,对这些系统的影响将来自 I/O、进程和内存利用率。
备份过程将作为客户端连接到源数据库。
复制过程将在目标站点创建一个单实例辅助数据库实例,并且可以通过该实例的初始化参数设置来配置资源利用率。
目标还原
确定我们将要调用的辅助数据库。
如果我们并行运行多个副本,则每个副本都应具有唯一的数据库名称。
相应地修改上面创建的 pfile。确保我们有足够的可用空间来处理克隆的数据库。
这将是根中所有数据文件(系统、系统辅助、RAC 源的所有撤消以及可能是根的一部分的任何其他数据文件)以及源中每个线程的所有联机重做日志的空间。
备份中的控制文件被恢复,它必须创建源控制文件中存在的所有联机重做日志,并且无法修改联机重做日志的大小。
例如,如果源上有 4 个 RAC 实例,每个 2 个组,每个日志 4g,每个组 1 个成员,那么我们将需要 4 * 2 * 4g = 32g 空间用于联机重做日志。
根的空间可能只是临时的,因为在复制操作完成并将PDB迁移到新的CDB后可以删除辅助数据库。
被克隆的 PDB 空间将在之后继续使用。
修改上面创建的示例 pfile 以用于 AUXILIARY 实例。
如果它不存在,则创建 AUDIT_FILE_DEST 目录结构:
$ mkdir -p /u01/app/oracle/admin/auxcdb/pfile
- 创建复制命令。
正如我们在以下命令中看到的,我们可以根据需要指定多个通道来执行恢复。
DUPLICATE DATABASE TO 子句应提供辅助数据库的名称并匹配刚刚创建的 pfile 中的 DB_NAME 设置。
指定我们希望恢复为该 CDB 的一部分的每个 PDB,每个 PDB 用逗号分隔。
我们必须指定 ROOT。
请注意,ROOT 也会导致 PDB$SEED 被恢复。
LOCATION 应提供复制备份的目录。
run { allocate auxiliary channel dupe1 type disk; allocate auxiliary channel dupe2 type disk; allocate auxiliary channel dupe3 type disk; allocate auxiliary channel dupe4 type disk; duplicate database to auxcdb pluggable database pdb100, root backup location '+RECO/auxcdb/backups'; }
将环境设置为指向辅助数据库 ORACLE_HOME 和 ORACLE_SID。
以 SYSDBA 身份连接到 SQL*PLUS 并在 nomount 中启动辅助实例,确保使用在步骤 3 中创建/修改的 init.ora:
$ sqlplus / as sysdba SQL> startup nomount pfile='/home/oracle/auxcdb/initauxcdb.ora'
8、连接辅助实例,执行步骤5中创建的复制数据库命令。
注意:这里的连接是辅助的,不是目标的。
$ rman auxiliary / RMAN>@dupe.cmd
RMAN DUPLICATE 过程将;
读取 LOCATION 目录中的备份文件以确定哪些文件可用。
从辅助实例的内存中创建一个 spfile。
重启NOMOUNT中的辅助,对spfile做一些小的修改,比如设置DB_NAME=[源数据库的DB_NAME]和DB_UNIQUE_NAME=[辅助数据库名称]。
使用此更新的 spfile 重新启动 NOMOUNT 中的辅助数据库,并从备份 LOCATION 恢复控制文件。
挂载辅助实例。
基于在配置文件中找到的信息。
确定一致的恢复点 SCN。
确定应该恢复哪些文件和表空间以及应该跳过/删除哪些文件和表空间。
恢复数据文件。
恢复数据文件。
重新启动 NOMOUNT 中的辅助。
为这个新数据库创建一个新的控制文件。
编目新的数据文件名称并酌情使用。
删除源 CDB 中存在的任何未克隆的 PDB。
打开新的数据库重置日志。
- RMAN DUPLICATE 脚本完成后,辅助数据库将处于 OPEN 状态,恢复的 PDB 也是如此。
通过 sqlplus 连接到实例并拔下 PDB。
SQL> alter pluggable database [pdbname] close; SQL> alter pluggable database [pdbname] unplug into '[some xml file]'; SQL> drop pluggable database [pdbname] keep datafiles; SQL> shutdown abort
- 将环境设置为指向目标 CDB ORACLE_HOME 和 ORACLE_SID。
11.通过SQL*Plus连接目标CDB,执行PDB插件操作。
注意:PDB 应该获得一个新名称以生成新的全局唯一标识符 (GUID),以确保它不会与源 PDB 的 GUID 冲突。
按照此示例的编码方式,由 RMAN DUPLICATE 进程创建的 PDB 的数据文件将直接用于新的 PDB。
它们将保留在辅助数据库的 ASM 目录结构下,直到将来某个时候它们被移动或者恢复。
如果我们希望将数据文件复制到目标 CDB 的 ASM 目录结构,请使用 COPY 子句而不是 NOCOPY 子句。
SQL> create pluggable database using '[xml file created from unplug]' tempfile reuse nocopy;
- 删除辅助数据库。
重复进程还会在 $ORACLE_HOME/dbs 中为辅助实例创建一个 spfile,我们应该在重新运行具有相同辅助数据库名称的 RMAN DUPLICATE 进程之前删除它。
注意:如果在目标 CDB 中创建新 PDB 时使用了 NOCOPY 子句,请记住不要从辅助 CDB 目录中删除 PDB 的数据文件。