SQL 快照重定向

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 手动连接到数据库快照。但是,为了支持生产环境,您应该创建一个编程解决方案,透明地将报表编写客户端定向到数据库的最新数据库快照。 ”

Dan*_*man 5

一种方法是创建一个仅包含同义词的数据库,这些同义词引用您需要报告的快照中的对象。然后客户端可以连接到同义词数据库并运行查询,就像他们直接使用快照一样。

每当创建新快照时,运行脚本以使用新快照数据库名称更新同义词。下面是为快照中的所有表、视图和过程重新创建同义词的示例。如果需要,添加其他对象类型。

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 可以使用该数据源动态创建其连接。此示例略有不同,但适用相同的一般概念

https://www.mssqltips.com/sqlservertip/4302/implement-dynamic-data-sources-in-sql-server-reporting-services/