oracle 读写分离 DG,oracle 12c dg 搭建 主备切换 故障诊断

内容

单机对单机的实时同步

11G开始实现读写分离,备库是mount状态,可以实时同步,备库而且可以读,做报表应用。(10G 备库就是备库,不能读)

主库 备库

实例名 prod sbdb

静态监听 1522 1522

dbca 需要 不需要

oracle_unqname prod sbdb

(配置文件)

oracle_sid prod sbdb

(配置文件)

globalname(装库) prod

sid(装库) prod

listener global_dbname prod prod

listener sid_name prod sbdb

初始化参数

db_name prod prod

instance_name prod sbdb

db_unique_name prod sbdb

tnsnames.ora tnsprod,tnssbdb tnsprod,tnssbdb

service_name prod prod

(tnsname.ora)

服务名 prod prod(业务端代码不需要更改连接)

(lsnrctl 中的service 对应 listener.ora global_dbname)

主库参数配置

查看数据库参数的命令,show parameter *****

(1)可以在数据库级别或表空间级别设置FORCE LOGGING选项。优先级是从数据库到表空间。如果创建或更改了表空间以启用FORCE LOGGING,则该表空间中的任何更改都将进入重做日志并可用于恢复。

同样,如果创建或更改数据库以启用FORCE LOGGING,则数据库中的任何更改(临时段和临时表空间除外)都将在重 做日志中用于恢复。

desc v$database

select force_logging from v$database;

alter database force logging;

(2)启用归档,查看的方式两种,11g需要开启,12c默认开启

archive log list;

select log_mode from v$database;

两个参数

log_archive_format

alter system set log_archiveformat=’%t%s_%r.arc’ scope=spfile;( 静态变量,要重启数据库)

log_archive_dest (下一步中修改_1 和_2)

shutdown immediate

startup mount

alter database archivelog;

alter database open;

(3)静态监听

listener.ora文件配置

LISTENER1=

(

DESCRIPTION_LIST=

(

DESCRIPTION=

(

ADDRESS_LIST=

(

ADDRESS=(PORTOCOL=TCP)(HOSTNAME=oracle12cpri)(PORT=1522)

)

)

)

)

SID_LIST_LISTENER1=

(

SID_LIST=

(

SID_DESC=

(GLOBAL_DBNAME=prod)

(SID_NAME=prod)

(ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1)

)

)

由配置文件可以看出:sid_name实例名prod,global_dbname对外的服务名prod。

文件三个注意点

标红的地方命名要一致

global_dbname 对应 (lsnrctl status listener)services

sid_name 对应 (lsnrctl status listener) instance

(4)初始化参数

db_unique_name

alter system set db_unique_name=’prod’ scope=spfile; prod要加引号,不加引号就是大写

log_archive_config

alter system set log_archive_config=’DG_CONFIG=(prod,sbdb)’ scope=both;

log_archive_dest_1

alter system set log_archive_dest_1=’LOCATION=/u01/arch VALID_FOR=

(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=prod’ scope=both;

Log_archive_dest_2

alter system set log_archive_dest_2=’SERVICE=tnssbdb LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sbdb’ scope=both;

配置tnsnames.ora文件

复制prod ()里面代码,修改prod 为tnssbdb, host=oracle12csta

Port =1522, service_name 不变,因为主备机是同一访问名称。

db_file_name_convert 数据文件 (select from v$dbfile;)

alter system set db_file_name_convert=’/u01/app/oracle/oradata/sbdb’,’/u01/app/oracle/oradata/prod’ scope=spfile;

log_file_name_convert 重做日志文件 (select from v$logfile)

alter system set db_file_name_convert=’/u01/app/oracle/oradata/sbdb’,’/u01/app/oracle/oradata/prod’ scope=spfile;

standby_file_management

alter system set standby_file_management=auto; 不加引号就是大写

fal_client 本端作为客户端

alter system set fal_client=’tnsprod’ scope=both;

fal_server 对端备机作为服务端

alter system set fal_server=’tnssbdb’ scope=both;

物理备库的参数配置

(1)拷贝密码文件,主备库sys用户密码要保持一致

cd $ORACLE_HOME/dbs

scp orapwprod oracle12csta:/u01/app/oracle/product/12.2.0/dbhome_1/dbs

在备机 mv orapwprod orapwsbdb

(2)备机 dbs目录下

touch initsbdb.ora,

主库的spfileprod.ora复制过来, 切记主库的spfileprod.ora 不要改动,是二进制文件

db_name不变,log_archive_config不变,其他的都要按照主库的配置初始化参数改掉,并创建对应目录

(3) 备机 sqlplus / as sysdba

create spfile from pfile;

$ORACLE_HOME/dbs 下面会根据initsbdb.ora产生一个spfilesbdb.ora

stratup nomount 默认寻找.ora文件

如果报错内容,更改备机的initsbdb.ora文件配置,重新 create spfile from pfile; startup nomount

(4) 配置静态监听

主机拷贝一份,hostname ,sid_name 要改成备库

global_dbname 和主库一致,因为对外服务

备库一定要配置静态监听,因为nomount 状态下只有静态监听才能连进来实例

(5) tns 配置

主机的tnsnames.ora 文件补全

tnssbdb =

(

DESCRIPTION=

(

ADDRESS=(PROTOCOL=TCP)(HOST=oracle12csta)(PORT=1522)

)

(

CONNECT_DATA=

(SERVER=DEDICATED)

(SERVICE_NAME=prod)

)

)

tnsprod =

(

DESCRIPTION=

(

ADDRESS=(PROTOCOL=TCP)(HOST=oracle12cpri)(PORT=1522)

)

(

CONNECT_DATA=

(SERVER=DEDICATED)

(SERVICE_NAME=prod)

)

)

备机把主库的文件scp,只留上面的tnsprod tndsbdb

并做 tnsping 测试

tnsping tnsprod tnsping tnssbdb

主备库都连接下

sqlplus sys/ora123@tnsprod as sysdba

sqlplus sys/ora123@tnssbdb as sysdba

参数检查

db_unique_name

compatible

log_archive_config

log_archive_dest_1

log_archive_dest_2

log_archive_dest_state_2: enable-启用 defer-禁用

db_file_name_convert

log_file_name_convert

standby_file_management

log_archive_format

至此,准备工作做好,备库处于 unmount 状态

select status from v$instance;

started 已经启动的状态

使用duplicate创建物理standby

主库

rman target sys/ora123@tnsprod 必须用这种输入密码的方式

connect auxiliary sys/ora123@tnssbdb

duplicate target database for standby from active database nofilenamecheck;

此时检查下,/u01/app/oracle/oradata/sbdb 会有数据,和主库prod 下面一致

添加standby 日志组并开启同步

standby 日志组个数:redo 日志组+1

主库:

select from v$logfile; 看到有三组redo.log,和对应路径

select from v$log; 看到BYTES每组大小50M

alter database add standby logfile group 4 (‘/u01/app/oracle/oradata/prod/stredo04.log’) size 50M;

alter database add standby logfile group 5 (‘/u01/app/oracle/oradata/prod/stredo05.log’) size 50M;

alter database add standby logfile group 6 (‘/u01/app/oracle/oradata/prod/stredo06.log’) size 50M;

alter database add standby logfile group 7 (‘/u01/app/oracle/oradata/prod/stredo07.log’) size 50M;

一般redo日志后缀不以.log结尾

查看standby日志组 select * from v$standby_log;

备库:此时备库要处于mount状态,

startup nomount alter database mount;

select * from v$instance; mounted

alter database add standby logfile group 4 (‘/u01/app/oracle/oradata/sbdb/stredo04.log’) size 50M;

alter database add standby logfile group 5 (‘/u01/app/oracle/oradata/sbdb/stredo05.log’) size 50M;

alter database add standby logfile group 6 (‘/u01/app/oracle/oradata/sbdb/stredo06.log’) size 50M;

alter database add standby logfile group 7 (‘/u01/app/oracle/oradata/sbdb/stredo07.log’) size 50M;

如果 目录写错了,执行下面

alter database drop logfile group 4;

开启同步:

备库:

alter database open;

开启实时同步

alter database recover managed standby database using current logfile disconnect from session;

 日志切换才同步

alter database recover managed standby database disconnect from session;

停止同步

alter database recover managed standby database cancel;

select open_mode,database_role,protection_mode,protection_level from v$database;

打开实时同步,open_mode 是read only with apply

不打开,是 read only

查看主库的 是 read write

三种保护模式

最大性能 maximize performance | LGWR ASYNC NOAFFIRM

最高可用 maximize availability生产上用,网络问题会自动切换到最高性能模式,网络恢复后转成最高可用 | LGWR SYNC AFFIRM

最高保护 maximize protection | LGWR SYNC AFFIRM

SYNC:主库commit之前,等待备库接受完日志数据,至少一个备库

ASYNC:主库commit之前,不等待

AFFIRM:日志信息写到备库standby_log后,通知主库日志就收完毕

NOAFFIRM:不用等日志信息写到备库standby日志,就通知主库日志接收完毕

最大性能 到 最高可用,前提:log_archive_dest_2 = LGWR SYNC AFFIRM

主备库都执行:Alter database set standby database to maximize availability;

检查:

select open_mode,database_role,protection_mode,protection_level from v$database;

测试下:主库create table t(id int); insert into t values(200);

备库:select * from t;

此时主备数据库的状态都是 open

如果同步没有成功,再检查下主备库的参数是否正确,可能会是

log_archive_dest_state_2: enable-启用 没有开启

然后shutdown immediate startup主备库,备库开启实时同步

alter database recover managed standby database using current logfile disconnect from session;

到此dg搭建完成

下面是查看dataguard 的状态,解决一些dg遇到的问题

启动顺序

先监听后实例,先备库后主库

关闭顺序

先关主库,再关备库

视图:

(1)v$database

open_mode

read only,read and write,read only with apply,mount

database_role

physical standby,logical standby,primary,snapshot standby

protection_mode

maximize availability,maximize protection,maximize performance,

resynchronization(重新同步模式),unprotected

(2)v$managed_standby (备库执行)

process ( ps – ef | grep ora 可以看到) ARCH 归档,MRPO日志实时同步,RFS远程日志接收进程

select process,pid,status,sequence# from v$managed_standby; process: ARCH:归档进程

MRP0:用来应用接收的日志media recovery process(开启了实时应用或者非实时应用)

RFS:remote file server,接收远程日志文件

pid: 操作系统进程号

status:

CONNECTED:和主库建立了网络连接

CLOSING:进程已经完成归档,并且关闭了归档日志文件

WRITING:进程正在写redo数据到归档文件。

APPLYING_LOG:正在应用日志到备库,开启实时应用 WAIT_FOR_LOG:等待归档日志完成(开启非实时应用,或者主备之间不通)

alter database recover managed standby database disconnect;

sequence#:归档日志序列号

archive log list sequence 142

alter system switch logfile; sequence 会增加1

(3)v$standby_log 备库查询

select group#,sequence#,archived,status from v$standby_log;

对比:

select from v$log;

select from v$logfile;

select from v$standby_log;

(4) v$archive_dest_status

status: VALID:有效 INACTIVE:非活动的 DEFERRED:手工禁用(可用临时禁用同步)

alter system set log_archive_dest_state_2=’defer’ 临时进用同步的命令

alter system set log_archive_dest_state_2=’enable’ 开启

type: LOCAL:主库 PHYSICAL:物理standby LOGICAL:逻辑standby SNAPSHOT:快照standby

error,synchronization_status,synchronized 这三个字段可以帮助查看dg不同步的故障

(5) v$dataguard_status

备库查询

select from v$dataguard_status t order by t."TIMESTAMP" desc

message字段,可以查看DG的一些报错

数据库新建用户,分权限

create user test identified by test;

grant sysoper,connect,resource to test;

日志GAP

模拟故障:

alter system set log_archive_state_2=’defer’;

主库 插入一条表数据

alter system switch logfile; 三次

主库:log archive list; sequence 会和备库不一样,主库的protection_level = ‘重新同步模式’

备库:select from v$managed_standby

MRPO 进程 会显示:wait_for_log, 说明现在没有应用日志(正常应该是applying_log)

主库: 主库的squence# 会多于备库

Select t.”sequence#”,t.”applied”, from v$archived_log t where id=1;

备库:

Select t.”sequence#”,t.”archived” from v$archived_log t where id=1;

Select from v$archive_dest_status;

Error 字段会出现报错,像改成defer 的话,不会报错

主库不可用,需要自己手动操作

把gap掉的日志文件,archive log list 主库路径下的文件拷过去

备库没有注册过去rman target / list archive all;看到没有主库的那几个日志文件,需要手工注册

少量的话:alter database register logfile ‘/u01/arch/***’;

大量的话:rman>catalog start with ‘/u01/arch/’;

查看备库alert文件

/u01/app/oracle/diag/rdbms/sbdb/sbdb/trace/alert_sbdb.log

自动应用,不行的话,重新开始备库日志同步即可

角色互换

(1) switchover 主备互换,不丢失数据

主备库检查下参数,(实际上,只要insert into 一条数据,同步参数就没问题)

主库检查 standby redo log, select * from v$standby_log;

select t."NAME",t."DATABASE_ROLE",t."SWITCHOVER_STATUS" from v$database t;

SWITCHOVER_STATUS:

to standby: 可切换

session active:有会话连接 可切换

备库查询:NOT ALLOWED

验证是否有gap:

select t."STATUS", t."GAP_STATUS" from v$archive_dest_status t where t."DEST_ID" = 2;

最保险的还要执行,insert

操作

alter database commit to switchover to physical standby;

有会话的话,

alter database commit to switchover to physical standby with session shutdown;

startup主库

alter database recover managed standby database using current logfile disconnect;

备库:

select t."NAME",t."DATABASE_ROLE",t."SWITCHOVER_STATUS" from v$database t;

SWITCHOVER_STATUS:

to primary

session active

alter database commit to switchover to primary;

alter database commit to switchover to primary with session shutdown;

shutdown immediate;

startup

insert 测试下 ,查看下模式

select open_mode,database_role,protection_mode,protection_level from v$database;

注意:生产环境的话 ,库运行时间长的话,直接切换会花费很长时间

主备库执行:alter system flush buffer_cache;

alter system checkpoint;

shutdown immediate

然后重启主备库,备库打开实时同步,在进行切换

(2) failover故障转移主库坏了,备库转主库,最大保护和最大可用不丢失数据(相对switchover)

步骤:

停止备库日志应用

alter database recover managed standby database cancel;

关闭备库的日志传输

注意要先解决GAP,解决后执行下面这条语句

alter database recover managed standby database finish force;

若解决不了,执行下面,结果就是会丢失数据

alter database active physical standby database;

切换主库

alter database commit to switch to primary with session shutdown;

检查:

select open_mode,database_role from v$database;

read write database_role

快照数据库

将备库置于可读写的模式。模拟上线测试或者业务测试

注意:备库可以接受主库的日志,但是不能进行apply应用。

步骤: (1).配置快速恢复区

备库: db_recovery_file_dest_size(先设置大小) db_recovery_file_dest

alter system set db_recovery_file_dest_size=10g;

alter system set db_recovery_file_dest='/u01/flash';

flashback database不需要开启

(2).关闭redo apply应用

alter database recover managed standby database cancel;

(3).切换为snapshot快照数据库

alter database convert to snapshot standby;

select status from v$database; mounted 要打开

alter database open

select open_mode,database_role from v$database;

read write(与主相同) snapshot standby

测试:insert

到此,物理备库->快照数据库

.快照数据库->物理备库,切回

(5).关闭数据库,置于mount

shutdown immediate

startup mount

(6).执行切回命令 alter database convert to physical standby;

实例是nomount状态 v$instance status 是 started

关闭实例,启动到open

alter database recover managed standby database using current logfile disconnect;开启实时应用

insert 测试

注意: snapshot读写模式至少打开一次,才能转换回物理备库

命令 状态 v$instance status

startup open open

startup nomount nomount started

startup mount mount mounted

alter system open open open

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值