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 / 220376
Accepted
SqlWorldWide
SqlWorldWide
Asked: 2018-10-18 08:53:47 +0800 CST2018-10-18 08:53:47 +0800 CST 2018-10-18 08:53:47 +0800 CST

A alteração do crescimento do arquivo de log do banco de dados não reflete na réplica secundária sys.master_files

  • 772

Ambiente: Microsoft SQL Server 2014 - 12.0.4100.1 (X64) 20 de abril de 2015 17:29:27 Copyright (c) Microsoft Corporation Enterprise Edition (64 bits) no Windows NT 6.3 (Build 9600: ) (Hypervisor)

Quando altero a taxa de crescimento do arquivo de log na réplica primária, o banco de dados da réplica secundária obtém essa alteração e posso verificar na GUI e na sys.database_filesexibição. Mas a mesma mudança não reflete em sys.master_filesvista.

Código de configuração

:Connect PrimaryNode

IF EXISTS(SELECT name FROM sys.databases
  WHERE name = 'FileGrowthTest]')
  DROP DATABASE FileGrowthTest
GO
CREATE DATABASE [FileGrowthTest]
 ON  PRIMARY 
( NAME = N'FileGrowthTest', FILENAME = N'L:\FileGrowthTest.mdf' , SIZE = 4096KB , FILEGROWTH = 10%)
 LOG ON 
( NAME = N'FileGrowthTest_log', FILENAME = N'F:\FileGrowthTest_log.ldf' , SIZE = 4096KB , FILEGROWTH = 10%)
GO

BACKUP DATABASE [FileGrowthTest] TO  
    DISK = N'E:\Backup\FileGrowthTest.bak' 
    WITH NOFORMAT, NOINIT,  NAME = N'FileGrowthTest-Full Database Backup', 
    SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

--- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE.
:Connect PrimaryNode

USE [master]

GO

ALTER AVAILABILITY GROUP [TestAG]
ADD DATABASE [FileGrowthTest];

GO

:Connect PrimaryNode

BACKUP DATABASE [FileGrowthTest] TO  DISK = N'\\backupshare\FileGrowthTest.bak' WITH  COPY_ONLY, FORMAT, INIT, SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 5

GO

:Connect SecondaryNode

RESTORE DATABASE [FileGrowthTest] FROM  DISK = N'\\backupshare\FileGrowthTest.bak' WITH  NORECOVERY,  NOUNLOAD,  STATS = 5

GO

:Connect PrimaryNode

BACKUP LOG [FileGrowthTest] TO  DISK = N'\\backupshare\FileGrowthTest.trn' WITH NOFORMAT, INIT, NOSKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 5

GO

:Connect SecondaryNode

RESTORE LOG [FileGrowthTest] FROM  DISK = N'\\backupshare\FileGrowthTest.trn' WITH  NORECOVERY,  NOUNLOAD,  STATS = 5

GO

:Connect SecondaryNode


-- Wait for the replica to start communicating
begin try
declare @conn bit
declare @count int
declare @replica_id uniqueidentifier 
declare @group_id uniqueidentifier
set @conn = 0
set @count = 30 -- wait for 5 minutes 

if (serverproperty('IsHadrEnabled') = 1)
    and (isnull((select member_state from master.sys.dm_hadr_cluster_members where upper(member_name COLLATE Latin1_General_CI_AS) = upper(cast(serverproperty('ComputerNamePhysicalNetBIOS') as nvarchar(256)) COLLATE Latin1_General_CI_AS)), 0) <> 0)
    and (isnull((select state from master.sys.database_mirroring_endpoints), 1) = 0)
begin
    select @group_id = ags.group_id from master.sys.availability_groups as ags where name = N'TestAG'
    select @replica_id = replicas.replica_id from master.sys.availability_replicas as replicas where upper(replicas.replica_server_name COLLATE Latin1_General_CI_AS) = upper(@@SERVERNAME COLLATE Latin1_General_CI_AS) and group_id = @group_id
    while @conn <> 1 and @count > 0
    begin
        set @conn = isnull((select connected_state from master.sys.dm_hadr_availability_replica_states as states where states.replica_id = @replica_id), 1)
        if @conn = 1
        begin
            -- exit loop when the replica is connected, or if the query cannot find the replica status
            break
        end
        waitfor delay '00:00:10'
        set @count = @count - 1
    end
end
end try
begin catch
    -- If the wait loop fails, do not stop execution of the alter database statement
end catch
ALTER DATABASE [FileGrowthTest] SET HADR AVAILABILITY GROUP = [TestAG];

GO

GO

Ambos os arquivos têm uma taxa de crescimento de 10% agora. Mudando para valor fixo.

USE [master];
GO
ALTER DATABASE FileGrowthTest MODIFY FILE (NAME='FileGrowthTest', FILEGROWTH = 256MB);
ALTER DATABASE FileGrowthTest MODIFY FILE (NAME='FileGrowthTest_log', FILEGROWTH = 128MB);
GO

A alteração é visível no nó de réplica secundário ao usar sys.database_filesa exibição para dados e arquivos de log.

USE [FileGrowthTest];
GO
SELECT name AS file_name,
type_desc AS file_type,
growth AS current_percent_growth
FROM sys.database_files
WHERE is_percent_growth=1

Mas usando sys.master_filesapenas a visualização, a alteração do arquivo de dados é visível. O crescimento do arquivo de log ainda mostra 10%.

SELECT d.name as database_name,
    mf.name as file_name,
    mf.type_desc as file_type,
    mf.growth as current_percent_growth
FROM sys.master_files mf (NOLOCK)
JOIN sys.databases d (NOLOCK) on mf.database_id=d.database_id
WHERE is_percent_growth=1
AND d.name='FileGrowthTest'
GO

Por sys.master_filesque não reflete a alteração da taxa de crescimento automático do arquivo de log, enquanto a alteração do crescimento automático do arquivo de dados é refletida corretamente?

sql-server sql-server-2014
  • 2 2 respostas
  • 378 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2018-10-18T10:15:32+08:002018-10-18T10:15:32+08:00

    Este é um problema conhecido, suspeito que masterno secundário não será gravado imediatamente, e talvez não até que essa instância se torne a primária. O problema ainda está "em análise" de acordo com este bug apresentado por Nic Cain em 2015:

    • A exibição de catálogo sys.master_files para crescimento de TLOG não é atualizada em um AG secundário

    Até que isso seja resolvido, recomendo usar sys.database_filesem vez de sys.master_files, embora saiba que isso nem sempre é conveniente.

    Veja também este tópico do fórum , este tópico do fórum e a postagem do blog de Nic sobre esse problema .

    • 2
  2. Peter Vandivier
    2018-10-18T13:25:15+08:002018-10-18T13:25:15+08:00

    Eu tento pensar database_filesno escopo do banco de dados e master_filesno escopo do instância . Eu já pensei sobre isso como significando que um dfvalor de atributo afetado será transportado na conclusão do comando, enquanto um mfvalor pode exigir uma reinicialização mais perturbadora fisicamente antes de " colar " em ambos os lados 1 .

    Talvez seja pró-forma apontar, mas ... a linha um de cada documentação oficial mostra a diferença (ênfase minha):

    ...como armazenado no próprio banco de dados ...[ database_files]... é uma visualização por banco de dados.

    ...conforme armazenado no banco de dados mestre ...[ master_files]... é uma visão única de todo o sistema.

    Não considero isso um bug. A leitura da réplica secundária desses dados não é "incorreta". Pode ser mais correto dizer que é "latente". Você já dirigiu semear um AG apenas para perceber que o banco de dados da réplica secundária tem um proprietário diferente da réplica primária? Talvez alguma configuração vinculada à instância como trustworthynão " pegou " na réplica secundária e você não possa " consertá -la" até o failover? É até possível fazer failover e depois failback sem corrigir esses atributos em alguns casos!?

    Perguntar a uma determinada fonte retornará os dados " corretos " para o escopo dessa fonte . Dando uma olhada no interior doobject_definition() para cada exibição de catálogo, vemos que database_filesé apontado primeiro sys.sysprufilesenquanto master_filesestá em primeiro lugar sys.sysbrickfiles.

    Uma diferença levemente massageada dessas definições revela algo como o seguinte:

    Brevemente...

    1. MF tem 2 colunas extras,database_id ecredential_id
    2. DF expressa uma transformação não presente em MF para as colunassize ephysical_name
    3. Para todas as colunas exceto type_desce state_desc, o conjunto de linhas base difere conforme observado acima (mf = sysbrickfiles| df = sysprufiles)
    4. Diferença nos predicados

    1. Certamente, o teste de casos extremos para diferentes atributos pode ser uma maneira divertida de perder alguns dias ... O OP menciona especificamente a taxa de crescimento do arquivo de log como o atributo que não está carregando. Se você pudesse criar um cenário em que o secundário visse a necessidade de aumentar automaticamente o tronco, mas não o primário... bem... quebrar as coisas pode ser divertido!

    • 1

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