RMAN duplicate复制库

RMAN duplicate复制库

【官方文档】

Backup and Recovery User's Guide

  25 Duplicating a Database

  26 Duplicating a Database: Advanced Topics

1 概念

Source Database(或source host)       源数据库

Duplicate Database(或new host)        新复制的数据库

Catalog Database(或catalog host)     目录库

1.1 RMAN Duplicate用途

① 用于测试的Database

  就是source host的一个copy,RMAN通过不完全恢复复制出来一个new host,如果sourc和new host都在一个平台上,文件路径命名不能相同,如果是两个平台(不支持异构),文件路径命名可同也可不同。无论如何,new host有自己唯一的DBID

②Standby用途Database

  典型的就是Data Guard,Standby Database的主要功能是可以提供Failover,所以Primary database会将log输送到Standy Database,使其不断更新数据

1.2 RMAN duplicate模式

① Active Database Duplication

  基于RMAN网络的,从源数据库通过网络(不使用RMAN备份)直接创建辅助库

② Backup-Based Duplication

  基于RMAN备份的,利用RMAN备份创建辅助库

1.3 基本框架

 

2 复制新库步骤

1)将辅助库上安装数据库软件不建库,建立Oracle Home

2)为辅助库建立口令文件,Active方式下与源数据库口令相同

3)确保到辅助实例的网络连通性(辅助库建立静态监听)

4)为辅助实例创建参数文件

5)以nomount方式启动辅助实例(启动静态监听)

6)生产数据库处于mount或open模式下

7)创建备份或将备份和归档日志文件复制到辅助库实例可以访问的某个位置,或者使用活动(active)数据库复制

8)如果有必要分配辅助通道

9)运行rman duplicate命令

10)使用resetlogs打开辅助数据库

duplicate是个不完全恢复,因为current log没有办法通过RMAN备份

 

3 注意点

1)duplicate目前还不支持跨平台的复制,如windows和linux就是两个平台(windows32位和64位算是一个平台)

2)非active方式,必须保证RMAN的备份能使new host访问到

3)Active模式要保证 source host和duplicate host两端有同样的sys口令文件

4)如果是复制test database,Oracle依靠不同的DBID区别source host和duplicate host如果是复制standby database, Oracle依靠db_unqiue_name区分primary host和standby host

5)基于backup的duplicate是由auxiliary channel工作,而基于active的duplicate是由target channel工作

6)初始化参数DB_FILE_NAME_CONVERT指定数据文件和临时文件的映射名称,初始化参数LOG_FILE_NAME_CONVERT指定联机重做日志文件的映射名称

7)也可以通过duplicate database中的spfile子句指定上面两个参数

8)duplicate是一个不完全恢复,因为rman不备份online redo logfile

 

4 【实战案例】RMAN duplicate搭建测试库

RMAN通过网络(active方式)在新节点上复制用于测试的数据库

新节点要求如下:

  数据库名同source database ORCL

  实例名同source database ORCL

  数据库(控制文件,在线日志,数据文件)目录:同source database

  审计、参数文件、口令文件命名遵循oracle规范

  不同的DBID

DUPLICATE TARGET DATABASE TO dupdb

  FROM ACTIVE DATABASE

  PASSWOED FILE

  SPFILE

  NOFILENAMECHECK;

解析:

  基于网络的复制数据库,此例是Active方式,source host和target host需要同样的一个PASSWORD FILE,SPFILE是复制过去的(没有任何参数修改)。两个节点有着相同的目录结构及文件命名。NOFILENAMECHECK的意思是不检查文件是否重名,因为source host和duplicate host不是同一个平台

4.1 名词定义

source database --->duplicate database       //duplicate端只安装Oracle软件,不创建数据库

db_name---->orcl                                          //source端的数据库名

instance_name---->orcl                                //source端的实例名

4.2 准备工作(source/目标库)

在source端创建表插入数据,方便复制库之后查询验证

conn scott/tiger
create table test(id number);
insert into test values(100);
insert into test values(101);
insert into test values(102);
commit;
conn / as sysdba
alter system switch logfile;
select * from scott.test;

4.3 准备工作(duplicate/测试库)

4.3.1 环境变量实例为orcl

echo $ORACLE_SID
sqlplus / as sysdba

4.3.2 建立pfile哑参文件

cd $ORACLE_HOME/dbs
vi dummy.ora

写入:

db_name='aaa'

4.3.3 从source库复制口令文件到duplicate库

4.3.3.1 编辑hosts解析文件
vi /etc/hosts

写入:

192.168.9.20    duplicate
192.168.9.10    source

同步到source库

cat /etc/hosts
scp duplicate:/etc/hosts source:/etc

4.3.3.2 复制口令文件
cd /u01/app/oracle/product/19.3.0/dbhome_1/dbs/
scp source:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapworcl ./

4.4 创建duplicate数据库需要的目录

4.4.1 审计目录

show parameter audit_file_dest

在duplicate端创建目录

mkdir -p /u01/app/oracle/admin/orcl/adump

4.4.2 快速恢复区目录

show parameter db_recovery_file_dest

在duplicate端创建目录

mkdir /u01/flash_recovery_area
ls -ld /u01/flash_recovery_area/

4.4.3 归档目录

archive log list

在duplicate端创建目录

mkdir /u01/arch
ls -ld /u01/arch

4.4.4 参数文件、密码文件

cd $ORACLE_HOME/dbs
ll

一个是静态参数文件(哑参)----- dummy.ora

一个source database的远程口令文件副本 --- orapworcl

4.4.5 创建数据库目录

mkdir /u01/app/oracle/oradata/ORCL
ll /u01/app/oracle/oradata/

4.5 source端和duplicate端之间的oracle net

  网络复制是通过source端和duplicate端之间的oracle net,必须保证两端的监听都能启动,duplicate端用的是静态监听,source端使用静态/动态都可

4.5.1 配置duplicate端的静态监听配置文件

lsnrctl stop
cd $ORACLE_HOME/network/admin
vi listener.ora

写入:

LISTENER=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=duplicate)(PORT=1521))
    )
  )
SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=orcl)
      (ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1)
      (SID_NAME=orcl)
    ) 
  )

lsnrctl start

Oracle服务名、实例名一样

4.5.2 两端都需配置tnsnames.ora

sourceduplicate两端的tnsnames.ora都必须配置,两端内容相同即可

cd $ORACLE_HOME/network/admin
vi tnsnames.ora

写入:

orcl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = source)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
aux =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = duplicate)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)      
    )
  )

4.5.3 测试网络

tnsping aux
sqlplus sys/oracle@aux as sysdba

tnsping orcl
sqlplus sys/oracle@orcl as sysdba

4.6 测试库使用哑参文件到nomount状态

duplicate端使用dummy参数文件启动实例到nomount状态

sqlplus / as sysdba
startup nomount pfile=$ORACLE_HOME/dbs/dummy.ora

4.7 rman复制

测试库开启log session记录会话日志方便以后查看

在duplicate端使用rman同时连接source和duplicate(两端都使用远程连接方式)

rman target sys/oracle@orcl auxiliary sys/oracle@aux

开始RMAN通过网络复制数据库

duplicate target database to orcl from active database spfile nofilenamecheck;

……

……

……

复制的新库和source库的DBID是不同的,但它们有相同的db_name和数据库文件路径

oracle@duplicate ~ $ rman target sys/oracle@orcl auxiliary sys/oracle@aux

Recovery Manager: Release 19.0.0.0.0 - Production on Mon Jul 12 02:14:45 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (DBID=1597307870)
connected to auxiliary database: AAA (not mounted)

RMAN> duplicate target database to orcl from active database spfile nofilenamecheck;

Starting Duplicate Db at 12-JUL-21
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=21 device type=DISK
current log archived

contents of Memory Script:
{
   restore clone from service  'orcl' spfile to 
 '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/spfileorcl.ora';
   sql clone "alter system set spfile= ''/u01/app/oracle/product/19.3.0/dbhome_1/dbs/spfileorcl.ora''";
}
executing Memory Script

Starting restore at 12-JUL-21
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: restoring SPFILE
output file name=/u01/app/oracle/product/19.3.0/dbhome_1/dbs/spfileorcl.ora
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
Finished restore at 12-JUL-21

sql statement: alter system set spfile= ''/u01/app/oracle/product/19.3.0/dbhome_1/dbs/spfileorcl.ora''

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''ORCL'' comment=
 ''duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

sql statement: alter system set  db_name =  ''ORCL'' comment= ''duplicate'' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    1660940992 bytes

Fixed Size                     8897216 bytes
Variable Size                956301312 bytes
Database Buffers             687865856 bytes
Redo Buffers                   7876608 bytes
duplicating Online logs to Oracle Managed File (OMF) location

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''ORCL'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   sql clone "alter system set  db_unique_name = 
 ''ORCL'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   restore clone from service  'orcl' primary controlfile;
   alter clone database mount;
}
executing Memory Script

sql statement: alter system set  db_name =  ''ORCL'' comment= ''Modified by RMAN duplicate'' scope=spfile

sql statement: alter system set  db_unique_name =  ''ORCL'' comment= ''Modified by RMAN duplicate'' scope=spfile

Oracle instance shut down

Oracle instance started

Total System Global Area    1660940992 bytes

Fixed Size                     8897216 bytes
Variable Size                956301312 bytes
Database Buffers             687865856 bytes
Redo Buffers                   7876608 bytes

Starting restore at 12-JUL-21
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=255 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:04
output file name=/u01/app/oracle/oradata/ORCL/control01.ctl
output file name=/u01/app/oracle/oradata/ORCL/control02.ctl
Finished restore at 12-JUL-21

database mounted
RMAN-05538: warning: implicitly using DB_FILE_NAME_CONVERT
RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/system01.dbf conflicts with a file used by the target database
RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/sysaux01.dbf conflicts with a file used by the target database
RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/undotbs01.dbf conflicts with a file used by the target database
RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/test_tbs01.dbf conflicts with a file used by the target database
RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/users01.dbf conflicts with a file used by the target database
RMAN-05158: WARNING: auxiliary (tempfile) file name /u01/app/oracle/oradata/ORCL/temp01.dbf conflicts with a file used by the target database

contents of Memory Script:
{
   set newname for datafile  1 to 
 "/u01/app/oracle/oradata/ORCL/system01.dbf";
   set newname for datafile  3 to 
 "/u01/app/oracle/oradata/ORCL/sysaux01.dbf";
   set newname for datafile  4 to 
 "/u01/app/oracle/oradata/ORCL/undotbs01.dbf";
   set newname for datafile  5 to 
 "/u01/app/oracle/oradata/ORCL/test_tbs01.dbf";
   set newname for datafile  7 to 
 "/u01/app/oracle/oradata/ORCL/users01.dbf";
   restore
   from  nonsparse   from service 
 'orcl'   clone database
   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 12-JUL-21
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/ORCL/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:03:25
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/ORCL/sysaux01.dbf

Message from syslogd@dba at Jul 12 02:27:56 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 21s! [vmtoolsd:699]

Message from syslogd@dba at Jul 12 02:27:56 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 22s! [in:imjournal:1028]
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:11:39
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/ORCL/undotbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:01:08
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/ORCL/test_tbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/ORCL/users01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 12-JUL-21

sql statement: alter system archive log current
current log archived

contents of Memory Script:
{
   restore clone force from service  'orcl' 
           archivelog from scn  3044539;
   switch clone datafile all;
}
executing Memory Script

Starting restore at 12-JUL-21
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=36
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using network backup set from service orcl
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=37
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 12-JUL-21

datafile 1 switched to datafile copy
input datafile copy RECID=2 STAMP=1077676435 file name=/u01/app/oracle/oradata/ORCL/system01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=3 STAMP=1077676435 file name=/u01/app/oracle/oradata/ORCL/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=4 STAMP=1077676435 file name=/u01/app/oracle/oradata/ORCL/undotbs01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=5 STAMP=1077676435 file name=/u01/app/oracle/oradata/ORCL/test_tbs01.dbf
datafile 7 switched to datafile copy
input datafile copy RECID=6 STAMP=1077676435 file name=/u01/app/oracle/oradata/ORCL/users01.dbf

contents of Memory Script:
{
   set until scn  3045285;
   recover
   clone database
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 12-JUL-21
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 36 is already on disk as file /u01/arch/arch_ORCL_1_36_1069527136.dbf
archived log for thread 1 with sequence 37 is already on disk as file /u01/arch/arch_ORCL_1_37_1069527136.dbf
archived log file name=/u01/arch/arch_ORCL_1_36_1069527136.dbf thread=1 sequence=36
archived log file name=/u01/arch/arch_ORCL_1_37_1069527136.dbf thread=1 sequence=37
media recovery complete, elapsed time: 00:00:04
Finished recover at 12-JUL-21

contents of Memory Script:
{
   delete clone force archivelog all;
}
executing Memory Script

released channel: ORA_AUX_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=274 device type=DISK
deleted archived log
archived log file name=/u01/arch/arch_ORCL_1_36_1069527136.dbf RECID=1 STAMP=1077676432
deleted archived log
archived log file name=/u01/arch/arch_ORCL_1_37_1069527136.dbf RECID=2 STAMP=1077676433
Deleted 2 objects

Oracle instance started

Total System Global Area    1660940992 bytes

Fixed Size                     8897216 bytes
Variable Size                956301312 bytes
Database Buffers             687865856 bytes
Redo Buffers                   7876608 bytes

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''ORCL'' comment=
 ''Reset to original value by RMAN'' scope=spfile";
   sql clone "alter system reset  db_unique_name scope=spfile";
}
executing Memory Script

sql statement: alter system set  db_name =  ''ORCL'' comment= ''Reset to original value by RMAN'' scope=spfile

sql statement: alter system reset  db_unique_name scope=spfile
Oracle instance started

Total System Global Area    1660940992 bytes

Fixed Size                     8897216 bytes
Variable Size                956301312 bytes
Database Buffers             687865856 bytes
Redo Buffers                   7876608 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "ORCL" RESETLOGS ARCHIVELOG 
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP     1  SIZE 200 M ,
  GROUP     2  SIZE 200 M ,
  GROUP     3  SIZE 200 M 
 DATAFILE
  '/u01/app/oracle/oradata/ORCL/system01.dbf'
 CHARACTER SET AL32UTF8


contents of Memory Script:
{
   set newname for tempfile  1 to 
 "/u01/app/oracle/oradata/ORCL/temp01.dbf";
   switch clone tempfile all;
   catalog clone datafilecopy  "/u01/app/oracle/oradata/ORCL/sysaux01.dbf", 
 "/u01/app/oracle/oradata/ORCL/undotbs01.dbf", 
 "/u01/app/oracle/oradata/ORCL/test_tbs01.dbf", 
 "/u01/app/oracle/oradata/ORCL/users01.dbf";
   switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/ORCL/temp01.dbf in control file

cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/ORCL/sysaux01.dbf RECID=1 STAMP=1077676480
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/ORCL/undotbs01.dbf RECID=2 STAMP=1077676480
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/ORCL/test_tbs01.dbf RECID=3 STAMP=1077676480
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/ORCL/users01.dbf RECID=4 STAMP=1077676480

datafile 3 switched to datafile copy
input datafile copy RECID=1 STAMP=1077676480 file name=/u01/app/oracle/oradata/ORCL/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=2 STAMP=1077676480 file name=/u01/app/oracle/oradata/ORCL/undotbs01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=3 STAMP=1077676480 file name=/u01/app/oracle/oradata/ORCL/test_tbs01.dbf
datafile 7 switched to datafile copy
input datafile copy RECID=4 STAMP=1077676480 file name=/u01/app/oracle/oradata/ORCL/users01.dbf

contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script

database opened
Finished Duplicate Db at 12-JUL-21
output log

4.8 查看验证

select instance_name,status from v$instance;
select * from scott.test;

数据库复制完成!!

posted @ 2021-07-11 19:31  chchcharlie、  阅读(1331)  评论(0编辑  收藏  举报