SQL 上的内存 Table 2014 HA 集群在辅助节点上不可查询
In-Memory Table on SQL 2014 HA cluster not queriable on Secondary nodes
我在 SQL 2014 的高可用性组数据库上设置了一个简单的内存 table。
直接从主节点或从监听器查询 table 工作正常。
如果我将查询字符串更改为 ReadOnly Intent 或尝试直接从 2 个辅助节点中的任何一个进行查询,我会收到以下错误:-
Msg 41341, Level 16, State 1, Line 1
Table 'tbl_GetMakes' is not yet available on the secondary replica.
网上关于此消息的信息很少。它谈到它在 "REDO" 过程发生时被正确复制。据我所知,"REDO" 过程应该是自动的,table 已经运行了 24 小时多一点,但仍然无法正常工作。
有什么想法吗?
谢谢,
乔恩
感谢 Sean Gallardy 在 Microsoft 论坛上回答了这个问题
我已将上述 link 的答案转载如下:-
这是不正确的,它们绝对可以从可读的辅助设备读取,假设:
内存中 table 的耐久度 = schema_and_data
检查点在主节点上有 运行
使用适当的隔离级别
我可以很容易地让它工作,这是一个重现:
1. 在主数据库上创建数据库并放入 AG
CREATE DATABASE [Test1]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Test1',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Test1.mdf' ,
SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [IMOLTP] CONTAINS MEMORY_OPTIMIZED_DATA DEFAULT
( NAME = N'imoltp_dir',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\imoltp_dir' ,
MAXSIZE = UNLIMITED)
LOG ON
( NAME = N'Test1_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Test1_log.ldf' , SIZE = 1280KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
- 创建 IM Table 并填充
CREATE TABLE dbo.IMOLTP
(
C1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
INSERT INTO dbo.IMOLTP(C1) VALUES (1), (2), (3)
GO
CHECKPOINT
SELECT * FROM dbo.IMOLTP
- 从可读辅助读取
Use Test1
GO
SELECT * FROM dbo.IMOLTP
GO
它对我来说很好用:Microsoft SQL Server 2014 (SP2-CU3) (KB3204388) - 12.0.5538.0 (X64)
-肖恩
我在 SQL 2014 的高可用性组数据库上设置了一个简单的内存 table。 直接从主节点或从监听器查询 table 工作正常。 如果我将查询字符串更改为 ReadOnly Intent 或尝试直接从 2 个辅助节点中的任何一个进行查询,我会收到以下错误:-
Msg 41341, Level 16, State 1, Line 1
Table 'tbl_GetMakes' is not yet available on the secondary replica.
网上关于此消息的信息很少。它谈到它在 "REDO" 过程发生时被正确复制。据我所知,"REDO" 过程应该是自动的,table 已经运行了 24 小时多一点,但仍然无法正常工作。 有什么想法吗? 谢谢, 乔恩
感谢 Sean Gallardy 在 Microsoft 论坛上回答了这个问题
我已将上述 link 的答案转载如下:-
这是不正确的,它们绝对可以从可读的辅助设备读取,假设: 内存中 table 的耐久度 = schema_and_data 检查点在主节点上有 运行 使用适当的隔离级别 我可以很容易地让它工作,这是一个重现: 1. 在主数据库上创建数据库并放入 AG
CREATE DATABASE [Test1]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Test1',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Test1.mdf' ,
SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [IMOLTP] CONTAINS MEMORY_OPTIMIZED_DATA DEFAULT
( NAME = N'imoltp_dir',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\imoltp_dir' ,
MAXSIZE = UNLIMITED)
LOG ON
( NAME = N'Test1_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Test1_log.ldf' , SIZE = 1280KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
- 创建 IM Table 并填充
CREATE TABLE dbo.IMOLTP ( C1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000) ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
INSERT INTO dbo.IMOLTP(C1) VALUES (1), (2), (3) GO
CHECKPOINT
SELECT * FROM dbo.IMOLTP
- 从可读辅助读取
Use Test1 GO
SELECT * FROM dbo.IMOLTP GO
它对我来说很好用:Microsoft SQL Server 2014 (SP2-CU3) (KB3204388) - 12.0.5538.0 (X64)
-肖恩