同一守护进程组中,不同数据库实例的数据出现不一致,并且无法通过重演 Redo 日志 重新同步数据的情况,我们称为组分裂。引发组分裂的主要原因包括:
查看集群监视器发现监视器报集群组分裂。
如果分裂库的守护进程控制文件状态不是Valid,可借助监视器的show open info 命令,根据 DESC 字段找出原因。
停止分裂库的守护进程及数据库服务。
登录主库,执行联机备份。
联机备份:SQL> BACKUP DATABASE BACKUPSET ‘/data/dmdata/BACKUP_FILE_01’;
将主库备份集拷贝到备库服务器并执行脱机还原与恢复。
./dmrman CTLSTMT=“RESTORE DATABASE ‘/data/dmdata/DAMENG/dm.ini’ FROM BACKUPSET
‘/data/dmdata/BACKUP_FILE_01’”
./dmrman CTLSTMT=“RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ FROM BACKUPSET
‘/data/dmdata/BACKUP_FILE_01’”
./dmrman CTLSTMT=“RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ UPDATE DB_MAGIC”
控制文件
数据守护 V4.0 对守护进程控制文件(dmwatcher.ctl)进行了简化,仅用于记录本地
数据库的分裂状态和分裂描述信息。守护进程在检测到本地库分裂时,自动创dmwatcher.ctl 文件,保存在本地库的 SYSTEM_PATH路径下,并且文件中记录的状态一定是 Split 分裂状态。如果dmwatcher 加载到 dmwatcher.ctl 文件,则认为对应的库一定是分裂状态。如果需要对分裂库进行重建,则需要手动将 dmwatcher.ctl 文件删除,否则守护进程仍然会认定本地库为分裂库。
守护进程控制文件仅包含版本号、状态及分裂描述信息这三项内容。
状态字段包含以下两种:
已mount方式启动备库。
[dmdba@localhost bin]$ ./DmServiceGRP1 start
重置OGUID和数据库模式。
sp_set_oguid()设置的 OGUID 值必须与主库一致。若重建的备库仍和主库在同一个集群中,则还原后备库的 OGUID 值与主库是一致的。
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);
[dmdba@localhost bin]$ ./DmWatcherServiceWatcher start
登录监视器查看集群状态已恢复正常,实例状态均为OPEN。
[dmdba@localhost bin]$ ./dmmonitor /data/dmdata/DAMENG/dmmonitor_auto.ini
如果数据规模比较大、联机备份耗时较长、应用压力比较大的情况下,主库联机备份、
备库脱机还原过程中,主库可能又新产生了大量归档日志。使用上述步骤重建备库后,主库
向备库同步历史数据的时间会比较久,主备库数据会在比较长的一段时间内处于不一致状
态。对这种情况,用户可以通过归档备份、还原和归档恢复功能,将备库数据恢复到更加接
近主库的最新状态,有效减少备库加入主备系统后的历史数据同步时间。执行步骤如下:
停止数据库实例和守护进程。
登录主库,执行联机备份。
解释:
数据备份主要针对数据文件内容,包括库备份、表空间备份和表备份。其中,未指定
WITHOUT LOG 参数执行的库备份和表空间备份还包含了 REDO 日志备份。
库备份,顾名思义就是对整个数据库执行的备份,又称为库级备份。库备份会拷贝数据
库中所有数据文件的有效数据页。DM8 备份与还原
表空间备份是针对特定表空间执行的备份,又称为表空间级备份。表空间备份只能在联
机状态下执行。
表备份则拷贝指定表的所有数据页到备份集中,并会记录各个数据页之间的逻辑关系用
以恢复。表备份只能在联机状态下执行,一次表备份操作只能备份一张用户表,并且不支持
增量表备份。
SQL> BACKUP DATABASE FULL BACKUPSET ‘/data/dmdata/BACKUP_FILE_03’ WITHOUT LOG;
将主库备份文件拷贝到备库,执行脱机还原
[dmdba@localhost bin]$ ./dmrman CTLSTMT=“RESTORE DATABASE ‘/data/dmdata/DAMENG/dm.ini’ FROM BACKUPSET ‘/data/dmdata/BACKUP_FILE_03’”
启动 DIsql 登录主库,查看备份集的 BEGIN_LSN,并从 BEGIN_LSN 开始备份主
库的归档日志。(这里假设查询到的备份集 BEGIN_LSN 是 2176891)。
如果备份集不是在默认备份路径下,则需要先将备份集所在目录添加进来,否则会查询
不到备份集信息:
SQL> SELECT SF_BAKSET_BACKUP_DIR_ADD(‘DISK’,’/data/dmdata/’);
备份归档日志
SQL> SELECT BACKUP_NAME,BEGIN_LSN FROM V$BACKUPSET;
SQL> BACKUP ARCHIVE LOG FROM LSN 2176891 BACKUPSET ‘/data/dmdata/ARCH_BAK_03’;
控制文件
数据守护 V4.0 对守护进程控制文件(dmwatcher.ctl)进行了简化,仅用于记录本地
数据库的分裂状态和分裂描述信息。守护进程在检测到本地库分裂时,自动创dmwatcher.ctl 文件,保存在本地库的 SYSTEM_PATH路径下,并且文件中记录的状态一定是 Split 分裂状态。如果dmwatcher 加载到 dmwatcher.ctl 文件,则认为对应的库一定是分裂状态。如果需要对分裂库进行重建,则需要手动将 dmwatcher.ctl 文件删除,否则守护进程仍然会认定本地库为分裂库。
守护进程控制文件仅包含版本号、状态及分裂描述信息这三项内容。
状态字段包含以下两种:
利用这些归档日志进行数据库 恢复。
[dmdba@localhost bin]$ ./dmrman CTLSTMT=“RESTORE ARCHIVE LOG FROM BACKUPSET ‘/data/dmdata/ARCH_BAK_03’ TO ARCHIVEDIR ‘/data/dmdata/DAMENG/arch1’”
[dmdba@localhost bin]$ ./dmrman CTLSTMT=“RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ WITH ARCHIVEDIR ‘/data/dmdata/DAMENG/arch1’”
[dmdba@localhost bin]$ ./dmrman CTLSTMT=“RECOVER DATABASE ‘/data/dmdata/DAMENG/dm.ini’ UPDATE DB_MAGIC”
已mount方式启动备库。
[dmdba@localhost bin]$ ./DmServiceGRP1 start
重置OGUID和数据库模式。
sp_set_oguid()设置的 OGUID 值必须与主库一致。若重建的备库仍和主库在同一个集群中,则还原后备库的 OGUID 值与主库是一致的。
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);
[dmdba@localhost bin]$ ./DmWatcherServiceWatcher start
登录监视器查看集群状态已恢复正常,实例状态均为OPEN。
[dmdba@localhost bin]$ ./dmmonitor /data/dmdata/DAMENG/dmmonitor_auto.ini
在数据库高可用性(HA)和集群环境中,组分裂(Split)和脑裂(Split-Brain) 是两种不同的异常状态,但都与网络或同步问题相关。它们的核心区别如下:
组分裂的预防:
配置合理的超时和心跳检测机制。
使用多路径网络冗余减少通信中断风险。
脑裂的预防:
仲裁机制(Quorum):确保集群中只有多数节点存活时才能选举主节点。
Fencing(隔离):强制关闭不确定状态的节点(如电源隔离)。
人工干预确认:关键切换需手动确认(如 FORCE FAILOVER 命令)。
文章
阅读量
获赞