A configuração do meu laboratório doméstico consiste em quatro servidores executados no HyperV em dois hosts físicos. As instâncias do SQL Server são SQLAG101, SQLAG102, SQLAG201 e SQLAG202.
SQLAG101 e SQLAG102 são membros do SQLAG100 Availability Group e estão na rede 192.168.0.0/24.
SQLAG201 e SQLAG202 são membros do SQLAG200 Availability Group e estão na rede 192.168.2.0/24.
O tráfego é roteado entre as duas sub-redes, que são locais para meu laboratório (ou seja, há muito pouca latência envolvida).
SQLDAG é um Grupo de Disponibilidade Distribuído que abrange SQLAG100 e SQLAG200. Isso está funcionando bem há cerca de 6 meses, com failover automático entre os servidores membros do AG e failovers manuais entre os dois AGs funcionando corretamente e sem perda de dados.
No meu servidor de teste, estou vendo os seguintes erros no meu Distributed AG Forwarder para um banco de dados usando FILESTREAM
:
O sistema operacional retornou o erro '2(O sistema não pode encontrar o arquivo especificado.)' ao tentar 'CreateFileW' em 'F:\SQLServer\HV2019\FILESTREAM\dag_test_db\dag_test_db_fg_fs_f01\3e6a0757-7405-4ee2-b8a8-df878b8cd7ce\a10e3ae8 -922c-4821-904e-7555c031630d\0000008f-000292b0-0006' em 'fsdohdlr.cpp'(2474).
A movimentação de dados dos Grupos de Disponibilidade Always On para o banco de dados 'dag_test_db' foi suspensa pelo seguinte motivo: "system" (Source ID 3; Source string: 'SUSPEND_FROM_CAPTURE'). Para retomar a movimentação de dados no banco de dados, você precisará retomar o banco de dados manualmente. Para obter informações sobre como retomar um banco de dados de disponibilidade, consulte os Manuais Online do SQL Server.
(adoro essa referência do Books Online, btw)
Para solucionar problemas, abandonei completamente o dag_test_db
encaminhador e os encaminhadores secundários. Em seguida, fiz um backup completo do primário, restaurei-o no encaminhador e continuei restaurando os backups de log conforme necessário antes de adicionar o dag_test_db
retorno ao Grupo de Disponibilidade dos encaminhadores por meio deALTER DATABASE [dag_test_db] SET HADR AVAILABILITY GROUP = SQLAG200;
Inicialmente, o painel do grupo de disponibilidade para os encaminhadores AG (SQLAG200) mostrou o banco de dados como sendo sincronizado, mas após cerca de uma hora o estado de sincronização é exibido NOT SYNCHRONIZING
e a descrição do motivo da integridade da sincronização é exibida SUSPEND_FROM_CAPTURE
.
A execução chkdsk /f
na unidade F: não relata erros.
dbcc checkdb (dag_test_db)
do primário não retorna nenhum erro.
Escrevi uma consulta para ler todos os dados do filestream; talvez isso mostre algo interessante. Assim que tiver os resultados desse teste, atualizarei a pergunta. A consulta está usando ApplicationIntent=ReadOnly
via sqlcmd.exe para se conectar à instância do encaminhador. Esta é a consulta, para os interessados:
USE [dag_test_db];
GO
DECLARE @d varbinary(max);
DECLARE @f nvarchar(260);
DECLARE cur CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR
SELECT
[f].[file_data]
, [f].[original_file_name]
FROM [dbo].[files] [f];
OPEN cur;
FETCH NEXT FROM cur INTO @d, @f;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @f + N': ' + CONVERT(nvarchar(11), LEN(@d), 0);
FETCH NEXT FROM cur INTO @d, @f;
END
CLOSE cur;
DEALLOCATE cur;
Talvez algum jovem e arrojado engenheiro da Microsoft possa me ajudar a entender o que está causando um erro em fsdohdlr.cpp at 2474
?
DBCC CHECKDB ([dag_test_db]) WITH NO_INFOMSGS;
no primário global não mostra nenhuma corrupção.
Converter o nome do arquivo na mensagem de erro para um LSN decimal e usar fn_dblog
no primário global para exibir o conteúdo do log mostra:
LSN atual | Operação | Contexto | ID da transação | LogBlockGeneration | Tag Bits | Comprimento Fixo do Registro de Log | Comprimento do Registro de Log | LSN anterior | Bits de Sinalização | Reserva de Log | AllocUnitId | AllocUnitName | ID da página | ID do slot | Página Anterior LSN | PartitionId | RowFlags | Num Elements | Offset in Row | Modify Size | Checkpoint Begin | CHKPT Begin DB Version | Max XDESID | Num Transactions | Checkpoint End | CHKPT End DB Version | Minimum LSN | Dirty Pages | Oldest Replicated Begin LSN | Next Replicated End LSN | Last Distributed Backup End LSN | Last Distributed End LSN | Repl Min Hold LSN | Server UID | SPID | Beginlog Status | Xact Type | Begin Time | Transaction Name | Transaction SID | Parent Transaction ID | Oldest Active Transaction ID | Xact ID | Xact Node ID | Xact Node Local ID | End AGE | End Time | Transaction Begin | Replicated Records | Oldest Active LSN | Server Name | Database Name | Mark Name | Master XDESID | Master DBID | Preplog Begin LSN | Prepare Time | Virtual Clock | Previous Savepoint | Savepoint Name | Rowbits First Bit | Rowbits Bit Count | Rowbits Bit Value | Number of Locks | Lock Information | LSN before writes | Pages Written | Command Type | Publication ID | Article ID | Partial Status | Command | Byte Offset | New Value | Old Value | New Split Page | Linhas excluídas | Bytes liberados | ID da tabela CI | ID do índice de IC | NewAllocUnitId | ID do grupo de arquivos | Metastatus | Status do arquivo | ID do arquivo | Nome Físico | Nome Lógico | Formato LSN | RowsetId | TextPtr | Deslocamento da Coluna | Bandeiras | Tamanho do texto | Desvio | Tamanho antigo | Novo tamanho | Descrição | Contagem de extensão alocada em massa | Id do conjunto de linhas em massa | AllocUnitId em massa | Alocação em massa primeiro IAM Page ID | IDs de extensão alocados em massa | VLFs adicionados | InvalidateCache Id | Chaves InvalidateCache | ID da página de origem CopyVerionInfo | LSN da página de origem CopyVerionInfo | ID do slot de origem CopyVerionInfo | Contagem de slots de origem CopyVerionInfo | Conteúdo do RowLog 0 | RowLog Conteúdo 1 | RowLog Conteúdo 2 | RowLog Conteúdo 3 | RowLog Conteúdo 4 | RowLog Conteúdo 5 | Tipo de registro de compactação | Informação de compressão | PageFormat PageType | PageFormat PageFlags | PageFormat PageLevel | PageFormat PageStat | PageFormat FormatOption | registro de registro |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0000008F:000292B0:0006 | LOP_FS_DOWNLEVEL_OP | LCX_NULL | 0000:0022f09f | 0 | 0x0000 | 24 | 360 | 0000008F:000292B0:0005 | 0x0002 | 366 | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | NULO | Operation CREATE;File Id 65537;Name 3e6a0757-7405-4ee2-b8a8-df878b8cd7ce\a10e3ae8-922c-4821-904e-7555c031630d\0000008f-000292b0-0006 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0x000018008F000000B0920200050002009FF022000000910001004A01010000007000C00001000000010001000000000000000000000046003A005C00530051004C005300650072007600650072005C004D005300530051004C00310035002E004800560032003000310039005C004D005300530051004C005C0044004100540041005C006400610067005F0074006500730074005F00640062005F00660067005F0066007300330065003600610030003700350037002D0037003400300035002D0034006500650032002D0062003800610038002D006400660038003700380062003800630064003700630065005C00610031003000650033006100650038002D0039003200320063002D0034003800320031002D0039003000340065002D003700350035003500630030003300310036003300300064005C00300030003000300030003000380066002D00300030003000320038006600360038002D0030003000310030000001 |
O arquivo referenciado na mensagem de erro existe no sistema de arquivos do encaminhador:
C:\Users\Hannah>dir F:\SQLServer\HV2019\FILESTREAM\dag_test_db\dag_test_db_fg_fs_f01\3e6a0757-7405-4ee2-b8a8-df878b8cd7ce\a10e3ae8-922c-4821-904e-7555c031 630d\0000008f-000292b0-0006 O volume na unidade F não tem rótulo. O número de série do volume é 90BA-CEC3 Diretório de F:\SQLServer\HV2019\FILESTREAM\dag_test_db\dag_test_db_fg_fs_f01\3e6a0757-7405-4ee2-b8a8-df878b8cd7ce\a10e3ae8-922c-4821-904e-7555c031630d 28/04/2023 22:27 797.346 0000008f-000292b0-0006 1 Arquivo(s) 797.346 bytes 0 Dir(s) 123.663.937.536 bytes livres
icacls
para o caminho em questão no encaminhador mostra:
icacls F:\SQLServer\HV2019\FILESTREAM\dag_test_db\dag_test_db_fg_fs_f01\3e6a0757-7405-4ee2-b8a8-df878b8cd7ce\a10e3ae8-922c-4821-904e-7555c031630d F:\SQLServer\HV2019\FILESTREAM\dag_test_db\dag_test_db_fg_fs_f01\3e6a0757-7405-4ee2-b8a8-df878b8cd7ce\a10e3ae8-922c-4821-904e-7555c031630d NT SERVICE\MS$H V2019:(I)(OI)(CI)(F ) DIREITOS DO PROPRIETÁRIO:(I)(OI)(CI)(F) BUILTIN\Administradores:(I)(OI)(CI)(F) 1 arquivo processado com sucesso; Falha ao processar 0 arquivos
As permissões parecem boas pelo que posso ver - o serviço SQL Server como controle total sobre o arquivo e, de fato, toda a estrutura de pastas de F:\SQLServer\HV2019
.
Não consegui determinar conclusivamente qual
SUSPEND_FROM_CAPTURE
era a causa raiz do problema. Aparentemente, esse status indica que o encaminhador (ou secundário) não pode mais ler o fluxo de logs do primário de forma a permitir que o secundário acompanhe o primário.Para resolver isso no encaminhador, removi o banco de dados do SQLAG200 Availability Group primário (ou seja, o encaminhador) e, em seguida, descartei-o do secundário do SQLAG200 Availability Group. Em seguida, restaurei o banco de dados de backups no secundário SQLAG200 e o primário SQLAG200, garantindo que os backups de log de transações aplicáveis fossem restaurados para trazer cada cópia do banco de dados o mais próximo possível do estado na cópia primária global do banco de dados no SQLAG100. Depois que as restaurações foram concluídas, consegui que o encaminhador alcançasse o primário global:
Isso associa o banco de dados recém-restaurado ao Grupo de Disponibilidade dos encaminhadores e, por extensão, ao Grupo de Disponibilidade primário global por meio do Grupo de Disponibilidade Distribuído.
Depois que o encaminhador estava a bordo, fiz o seguinte nos encaminhadores secundários:
E, finalmente, parece estável. O que aprendi com tudo isso foi que, em nenhum momento, a cópia primária do banco de dados ficou offline ou ficou indisponível para meu cliente de teste C# Filestream. Ele apenas continuou gravando arquivos no
dag_test_db
grupo de arquivos do fluxo de arquivos. Pode demorar um pouco, mas enquanto o principal estiver online, o negócio não ficará muito chateado.Estou feliz por ter um laboratório doméstico configurado como este, onde posso praticar como lidar com esses tipos de problemas antes que eles afetem um banco de dados de produção real.
O Microsoft CSS tem um sinalizador de rastreamento não documentado que pode ser usado na inicialização do SQL Server para desabilitar vários fluxos de log, que é um novo recurso no SQL Server 2022. No meu caso, habilitar esse sinalizador de rastreamento resolveu o problema; remover o sinalizador de rastreamento fez com que o problema ocorresse quase imediatamente.