首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询以检查辅助数据库是否已从可用性组中删除

SQL查询以检查辅助数据库是否已从可用性组中删除
EN

Database Administration用户
提问于 2019-02-15 20:40:15
回答 2查看 2.7K关注 0票数 2

我有一个AG,有一个主副本和一个二级副本。我已经创建了一个脚本,可以从这些数据库副本查询事务日志备份并将它们还原到目标数据库。

最近,一个用户从AG中删除了一个辅助数据库,并开始使用它作为一个独立的数据库,如这里所解释的https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/remove-a-secondary-database-from-an-availability-group-sql-server?view=sql-server-2017。用户还启动了该数据库的备份链。

当恢复叉guid在辅助数据库上更改时,脚本现在无法恢复。

是否有一种方法可以检测数据库是否离开了AG,以便在脚本中,当我查询备份时,如果数据库不再是AG的一部分,就可以跳过数据库?

谢谢!

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-02-15 20:52:52

您可以使用existssys.dm_hadr_database_replica_states DMV一起查看DB是否在AG中。

为参与Server本地实例承载可用性副本的“始终在可用性”组中的每个数据库返回一行。此动态管理视图公开主副本和辅助副本的状态信息。在辅助副本上,此视图为服务器实例上的每个辅助数据库返回一行。在主副本上,此视图为每个主数据库返回一行,为相应的辅助数据库返回另一行。

以下是查询:

代码语言:javascript
运行
复制
if exists(
    select 
        DBName = db_name(s.database_id)
        ,s.is_local
        ,s.synchronization_state_desc
        ,s.synchronization_health_desc
    from sys.dm_hadr_database_replica_states s
    where db_name(s.database_id) = 'your_database'
    )
begin
--do something useful
end
else
begin
--exit, probably without error
end

如果您不在2014+上,则需要对辅助程序进行查询。如果是,则可以将s.is_primary_replica = 0添加到查询中。或者您可以使用这种方法或类似的方法。

票数 2
EN

Database Administration用户

发布于 2019-02-15 21:32:34

您可以使用以下查询来确定给定数据库是否在给定服务器上有副本。替换WHERE子句中的占位符,以指定正在检查的数据库和服务器,并在主服务器上运行它。

代码语言:javascript
运行
复制
SELECT 
  * 
FROM 
  sys.dm_hadr_availability_replica_states rs 
  JOIN sys.dm_hadr_database_replica_cluster_states dcs ON dcs.replica_id = rs.replica_id 
  JOIN sys.dm_hadr_availability_replica_cluster_states acs ON acs.replica_id = rs.replica_id 
WHERE 
  dcs.database_name = '<databasename>' 
  AND acs.replica_server_name = '<servername>'
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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