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 / 238844
Accepted
GoodwinSQL
GoodwinSQL
Asked: 2019-05-23 17:28:02 +0800 CST2019-05-23 17:28:02 +0800 CST 2019-05-23 17:28:02 +0800 CST

Impeça o acesso de leitura na réplica primária do AG, mas permita-o no secundário legível

  • 772

Temos uma situação única em que queremos permitir que os usuários consultem uma réplica secundária legível de um banco de dados com SSMS para relatórios ad hoc, mas não permitir que eles leiam da réplica primária. Configuramos o roteamento somente leitura para fazer isso. Isso também está tudo no SQL 2016.

Meu pensamento inicial foi criar o logon nas réplicas primária e secundária e conceder acesso de leitura ao banco de dados em questão. Em seguida, DENY CONNECT ou desabilitamos o login na réplica primária atual. No SSMS, os usuários podem se conectar ao Ouvinte com ApplicationIntent=ReadOnly e ser roteados para a réplica secundária sem nunca tocar na primária.

Configuramos um trabalho simples nos servidores de réplica primário e secundário com lógica básica: IF current server = primary then disable login; se o servidor atual = secundário, ative o login.

O problema é que estou recebendo falhas de login ao conectar ao listener com intenção somente leitura quando o login está desabilitado no servidor primário. Quando eu reabilito o logon na réplica primária, ele funciona bem e a conexão é roteada corretamente para o secundário legível.

Eu configuro um rastreamento no servidor primário e, com certeza, posso ver o login conectar e executar algumas consultas de tipo de sistema em master e msdb na réplica primária - mesmo que eu esteja conectando com ApplicationIntent=ReadOnly no SSMS. Não tenho certeza se isso é algo que o SSMS faz nos bastidores ou se é o comportamento padrão de um logon passando pelo processo de roteamento somente leitura.

Aqui estão as consultas que capturei com o rastreamento do criador de perfil rápido no primário:

--msdb query

    select 
        case 
            when object_id('dbo.sysdac_instances') is not null then 1             
        else
            0 
        end

--master query

SELECT
dtb.name AS [Name],
dtb.database_id AS [ID],
CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible]
FROM
master.sys.databases AS dtb
ORDER BY
[Name] ASC

Alguém já teve que lidar com essa situação antes? Parece que basicamente precisamos permitir uma permissão de conexão de login na réplica primária enquanto negamos acesso de leitura ao banco de dados no AG no primário, mas concedemos a essa permissão de login para ler o banco de dados na réplica secundária legível.

A outra alternativa é criar uma entrada DNS que aponte diretamente para a réplica secundária, mas não podemos garantir que a réplica SEMPRE seja a secundária, pois pode ocorrer um failover.

sql-server sql-server-2016
  • 5 5 respostas
  • 2194 Views

5 respostas

  • Voted
  1. Best Answer
    Josh Darnell
    2019-05-24T03:05:56+08:002019-05-24T03:05:56+08:00

    Parece que basicamente precisamos permitir uma permissão de conexão de login na réplica primária [...]

    Isso é exatamente certo. O login que está sendo usado para conectar deve ser capaz de se conectar ao primário.

    Ao usar ApplicationIntent=ReadOnlyem uma cadeia de conexão que aponta para um ouvinte AG, o driver se conecta inicialmente à instância primária. Isso é para que o SQL Server possa revisar a lista de réplicas e ver se há réplicas disponíveis e legíveis online para enviar a você. Isso está documentado aqui:

    Intenção de aplicativo somente leitura e roteamento somente leitura

    O banco de dados primário do grupo de disponibilidade processa a solicitação de roteamento somente leitura de entrada e tenta localizar uma réplica somente leitura online que é associada à réplica primária e configurada para roteamento somente leitura. O cliente recebe informações de conexão de volta do servidor de réplica primária e se conecta à réplica somente leitura identificada.

    Há também um bom resumo do processo apresentado pelo Top Microsoft Man Sean Gallardy no blog da PFE aqui:

    Encontrando quais conexões foram roteadas somente leitura

    1. Criamos uma conexão através do driver
    2. O driver se conecta ao SQL Server por meio do ouvinte e passa as informações relevantes
    3. O SQL Server percebe que lemos apenas a configuração de roteamento e verifica a configuração
    4. O servidor SQL informa ao driver que temos um secundário somente leitura que pode ser usado
    5. SQL Server envia as novas informações secundárias para o driver
    6. O driver cria uma nova conexão com o secundário com as informações fornecidas

    Em relação ao outro item que você observou na pergunta:

    negando acesso de leitura ao banco de dados no AG no primário, mas dê a esse login permissão para ler o banco de dados na réplica secundária legível.

    As permissões de nível de banco de dados serão replicadas no AG - portanto, se você remover o acesso de leitura do usuário no primário, ele também perderá o acesso de leitura no secundário.

    Estou um pouco confuso sobre o objetivo de tal empreendimento, já que os dados deveriam, em teoria, ser os mesmos (ou próximos dos mesmos). Talvez você simplesmente não queira certos logins executando consultas no primário por motivos de desempenho. Expressar a intenção somente leitura e conectar-se ao ouvinte é realmente a abordagem mais direta para resolver isso.

    Outras opções envolveriam hardware separado ou codificação personalizada em seu aplicativo que lida com a conexão direta à réplica correta (e lógica de repetição se ocorrer um failover e trabalhos agendados em cada réplica para desabilitar/habilitar os logins no caso de um failover , etc).

    • 5
  2. Simon Pratt
    2020-05-13T01:21:18+08:002020-05-13T01:21:18+08:00

    Eu sei que este é um tópico um pouco antigo, mas na verdade temos exatamente os mesmos requisitos - Permitir que os usuários se conectem com intenção somente leitura e impedir que eles voltem ao primário.

    A razão é simples - Nossos bancos de dados são complexos com muitas pequenas consultas constantemente sendo executadas em nossos sistemas de produção e nossos usuários normalmente executam consultas de relatórios pesados ​​que exigem muitas junções e bloqueios subsequentes. Não podemos, sob nenhuma circunstância, fazer com que os usuários executem esses relatórios nas réplicas primárias devido ao impacto nos sistemas de produção. É reconhecidamente extremamente improvável que eles voltem ao primário, mas é possível que isso ocorra e é isso que desejamos evitar.

    Também é possível que os usuários evitem o ouvinte e se conectem diretamente à réplica primária, o que obviamente também precisamos evitar.

    Acho que, por enquanto, a melhor solução é habilitar o RCSI nos bancos de dados (já pagamos o custo do versionamento de linha devido ao secundário síncrono), portanto, se um fallback de uma consulta de relatório atingir o primário, pelo menos não bloqueará ou deadlock contra consultas de produção. Não é o ideal, pois ainda temos o custo do recurso (temp db, memória, cpu, etc).

    Se alguém tiver alguma outra idéia, eu adoraria ouvi-los.

    • 2
  3. briancarrig
    2020-10-27T17:40:21+08:002020-10-27T17:40:21+08:00

    Uma sugestão é o seu plano conforme descrito, mas combinado com o Administrador de Recursos para manter alguns dos outros custos de recursos sob controle.

    Como alternativa, suponha que não seja muito prejudicial ao aplicativo. Nesse caso, você pode usar um gatilho de login para impedir que o relatório seja executado ou ter um trabalho executado com frequência que elimine o SPID associado ao relatório (você pode aliviar seu chefe tornando o trabalho baseado em limite).

    Além disso, um gatilho de login funcionaria, mas esteja ciente do risco de se bloquear do primário. Revise completamente e teste, teste, teste, para que você não fique tentando lembrar como inicializar no modo mínimo como administrador às 3 da manhã.

    Fizemos um pequeno brainstorming aqui, e não há como evitar alterações de configuração em execução no primário que conhecemos.

    Eu também consideraria sair do SQL Server para este e examinar os balanceadores de carga de aplicativos. F5 se houver um orçamento, o HAProxy funcionou bem para mim no passado usando a edição da comunidade de código aberto.

    • 1
  4. SteveJ
    2022-08-11T10:39:06+08:002022-08-11T10:39:06+08:00

    Temos esta mesma exigência. Estou curioso para saber se o uso de um gatilho de logon funcionaria?

    Crie uma maneira de identificar quais usos são usuários "Somente leitura": conceda a eles uma função específica para "Somente leitura"

    Durante o evento de logon, se o usuário estiver nesta tabela e você estiver na reversão da réplica primária.

    Como acima teste muito bem antes de tentar em produção.

    • 0
  5. David Browne - Microsoft
    2022-08-11T10:58:31+08:002022-08-11T10:58:31+08:00

    Algumas abordagens que você pode tentar.

    1. Conecte os usuários diretamente ao secundário sem usar o AG Listener. Uma variante sofisticada disso usa um endpoint IP de cluster adicional com proprietário preferencial no nó secundário. Isso permitiria que o endpoint IP fizesse failover para o primário se o secundário estivesse inativo.

    2. Não conceda permissões SELECT em nível de banco de dados aos usuários somente leitura e conceda as seguintes permissões em nível de servidor no secundário: CONNECT ANY DATABASE e SELECT ALL USER SECURABLES.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

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