首先介绍一些概念
- physical standby database ,即直接从主库接受archivedlog然后做基于block的物理恢复,所以physical standby在物理文件一级完全等同于主库。
- Logical standby database是把主库上传过来的archived log通过logminer技术,解析为sql语句,直接在logical standby上作基于sql的同步。
重要的进程
- RFS (remote file server process) :接受由primary数据库的lgwr或arch通过oracle net传来的redo 数据,写入standby redo logs或standby archived redo logs
- MRP(managed Recovery Process): 管理恢复进程。
- FAL(fetch archive log): 在primary和standby数据库的两端同时配置。Primary端是fetch archive log server,standby端是fetch archive log client. FAL是自动探测primary/standby数据库之间archived logs是否有有间隔的一个进程。
一、开始做physical standby
1.1 主库上的准备工作
1、开启forced logging模式
alter database force logging;
2、开启归档模式和设置归档路径
alter system set log_archive_dest_1=’LOCATION=/u02/oradata/archive’scope=both;
3、为备库创建控制文件
alter database create standby controlfile as ‘目标路径’;
4、验证主库的数据文件,利用主库的备份创建备库
5、修改tnsnames.ora,加入备库信息:
STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.40.13.179)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
6.为备库创建参数文件,可利用主库的spfile生成pfile然后拷贝到备库
1.2 创建备用数据库
1、修改从主库拷贝的备库参数文件
一般只须加这些参数:
standby_archive_dest=’d:oradataarchive’
standby_file_management=AUTO
remote_archive_enable=true
fal_server=’orcl’
fal_client=’standby’
需要修改的一些参数:
control_files:修改指向备库的控制文件
standby_archive_dest:指向备库的归档日志目录(从主库接收归档日志)
db_file_name_convert:在目录结构改变时需要设置,格式为(‘主库数据文件路径’,'从库数据文件路径’)
log_file_name_convert:在目录结构改变时需要设置,格式为(‘主库日志文件路径’,'从库日志文件路径’)
log_archive_dest_1:应指向从库的归档日志目录
standby_file_management:设置为AUTO
remote_archive_enable:设置为TURE(测试中发现加上这条就无法生成spfile,可能是系统默认值不要设置)
instance_name:应该修改为从库的数据库实例名(如在同一主机时,备库肯定无法和主库相同,肯定要修改)
lock_name_space:设置为备库实例名
2、如果是windows平台,利用oradim创建windows服务
3、配置监听进程及tnsnames
以下是备库tnsnaes.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.40.13.180)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
standby =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.40.144.79)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
4、创建备库SPfile(由修改过的Pfile生成)
create spfile from Pfile=’备库路径’;
5、启动physical standby database
startup nomount;
alter database mount standby database;
6、置于恢复状态
alter database recover managed standby database disconnect from session;
7、在主库上设置到备库的归档(在主库上操作)
alter system set log_archive_dest_2=’SERVICE=备库实例名’ scope=both;
alter system set log_archive_dest_state_2=enable scope=both;
1.3 验证physical standby database
当创建了物理备份数据库和设置日志传输服务,可在备份数据库上验证修改是否生效
1、查询现有归档日志
select name,applied from v$archived_log;
2、在主库上归档当前日志
alter system archive log current;
3、验证新日志是否接收到(同步骤1)
4、验证是否新的归档Redo日志已经被应用
select name,applied from v$archived_log ;
二、主备库切换
2.1 主库切到备库
1、 在主库
SQL> alter database commit to switchover to physical standby;
Database altered.
SQL> shutdown immediate
ORA-01507: database not mounted
ORACLE instance shut down.
以备用模式启用原主库
SQL> startup nomount;
ORACLE instance started.
SQL> alter database mount standby database;
SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
——— ———- ——————– —————-
PRIMARY MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered.
2、 在备库
SQL> alter database commit to switchover to primary;
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup
SQL> alter system switch logfile;
System altered.
三、日常管理
3.1 关于启动关闭顺序
启动的时候,先从库的listener,再启动从库,再启动主库的listener,再主库
关闭的时候,先关闭主库,再启动从库。
3.2 检查当前Primary库的保护模式
select protection_mode from v$database;
3.3 转换数据库模式为MAX AVAILABILITY:
shutdown immediate;
startup mount;
alter database set standby database to maximize performance;
alter database open;
3.4 测试Primary的归档能否应用到Standby
查看主数据库日志是否全部传送到副数据库,可查看v$archive_gap,更简单的方法是查看各自主机的日志归档目录的日志序号即可
select max(sequece#) from v$archived_log;
select file_name from v$datafile;
show parameter fal
show parameter lag
select * from v$archive_gap;
3.5 设置归档频率
如果要强制Primary一分种归档一次,那么设置Primary的初始化参数ARCHIVE_LAG_TARGET:
alter system set ARCHIVE_LAG_TARGET=60 scope=both;
3.6 停止Standby
alter database recover managed standby database cancel;
shutdown immediate;
3.7 切换到只读模式
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN READ ONLY;
3.8 切换回管理恢复模式
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE PARALLEL 8 DISCONNECT FROM SESSION;
3.9 哪些归档日志没有归档到备用库
假设local归档目录的ID为1,remote的归档目录为2。
SELECT LOCAL.THREAD#, LOCAL.SEQUENCE# FROM
(SELECT THREAD#, SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=1) LOCAL
WHERE
LOCAL.SEQUENCE# NOT IN
(SELECT SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=2 AND
THREAD# = LOCAL.THREAD#);
3.10 注意事项:
1、如果在主库执行 alter database clear unarchived logfile或alter database open resetlogs ,则dataguard要重建。
2、在连续恢复模式下工作之前,需要保证之前所有的归档日志己经应用到备用库上。因为在连续恢复模式的情况下,oracle不会应用之前的归档日志,而只会应用后面陆续到来的归档日志。
3、出现归档日志gap时,需要找出相应的归档日志, 然后将这些归档日志copy到备用节点的standby_archive_dest和log_archive_dest目录下面。需要注意的是log_archive_dest目录下也需要copy。然后ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE;
4、新建表、表空间、datafile都能通过日志应用到备库,但新建一个临时表空间,rename datafile 均不能应用到备库上.
5、应当实时察看standby库的alert文件,就能清晰明了地知道主备更新的情况。这也是排错的重要方法,切记!!
3.11 failover和switchover
Failover : 将主数据库offline,备用数据库online,这种操作由系统和软件失败引起。 即使在备用数据库上应用重做日志,也可能出现数据丢失的现象,除非备用数据库运行在 guaranteed protection 模式。 原主数据库重新使用时必须重新启动实例。 其它的备用数据库也需重新启动实例。
Switchover : 故意将主数据库offline,而将另一备用数据库online,它能够切换到备用数据库而不需同步操作。如:可使用 Switchover 完成系统的平滑升级。 即使在备用数据库上不应用重做日志,也不会造成数据的丢失。 数据库不需重新启动实例。这使主数据库几乎能立即在备用数据库上恢复它的功能,因此可经常进行定期维护而不需中断操作。 Failover和Switchover的区别为:当Failover发生,备用数据库切换为主数据库之后,它丢失了备用数据库的所有能力,也就是说,不能再返回到备用模式;而Switchover可以,备用数据库可切换为主数据库,也可从主数据库再切换回备用数据库。
3.12 相关视图
DBA_LOGSTDBY_EVENTS (Logical Standby Databases Only)
DBA_LOGSTDBY_LOG (Logical Standby Databases Only)
DBA_LOGSTDBY_NOT_UNIQUE (Logical Standby Databases Only)
DBA_LOGSTDBY_PARAMETERS (Logical Standby Databases Only)
DBA_LOGSTDBY_PROGRESS (Logical Standby Databases Only)
DBA_LOGSTDBY_SKIP (Logical Standby Databases Only)
DBA_LOGSTDBY_SKIP_TRANSACTION (Logical Standby Databases Only)
DBA_LOGSTDBY_UNSUPPORTED (Logical Standby Databases Only)
V$ARCHIVE_DEST
V$ARCHIVE_DEST_STATUS
V$ARCHIVE_GAP
V$ARCHIVED_LOG
V$DATABASE
V$DATAFILE
V$DATAGUARD_STATUS
V$LOG
V$LOGFILE
V$LOG_HISTORY
V$LOGSTDBY (Logical Standby Databases Only)
V$LOGSTDBY_STATS (Logical Standby Databases Only)
V$MANAGED_STANDBY (Physical Standby Databases Only)
V$STANDBY_LOG