服务器用的阿里云服务器,自己做的非域Aways On主从同步。
故障描述:所有从数据库无法同步主数据库的数据,查看Aways On的服务器状态,所有服务器已离线。
故障排查:
1.查看同步状态,延时非常高。
SELECT availability_mode_desc , role_desc , replica_server_name , last_redone_time , GETDATE() now , DATEDIFF(ms, last_redone_time, GETDATE()) diffMS FROM ( ( sys.availability_groups AS ag JOIN sys.availability_replicas AS ar ON ag.group_id = ar.group_id ) JOIN sys.dm_hadr_availability_replica_states AS ar_state ON ar.replica_id = ar_state.replica_id ) JOIN sys.dm_hadr_database_replica_states dr_state ON ag.group_id = dr_state.group_id AND dr_state.replica_id = ar_state.replica_id;
2.检查同步面板,所有服务器离线。
3.检查数据库日志,发现问题:大致意思为证书过期。
Database Mirroring login attempt failed with error: 'Connection handshake failed. The certificate used by this endpoint was not found: Certificate expired. Use DBCC CHECKDB in master database to verify the metadata integrity of the endpoints. State 85
4.检查群集状态,正常。
5.百度后发现是由于服务器aways on证书过期导致的。昨天对服务器进行了续费操作,因而推断去年的今天做了数据库非域Aways on,没有注意到证书的有效时间,而证书默认有效时间为1年,与证书过期相吻合。
故障原因:非域Aways on同步对应的数据库证书过期。
故障解决:
1.在各服务器查询所有的证书,找到所有的过期证书。
select * from master.sys.certificates
2.删除所有的过期证书。
DROP CERTIFICATE 证书名称
如果证书名称中包含有特殊字符,例如-,需要采用下面的方法进行删除。
declare @CompName varchar(255),@dySql varchar(1000) set @CompName='证书部分名称' set @dySql=CONCAT('drop CERTIFICATE ', QUOTENAME(@CompName + '-特殊字符后')) exec (@dySql);
3.如果是删除当前服务器的证书,则会报错,删除失败,需要先删除端点,再删除证书。
查看端点
select * from master.sys.database_mirroring_endpoints
删除端点
DROP ENDPOINT Endpoint_Mirroring
4.参考Aways on的搭建,重新生成证书并导入到对应的服务器中。
5.参考Aways on的搭建,重新加入从数据库到Aways on中。
6.讲过上述步骤后,主从同步正常。