适用于

Oracle数据库 - 企业版 - 版本10.1.0.2至10.2.0.4 [10.1至10.2]
Oracle数据库 - 企业版 - 版本12.1.0.2至12.1.0.2 [12.1]
Oracle数据库 - 企业版 - 版本11.2.0.4至11.2.0.4 [11.2]
Oracle数据库 - 企业版 - 版本11.1.0.7至11.1.0.7 [11.1]

目标

以下说明描述了如何在不关闭主(生产)数据库的情况下,使用RMAN复制逐步创建物理备用数据库的过程。
Database Name :- prim
Primary db_unique_name :- prim
standby db_unique_name :- stdby
Primary Hostname :- raca.idc.oracle.com
standby Hostname :- core1.idc.oracle.com

解决方案

  1. 启用强制日志记录。
  2. 创建备用重做日志(SRL)。
  3. 在主数据库的参数文件中做出适当的更改。
  4. 备份数据库,包括数据文件、归档日志和控制文件,以便备用,并将备份复制到备用服务器。
  5. 为备用数据库创建参数文件。
  6. 从主数据库到备用数据库建立连接。
  7. 将备份移动到备用服务器。
  8. 和 9. 启动备用实例。
  9. 使用RMAN复制命令创建备用数据库。
  10. 创建SRL。
  11. 启动MRP(管理恢复进程)。
  12. 验证是否正确地将日志发送并应用到备用数据库。

步骤1:在主数据库上启用强制日志记录。

1
SQL> ALTER DATABASE FORCE LOGGING;

注意:如果不存在,请创建密码文件,同时检查是否已启用归档。

步骤2:在主数据库上配置备用重做日志。

1
2
3
4
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 3 '/u01/app/oracle/databases/prim/redo/log3a.log' size 50m;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/oracle/databases/prim/redo/log4a.log' size 50m;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 '/u01/app/oracle/databases/prim/redo/log5a.log' size 50m;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '/u01/app/oracle/databases/prim/redo/log6a.log' size 50m;

注意:
检查SRL(备用重做日志)的数量, (每个线程的最大日志文件数 + 1)* 最大线程数
SRL的大小应等于ORL(在线重做日志)的大小。

例如,如果主数据库每个线程有3个日志文件,且有2个线程,那么备用数据库上需要8个备用重做日志文件组。 验证是否已创建备用重做日志文件组。

1
SQL> SELECT GROUP#,ThREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG; 

步骤3:修改主数据库的初始化参数以配置Data Guard,具体如下:

1
2
3
4
5
6
7
8
SQL>alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(prim,stdby)';
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/databases/prim/redo/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=prim';
SQL>alter system set LOG_ARCHIVE_DEST_2='SERVICE=stdby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stdby';
SQL> alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE;
SQL>alter system set FAL_SERVER=stdby;
SQL>alter system set FAL_CLIENT=prim;
SQL>alter system set DB_FILE_NAME_CONVERT='/u01/app/oracle/databases/stdby/data/','/u01/app/oracle/databases/prim/data' scope=spfile;
SQL>alter system set LOG_FILE_NAME_CONVERT='/u01/app/oracle/databases/stdby/redo/','/u01/app/oracle/databases/prim/redo' scope=spfile;

步骤4:在主数据库上运行备份作业,通过连接到目标数据库和目录数据库(如果有的话)。

1
2
3
4
5
6
7
8
run
{
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/u01/app/oracle/databases/stage/%U';
backup archivelog all format '/u01/app/oracle/databases/stage/%U';
backup current controlfile for standby format '/u01/app/oracle/databases/stage/%U';
}

步骤5:在主数据库上创建参数文件,将其复制到备用数据库,并做出必要的更改。

1
SQL>create pfile='/u01/app/oracle/databases/prim/stage/initstdby.ora' from spfile;

步骤6:建立连接
在主数据库和备用数据库上都创建网络服务。
在prim服务器上,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prim =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =raca.idc.oracle.com )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = prim)
)
)

stdby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =core1.idc.oracle.com )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = stdby)
)
)

在standby服务器上,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prim =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =raca.idc.oracle.com )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = prim)
)
)

stdby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =core1.idc.oracle.com )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = stdby)
)
)

步骤7:将文件移动到备用服务器,
a. 在备用服务器上创建相同的目录并复制备份。 在备用服务器操作系统上,

1
2
$mkdir -p /u01/app/oracle/databases/stage/
[oracle@raca prim]$ scp /u01/app/oracle/databases/stage/* core1.idc.oracle.com:/u01/app/oracle/databases/stage/

b. 另外,我们可以将备份复制到备用服务器的不同目录。在备用服务器上,以主数据库为目标连接到RMAN,并以辅助实例身份登录,如果你的主数据库有目录数据库,那么以主数据库为目标、目录数据库和辅助实例身份连接。将这些备份片段编入目录,以便主数据库或目录数据库的控制文件知道备份信息。

步骤8:在备用服务器上对复制的initstdby.ora文件进行必要的更改。

1
2
3
4
5
6
7
8
9
10
11
12
13
db_name=prim
db_unique_name=stdby
log_archive_config='DG_CONFIG=(prim,stdby)'
log_archive_dest_1='LOCATION=/u01/app/oracle/databases/stdby/redo/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=stdby'
log_archive_dest_2='SERVICE=prim LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=prim'
log_archive_dest_state_1=ENABLE
db_file_name_convert='/u01/app/oracle/databases/prim/data/','/u01/app/oracle/databases/stdby/data/'
log_file_name_convert='/u01/app/oracle/databases/prim/redo/','/u01/app/oracle/databases/stdby/redo/'
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
standby_archive_dest='/u01/app/oracle/databases/stdby/arch/'
standby_file_management=AUTO
fal_client=stdby
fal_server=prim

步骤9:创建备用实例。
创建与主数据库相同的密码。或者,我们可以从主数据库复制密码文件并在备用数据库上重命名它。
例如,从主数据库复制密码文件,

1
scp /u01/app/oracle/dbs/opapwprim core1.idc.oracle.com:/u01/app/oracle/dbs/ 

在standby上,

1
$mv orapwprim orapwstdby

或者创建与主数据库相同的新密码,如下所示,
a. 对于UNIX,

1
2
$export ORACLE_SID
$orapwd file='$ORACLE_HOME/dbs/orapwstdby' password=sys entries=10;

对于Windows,

1
2
d:>set ORACLE_SID=stdby
d:>oradim -new -sid stdby -intpwd sys

b. 在备用服务器上创建必要的目录并启动辅助实例。

1
2
3
4
5
[oracle@core1 stdby]$ pwd
/u01/app/oracle/databases/stdby
[oracle@core1 stdby]$mkdir data redo oradata stage udump bdump cdump
SQL>create spfile from pfile='/u01/app/oracle/databases/stage/initstdby.ora';
SQL>start nomount;

步骤10:在备用服务器上使用RMAN复制创建备用数据库。
当在备用数据库的复制命令中指定’dorecover’时,请在目标数据库上执行归档日志切换,并运行复制命令。
例如:
对于primary,

1
sql> alter system archive log current;

在备用服务器上,通过连接字符串连接到目标数据库(即prim)和目录数据库(如果有的话),以及这个辅助数据库,操作如下,

1
$RMAN target /@prim catalog RMAN/RMAN@catdb auxiliary /

如果是no catalog数据库,

1
2
3
4
5
6
$RMAN target sys/<password>@prim auxiliary /
Recovery Manager: Release 10.2.0.1.0 - Production on Thu Mar 5 12:30:56 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: PRIM (DBID=3971986030)
connected to auxiliary database: PRIM (DBID=3971986030, not open)
RMAN> duplicate target database for standby dorecover;

注意:我们也可以使用不带dorecover子句的选项, 例如,

1
RMAN>duplicate target database for standby;

步骤11:创建SRL,

1
2
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 3 '/u01/app/oracle/databases/prim/redo/log3a.log' size 50m;
参考步骤2

步骤12:在备用数据库上启动MRP(管理恢复进程),

1
2
3
4
5
SQL> select name,db_unique_name,database_role from v$database;
NAME DB_UNIQUE_NAME DATABASE_ROLE
--------- ---------------- --------------
PRIM STDBY PHYSICAL STANDBY
SQL> alter database recover managed standby database disconnect;

步骤13:在主数据库上启用log_archive_dest_2,该参数用于将日志发送到备用服务器。

1
SQL>alter system set log_archive_dest_state_2=enable;

步骤14:检查备用数据库是否与主数据库同步,
A. 在备用数据库上检查v$archived_log视图,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
29 06-MAR-09 06-MAR-09
30 06-MAR-09 06-MAR-09
31 06-MAR-09 06-MAR-09
32 06-MAR-09 06-MAR-09
33 06-MAR-09 06-MAR-09
34 06-MAR-09 06-MAR-09
35 06-MAR-09 06-MAR-09
36 06-MAR-09 06-MAR-09
37 06-MAR-09 06-MAR-09
38 06-MAR-09 06-MAR-09
39 06-MAR-09 06-MAR-09

B. 在主数据库上执行日志切换,

1
SQL> ALTER SYSTEM SWITCH LOGFILE;

C. 在备库上执行,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
29 06-MAR-09 06-MAR-09
30 06-MAR-09 06-MAR-09
31 06-MAR-09 06-MAR-09
32 06-MAR-09 06-MAR-09
33 06-MAR-09 06-MAR-09
34 06-MAR-09 06-MAR-09
35 06-MAR-09 06-MAR-09
36 06-MAR-09 06-MAR-09
37 06-MAR-09 06-MAR-09
38 06-MAR-09 06-MAR-09
39 06-MAR-09 06-MAR-09
40 06-MAR-09 07-MAR-09

SQL> select sequence#,applied from v$archived_log order by sequence#;
SEQUENCE# APP
---------- ---
29 YES
30 YES
31 YES
32 YES
33 YES
34 YES
35 YES
36 YES
37 YES
38 YES
39 YES
40 YES