1. 引言
随着企业对数据服务连续性要求的不断提高,数据库系统的高可用性成为核心关注点。YashanDB 支持基于物理备库的主备复制架构,通过日志同步实现主备库之间的数据一致性。当主库发生故障或需要进行计划性维护时,可通过主备切换将备库提升为主库,从而快速恢复服务。
本文旨在系统梳理 YashanDB 的主备切换方法,帮助数据库管理员(DBA)掌握从检查状态到执行切换、再到旧主库降备的完整流程,确保在各种场景下都能安全、高效地完成切换操作。
2. 主备切换方式概述
YashanDB 提供了两种主要的主备切换方式:
切换类型 | 使用场景 | 是否可逆 | 数据丢失风险 |
---|---|---|---|
Switchover | 计划性维护、升级、负载均衡等 | ✅ 可逆 | ❌ 无数据丢失 |
Failover | 主库宕机、不可用等紧急情况 | ⚠️ 不可逆(需手动降备) | ⚠️ 可能有少量数据丢失 |
注意:
- Switchover 是一种“平滑”切换,适用于主备同步正常的情况。
- Failover 是一种“强制”切换,仅用于主库无法访问的紧急场景,存在数据丢失风险。
3. Switchover(计划性切换)
3.1 适用场景
- 主库硬件/软件升级
- 网络调整或迁移
- 负载均衡需求
- 定期演练
3.2 操作前提
- 主备库同步状态正常(
transport_lag = 0
,apply_lag = 0
) - 备库连接稳定,角色为
STANDBY
- 所有客户端会话已妥善处理
3.3 操作步骤
步骤一:检查主备状态
-- 查看当前数据库角色
SELECT database_id, database_name, log_mode, open_mode, database_role FROM V$DATABASE;
--查看复制状态(在主库上执行)
select STATUS, DATABASE_MODE, SYNCHRONIZATION_STATUS, SYNCHRONIZED from v$ARCHIVE_DEST_STATUS;
-- 查看复制状态(在备库上执行)
SELECT connection, status, peer_addr, transport_lag, apply_lag FROM V$REPLICATION_STATUS;
输出示例:
DATABASE_ID DATABASE_NAME LOG_MODE OPEN_MODE DATABASE_ROLE
--------------------- ---------------------------------------------------------------- ----------------- ----------------- -----------------
3411206185 yashandb ARCHIVELOG READ_WRITE PRIMARY
1 row fetched.
STATUS DATABASE_MODE SYNCHRONIZATION_STATUS SYNCHRONIZED
----------------- ----------------- ---------------------- ------------
NORMAL OPEN SYNC YES
1 row fetched.
CONNECTION STATUS PEER_ADDR TRANSPORT_LAG APPLY_LAG
----------------- ----------------- ---------------------------------------------------------------- ------------- ------------
CONNECTED NORMAL 192.168.3.110:1602 0 0
1 row fetched.
步骤二:在备库执行 Switchover
ALTER DATABASE SWITCHOVER;
提示:
执行期间,主库所有会话将被中断,且无法建立新连接,直到切换完成。
步骤三:验证切换结果
切换完成后,再次查询 V$DATABASE
和 V$REPLICATION_STATUS
,确认角色已互换,且同步恢复正常。
4. Failover(故障切换)
4.1 适用场景
- 主库服务器宕机
- 主库进程异常终止
- 主库网络中断导致不可达
4.2 操作前提
- 主库确实不可用(无法连接、无响应)
- 备库具备足够的归档日志(
received_lfn
最大) - 建议选择
gap_seq# = 0
的备库以减少数据丢失
4.3 操作步骤
步骤一:选择最优备库
-- 查询各备库的接收日志量和缺口
SELECT connection, status, received_lfn, gap_seq# FROM V$REPLICATION_STATUS;
选择策略:
- 若所有
gap_seq# = 0
,选received_lfn
最大的备库。 - 若存在
gap_seq# > 0
,优先选择gap_seq#
最小但received_lfn
最大的备库。
步骤二:执行 Failover
ALTER DATABASE FAILOVER;
警告:
Failover 后原主库不能再直接打开,否则可能导致“脑裂”(Split-Brain)问题!
步骤三:验证新主库状态
SELECT database_id, database_name, log_mode, open_mode, database_role FROM V$DATABASE;
成功标志:
open_mode = READ_WRITE
database_role = PRIMARY
5. 旧主库降备(Failover 后操作)
当旧主库恢复后,必须将其降为备库,不能直接 OPEN
。
5.1 操作流程(在备库上执行)
步骤一:关闭monit
yasboot monit stop -c yashandb -d
步骤二:重启旧主库至 MOUNT 阶段
yasboot node restart -c yashandb -n 1-2 -m mount
步骤三:执行降备命令
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
步骤四:打开数据库
ALTER DATABASE OPEN;
步骤五:验证备库状态
SELECT open_mode, database_role FROM V$DATABASE;
正常输出:
OPEN_MODE DATABASE_ROLE
----------------- -----------------
READ_ONLY STANDBY
1 row fetched.
SELECT connection, status, received_lfn, gap_seq# FROM V$REPLICATION_STATUS;
正常输出:
CONNECTION STATUS RECEIVED_LFN GAP_SEQ#
----------------- ----------------- --------------------- ------------
CONNECTED NORMAL 2828 0
1 row fetched.
5.2 异常处理
状态 | 含义 | 处理建议 |
---|---|---|
NEED REPAIR |
数据不一致,存在未应用的 redo | 在主库上手动修复(BUILD DATABASE REPAIR STANDBY standby_name;)或在备库全量build |
REDO MISMATCH |
redo 存在分歧但未应用 | 使用 ALTER SYSTEM IGNORE STANDBY MISMATCHED REDO 快速修复 |
重要提醒:
若旧主库直接 OPEN
再降备,极易引发脑裂,导致数据冲突,必须严格遵循“先 MOUNT → 降备 → OPEN”的顺序。
6. 使用 yasboot 工具进行远程切换
YashanDB 提供了强大的命令行工具 yasboot
,支持远程执行主备切换,极大提升了运维效率。
6.1 常用命令
命令 | 功能 |
---|---|
yasboot node switchover |
执行计划性切换 |
yasboot node failover |
执行故障切换 |
yasboot node status |
查看节点状态 |
yasboot node config show/set/unset |
查看/修改配置参数 |
6.2 示例
# 执行 Switchover
yasboot node switchover -c yashandb -n 1-2
# 执行 Failover
yasboot node failover -c yashandb -n 1-1
# 查看节点状态
yasboot node status -c yashandb -n 1-1 -d
优势:
- 支持跨主机远程操作
- 自动化任务流,减少人为失误
- 可集成到监控告警系统中实现自动化切换
7. 最佳实践与注意事项
类别 | 建议 |
---|---|
切换前准备 | 定期检查 V$REPLICATION_STATUS ,确保 lag 为 0 |
Failover 选择 | 尽量选择 received_lfn 最大、gap_seq# 最小的备库 |
避免脑裂 | 旧主库恢复后必须先 MOUNT 再降备,禁止直接 OPEN |
监控告警 | 配置 transport_lag 和 apply_lag 的阈值告警 |
文档记录 | 每次切换后应记录时间、原因、操作人及结果 |
8. 总结
YashanDB 的主备切换机制设计合理,兼顾了灵活性与安全性。通过合理的规划与规范的操作流程,可以在不影响业务的前提下完成主备切换。无论是计划内的 Switchover 还是突发的 Failover,只要遵循本文所述步骤,即可有效保障数据库的高可用性。
未来,随着 YashanDB 在金融、电信等关键行业的深入应用,其高可用架构将持续优化,为用户提供更稳定、更智能的数据库服务。
参考资料
- YashanDB 官方文档《主备切换手册》
- YashanDB 工具手册《yasboot 命令介绍》
📌 说明:本文为原创技术分享,欢迎转载,请注明出处。如需合作或交流,欢迎联系作者。