首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是谁或是什么引发了故障转移

问是谁或是什么引发了故障转移
EN

Database Administration用户
提问于 2017-06-13 17:39:05
回答 5查看 7.3K关注 0票数 3

我们已经将集群设置为高可用性和手动故障转移。每当发生故障转移时,我都会向DBA发送电子邮件。我们也希望在电子邮件中看到为什么和/或世卫组织。我们还有其他的团队,他们一直在重新启动,测试和删除一些东西,我们想知道这是否是某个人在做什么,而不是什么错误。现在,电子邮件是“可用性组数据库”TESTIN2,因为镜像会话或可用性组由于角色同步失败而将角色从“主”更改为“解析”。这只是一条信息消息。不需要用户操作。“谢谢

EN

回答 5

Database Administration用户

发布于 2017-06-13 21:07:53

我们也希望在电子邮件中看到为什么和/或世卫组织。

然后,您前面有相当多的开发工作。我是认真的。

每个人都问同样的问题,但用更多的决心回答这个问题比“这个问题在这个时候失败了”更不容易。虚拟化等东西使得这变得更加困难,因为工具和管理程序本身可能会做超出沙箱权限范围的事情。

然而,为了让您开始,需要对数据进行检查的位置:

  1. Server错误日志
  2. 应用程序事件日志
  3. 系统事件日志
  4. 群集日志/聚类事件日志
  5. 管理程序日志/数据库
  6. 停机/升级/补丁/等等的内部列表。

祝你好运。

我们还有其他的团队,他们一直在重新启动,测试和删除一些东西,我们想知道这是否是某个人在做什么,而不是什么错误。

这是一个组织信息共享/管理问题,在通过一个简单的Server警报来处理这个问题时,您不会有太多的帮助。实际上,要正确地做到这一点,您将需要将Server从图片中删除!

最有可能的情况是,您需要编写一个不断使用事件日志、跟踪、错误日志等的服务,然后在出现问题时采取行动。

票数 4
EN

Database Administration用户

发布于 2018-05-08 19:45:25

我将考虑设置一个扩展事件,以跟踪batch_starting、sql_statement_starting、alwayson_ddl_executed或availability_replica_state_change事件的sql_statement_starting在哪里。顶部图像是XE的实时数据视图,下面的图像是记录的内容。我模糊了我的信息,但用户名显示谁发出了故障转移命令。

创建我使用的XE的代码(可能对我包含的事件过高,但它对我有效):

代码语言:javascript
复制
    CREATE EVENT SESSION [Audit_Availability_Group_Failovers] ON SERVER 
ADD EVENT sqlserver.alwayson_ddl_executed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.availability_group_lease_expired(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.availability_replica_automatic_failover_validation(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.availability_replica_manager_state_change(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.availability_replica_state(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.availability_replica_state_change(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.hadr_undo_of_redo_log_scan(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.sql_batch_starting(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%'))),
ADD EVENT sqlserver.sql_statement_starting(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%ALTER AVAILABILITY GROUP%FAILOVER%')))
ADD TARGET package0.event_file(SET filename=N'D:\Audit_Availability_Group_Failovers.xel'),
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=ON)
GO
票数 3
EN

Database Administration用户

发布于 2017-06-18 01:03:54

根据我的经验,当用户启动故障转移时,它不会被记录。你可以花几个小时搜索日志,但它不会告诉你是谁干的。如果您只希望特定人员访问AlwaysOn仪表板,则需要在实例中配置您的安全设置。如果有人重新启动了装载主副本的服务器,您可以看到故障转移何时发生,然后查看系统日志中的USER32事件,该事件将告诉您是谁重新启动了服务器。除此之外,您还可以使用登录审核来查看连接到实例的人,但这可能是一个猜测游戏。

缺少错误日志使您知道它是用户(手动故障转移或重新启动)。另一方面,如果它是由错误引起的,您肯定会在Sean提到的地方看到显式错误。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/176199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档