AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 249123
Accepted
youcantryreachingme
youcantryreachingme
Asked: 2019-09-19 21:32:12 +0800 CST2019-09-19 21:32:12 +0800 CST 2019-09-19 21:32:12 +0800 CST

Os bancos de dados do grupo de disponibilidade em uma réplica secundária são definidos automaticamente como somente leitura pelo AG?

  • 772

Eu li os documentos do MS sobre roteamento somente leitura , mas não estou falando sobre isso.

Atualmente, se eu executar um UPDATEem 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 UPDATEe ALTERmuito 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 UPDATEuma 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_permissionsnã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.

availability-groups sql-server-2016
  • 2 2 respostas
  • 1670 Views

2 respostas

  • Voted
  1. Best Answer
    George.Palacios
    2019-09-19T23:57:48+08:002019-09-19T23:57:48+08:00

    Eu daria uma boa leitura aos documentos . Particularmente a seção sobre réplicas de disponibilidade .

    Cada réplica de disponibilidade recebe uma função inicial - a função primária ou a função secundária, que é herdada pelos bancos de dados de disponibilidade dessa réplica. A função de uma determinada réplica determina se ela hospeda bancos de dados de leitura/gravação ou bancos de dados somente leitura. Uma réplica, conhecida como réplica primária, recebe a função primária e hospeda bancos de dados de leitura e gravação, conhecidos como bancos de dados primários. Pelo menos uma outra réplica, conhecida como réplica secundária, recebe a função secundária. Uma réplica secundária hospeda bancos de dados somente leitura, conhecidos como bancos de dados secundários.

    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_onlyem sys.databases), nem é tem a mesma configuração que a opção somente leitura no nível do grupo de arquivos.

    • 2
  2. youcantryreachingme
    2019-09-20T15:12:50+08:002019-09-20T15:12:50+08:00

    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_ONLYe 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_onlye set read_writeafeta sys.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:

    • Estado 1

    Isso é diferente do erro na pergunta do post original, que mostrava

    • Estado 2

    Um artigo em outro lugar cita o MS Books Online para esclarecer a finalidade desse valor:

    Um número de um a três dígitos com um valor máximo de 127 que indica aos engenheiros e desenvolvedores de suporte da Microsoft a localização no código do SQL Server que gerou a mensagem

    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 em sys.databases.is_read_only) e Estado 2 = parte de um AG e em uma réplica atualmente atuando como Secundária.

    create database CLRTEST;
    go
    
    use CLRTEST;
    go
    
    create table CLRTEST.dbo.testTable (id int);
    go
    
    SELECT name, is_read_only FROM sys.databases where name = 'CLRTEST';
    go -- Value 0 means we can read and write
    
    SELECT * FROM fn_my_permissions(null, 'DATABASE') where permission_name = 'insert' ORDER BY subentity_name, permission_name ;  
    go -- We have insert permission in the database
    
    SELECT * FROM fn_my_permissions('testTable', 'OBJECT') where permission_name = 'insert' ORDER BY subentity_name, permission_name;
    go -- We have insert permission on the table
    
    insert into CLRTEST.dbo.testTable values (1);
    go -- insert succeeds
    
    alter database CLRTEST set read_only; -- Does change sys.databases.is_read_only to 1
    go -- we set database to read-only
    
    SELECT name, is_read_only FROM sys.databases where name = 'CLRTEST';
    go -- value 1 shows database is now read-only
    
    SELECT * FROM fn_my_permissions(null, 'DATABASE') where permission_name = 'insert' ORDER BY subentity_name, permission_name;
    go -- ! but we still have insert permission in the database
    
    SELECT * FROM fn_my_permissions('testTable', 'OBJECT') where permission_name = 'insert' ORDER BY subentity_name, permission_name;
    go -- ! and we still have insert permission on the table
    
    insert into CLRTEST.dbo.testTable values (2);
    go -- ! but insert fails, with message below
    
    -- Produces message:
    -- Msg 3906, Level 16, State 1, Line 22
    -- Failed to update database "CLRTEST" because the database is read-only.
    
    alter database CLRTEST set read_write with no_wait;
    go -- we set database to read-write
    
    SELECT name, is_read_only FROM sys.databases where name = 'CLRTEST';
    go -- value 0 shows database is read-write
    
    SELECT * FROM fn_my_permissions(null, 'DATABASE') where permission_name = 'insert' ORDER BY subentity_name, permission_name ;  
    go -- permissions same as all the way through this test
    
    SELECT * FROM fn_my_permissions('testTable', 'OBJECT') where permission_name = 'insert' ORDER BY subentity_name, permission_name;
    go -- permissions same as all the way through this test
    
    insert into CLRTEST.dbo.testTable values (3);
    go -- and we can insert again, as expected
    
    use master;
    go
    
    drop database CLRTEST;
    go
    
    • 2

relate perguntas

  • AlwaysOn AG, DTC com failover

  • Bancos de dados fora do grupo de disponibilidade AlwaysOn travados no status RESTORING [fechado]

  • Os bloqueios em bancos de dados secundários somente leitura se propagam para o banco de dados de leitura/gravação

  • Nó preferencial para leitura no Grupo de Disponibilidade em uma configuração multisite

  • Como determinar se a configuração de alta disponibilidade está funcionando corretamente

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve