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_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. 物理备库的参数配置
    (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 已经启动的状态

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

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

  1. 三种保护模式
    最大性能 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. 启动顺序
    先监听后实例,先备库后主库
    关闭顺序
    先关主库,再关备库
    视图:
    (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的一些报错

  2. 数据库新建用户,分权限
    create user test identified by test;
    grant sysoper,connect,resource to test;

  3. 日志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. 角色互换
    (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

  1. 快照数据库
    将备库置于可读写的模式。模拟上线测试或者业务测试
    注意:备库可以接受主库的日志,但是不能进行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