好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;


创建备库

```sql
alter 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;


在备库执行命令启动数据同步

```sql
alter 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


在备库添加监听

```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.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_1
ORACLE_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_1
ORACLE_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


至此全部配置完成。

总结

准备好主备环境后,我们可以根据实际需要选择物理备库或者逻辑备库,并使用自动切换脚本来保证业务的连续性,为企业信息

数据运维技术 » 好Oracle主库出现故障,备库及时拯救了系统(oracle 主库坏备库)