本次实验是在DG的基础下实现的
DG搭建之最佳实践(基本参数配置,且本次配置不考虑切换)
生产端:
alter system set log_archive_dest_1='LOCATION=+data/xuh/archivelog' scope=both;
alter system set log_archive_dest_2='SERVICE=xuhdg arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=xuh' scope=both;
alter system set log_archive_dest_state_1=ENABLE scope=both;
alter system set log_archive_dest_state_2=ENABLE scope=both;
alter system set db_file_name_convert='+data/xuh/datafile','/oracle/app/xuh','+data/xuh/tempfile','/oracle/app/xuh' scope=spfile;
alter system set log_file_name_convert='+data/xuh','/oracle/app/xuh' scope=both;
DG端:
*.audit_file_dest='/oracle/app/admin/xuh/adump'
*.background_dump_dest='/oracle/app/admin/xuh/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/oracle/app/xuh/control01.ctl'
*.core_dump_dest='/oracle/app/admin/xuh/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_file_name_convert='+data/xuh/datafile','/oracle/app/xuh','+data/xuh/tempfile','/oracle/app/xuh'
*.db_name='xuh'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=xuhXDB)'
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION=/oracle/arch'
*.log_archive_dest_2='SERVICE=xuh arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=xuh'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_file_name_convert='+data/xuh','/oracle/app/xuh'
*.open_cursors=300
*.pga_aggregate_target=93323264
*.processes=150
*.remote_login_passwordfile='exclusive'
*.sga_target=281018368
*.undo_management='AUTO'
undo_tablespace='UNDOTBS1'
*.user_dump_dest='/oracle/app/admin/xuh/udump'
搭建结束后,生产端alter system archive log current;对比生产端和DG端max(sequence#),验证select max(sequence#),thread# from v$archived_log group by thread#;
在确保生产端和DG端归档日志完全同步后,进行如下操作
由于生产端是10gRAC,数据库文件均放在ASM磁盘组中,不能将联机日志文件直接scp或者ftp到DG端。因此,新建online redo log,并且新建的联机日志放在文件系统上,删除旧联机日志文件
SQL> select a.group#,a.thread#,b.member from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER
---------- ---------- ------------------------------
1 1 +DATA/xuh/redo01.log
2 1 +DATA/xuh/redo02.log
3 2 +DATA/xuh/redo03.log
4 2 +DATA/xuh/redo04.log
SQL> alter database add logfile thread 1 group 5 ('/oracle/app/xuh/redo05.log') size 50M;
Database altered.
SQL> alter database add logfile thread 1 group 6 ('/oracle/app/xuh/redo06.log') size 50M;
Database altered.
SQL> alter database add logfile thread 2 group 7 ('/oracle/app/xuh/redo07.log') size 50M;
Database altered.
SQL> alter database add logfile thread 2 group 8 ('/oracle/app/xuh/redo08.log') size 50M;
Database altered.
SQL> select a.group#,a.thread#,b.member from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER
---------- ---------- ------------------------------
1 1 +DATA/xuh/redo01.log
2 1 +DATA/xuh/redo02.log
3 2 +DATA/xuh/redo03.log
4 2 +DATA/xuh/redo04.log
5 1 /oracle/app/xuh/redo05.log
6 1 /oracle/app/xuh/redo06.log
7 2 /oracle/app/xuh/redo07.log
8 2 /oracle/app/xuh/redo08.log
8 rows selected.
SQL> select a.group#,a.thread#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log INACTIVE
2 1 +DATA/xuh/redo02.log CURRENT
3 2 +DATA/xuh/redo03.log CURRENT
4 2 +DATA/xuh/redo04.log INACTIVE
5 1 /oracle/app/xuh/redo05.log UNUSED
6 1 /oracle/app/xuh/redo06.log UNUSED
7 2 /oracle/app/xuh/redo07.log UNUSED
8 2 /oracle/app/xuh/redo08.log UNUSED
8 rows selected.
SQL> select a.group#,a.thread#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log INACTIVE
2 1 +DATA/xuh/redo02.log ACTIVE
3 2 +DATA/xuh/redo03.log INACTIVE
4 2 +DATA/xuh/redo04.log INACTIVE
5 1 /oracle/app/xuh/redo05.log CURRENT
6 1 /oracle/app/xuh/redo06.log UNUSED
7 2 /oracle/app/xuh/redo07.log CURRENT
8 2 /oracle/app/xuh/redo08.log UNUSED
8 rows selected.
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log INACTIVE
2 1 +DATA/xuh/redo02.log ACTIVE
3 2 +DATA/xuh/redo03.log INACTIVE
4 2 +DATA/xuh/redo04.log INACTIVE
5 1 /oracle/app/xuh/redo05.log ACTIVE
6 1 /oracle/app/xuh/redo06.log CURRENT
7 2 /oracle/app/xuh/redo07.log INACTIVE
8 2 /oracle/app/xuh/redo08.log CURRENT
8 rows selected.
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log CURRENT
2 1 +DATA/xuh/redo02.log ACTIVE
3 2 +DATA/xuh/redo03.log INACTIVE
4 2 +DATA/xuh/redo04.log CURRENT
5 1 /oracle/app/xuh/redo05.log ACTIVE
6 1 /oracle/app/xuh/redo06.log ACTIVE
7 2 /oracle/app/xuh/redo07.log INACTIVE
8 2 /oracle/app/xuh/redo08.log INACTIVE
8 rows selected.
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log ACTIVE
2 1 +DATA/xuh/redo02.log CURRENT
3 2 +DATA/xuh/redo03.log CURRENT
4 2 +DATA/xuh/redo04.log INACTIVE
5 1 /oracle/app/xuh/redo05.log ACTIVE
6 1 /oracle/app/xuh/redo06.log ACTIVE
7 2 /oracle/app/xuh/redo07.log INACTIVE
8 2 /oracle/app/xuh/redo08.log INACTIVE
8 rows selected.
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log ACTIVE
2 1 +DATA/xuh/redo02.log ACTIVE
3 2 +DATA/xuh/redo03.log INACTIVE
4 2 +DATA/xuh/redo04.log INACTIVE
5 1 /oracle/app/xuh/redo05.log CURRENT
6 1 /oracle/app/xuh/redo06.log INACTIVE
7 2 /oracle/app/xuh/redo07.log CURRENT
8 2 /oracle/app/xuh/redo08.log INACTIVE
8 rows selected.
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log ACTIVE
2 1 +DATA/xuh/redo02.log ACTIVE
3 2 +DATA/xuh/redo03.log INACTIVE
4 2 +DATA/xuh/redo04.log INACTIVE
5 1 /oracle/app/xuh/redo05.log ACTIVE
6 1 /oracle/app/xuh/redo06.log CURRENT
7 2 /oracle/app/xuh/redo07.log INACTIVE
8 2 /oracle/app/xuh/redo08.log CURRENT
8 rows selected.
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log CURRENT
2 1 +DATA/xuh/redo02.log INACTIVE
3 2 +DATA/xuh/redo03.log INACTIVE
4 2 +DATA/xuh/redo04.log CURRENT
5 1 /oracle/app/xuh/redo05.log INACTIVE
6 1 /oracle/app/xuh/redo06.log INACTIVE
7 2 /oracle/app/xuh/redo07.log INACTIVE
8 2 /oracle/app/xuh/redo08.log INACTIVE
8 rows selected.
SQL> alter database drop logfile '+DATA/xuh/redo02.log';
Database altered.
SQL> alter database drop logfile '+DATA/xuh/redo03.log';
Database altered.
SQL> select a.group#,a.thread#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log ACTIVE
4 2 +DATA/xuh/redo04.log INACTIVE
5 1 /oracle/app/xuh/redo05.log CURRENT
6 1 /oracle/app/xuh/redo06.log INACTIVE
7 2 /oracle/app/xuh/redo07.log CURRENT
8 2 /oracle/app/xuh/redo08.log INACTIVE
6 rows selected.
SQL> alter database drop logfile '+DATA/xuh/redo04.log';
Database altered.
SQL> select a.group#,a.thread#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log ACTIVE
5 1 /oracle/app/xuh/redo05.log ACTIVE
6 1 /oracle/app/xuh/redo06.log CURRENT
7 2 /oracle/app/xuh/redo07.log INACTIVE
8 2 /oracle/app/xuh/redo08.log CURRENT
SQL> select a.group#,a.thread#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log CURRENT
5 1 /oracle/app/xuh/redo05.log ACTIVE
6 1 /oracle/app/xuh/redo06.log ACTIVE
7 2 /oracle/app/xuh/redo07.log CURRENT
8 2 /oracle/app/xuh/redo08.log INACTIVE
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log ACTIVE
5 1 /oracle/app/xuh/redo05.log CURRENT
6 1 /oracle/app/xuh/redo06.log INACTIVE
7 2 /oracle/app/xuh/redo07.log INACTIVE
8 2 /oracle/app/xuh/redo08.log CURRENT
SQL> /
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
1 1 +DATA/xuh/redo01.log INACTIVE
5 1 /oracle/app/xuh/redo05.log INACTIVE
6 1 /oracle/app/xuh/redo06.log CURRENT
7 2 /oracle/app/xuh/redo07.log CURRENT
8 2 /oracle/app/xuh/redo08.log INACTIVE
SQL> alter database drop logfile '+DATA/xuh/redo01.log';
Database altered.
SQL> select a.group#,a.thread#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group#;
GROUP# THREAD# MEMBER STATUS
---------- ---------- ------------------------------ ----------------
5 1 /oracle/app/xuh/redo05.log INACTIVE
6 1 /oracle/app/xuh/redo06.log CURRENT
7 2 /oracle/app/xuh/redo07.log CURRENT
8 2 /oracle/app/xuh/redo08.log INACTIVE
SQL>
日志文件切换到文件系统之后,将控制文件创建到文件系统上(原控制文件在ASM磁盘组上)
SQL> select name,status from v$controlfile;
NAME STATUS
------------------------------ -------
+DATA/xuh/control01.ctl
+DATA/xuh/control02.ctl
+DATA/xuh/control03.ctl
SQL> alter system set control_files='/oracle/app/xuh/control01.ctl','/oracle/app/xuh/control02.ctl','/oracle/app/xuh/control03.ctl' scope=spfile;
System altered.
[oracle@node1 ~]$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Tue Jul 28 00:40:29 2015
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database (not started)
RMAN> startup nomount;
Oracle instance started
Total System Global Area 281018368 bytes
Fixed Size 2020192 bytes
Variable Size 117443744 bytes
Database Buffers 159383552 bytes
Redo Buffers 2170880 bytes
RMAN> restore controlfile from '+DATA/xuh/control01.ctl';
Starting restore at 28-JUL-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=147 instance=xuh1 devtype=DISK
channel ORA_DISK_1: copied control file copy
output filename=/oracle/app/xuh/control01.ctl
output filename=/oracle/app/xuh/control02.ctl
output filename=/oracle/app/xuh/control03.ctl
Finished restore at 28-JUL-15
RMAN> exit
Recovery Manager complete.
到这里,控制文件以及联机日志文件都在文件系统上,可以用scp传到DG端指定位置
[oracle@standby xuh]$ ls
control01.ctl redo05.log redo07.log sysaux.479.886185005 undotbs1.480.886185001 users.476.886185017
control01.ctl.bak redo06.log redo08.log system.481.886184991 undotbs2.477.886185015
[oracle@standby xuh]$ pwd
/oracle/app/xuh
[oracle@standby xuh]$
这边需要注意,scp过来的控制文件中的logfile已经修改到文件系统上,现在只需将datafile的路径重新rename下,从ASM磁盘组指向新的文件系统位置
[oracle@standby ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jul 28 01:02:26 2015
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 281018368 bytes
Fixed Size 2020192 bytes
Variable Size 88083616 bytes
Database Buffers 188743680 bytes
Redo Buffers 2170880 bytes
Database mounted.
SQL> alter database rename file '+DATA/xuh/datafile/system.481.886184991' to '/oracle/app/xuh/system.481.886184991';
Database altered.
SQL> alter database rename file '+DATA/xuh/datafile/undotbs1.480.886185001' to '/oracle/app/xuh/undotbs1.480.886185001';
Database altered.
SQL> alter database rename file '+DATA/xuh/datafile/sysaux.479.886185005' to '/oracle/app/xuh/sysaux.479.886185005';
Database altered.
SQL> alter database rename file '+DATA/xuh/datafile/undotbs2.477.886185015' to '/oracle/app/xuh/undotbs2.477.886185015';
Database altered.
SQL> alter database rename file '+DATA/xuh/datafile/users.476.886185017' to '/oracle/app/xuh/users.476.886185017';
Database altered.
SQL> recover database;
ORA-00279: change 502365 generated at 07/27/2015 21:25:55 needed for thread 1
ORA-00289: suggestion : /oracle/arch/1_30_886184975.dbf
ORA-00280: change 502365 for thread 1 is in sequence #30
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 502365 generated at 07/27/2015 18:54:40 needed for thread 2
ORA-00289: suggestion : /oracle/arch/2_1_886184975.dbf
ORA-00280: change 502365 for thread 2 is in sequence #1
.
.
.
这边省略归档日志的应用
.
.
.
ORA-00279: change 538963 generated at 07/28/2015 00:21:10 needed for thread 2
ORA-00289: suggestion : /oracle/arch/2_25_886184975.dbf
ORA-00280: change 538963 for thread 2 is in sequence #25
ORA-00278: log file '/oracle/arch/2_24_886184975.dbf' no longer needed for this
recovery
ORA-00279: change 538969 generated at 07/28/2015 00:21:22 needed for thread 1
ORA-00289: suggestion : /oracle/arch/1_59_886184975.dbf
ORA-00280: change 538969 for thread 1 is in sequence #59
ORA-00278: log file '/oracle/arch/1_58_886184975.dbf' no longer needed for this
recovery
ORA-00279: change 538972 generated at 07/28/2015 00:21:22 needed for thread 2
ORA-00289: suggestion : /oracle/arch/2_26_886184975.dbf
ORA-00280: change 538972 for thread 2 is in sequence #26
ORA-00278: log file '/oracle/arch/2_25_886184975.dbf' no longer needed for this
recovery
Log applied.
Media recovery complete.
SQL> alter database open;
Database altered.
SQL> select open_mode,log_mode from v$database;
OPEN_MODE LOG_MODE
---------- ------------
READ WRITE ARCHIVELOG
到此,已经能正常实现DG端数据库正常open了。本方法不用switchover或者failover,同样能使得数据库正常open,零数据丢失!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30310891/viewspace-1753385/
,如需转载,请注明出处,否则将追究法律责任。