Eu li os documentos do MS sobre roteamento somente leitura , mas não estou falando sobre isso.
Atualmente, se eu executar um UPDATE
em um banco de dados que está em uma réplica secundária e faz parte do grupo de disponibilidade, recebo uma mensagem:
Msg 3906, Level 16, State 2, Line 6
Failed to update database "dbName" because the database is read-only.
Minha dúvida é se essa configuração é estabelecida por padrão (e inevitável) em virtude do banco de dados fazer parte do AG e estar em um Secundário no momento?
Alguns extras interessantes:
O SQL a seguir, executado nesse Secundário, mostra que tenho UPDATE
e ALTER
muito mais permissões nesse banco de dados:
SELECT *
FROM fn_my_permissions(null, 'DATABASE')
ORDER BY subentity_name, permission_name;
O SQL a seguir mostra explicitamente que tenho permissão para UPDATE
uma tabela nesse banco de dados:
SELECT *
FROM fn_my_permissions('dbName.dbo.tblName', 'OBJECT')
ORDER BY subentity_name, permission_name ;
Apesar disso, estou realmente impedido de atualizar essa tabela. Isso implica:
- A saída de
fn_my_permissions
não está estritamente correta - A configuração "somente leitura" do banco de dados substitui permissões individuais
Eu entendo que a configuração em jogo é configurada por meio de:
ALTER DATABASE dbName SET READ_ONLY
e
ALTER DATABASE dbName SET READ_WRITE WITH NO_WAIT
A principal razão para a pergunta é entender se a configuração "somente leitura" é responsabilidade de um DBA/designer durante o projeto e implantação do AG, ou um recurso esperado (e garantido?) pelo simples uso de um AG.
Eu daria uma boa leitura aos documentos . Particularmente a seção sobre réplicas de disponibilidade .
Como pode ser visto acima, cada réplica pode ser somente leitura ou leitura-gravação (secundária ou primária, respectivamente). Além disso, só pode haver uma réplica primária (leitura-gravação). Quando nos referimos a réplica a esse respeito, estamos nos referindo ao nível do banco de dados. Cada servidor pode hospedar vários grupos de disponibilidade, com configuração primária-secundária potencialmente mista.
A situação à qual você está se referindo com várias réplicas de leitura/gravação não é compatível com Grupos de Disponibilidade AlwaysOn, que são projetados para atender às necessidades de Alta Disponibilidade e Escala de Leitura, não configurações de vários mestres. Você deve analisar as tecnologias de replicação bidirecional para dar suporte a essa necessidade.
Quanto à configuração somente leitura em si, ela é definida automaticamente pelo grupo de disponibilidade, embora valha a pena dizer que não é a mesma configuração que a configuração "Database Read-Only" encontrada nas propriedades do banco de dados (ou
is_read_only
emsys.databases
), nem é tem a mesma configuração que a opção somente leitura no nível do grupo de arquivos.Eu aceitei a resposta de George porque ele me apontou diretamente para os documentos que afirmam que os bancos de dados AG em um secundário serão somente leitura (ou seja, por design do sistema AG pela MS).
No entanto, nos últimos detalhes da pergunta sobre a qual falei
ALTER DATABASE dbName SET READ_ONLY
e George esclareceu que é uma configuração diferente do que significa o AG definindo a função de um Secundário como somente leitura e, por extensão, todos os DBs nesse AG nesse Secundário.Eu investiguei isso mais a fundo e descobri que você pode verificar a diferença entre uma falha de atualização devido ao fato de o banco de dados fazer parte de um AG em um secundário e devido à propriedade somente leitura em relação ao banco de dados (que é definida com o SQL acima).
Abaixo está um script que demonstra como
set read_only
eset read_write
afetasys.databases.is_read_only
- mas, mais especificamente, mostra que você recebe uma mensagem de erro ligeiramente diferente se tentar atualizar um banco de dados protegido por essa propriedade, em vez de estar em um Secundário em um AG .O SQL a seguir cria um novo banco de dados que será automaticamente de leitura/gravação e não fará parte de nenhum AG, mesmo que criado em uma réplica que esteja atuando como Secundária em algum AG.
Observe o comentário que fornece a mensagem de erro quando você tenta atualizar uma tabela enquanto o banco de dados está definido para
read_only
- em particular, a parte:Isso é diferente do erro na pergunta do post original, que mostrava
Um artigo em outro lugar cita o MS Books Online para esclarecer a finalidade desse valor:
Em outras palavras, o erro "Falha ao atualizar o banco de dados "X" porque o banco de dados é somente leitura" pode se originar de pelo menos duas condições diferentes: Estado 1 = propriedade do banco de dados definida como
read_only
(visível emsys.databases.is_read_only
) e Estado 2 = parte de um AG e em uma réplica atualmente atuando como Secundária.