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 / user-22155

GoodwinSQL's questions

Martin Hope
GoodwinSQL
Asked: 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

  • 1

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 respostas
  • 2194 Views
Martin Hope
GoodwinSQL
Asked: 2016-04-19 05:45:03 +0800 CST

Uso de memória MEMORYCLERK_XE não será limpo

  • 3

Temos tido um problema em que o uso de memória de eventos estendidos aumenta para mais de 1 GB e não é limpo - mesmo quando paramos todas as sessões XEvent na instância. Isso ainda não foi um problema na maioria dos servidores, mas está realmente prejudicando alguns de nossos servidores menores de desenvolvimento/teste com apenas alguns GB de memória alocados para o SQL Server. Espero que alguém tenha algumas ideias sobre como corrigir isso, além de pular o SQL Server.

Algumas saídas de consulta relevantes:

    SELECT TOP 5 type
       ,NAME
       ,sum(pages_kb) / 1024 AS pages_mb
    FROM sys.dm_os_memory_clerks
       GROUP BY type
       ,NAME
    ORDER BY sum(pages_kb) DESC
    ------------------------------
        type                         NAME                   pages_mb
        MEMORYCLERK_XE               XE Engine              1133
        USERSTORE_TOKENPERM          TokenAndPermUserStore  55
        MEMORYCLERK_SOSNODE          SOS_Node               43
        MEMORYCLERK_SQLBUFFERPOOL    Default                41
        MEMORYCLERK_SQLGENERAL       Default                18
    ------------------------------    
    SELECT NAME
      ,total_buffer_size / 1024 AS total_buffer_size_kb
    FROM sys.dm_xe_sessions
    ORDER BY total_buffer_size_kb DESC
    ------------------------------
        name                                total_buffer_size_kb
        system_health                       4223
        SpotlightResponseTimeWaitData_3843  4223
        SpotlightWorkloadAnalysis_3843      4223
        SpotlightDeadlockDetection_3843     4031
        sp_server_diagnostics session       383

SELECT @@VERSION
    Microsoft SQL Server 2012 (SP1) - 11.0.3437.0 (X64) 
        May 29 2014 16:03:40 
        Copyright (c) Microsoft Corporation
        Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Divulgação completa - executamos o Dell Spotlight for SQL Server, que abre três sessões XEvents em cada instância por padrão. O código para essas 3 sessões está abaixo.

Até desativei o Spotlight nesta instância, descartei as três sessões XEvent Spotlight e interrompi a sessão system_health. O uso de memória MEMORYCLERK_XE permaneceu em 1120 mb. DBCC FREESYSTEMCACHE ('ALL') também não teve efeito.

As 3 Sessões Spotlight:

CREATE EVENT SESSION [SpotlightDeadlockDetection_3843] ON SERVER ADD EVENT sqlserver.xml_deadlock_report ADD TARGET package0.ring_buffer (SET occurrence_number = (0))
    WITH (
            MAX_MEMORY = 4000 KB
            ,EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS
            ,MAX_DISPATCH_LATENCY = 10 SECONDS
            ,MAX_EVENT_SIZE = 0 KB
            ,MEMORY_PARTITION_MODE = NONE
            ,TRACK_CAUSALITY = OFF
            ,STARTUP_STATE = OFF
            )
GO


CREATE EVENT SESSION [SpotlightResponseTimeWaitData_3843] ON SERVER ADD EVENT sqlos.wait_info (
    ACTION(package0.collect_system_time, sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name, sqlserver.plan_handle, sqlserver.query_hash, sqlserver.query_plan_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.username) WHERE (
        [opcode] = (1)
        AND (
            [duration] > (0)
            OR [signal_duration] > (0)
            )
        AND [sqlserver].[query_hash] <> (0)
        AND [package0].[counter] <= (1000)
        AND [wait_type] <> (214)
        )
    )
    ,ADD EVENT sqlos.wait_info_external (
    ACTION(package0.collect_system_time, sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name, sqlserver.plan_handle, sqlserver.query_hash, sqlserver.query_plan_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.username) WHERE (
        [opcode] = (1)
        AND [duration] > (0)
        AND [sqlserver].[query_hash] <> (0)
        AND [package0].[counter] <= (1000)
        AND [wait_type] <> (589)
        )
    ) ADD TARGET package0.ring_buffer (
    SET max_events_limit = (4000)
    ,occurrence_number = (1000)
    )
    WITH (
            MAX_MEMORY = 4096 KB
            ,EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS
            ,MAX_DISPATCH_LATENCY = 30 SECONDS
            ,MAX_EVENT_SIZE = 0 KB
            ,MEMORY_PARTITION_MODE = NONE
            ,TRACK_CAUSALITY = ON
            ,STARTUP_STATE = OFF
            )
GO


CREATE EVENT SESSION [SpotlightWorkloadAnalysis_3843] ON SERVER ADD EVENT sqlserver.sp_statement_completed (
    ACTION(sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name, sqlserver.plan_handle, sqlserver.session_id, sqlserver.sql_text, sqlserver.username) WHERE (
        [sqlserver].[is_system] = (0)
        AND [package0].[counter] <= (1000)
        )
    )
    ,ADD EVENT sqlserver.sql_statement_completed (
    ACTION(sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name, sqlserver.plan_handle, sqlserver.session_id, sqlserver.sql_text, sqlserver.username) WHERE (
        [sqlserver].[is_system] = (0)
        AND [package0].[counter] <= (1000)
        )
    ) ADD TARGET package0.ring_buffer (
    SET max_events_limit = (4000)
    ,occurrence_number = (1000)
    )
    WITH (
            MAX_MEMORY = 4096 KB
            ,EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS
            ,MAX_DISPATCH_LATENCY = 30 SECONDS
            ,MAX_EVENT_SIZE = 0 KB
            ,MEMORY_PARTITION_MODE = NONE
            ,TRACK_CAUSALITY = ON
            ,STARTUP_STATE = OFF
            )
GO

Alguém tem alguma ideia do que pode estar causando isso? Existe alguma maneira de liberar essa memória usada?

sql-server sql-server-2012
  • 1 respostas
  • 691 Views
Martin Hope
GoodwinSQL
Asked: 2014-10-14 11:47:17 +0800 CST

Inserir apenas impasses

  • 7

Temos uma aplicação inserindo dados em uma tabela. Infelizmente, estamos obtendo impasses e os impasses vêm apenas de inserções. Estamos vendo as inserções obterem bloqueios de chave em uma ordem diferente em um índice não clusterizado que está causando o problema.

Por que os inserts estão se comportando dessa forma e o que devemos fazer para tentar amenizar os impasses? Qualquer ajuda ou insight é apreciado.

No exemplo abaixo, há apenas duas inserções envolvidas, mas tivemos até 4 inserções diferentes envolvidas em um impasse.

Aqui está o gráfico de impasse:

    <deadlock>
    <victim-list>
        <victimProcess id="process3ab355868" />
    </victim-list>
    <process-list>
        <process id="process3ab355868" taskpriority="0" logused="1184" waitresource="KEY: 5:72057594043629568 (6234ed5bf036)" waittime="7493" ownerId="92332106" transactionname="implicit_transaction" lasttranstarted="2014-10-13T12:37:43.060" XDES="0x123699668" lockMode="X" schedulerid="3" kpid="3540" status="suspended" spid="89" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2014-10-13T12:37:44.333" lastbatchcompleted="2014-10-13T12:37:44.333" lastattention="1900-01-01T00:00:00.333" clientapp="Microsoft JDBC Driver for SQL Server" hostname="" hostpid="0" loginname="" isolationlevel="read committed (2)" xactid="92332106" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
            <executionStack>
                <frame procname="adhoc" line="1" stmtstart="278" stmtend="818" sqlhandle="0x0200000053a65d302154b91e9fee55234669030a42479c050000000000000000000000000000000000000000">
                    INSERT INTO table (col1, col2, col3, col4, col5, col6, col7, col8, col9) VALUES (@P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8)
                </frame>
                <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
                    unknown
                </frame>
            </executionStack>
            <inputbuf>
                (@P0 datetime2,@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 datetime2,@P4 nvarchar(4000),@P5 nvarchar(4000),@P6 decimal(38,1),@P7 int,@P8 int)INSERT INTO table (col1, col2, col3, col4, col5, col6, col7, col8, col9) VALUES (@P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8)                                                                         select SCOPE_IDENTITY() AS GENERATED_KEYS
            </inputbuf>
        </process>
        <process id="process14b38c928" taskpriority="0" logused="2564" waitresource="KEY: 5:72057594043629568 (275232b7b238)" waittime="7491" ownerId="92325909" transactionname="implicit_transaction" lasttranstarted="2014-10-13T12:37:39.567" XDES="0x16b38b988" lockMode="X" schedulerid="3" kpid="3668" status="suspended" spid="65" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2014-10-13T12:37:44.337" lastbatchcompleted="2014-10-13T12:37:44.337" lastattention="1900-01-01T00:00:00.337" clientapp="Microsoft JDBC Driver for SQL Server" hostname="" hostpid="0" loginname="" isolationlevel="read committed (2)" xactid="92325909" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
            <executionStack>
                <frame procname="adhoc" line="1" stmtstart="278" stmtend="818" sqlhandle="0x0200000053a65d302154b91e9fee55234669030a42479c050000000000000000000000000000000000000000">
                    INSERT INTO table (col1, col2, col3, col4, col5, col6, col7, col8, col9) VALUES (@P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8)
                </frame>
                <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
                    unknown
                </frame>
            </executionStack>
            <inputbuf>
                (@P0 datetime2,@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 datetime2,@P4 nvarchar(4000),@P5 nvarchar(4000),@P6 decimal(38,1),@P7 int,@P8 int)INSERT INTO table (col1, col2, col3, col4, col5, col6, col7, col8, col9) VALUES (@P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8)                                                                         select SCOPE_IDENTITY() AS GENERATED_KEYS
            </inputbuf>
        </process>
    </process-list>
    <resource-list>
        <keylock hobtid="72057594043629568" dbid="5" objectname="table1" indexname="unique_index" id="lock17bc3a480" mode="X" associatedObjectId="72057594043629568">
            <owner-list>
                <owner id="process14b38c928" mode="X" />
            </owner-list>
            <waiter-list>
                <waiter id="process3ab355868" mode="X" requestType="wait" />
            </waiter-list>
        </keylock>
        <keylock hobtid="72057594043629568" dbid="5" objectname="table1" indexname="unique_index" id="lock10735ce00" mode="X" associatedObjectId="72057594043629568">
            <owner-list>
                <owner id="process3ab355868" mode="X" />
            </owner-list>
            <waiter-list>
                <waiter id="process14b38c928" mode="X" requestType="wait" />
            </waiter-list>
        </keylock>
    </resource-list>
</deadlock>

Aqui está a tabela DDL:

CREATE TABLE [table1](
    [col0] [int] IDENTITY(1,1) NOT NULL,
    [col1] [int] NOT NULL,
    [col2] [int] NOT NULL,
    [col3] [decimal](15, 4) NULL,
    [col4] [datetime2](7) NOT NULL,
    [col5] [varchar](8) NOT NULL,
    [col6] [varchar](30) NOT NULL,
    [col7] [datetime2](7) NOT NULL,
    [col8] [varchar](8) NOT NULL,
    [col9] [varchar](30) NOT NULL,
 CONSTRAINT [PK] PRIMARY KEY CLUSTERED 
(
    [col0] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [unique_index] UNIQUE NONCLUSTERED 
(
    [col2] ASC,
    [col1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE table1 ADD  DEFAULT (sysdatetime()) FOR [col4]
GO

ALTER TABLE table1 ADD  DEFAULT (sysdatetime()) FOR [col7]
GO
sql-server sql-server-2012
  • 2 respostas
  • 1730 Views

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