- 内容
单机对单机的实时同步 - 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