查看当前数据库的角色,可以看v$database视图的database_role列。switchover不会丢数据,failover,如果主库不是在最大包含模式或是最高可用性模式,一些数据可能会丢失。
为角色转换做准备
1确认初始化参数设置正确
2验证备库在archivelog模式
3确保备库上的临时文件盒主库上的临时文件匹配
4确保在rac配置中只有1个实例启动,在角色转换完成后,在启动别的实例
为角色转换选择一个目标数据库,dg提供了一个v$dataguard_stats视图,这个视图可以评估每个备库的可用性,角色转换需要的时间。例如:
SQL> COLUMN NAME FORMAT A18
SQL> COLUMN VALUE FORMAT A16
SQL> COLUMN UNIT FORMAT A10
SQL> COLUMN TIME_COMPUTED FORMAT A24
SQL> SELECT * FROM V$DATAGUARD_STATS;
NAME VALUE UNIT TIME_COMPUTED
------------------ ---------------- ---------- ------------------------
apply finish time +00 00:00:02.4 day(2) to 15-MAY-2005 10:32:49
second(1)
interval
apply lag +00 0:00:04 day(2) to 15-MAY-2005 10:32:49
second(0)
interval
transport lag +00 00:00:00 day(2) to 15-MAY-2005 10:32:49
second(0)
interval
这个例子中,没有传输的延迟,日志应用没有应用过去4秒产生的日志,需要花费2.4秒来完成日志的应用。如果在配置中有物理备库与逻辑备库,那么考虑选择一个物理备库来作为目标备库,在转换完成后,对新的主库来说,配置中所有的数据库作为备库都可用。如果是转换到一个逻辑备库上,那么之前的物理备库都不可用了,你需要用新的主库的备份来重新创建物理备库,才使它们能重新可用。
switchover
一个switchover有2个步骤,第一个步骤,主库转成备库,第二部,备库转成主库。下面是一个示例:
这个是转换过程中,此时是有2个备库的,没有主库。
这时候完成了转换
failovers
如果备库当前运行在最大包含模式,首先将备库转变成最大性能模式
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
在物理备库上的转换
1确认可以转换
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO STANDBY
1 row selected
2在主库上初始化switchover,在主库上执行下面的语句啦转换成物理备库
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;执行该语句后,主库转换成备库,在转换之前当前控制文件备份到当前会话的trace文件中。这样可以重建一个当前控制文件。
3关闭及重启之前的主服务,启动到mount状态
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
在这个时间点,2个数据库都是备库
4在v$database 视图中验证转换的状态
在你转换主库到物理备库的角色后,转换的通知被备库接受到,你应该验证转换通知已经被备库处理了,查看下面的语句。
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
5转换物理备库到主库角色
当备库在mount状态或是在只读状态打开状态,你可以转换物理备库到主库角色。在想要转换的物理备库上执行下面的语句:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
6完成备库到主库的转换过程
1如果物理备库还没有打开,执行下面的语句来打开新的主库
alter database open;
2如果物理备库咋最后一次开始已经打开过了,你必须先关闭,在打开
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
7在物理备库上重启日志应用服务
对新的物理备库和别的物理备库与逻辑备库,如果日志应用服务之前没有被配置好,那么使用命令来重新启动日志应用服务。
8开始传输日志到备库,在新主库上执行下面的语句。
SQL> ALTER SYSTEM SWITCH LOGFILE;
逻辑库上的角色转换
1在主库上验证是否可以switchover
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO STANDBY
1 row selected
2准备当前的主库来switchover
在主库上执行下面的语句
ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;
这个语句通知当前主库很快要变成了逻辑备库,开始在新主库接受redo数据,这步准备接收logminer多版本的数据字典在当前逻辑备库的redo流中。
如果这个操作成功了,在v$database.switchover_status列中显示PREPARING SWITCHOVER 这个值
3为了switchover准备目标逻辑备库
在目标逻辑备库中执行下面的语句来构建logminer 多版本数据字典。
ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY;
这个语句是逻辑备库开始传输日志服务,开始传输它的redo数据到当前的主库和别的备库上,但是这些站点只是接受redo数据,但是不会去应用它。
4确认当前主库准备好了未来主库的redo流
确认主库接受到了logminer多版本数据字典,在主库上查询v$database的switchover_status视图,没有接受到数据字典,转换就不能进行,当返回to logical standby值,你可以做第5步。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO LOGICAL STANDBY
1 row selected
5转换主库到逻辑备库
ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;
6确认逻辑被库准备转换成主库
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
1 row selected
7换成逻辑备库到主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
8在新逻辑备库上执行sql apply
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;