好Oracle主库出现故障,备库及时拯救了系统(oracle 主库坏备库)
好Oracle主库出现故障,备库及时拯救了系统
在企业信息化建设中,数据库是关键的核心业务系统,特别是Oracle数据库,拥有可靠性、安全性和高可用等重要特点,很多企业都把Oracle作为其关键应用系统的数据库。然而,在日常使用过程中,数据库始终面临着各种意外故障问题。本文将介绍一种备库自动切换的解决方案,来解决Oracle主库故障问题。
自动切换核心思想
在Oracle主备数据库环境下,通过Oracle的Data Guard技术,可以将主库的数据实时同步到备库,以保障数据的安全性。但是,仅仅有数据实时同步还不够,当主库出现宕机、断电等故障时,备库需要能够自动切换成主库,立刻继续执行业务,以此来减小系统宕机造成的损失。
自动切换的核心思想就是,在主库出现故障后,通过网络监听等手段,自动将备库切换至主库角色,让主库中断的业务流量可以流转到备库上,保持业务的连续性。
解决方案
备库自动切换可分为物理备库和逻辑备库两种情况进行解决。
物理备库
物理备库是通过实时同步主库的redo日志来将主库数据复制一份,主备库之间数据保持实时同步。在出现主库故障时,只要将备库上的数据设置为主库数据,即可继续保证业务的连续性。但是,这种解决方案需要主备库之间有较高的网络带宽,否则同步数据的延迟可能会导致数据丢失。
逻辑备库
逻辑备库则是通过在备库上安装与主库相同的Oracle系统,并从主库上操作数据,实现数据同步的方式。在出现主库故障时,只要将备库设置为主库的角色,即可快速切换,保证业务的连续性。逻辑备库的优点是在主库崩溃后,能够无缝地接管主库的业务流量,但是其缺点是需要较高的同步频率以确保数据的准确性。
代码实现
建立简单的主备Oracle环境并同步数据。
创建主库
“`sql
alter system set log_archive_dest_1=’LOCATION=/u02/arch VALID_FOR=(all_logfiles,all_roles)DB_RECOVERY_FILE_DEST_SIZE=2G DB_RECOVERY_FILE_DEST=/u01/app/oracle/fra’ scope=spfile;
创建备库
```sqlalter system set log_archive_dest_1='SERVICE=primary LGWR ASYNC VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=standby' scope=spfile;
在主库执行命令,开启归档模式
“`sql
alter system set log_archive_start=true;
在备库执行命令启动数据同步
```sqlalter database recover managed standby database disconnect from session;
开启监听
在主库添加监听
“`sql
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = primary.world)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = primary)
)
(SID_DESC =
(GLOBAL_DBNAME = standby.world)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = standby)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.111)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
在备库添加监听
```sqlSID_LIST_LISTENER =
(SID_LIST = (SID_DESC =
(GLOBAL_DBNAME = primary.world) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = primary) )
(SID_DESC = (GLOBAL_DBNAME = standby.world)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = standby)
) )
LISTENER = (DESCRIPTION_LIST =
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.112)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) )
)
ADR_BASE_LISTENER = /u01/app/oracle
使用DG Broker配置自动切换
在主库执行以下命令启动broker
“`sql
DGMGRL> connect sys/oracle@primary
DGMGRL> create configuration ‘DGConfig’ as primary database is ‘primary’ connect identifier is ‘primary’ mntned as physical;
DGMGRL> add database ‘standby’ as connect identifier is ‘standby’ mntned as physical;
DGMGRL> edit database ‘standby’ set property ‘LogXptMode’=’SYNC’;
DGMGRL> enable configuration;
DGMGRL> show configuration;
在备库创建一个脚本standby.sh,内容如下:
```sql#!/bin/sh
## standby.sh
## Backup current controlfile
#
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1ORACLE_SID=primary
PATH=$PATH:${ORACLE_HOME}/bin
sqlplus / as sysdba startup nomount;
select 'backup controlfile to trace='/u01/app/oracle/scripts/standby.sql';' from dual;exit;
EOF
mv /u01/app/oracle/diag/rdbms/primary/primary/trace/primary_ora_2225.trc /u01/app/oracle/scripts/standby.sql
sqlplus / as sysdba alter database mount standby database;
exit;EOF
echo "Standby database is now mounted!!"
在备库创建一个脚本flover.sql,内容如下:
“`sql
CONN SYS/oracle@standby AS SYSDBA
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
ALTER DATABASE MOUNT;
exit;
在主库创建一个脚本flover.sh,内容如下:
```sql#!/bin/sh
## flover.sh
## Backup current controlfile
#
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1ORACLE_SID=primary
PATH=$PATH:${ORACLE_HOME}/bin
sqlplus / as sysdba alter system switch logfile;
alter system checkpoint;select 'alter database recover managed standby database cancel;alter database commit to switchover to physical standby with session shutdown;' from dual;
exit;EOF
scp /u01/app/oracle/scripts/flover.sql oracle@192.168.16.112:/tmp/
echo "Switching to Standby database!!"
在主库执行以下命令启动broker
“`sql
DGMGRL> connect sys/oracle@primary
DGMGRL> show configuration;
DGMGRL> show database ‘primary’;
DGMGRL> show database ‘standby’;
DGMGRL> edit database ‘standby’ set property LogArchiveMaxProcesses=10;
DGMGRL> edit database ‘standby’ set property LogArchiveDestState_1=’enable’;
DGMGRL> edit database ‘standby’ set property LogArchiveDest_1=’$(ORACLE_HOME)/dbs/dest_1′;
DGMGRL> edit database ‘primary’ set property LogArchiveMaxProcesses=0;
DGMGRL> edit database ‘primary’ set property LogArchiveDest_1=’$(ORACLE_HOME)/dbs/dest_1′;
DGMGRL> edit database ‘primary’ set property LogArchiveDestState_1=’enable’;
DGMGRL> show configuration verbose
至此全部配置完成。
总结
准备好主备环境后,我们可以根据实际需要选择物理备库或者逻辑备库,并使用自动切换脚本来保证业务的连续性,为企业信息