oracle 12c dg搭建切换与故障诊断

1. 内容

**单机对单机**的实时同步

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

3.

主库 备库

实例名 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)

4. 主库参数配置

查看数据库参数的命令,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_archive_format=’%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;

5. 物理备库的参数配置

(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    已经启动的状态

6. 使用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 下面一致

7. 添加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

8. 三种保护模式

最大性能  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遇到的问题

9. 启动顺序

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

关闭顺序

先关主库,再关备库

视图:

(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的一些报错

10. 数据库新建用户,分权限

create user test identified by test;

grant sysoper,connect,resource to test;

11. 日志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

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

12. 角色互换

(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

13. 快照数据库

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

注意:备库可以接受主库的日志,但是不能进行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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容