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 / 64771
Accepted
Mark Freeman
Mark Freeman
Asked: 2014-05-09 09:01:22 +0800 CST2014-05-09 09:01:22 +0800 CST 2014-05-09 09:01:22 +0800 CST

Como fazer uma redução única de log em um banco de dados com replicação transacional

  • 772

Eu herdei um banco de dados de 10 GB com um log de 80 GB [apenas 3% em uso de acordo com DBCC SQLPERF (logspace)]. Parece seguro presumir que o crescimento extremo do log foi devido a problemas muito antes de eu ser contratado.

O primário tem um trabalho de backup de envio de log executado a cada 15 minutos. O primário tem tarefas de cópia e restauração executadas a cada 15 minutos.

Quando tento reduzir o log, recebo "Não é possível reduzir o arquivo de log 2 (DatabaseName_log) porque o arquivo de log lógico localizado no final do arquivo está em uso". Eu tentei isso várias vezes com 15 minutos de intervalo e até dias de intervalo, mas sempre obtive o mesmo resultado.

DBCC LOGINFO mostra 784 VLFs, com apenas o primeiro 245 e o último com um status de 2. p_WhoIsActive mostra que a transação aberta mais longa foi executada por menos de 2 horas (transações longas não são incomuns aqui devido a um terceiro Microsoft Acesse o aplicativo com problemas de driver ODBC).

Como posso reduzir esse log com êxito (sem criar uma interrupção para os usuários)?

Obrigado, Marcos

sql-server sql-server-2012
  • 3 3 respostas
  • 8157 Views

3 respostas

  • Voted
  1. Best Answer
    dartonw
    2014-05-09T09:36:44+08:002014-05-09T09:36:44+08:00

    A solução mais fácil para esse problema é definir o banco de dados para recuperação simples, reduzir o log e configurá-lo novamente para recuperação total. Em T-SQL isso seria:

    ALTER DATABASE [database] SET RECOVERY SIMPLE WITH NO_WAIT
    DBCC SHRINKFILE([logfilename], 1)
    ALTER DATABASE [database] SET RECOVERY FULL WITH NO_WAIT
    

    Mudar o banco de dados para recuperação simples pode fazer com que as transações parem de ser replicadas, mas se agendadas fora do horário de trabalho, o log deve ser reduzido e retornar à recuperação total sem efeitos colaterais.

    Se isso for inaceitável, você pode usar o procedimento armazenado sp_repldone para marcar manualmente as transações como distribuídas e redefinir o status de replicação de transações inválidas:

    EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0,    @time = 0, @reset = 1
    
    • 7
  2. Hannah Vernon
    2014-05-09T11:20:19+08:002014-05-09T11:20:19+08:00

    Você poderia executar um script como este para tentar a operação de redução uma vez a cada minuto até que ela seja concluída ou seja executada 1.000 vezes. Como sempre, use por sua conta e risco - e teste primeiro em um ambiente que não seja de produção.

    USE tempdb;  /*  CHANGE THIS TO DESIRED DATABASE */
    GO
    DECLARE @DesiredSizeInMB INT;
    SET @DesiredSizeInMB = 1;
    
    DECLARE @T TABLE (
        CurrentSize BIGINT
    );
    DECLARE @LogFileName VARCHAR(255);
    DECLARE @LoopCount INT;
    DECLARE @MaxLoops INT;
    DECLARE @OK BIT;
    
    SELECT @LogFileName = df.name
    FROM sys.database_files df
    WHERE df.type_desc = 'LOG';
    
    SET @LoopCount = 0;
    SET @MaxLoops = 1000;
    WHILE @LoopCount < @MaxLoops
    BEGIN
        SET @OK=1;
        BEGIN TRY
            DELETE FROM @T;
            INSERT INTO @T
            SELECT size * 8192 / 1048576E0
            FROM sys.database_files df
            WHERE df.type_desc = 'LOG';
            DBCC SHRINKFILE (@LogFileName, @DesiredSizeInMB);
            /* If the now-current size of the log file is with 1MB of the target size, break */
            IF (SELECT CurrentSize * 8192 / 1048576E0 FROM @T) <= @DesiredSizeInMB + 1 
                BREAK;
            ELSE
                SET @OK = 0;
        END TRY
        BEGIN CATCH
            SET @OK=0;
            PRINT ERROR_MESSAGE();
        END CATCH
        IF @OK = 1 BREAK; /* IF the command didn't fail, then exit the loop */
        WAITFOR DELAY '00:00:30'
        SET @LoopCount = @LoopCount +1;
    END
    
    • 2
  3. Ryszard
    2015-03-11T07:35:54+08:002015-03-11T07:35:54+08:00

    Ao testar meu plano de backup em um servidor de teste de VM desconectado da rede, eu estava executando um backup e usei apenas o comando encolher. Eu uso um modelo de recuperação SIMPLES, mesmo assim tive que forçar a configuração do banco de dados para o modo SIMPLE, só assim poderia encolher meus t-logs. A conclusão parece que se você tem um banco de dados no modelo de recuperação SIMPLE, não FULL você ainda precisa destes comandos: ALTER DATABASE [database] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE([logfilename], 1)

    • 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