我有一个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的一部分,就可以跳过数据库?
谢谢!
发布于 2019-02-15 20:52:52
您可以使用exists
与sys.dm_hadr_database_replica_states
DMV一起查看DB是否在AG中。
为参与Server本地实例承载可用性副本的“始终在可用性”组中的每个数据库返回一行。此动态管理视图公开主副本和辅助副本的状态信息。在辅助副本上,此视图为服务器实例上的每个辅助数据库返回一行。在主副本上,此视图为每个主数据库返回一行,为相应的辅助数据库返回另一行。
以下是查询:
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
添加到查询中。或者您可以使用这种方法或类似的方法。
发布于 2019-02-15 21:32:34
您可以使用以下查询来确定给定数据库是否在给定服务器上有副本。替换WHERE子句中的占位符,以指定正在检查的数据库和服务器,并在主服务器上运行它。
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>'
https://dba.stackexchange.com/questions/229895
复制相似问题