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 / 95253
Accepted
kriegu
kriegu
Asked: 2015-03-14 16:11:30 +0800 CST2015-03-14 16:11:30 +0800 CST 2015-03-14 16:11:30 +0800 CST

Limpando logs binários automaticamente

  • 772

No momento, estou tentando criar um evento agendado no MySQL para limpar os logs binários toda semana.

A instrução create event é a seguinte:

CREATE EVENT purgebinlogs
ON SCHEDULE EVERY 1 WEEK
STARTS CONCAT(CURRENT_DATE + INTERVAL 7 - WEEKDAY(CURRENT_DATE) DAY,' 01:00:00')
DO
PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY);

Deve ser executado toda segunda-feira à 01:00. No entanto, se eu consultar a tabela mysql.event, obtenho a seguinte saída:

mysql> select * from mysql.event\G
*************************** 1. row ***************************
                  db: mysql
                name: purgebinlogs
                body: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)
             definer: root@localhost
          execute_at: NULL
      interval_value: 7
      interval_field: WEEK
             created: 2015-03-13 17:45:20
            modified: 2015-03-13 17:51:43
       last_executed: NULL
              starts: 2015-03-16 07:00:00
                ends: NULL
              status: ENABLED
       on_completion: DROP
            sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             comment:
          originator: 1
           time_zone: SYSTEM
character_set_client: cp850
collation_connection: cp850_general_ci
        db_collation: utf8_general_ci
           body_utf8: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)

Como você pode ver, a coluna inicial diz:

início: 2015-03-16 07:00:00

A data está OK, mas a hora... Deve ser 01:00 e não 07:00

Acho que isso pode ser um problema de fuso horário, porque meu fuso horário é "-06:00"

mysql> show global variables like 'time_z%';
+------------------+----------+
| Variable_name    | Value    |
+------------------+----------+
| time_zone        | -06:00   |
+------------------+----------+
2 rows in set, 1 warning (0.01 sec)

mysql> SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
+--------------------------------+
| TIMEDIFF(NOW(), UTC_TIMESTAMP) |
+--------------------------------+
| -06:00:00                      |
+--------------------------------+
1 row in set (0.00 sec)

Mas não consigo adivinhar como consertar isso. Quero executar o evento agendado às 01:00

EDITAR

ao consultar information_schema.events ele exibe as informações corretas

mysql> select * from information_schema.events\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: mysql
          EVENT_NAME: purgebinlogs
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 1
      INTERVAL_FIELD: WEEK
            SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
              STARTS: 2015-03-16 01:00:00
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2015-03-13 17:45:20
        LAST_ALTERED: 2015-03-13 17:56:32
       LAST_EXECUTED: NULL
       EVENT_COMMENT:
          ORIGINATOR: 1
CHARACTER_SET_CLIENT: cp850
COLLATION_CONNECTION: cp850_general_ci
  DATABASE_COLLATION: utf8_general_ci

Então eu acho que mysql.event exibe informações no horário UTC não no fuso horário local

EDITAR

Conforme sugerido por @Rick James, alterei dinamicamente o valor de expire_logs_days com o seguinte comando:

set global expire_logs_days=7

Mas parece que não está funcionando....

mysql> show global variables like 'expire%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 7     |
+------------------+-------+

No entanto, se eu listar os arquivos binlog, obtenho a seguinte lista:

 Mar  5 19:30 mysql56_bin.000001
 Mar  5 19:30 mysql56_bin.000002
 Mar 10 13:53 mysql56_bin.000003
 Mar 11 11:59 mysql56_bin.000004
 Mar 11 17:44 mysql56_bin.000005
 Mar 12 12:53 mysql56_bin.000006
 Mar 12 12:58 mysql56_bin.000007
 Mar 12 13:02 mysql56_bin.000008
 Mar 12 13:07 mysql56_bin.000009
 Mar 12 13:12 mysql56_bin.000010
 Mar 12 13:16 mysql56_bin.000011
 Mar 12 13:20 mysql56_bin.000012
 Mar 12 13:24 mysql56_bin.000013
 Mar 17 10:38 mysql56_bin.000014
 Mar 17 18:27 mysql56_bin.000015
 Mar 17 18:28 mysql56_bin.000016
 Mar 17 18:28 mysql56_bin.index

Como você pode ver, há binlogs com mais de uma semana atrás.

mysql
  • 7 7 respostas
  • 24971 Views

7 respostas

  • Voted
  1. Best Answer
    Rick James
    2015-03-14T17:10:29+08:002015-03-14T17:10:29+08:00

    Parece que expire_logs_days 7seria muito mais simples.

    8.0 está se movendo em direção a binlog_expire_logs_seconds.

    • 12
  2. James
    2019-06-19T17:48:58+08:002019-06-19T17:48:58+08:00

    Eu tenho ainda outro método para limpar logs automaticamente no mestre com base no que um escravo replicou.

    Isenção de responsabilidade: não tenho esta solução em produção há muito tempo, portanto, prossiga por sua conta e risco

    O shell script a seguir deve ser executado no servidor mestre. Ele assume que o escravo pode ser acessado via SSH. Você poderia facilmente adaptar isso a outros cenários.

    #!/bin/bash
    
    # This script assumes you have configured mysql to run without asking for username/password
    # on both the master and slave hosts. (e.g. by putting credentials in ~/.my.cnf)
    
    # Replace 'replication-server' with the hostname of your slave server.
    SECONDS=$(echo 'SHOW SLAVE STATUS\G' | ssh replication-server mysql | grep Seconds_Behind_Master | grep -o '[0-9]\+' )
    
    # This performs the actual purge on the Master DB
    # It calculates what date the slave has replicated to, and then subtracts an additional 1 week
    # buffer just in case.
    echo "PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 1 WEEK - INTERVAL $SECONDS SECOND)" | mysql
    

    Eu executo esse script em uma cronprogramação diária para garantir que os logs sejam limpos regularmente.

    • 2
  3. Miro
    2017-11-04T01:19:58+08:002017-11-04T01:19:58+08:00

    Olá, fiz um script que limpa logs binários na replicação mestre/escravo do mysql.

    #!/bin/bash
    
    logfile=/tmp/mysqlscript.log
    
    ## Get current binary log replication file on slave
    masterfile=$(mysql --defaults-extra-file=/opt/script/credentials-local.cnf -e "show slave status \G" | grep Relay_Master_Log_File:)
    ## echo $masterfile >> $logfile
    
    ## Get number from from replication file
    masternumber="$(echo $masterfile | cut -c34-40)"
    ## echo $masternumber >> $logfile
    
    ## Convert number to decimal value
    masternumdecimal=$((10#$masternumber))
    ## echo $masternumdecimal >> $logfile
    
    ## Decrease replication file number to left 50 replication files on master
    masternumfile=$(($masternumdecimal - 50))
    ## echo $masternumfile >> $logfile
    
    ## Convert decreased number to 6 digits number
    printf -v purgenum "%06d" $masternumfile
    ## echo $purgenum >> $logfile
    
    ## Create binary log purge file name
    purgefile=mysql-bin.$purgenum
    ## echo $purgefile
    
    ## Purge binary logs to purge file name on master
    mysql --defaults-extra-file=/opt/script/credentials-master.cnf -e "purge binary logs to '$purgefile';"
    echo Purged binary logs on master to $purgefile >> logfile
    

    Assim sempre tenho cca. 50 logs binários. Eu tenho isso no servidor escravo no crontab e o executo a cada poucas horas.

    Felicidades

    • 1
  4. Peter VARGA
    2018-08-26T10:50:31+08:002018-08-26T10:50:31+08:00

    Para o MySQL 8 existe outra opção: binlog_expire_logs_seconds- infelizmente não encontro uma entrada na documentação. Somente esta entrada de tarefa .

    Adicione esta configuração ao /etc/my.cnfarquivo [Linux version].

    Além disso, expire_logs_daysestá obsoleto no MYSQL 8 .

    • 1
  5. Nanhe Kumar
    2020-12-26T14:12:28+08:002020-12-26T14:12:28+08:00

    Tente com variável global

    SHOW VARIABLES LIKE 'expire_logs_days';
    
    SET GLOBAL expire_logs_days=7;
    

    insira a descrição da imagem aqui

    Para mais detalhes leia aqui

    • 1
  6. Manvendra Singh
    2022-10-07T03:26:13+08:002022-10-07T03:26:13+08:00

    definir binlog_expire_logs_seconds seria muito mais simples

    mostrar variáveis ​​globais como 'binlog_expire_logs_seconds'; SET GLOBAL binlog_expire_logs_seconds = 604800;

    • -1
  7. A.K. Malik
    2021-02-18T11:49:53+08:002021-02-18T11:49:53+08:00

    'expire_logs_days' agora está depreciado no Mysql8 Em vez disso, use 'binlog_expire_logs_seconds'.

    Depende do seu requisito, mas em geral use a instrução abaixo (altere o valor dos segundos de acordo com as necessidades do seu aplicativo): SET GLOBAL binlog_expire_logs_seconds=3600;

    • -2

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

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