Oracle19c 如何用rman duplicate 克隆一个数据库。
首先克隆有两种方法,一种是Backup-Based,一种是Active方式。官网文档链接
https://docs.oracle.com/database/121/BRADV/rcmdupdb.htm#BRADV010
在这里我用的是ACTIVE方式,这种方式无需创建备份,可以直接进行克隆。
(备份与ACTIVE的主要不同就是备份需要先生成备份,再把它COPY到目标机器上。--关于这个,有空再试试看)
步骤如下:
我用的机器oracle19c源库(IP:192.168.56.110),oracle19c-toclone目标库(192.168.56.111)
1)在目标库用DBCA创建一个空的database,实例名为newdb(非容器)。
因为我的源库是有HR DATABASE的,你的空库可以不安装HR,这样克隆后也好比较。
2) 配置host和监听,记得目标库一定需要配置静态监听,如此就可以在数据库没有打开的时候RMAN也能够连接了。
2.1)目标库hosts文件
[oracle@oracle19c-toclone dbs]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.111 oracle19c-toclone
192.168.56.110 oracle19c
2.2)目标库listner文件
[oracle@oracle19c-toclone admin]$ pwd
/u01/app/oracle/product/19c/db_1/network/admin
[oracle@oracle19c-toclone admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/19c/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c-toclone)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = newdb)
(ORACLE_HOME = /u01/app/oracle/product/19c/db_1)
(SID_NAME = newdb)
)
)
2.3)源库hosts文件
[oracle@oracle19c dbs]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.110 oracle19c
192.168.56.111 oracle19c-toclone
2.4)源库listner文件(可以不用变)
因为RMAN是在源库执行,通过源库连接目标库,所以可以不配置静态监听。
更重要的是,因为源库在archive log打开的情况下,是可以在数据库open状态下进行克隆的。
2.5)源库tnsname.ora文件,加上如下两个实例。
源库别名为PROD(当然,这个你也可以不需要,直接用ORCL也可以), 目标库别名TOCLONE
TOCLONE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c-toclone)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = newdb)
)
)
PROD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle19c)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
3)复制前的准备工作
3.1)在源库,编辑pfile文件(这个initorcl.ora实际上就是默认生成的pfile)
(如果文件没有的话,你可以在源库database open的情况下,执行create pfile from memory创建一个。注:还有其它方法)
[oracle@oracle19c dbs]$ pwd
/u01/app/oracle/product/19c/db_1/dbs
做如下修改,修改control_files路径为新的实例, db_name。
还有最重要的是db_file_name_convert,log_file_name_convert。
因为源库和目标库的实例名不同(如果完全一样,应该不用加convert呢),所以需要转换。
*.control_files='/u01/app/oracle/oradata/NEWDB/control01.ctl'#Restore Controlfile
*.db_name='newdb'
*.db_recovery_file_dest_size=5368709120
*.db_recovery_file_dest='/u01/app/oracle/fra'
*.db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/NEWDB/'
*.log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/NEWDB/'
3.2)复制密码文件,和spfile到目标库
scp initorcl.ora 192.168.56.111:/u01/app/oracle/product/19c/db_1/dbs/initnewdb.ora
scp orapworcl 192.168.56.111:/u01/app/oracle/product/19c/db_1/dbs/orapwnewdb
4)用pfile启动目标库
(目标库需要在NOMOUNT方式下进行克隆。注:这也是为何前面需要静态注册的原因。不然,实例未打开,客户端是无法连接的。)
startup nomount pfile='/u01/app/oracle/product/19c/db_1/dbs/initnewdb.ora';
5)连接RMAN进行复制
4.1)连接target(源库)和anxiliary(目标库)
rman target sys/Yang1u2u@prod auxiliary sys/Yang1u2u@toclone
4.2)执行复制命令。nofilenamecheck参数表示复制过去,文件是用同样的名字。如果不加,会报错。
RMAN> duplicate target database to newdb from active database nofilenamecheck;
Starting Duplicate Db at 03-JUN-21
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=39 device type=DISK
allocated channel: ORA_AUX_DISK_2
channel ORA_AUX_DISK_2: SID=40 device type=DISK
。。。
database opened
Cannot remove created server parameter file
Finished Duplicate Db at 03-JUN-21
6)检查目标库,及后续工作
RMAN复制完后,会自动OPEN目标库。此时,你可以用sqlplus重新连接。
[oracle@oracle19c-toclone admin]$ sqlplus / as sysdba
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> select count(*) from hr.employees;
COUNT(*)
----------
107
6.2)最后,你可以在目标库手动删除pfile里面的convert行。再用pfile启动。
启动完后(create spfile from memory),生成spfile。
下次正常启动,你就不再需要pfile了。