本帖最后由 selectshen 于 2014-10-28 16:55 编辑
测试DB信息:
--DB1
os:rhel5.6 ip:123.0.0.52 oracle version:10.2.0.4 sid:rh10g03 db_role:primary
--DB2
os:rhel5.6 ip:123.0.0.54 oracle version:10.2.0.4 sid:rh10g02 db_role:standby
先做一个简单的switchover
-----------------DB1
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
----上条语句的结果如果是to_standby,切换就不需要加with session shutdown
SQL> alter database commit to switchover to physical standby with session shutdown;
Database altered.
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 599785472 bytes
Fixed Size 2085776 bytes
Variable Size 293604464 bytes
Database Buffers 297795584 bytes
Redo Buffers 6299648 bytes
Database mounted.
SQL> alter database recover managed standby database disconnect from session ;
Database altered.
---------------DB2
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
SQL> alter database commit to switchover to primary;
Database altered.
SQL> alter database open;
Database altered.
SQL> alter system switch logfile;
System altered.
SQL> /
System altered.
--如果你的没有出什么错的话,应该可以看到,就表示已经switchover成功了.
---------------DB2
SQL> select process,thread#,sequence#,status from v$managed_standby;
PROCESS THREAD# SEQUENCE# STATUS
--------- ---------- ---------- ------------
ARCH 1 281 CLOSING
ARCH 1 282 CLOSING
LNS 1 283 WRITING
---------------DB1
SQL> select process,thread#,sequence#,status from v$managed_standby;
PROCESS THREAD# SEQUENCE# STATUS
--------- ---------- ---------- ------------
ARCH 0 0 CONNECTED
ARCH 1 280 CLOSING
MRP0 1 283 WAIT_FOR_LOG
RFS 1 283 IDLE
RFS 0 0 IDLE
顺便说一下failover,failover时是不用管DB1了,因為假设或事实DB1已经掛了,
只需在DB2上alter database recover managed standby database finish force;应用日誌,
然后alter database commit to switchover to primary;就行了.
上面的很简单,但生產环境可能就不只是这样了.如果我们只是简单的switchover,客户端的
tnsnames里存的可是之前的IP和service_name,此时客户端就需要修改tnsnames里对应的IP和
service_name,如果是B/s程序还好,直接的C/S程序每个客户端都要修,有时甚至已经不现实.
所以常常会在switchover之后,还要修改对应的IP和service_name.最近產生了一个个人觉得比较好
的方案,就是我们只需要修改IP就可以了,不需要修改service_name,而是在建dataguard时就加
一个共有的service_name,客户端连接都通过这个service_name,而主从之间的传输可用原本默认
的service_name(常常就是各自的sid).新加的service_name可以通过静态註册或动态註册都可以.
这样可以有效避免,常规方式中,客户端连接的service_name就是primary默认的service_name,
当switchover后,如果在要在新的primary上能让用户连接,就要加这个service_name.但如果加了这个
service_name,原有的主从就会因為名称的冲突无法传输.这时的解决办法可以是重建standby或是修改
sid等,就比较复杂了.
以下测试修改IP:
--假设客户端连接的IP:123.0.0.52 service_name:rh10g 这里的service_name已经是两边有加的service_name
通过DB1和DB2在 listener.ora中加入:
(SID_DESC =
(SID_NAME = rh10g03)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(global_dbname = rh10g)
用于静态註册.或是通过在DB1和DB2中执行:
SQL> alter system set service_names=rh10g;
用于动态註册.
--------------------DB1
--需要先把DB1的IP改為一个中间IP:123.0.0.55,避免修改IP后冲突
--修改里面IP对应的主机名
vi /etc/hosts
123.0.0.55 srhel10g03
--修改IP為中间IP123.0.0.55
vi /etc/sysconfig/network-scripts/ifcfg-eth0
--修改tnsnames.ora
RH10G02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.52)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g02)
)
)
RH10G03 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.54)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g03)
)
)
--重啟网路
service network restart
---------------------------DB2
--修改里面IP对应的主机名
vi /etc/hosts
123.0.0.52 srhel10g02
--修改IP
vi /etc/sysconfig/network-scripts/ifcfg-eth0
--修改tnsnames.ora
RH10G02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.52)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g02)
)
)
RH10G03 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.54)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g03)
)
)
--重啟网路
service network restart
-------------------------DB1
--修改里面IP对应的主机名
vi /etc/hosts
123.0.0.54 srhel10g03
----修改正确IP 123.0.0.54
vi /etc/sysconfig/network-scripts/ifcfg-eth0
--重啟网路
service network restart
-------------------------DB2
--网路修改完后,在DB2上切几次日誌检测是否正常
上面是switchover的方法,如果是failover那就简单了,直接通过静态或动态註册加入原primary的service_name,
然后修改IP就可以了.
--dataguard的几个参数:
log_archive_config='DG_CONFIG=(orcl01,orcl02)'
log_archive_dest_1='LOCATION=/u09/archivelog/orcl01 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl01'
LOG_ARCHIVE_DEST_2='SERVICE=orcl02 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,primary_ROLE) DB_UNIQUE_NAME=orcl02'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=defer
FAL_SERVER=orcl02
FAL_CLIENT=orcl01
db_file_name_convert='orcl02','orcl01' scope=spfile;
log_file_name_convert='orcl02','orcl01' scope=spfile;
standby_file_management=auto
测试DB信息:
--DB1
os:rhel5.6 ip:123.0.0.52 oracle version:10.2.0.4 sid:rh10g03 db_role:primary
--DB2
os:rhel5.6 ip:123.0.0.54 oracle version:10.2.0.4 sid:rh10g02 db_role:standby
先做一个简单的switchover
-----------------DB1
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
----上条语句的结果如果是to_standby,切换就不需要加with session shutdown
SQL> alter database commit to switchover to physical standby with session shutdown;
Database altered.
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 599785472 bytes
Fixed Size 2085776 bytes
Variable Size 293604464 bytes
Database Buffers 297795584 bytes
Redo Buffers 6299648 bytes
Database mounted.
SQL> alter database recover managed standby database disconnect from session ;
Database altered.
---------------DB2
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
SQL> alter database commit to switchover to primary;
Database altered.
SQL> alter database open;
Database altered.
SQL> alter system switch logfile;
System altered.
SQL> /
System altered.
--如果你的没有出什么错的话,应该可以看到,就表示已经switchover成功了.
---------------DB2
SQL> select process,thread#,sequence#,status from v$managed_standby;
PROCESS THREAD# SEQUENCE# STATUS
--------- ---------- ---------- ------------
ARCH 1 281 CLOSING
ARCH 1 282 CLOSING
LNS 1 283 WRITING
---------------DB1
SQL> select process,thread#,sequence#,status from v$managed_standby;
PROCESS THREAD# SEQUENCE# STATUS
--------- ---------- ---------- ------------
ARCH 0 0 CONNECTED
ARCH 1 280 CLOSING
MRP0 1 283 WAIT_FOR_LOG
RFS 1 283 IDLE
RFS 0 0 IDLE
顺便说一下failover,failover时是不用管DB1了,因為假设或事实DB1已经掛了,
只需在DB2上alter database recover managed standby database finish force;应用日誌,
然后alter database commit to switchover to primary;就行了.
上面的很简单,但生產环境可能就不只是这样了.如果我们只是简单的switchover,客户端的
tnsnames里存的可是之前的IP和service_name,此时客户端就需要修改tnsnames里对应的IP和
service_name,如果是B/s程序还好,直接的C/S程序每个客户端都要修,有时甚至已经不现实.
所以常常会在switchover之后,还要修改对应的IP和service_name.最近產生了一个个人觉得比较好
的方案,就是我们只需要修改IP就可以了,不需要修改service_name,而是在建dataguard时就加
一个共有的service_name,客户端连接都通过这个service_name,而主从之间的传输可用原本默认
的service_name(常常就是各自的sid).新加的service_name可以通过静态註册或动态註册都可以.
这样可以有效避免,常规方式中,客户端连接的service_name就是primary默认的service_name,
当switchover后,如果在要在新的primary上能让用户连接,就要加这个service_name.但如果加了这个
service_name,原有的主从就会因為名称的冲突无法传输.这时的解决办法可以是重建standby或是修改
sid等,就比较复杂了.
以下测试修改IP:
--假设客户端连接的IP:123.0.0.52 service_name:rh10g 这里的service_name已经是两边有加的service_name
通过DB1和DB2在 listener.ora中加入:
(SID_DESC =
(SID_NAME = rh10g03)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(global_dbname = rh10g)
用于静态註册.或是通过在DB1和DB2中执行:
SQL> alter system set service_names=rh10g;
用于动态註册.
--------------------DB1
--需要先把DB1的IP改為一个中间IP:123.0.0.55,避免修改IP后冲突
--修改里面IP对应的主机名
vi /etc/hosts
123.0.0.55 srhel10g03
--修改IP為中间IP123.0.0.55
vi /etc/sysconfig/network-scripts/ifcfg-eth0
--修改tnsnames.ora
RH10G02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.52)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g02)
)
)
RH10G03 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.54)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g03)
)
)
--重啟网路
service network restart
---------------------------DB2
--修改里面IP对应的主机名
vi /etc/hosts
123.0.0.52 srhel10g02
--修改IP
vi /etc/sysconfig/network-scripts/ifcfg-eth0
--修改tnsnames.ora
RH10G02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.52)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g02)
)
)
RH10G03 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.0.0.54)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rh10g03)
)
)
--重啟网路
service network restart
-------------------------DB1
--修改里面IP对应的主机名
vi /etc/hosts
123.0.0.54 srhel10g03
----修改正确IP 123.0.0.54
vi /etc/sysconfig/network-scripts/ifcfg-eth0
--重啟网路
service network restart
-------------------------DB2
--网路修改完后,在DB2上切几次日誌检测是否正常
上面是switchover的方法,如果是failover那就简单了,直接通过静态或动态註册加入原primary的service_name,
然后修改IP就可以了.
--dataguard的几个参数:
log_archive_config='DG_CONFIG=(orcl01,orcl02)'
log_archive_dest_1='LOCATION=/u09/archivelog/orcl01 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl01'
LOG_ARCHIVE_DEST_2='SERVICE=orcl02 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,primary_ROLE) DB_UNIQUE_NAME=orcl02'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=defer
FAL_SERVER=orcl02
FAL_CLIENT=orcl01
db_file_name_convert='orcl02','orcl01' scope=spfile;
log_file_name_convert='orcl02','orcl01' scope=spfile;
standby_file_management=auto
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28539951/viewspace-1312403/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28539951/viewspace-1312403/