Oracle DataGuard 实施
1.环境准备
1.1 修改主备机hosts文件
vi /etc/hosts
128.160.11.84 wang
128.160.11.218 dg2
1.2 修改(添加)主备机listener.ora和tnsnames.ora文件
vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = softdb)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1/)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = wang)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
vi $ORACLE_HOME/network/admin/tnsnames.ora
SOFTPRI =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = wang)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = softdb)
)
)
SOFTSTD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dg2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = softdb)
)
)
1.3 确定主备机parameter/control/data/log/archivelog file 的路径
audit_file_dest='/u01/app/oracle/admin/softdb/adump'
1.4 设置主库强制写日志
SQL> select force_logging from v$database;
FOR
---
NO
SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FOR
---
YES
1.5 设置主库归档模式
SQL> archive log list;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/11.2.0/db_1//dbs/arch
Oldest online log sequence 175
Next log sequence to archive 177
Current log sequence 177
2. 产生用于建立Standby库的全备份集及控制文件
2.1 创建并修改主库参数文件pfile
SQL> shutdown immediate;
SQL> create pfile from spfile;
修改initsoftdb.ora
vi $ORACLE_HOME/dbs/initsoftdb.ora
DB_NAME=softdb
DB_UNIQUE_NAME=softpri
LOG_ARCHIVE_CONFIG='DG_CONFIG=(softpri,softstd)'
control_files='/oradata/softdb/softdb/control01.ctl','/oradata/softdb/softdb/control02.ctl'
LOG_ARCHIVE_DEST_1=
'LOCATION=/oradata/softarch/
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=softpri'
LOG_ARCHIVE_DEST_2=
'SERVICE=softstd ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=softstd'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=10
##Standby Role Initialization Parameters
FAL_SERVER=softstd
FAL_CLIENT=softpri
DB_FILE_NAME_CONVERT='softstd','softpri'
LOG_FILE_NAME_CONVERT=
'/oradata/softdb/softdb/','/oradata/softdb/softdb/'
STANDBY_FILE_MANAGEMENT=AUTO
生成spfile
SQL> create spfile from pfile;
2.2 在pri库创建std库需要的控制文件
SQL> startup mount;
SQL> alter database create standby controlfile as '/oradata/backup/control01.ctl';
SQL> alter database open;
2.3 在pri库创建standby redo logfile
SQL> select group#,bytes,thread# from v$log;
GROUP# BYTES THREAD#
---------- ---------- ----------
1 52428800 1
2 52428800 1
3 52428800 1
SQL> alter database add standby logfile group 4('/oradata/softdb/softdb/slog1.rdo') SIZE 500M;
SQL> alter database add standby logfile group 5('/oradata/softdb/softdb/slog2.rdo') SIZE 500M;
SQL> alter database add standby logfile group 6('/oradata/softdb/softdb/slog3.rdo') SIZE 500M;
SQL> alter database add standby logfile group 7('/oradata/softdb/softdb/slog4.rdo') SIZE 500M;
注:standby redo logfile的group比logfile多1个,单个logfile大小一致。
2.4 生成备份集
$ rman target sys/ora11g@softdb
connected to target database: SOFTDB (DBID=402771454)
run {
allocate channel d1 type disk;
backup database format '/oradata/backup/full_%d_%t_%s.bak'
plus archivelog format '/oradata/backup/arch_%d_%t_%s.log'
delete all input;
release channel d1;
}
或者
run {
allocate channel d1 type disk;
allocate channel d2 type disk;
crosscheck archivelog all;
sql 'alter system switch logfile';
backup full database noexclude filesperset 8 format '/oradata/backup/%d_full_%t_%s_%p.dbf';
sql 'alter system switch logfile';
backup format '/oradata/backup/%d_log_%t_%s_%e.log' archivelog all;
backup current controlfile format '/dbbk/control_%s_%p_%t_%T.ctl';
release channel d1;
release channel d2;
}
rman> list backup;
2.5 将主机softdb的密码文件、参数文件、备份文件拷贝到备机
scp -rp $ORACLE_HOME/dbs/orapwsoftdb oracle@128.160.11.218:$ORACLE_HOME/dbs/
scp -rp $ORACLE_HOME/dbs/initsoftdb.ora oracle@128.160.11.218:$ORACLE_HOME/dbs/initsoftdb.ora
scp -rp /oradata/backup/* oracle@128.160.11.218:/oradata/backup/
3. 备机恢复数据库
3.1 修改standby库pfile
vi $ORACLE_HOME/dbs/initsoftdb.ora
DB_NAME=softdb
DB_UNIQUE_NAME=softstd
LOG_ARCHIVE_CONFIG='DG_CONFIG=(softpri,softstd)'
control_files='/oradata/softdb/softdb/control01.ctl','/oradata/softdb/softdb/control02.ctl'
LOG_ARCHIVE_DEST_1=
'LOCATION=/oradata/softarch/
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=softstd'
LOG_ARCHIVE_DEST_2=
'SERVICE=softpri ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=softpri'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=10
FAL_SERVER=softpri
FAL_CLIENT=softstd
DB_FILE_NAME_CONVERT='softpri','softstd'
LOG_FILE_NAME_CONVERT=
'/oradata/softdb/softdb/','/oradata/softdb/softdb/'
STANDBY_FILE_MANAGEMENT=AUTO
3.2 在standby执行rman的恢复primary库的全库备份
3.2.1 修改后的pfile将standby库启动到nomount
sqlplus /nolog
conn sys/@softstd as sysdba
startup nomount pfile='$ORACLE_HOME/dbs/initsoftdb.ora';
3.2.2 RMAN恢复standby库
rman> connect target sys@softstd
rman> set DBID 402771454
rman> restore controlfile from '/oradata/backup/full_SOFTDB_863944285_11.bak';
rman> alter database mount;
rman> restore database;
rman> recover database;
3.3 建立主备库standby关系
3.3.1 备库修改后spfile启动
SQL> shutdown immediate;
SQL> create spfile from pfile='$ORACLE_HOME/dbs/initsoftdb.ora';
SQL> startup nomount;
3.3.2 恢复standby controlfile
rman> restore controlfile from '/oradata/backup/control01.ctl';
3.3.3 在standby数据库上添加standby redo log
SQL> alter database mount standby database;
SQL> alter database add standby logfile group 4('/oradata/softdb/softdb/slog1.rdo') SIZE 500M;
SQL> alter database add standby logfile group 5('/oradata/softdb/softdb/slog2.rdo') SIZE 500M;
SQL> alter database add standby logfile group 6('/oradata/softdb/softdb/slog3.rdo') SIZE 500M;
SQL> alter database add standby logfile group 7('/oradata/softdb/softdb/slog4.rdo') SIZE 500M;
3.3.4 把standby数据库启动为恢复模式
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
4. 确保standby库正常接收redolog和Applying
4.1 standby database, query the V$ARCHIVED_LOG 确认存在的archived logfile
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME
---------- ------------------- -------------------
184 2014-11-17 22:00:31 2014-11-18 00:12:53
185 2014-11-18 00:12:53 2014-11-18 06:55:59
186 2014-11-18 06:55:59 2014-11-18 08:30:56
187 2014-11-18 08:30:56 2014-11-18 08:31:27
188 2014-11-18 08:31:27 2014-11-18 13:58:10
4.2 Force a log switch on primary database (to archive current logfile)
SQL> ALTER SYSTEM SWITCH LOGFILE;
4.3 确保standby库已经Archive and Apply新redolog
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME APPLIED
---------- ------------------- ------------------- ------------------
184 2014-11-17 22:00:31 2014-11-18 00:12:53 YES
185 2014-11-18 00:12:53 2014-11-18 06:55:59 YES
186 2014-11-18 06:55:59 2014-11-18 08:30:56 YES
187 2014-11-18 08:30:56 2014-11-18 08:31:27 YES
188 2014-11-18 08:31:27 2014-11-18 13:58:10 YES
189 2014-11-18 13:58:10 2014-11-18 14:08:33 IN-MEMORY
1.环境准备
1.1 修改主备机hosts文件
vi /etc/hosts
128.160.11.84 wang
128.160.11.218 dg2
1.2 修改(添加)主备机listener.ora和tnsnames.ora文件
vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = softdb)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1/)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = wang)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
vi $ORACLE_HOME/network/admin/tnsnames.ora
SOFTPRI =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = wang)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = softdb)
)
)
SOFTSTD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dg2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = softdb)
)
)
1.3 确定主备机parameter/control/data/log/archivelog file 的路径
audit_file_dest='/u01/app/oracle/admin/softdb/adump'
1.4 设置主库强制写日志
SQL> select force_logging from v$database;
FOR
---
NO
SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FOR
---
YES
1.5 设置主库归档模式
SQL> archive log list;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/11.2.0/db_1//dbs/arch
Oldest online log sequence 175
Next log sequence to archive 177
Current log sequence 177
2. 产生用于建立Standby库的全备份集及控制文件
2.1 创建并修改主库参数文件pfile
SQL> shutdown immediate;
SQL> create pfile from spfile;
修改initsoftdb.ora
vi $ORACLE_HOME/dbs/initsoftdb.ora
DB_NAME=softdb
DB_UNIQUE_NAME=softpri
LOG_ARCHIVE_CONFIG='DG_CONFIG=(softpri,softstd)'
control_files='/oradata/softdb/softdb/control01.ctl','/oradata/softdb/softdb/control02.ctl'
LOG_ARCHIVE_DEST_1=
'LOCATION=/oradata/softarch/
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=softpri'
LOG_ARCHIVE_DEST_2=
'SERVICE=softstd ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=softstd'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=10
##Standby Role Initialization Parameters
FAL_SERVER=softstd
FAL_CLIENT=softpri
DB_FILE_NAME_CONVERT='softstd','softpri'
LOG_FILE_NAME_CONVERT=
'/oradata/softdb/softdb/','/oradata/softdb/softdb/'
STANDBY_FILE_MANAGEMENT=AUTO
生成spfile
SQL> create spfile from pfile;
2.2 在pri库创建std库需要的控制文件
SQL> startup mount;
SQL> alter database create standby controlfile as '/oradata/backup/control01.ctl';
SQL> alter database open;
2.3 在pri库创建standby redo logfile
SQL> select group#,bytes,thread# from v$log;
GROUP# BYTES THREAD#
---------- ---------- ----------
1 52428800 1
2 52428800 1
3 52428800 1
SQL> alter database add standby logfile group 4('/oradata/softdb/softdb/slog1.rdo') SIZE 500M;
SQL> alter database add standby logfile group 5('/oradata/softdb/softdb/slog2.rdo') SIZE 500M;
SQL> alter database add standby logfile group 6('/oradata/softdb/softdb/slog3.rdo') SIZE 500M;
SQL> alter database add standby logfile group 7('/oradata/softdb/softdb/slog4.rdo') SIZE 500M;
注:standby redo logfile的group比logfile多1个,单个logfile大小一致。
2.4 生成备份集
$ rman target sys/ora11g@softdb
connected to target database: SOFTDB (DBID=402771454)
run {
allocate channel d1 type disk;
backup database format '/oradata/backup/full_%d_%t_%s.bak'
plus archivelog format '/oradata/backup/arch_%d_%t_%s.log'
delete all input;
release channel d1;
}
或者
run {
allocate channel d1 type disk;
allocate channel d2 type disk;
crosscheck archivelog all;
sql 'alter system switch logfile';
backup full database noexclude filesperset 8 format '/oradata/backup/%d_full_%t_%s_%p.dbf';
sql 'alter system switch logfile';
backup format '/oradata/backup/%d_log_%t_%s_%e.log' archivelog all;
backup current controlfile format '/dbbk/control_%s_%p_%t_%T.ctl';
release channel d1;
release channel d2;
}
rman> list backup;
2.5 将主机softdb的密码文件、参数文件、备份文件拷贝到备机
scp -rp $ORACLE_HOME/dbs/orapwsoftdb oracle@128.160.11.218:$ORACLE_HOME/dbs/
scp -rp $ORACLE_HOME/dbs/initsoftdb.ora oracle@128.160.11.218:$ORACLE_HOME/dbs/initsoftdb.ora
scp -rp /oradata/backup/* oracle@128.160.11.218:/oradata/backup/
3. 备机恢复数据库
3.1 修改standby库pfile
vi $ORACLE_HOME/dbs/initsoftdb.ora
DB_NAME=softdb
DB_UNIQUE_NAME=softstd
LOG_ARCHIVE_CONFIG='DG_CONFIG=(softpri,softstd)'
control_files='/oradata/softdb/softdb/control01.ctl','/oradata/softdb/softdb/control02.ctl'
LOG_ARCHIVE_DEST_1=
'LOCATION=/oradata/softarch/
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=softstd'
LOG_ARCHIVE_DEST_2=
'SERVICE=softpri ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=softpri'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=10
FAL_SERVER=softpri
FAL_CLIENT=softstd
DB_FILE_NAME_CONVERT='softpri','softstd'
LOG_FILE_NAME_CONVERT=
'/oradata/softdb/softdb/','/oradata/softdb/softdb/'
STANDBY_FILE_MANAGEMENT=AUTO
3.2 在standby执行rman的恢复primary库的全库备份
3.2.1 修改后的pfile将standby库启动到nomount
sqlplus /nolog
conn sys/@softstd as sysdba
startup nomount pfile='$ORACLE_HOME/dbs/initsoftdb.ora';
3.2.2 RMAN恢复standby库
rman> connect target sys@softstd
rman> set DBID 402771454
rman> restore controlfile from '/oradata/backup/full_SOFTDB_863944285_11.bak';
rman> alter database mount;
rman> restore database;
rman> recover database;
3.3 建立主备库standby关系
3.3.1 备库修改后spfile启动
SQL> shutdown immediate;
SQL> create spfile from pfile='$ORACLE_HOME/dbs/initsoftdb.ora';
SQL> startup nomount;
3.3.2 恢复standby controlfile
rman> restore controlfile from '/oradata/backup/control01.ctl';
3.3.3 在standby数据库上添加standby redo log
SQL> alter database mount standby database;
SQL> alter database add standby logfile group 4('/oradata/softdb/softdb/slog1.rdo') SIZE 500M;
SQL> alter database add standby logfile group 5('/oradata/softdb/softdb/slog2.rdo') SIZE 500M;
SQL> alter database add standby logfile group 6('/oradata/softdb/softdb/slog3.rdo') SIZE 500M;
SQL> alter database add standby logfile group 7('/oradata/softdb/softdb/slog4.rdo') SIZE 500M;
3.3.4 把standby数据库启动为恢复模式
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
4. 确保standby库正常接收redolog和Applying
4.1 standby database, query the V$ARCHIVED_LOG 确认存在的archived logfile
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME
---------- ------------------- -------------------
184 2014-11-17 22:00:31 2014-11-18 00:12:53
185 2014-11-18 00:12:53 2014-11-18 06:55:59
186 2014-11-18 06:55:59 2014-11-18 08:30:56
187 2014-11-18 08:30:56 2014-11-18 08:31:27
188 2014-11-18 08:31:27 2014-11-18 13:58:10
4.2 Force a log switch on primary database (to archive current logfile)
SQL> ALTER SYSTEM SWITCH LOGFILE;
4.3 确保standby库已经Archive and Apply新redolog
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME APPLIED
---------- ------------------- ------------------- ------------------
184 2014-11-17 22:00:31 2014-11-18 00:12:53 YES
185 2014-11-18 00:12:53 2014-11-18 06:55:59 YES
186 2014-11-18 06:55:59 2014-11-18 08:30:56 YES
187 2014-11-18 08:30:56 2014-11-18 08:31:27 YES
188 2014-11-18 08:31:27 2014-11-18 13:58:10 YES
189 2014-11-18 13:58:10 2014-11-18 14:08:33 IN-MEMORY