3 sql-server mirroring snapshot sql-server-2012 disaster-recovery
公司正在实施与快照异步的数据库镜像。这提供了一些具有报告功能的灾难恢复区域。服务器 A 主体包含镜像到服务器 B 的数据库,快照是在服务器 B 数据库上拍摄的。
为了启用更新的数据,我们将每 30 分钟在镜像服务器数据库上创建一次数据库快照。我们如何将所有 SSRS/报告存储过程查询重定向到最新快照?我们的报告查询非常短,一般在 10 秒左右。微软在下面提到了程序化解决方案,不确定那是什么?所以SalesDB1030、SalesDB1100、SalesDB1130、24clock加在dbname后面
报告查询可能是
select * from SalesDbSnapshot.dbo.SalesTransaction st
inner join SalesDbSnapshot.dbo.Customer cs
on st.CustomerId = cs.CustomerId
inner join SalesDbSnapshot.dbo.Product pr
on st.ProductId = pr.ProductId
Run Code Online (Sandbox Code Playgroud)
“要使用数据库快照,客户端需要知道在哪里可以找到它。用户可以在创建或删除一个数据库快照时读取另一个数据库快照。但是,当您用新快照替换现有快照时,您需要将客户端重定向到新快照。用户可以通过 SQL Server Management Studio 手动连接到数据库快照。但是,为了支持生产环境,您应该创建一个编程解决方案,透明地将报表编写客户端定向到数据库的最新数据库快照。 ”
一种方法是创建一个仅包含同义词的数据库,这些同义词引用您需要报告的快照中的对象。然后客户端可以连接到同义词数据库并运行查询,就像他们直接使用快照一样。
每当创建新快照时,运行脚本以使用新快照数据库名称更新同义词。下面是为快照中的所有表、视图和过程重新创建同义词的示例。如果需要,添加其他对象类型。
USE SynonymDatabase;
DECLARE
@SnapshotDatabaseName sysname = N'YourSnapshotDatabase'
, @SQL nvarchar(MAX)
, @DropSynonymsSQL nvarchar(MAX)
, @CreateSynonymsSQL nvarchar(MAX);
--generate DROP SYNONYM script
SELECT @DropSynonymsSQL = (SELECT N'DROP SYNONYM ' + QUOTENAME(sch.name) + N'.' + QUOTENAME(syn.name) + N';
'
FROM sys.synonyms AS syn
JOIN sys.schemas AS sch ON sch.schema_id = syn.schema_id
FOR XML PATH(''), TYPE).value('(./text())[1]', 'nvarchar(MAX)');
--generate CREATE SYNONYM script
SET @SQL = N'USE ' + QUOTENAME(@SnapshotDatabaseName) + N';
SELECT @CreateSynonymsSQL = (SELECT N''CREATE SYNONYM '' + QUOTENAME(sch.name) + N''.'' + QUOTENAME(obj.name) +
N'' FOR '' + QUOTENAME(@SnapshotDatabaseName) + N''.'' + QUOTENAME(sch.name) + N''.'' + QUOTENAME(obj.name) + N'';
''
FROM sys.objects AS obj
JOIN sys.schemas AS sch ON sch.schema_id = obj.schema_id
WHERE
obj.type IN(''U'', ''V'', ''P'')
AND obj.is_ms_shipped = 0
FOR XML PATH(''''), TYPE).value(''(./text())[1]'', ''nvarchar(MAX)'');';
EXECUTE sp_executesql
@SQL
, N'@SnapshotDatabaseName sysname, @CreateSynonymsSQL nvarchar(MAX) OUTPUT'
, @SnapshotDatabaseName = @SnapshotDatabaseName
, @CreateSynonymsSQL = @CreateSynonymsSQL OUTPUT;
BEGIN TRY
BEGIN TRAN;
EXEC sp_executesql @DropSynonymsSQL;
EXEC sp_executesql @CreateSynonymsSQL;
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH;
GO
Run Code Online (Sandbox Code Playgroud)
来自 Aaron:创建快照的作业可以将新的数据库名称存储在表中,SSRS 可以使用该数据源动态创建其连接。此示例略有不同,但适用相同的一般概念