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 / 254466
Accepted
Freedo
Freedo
Asked: 2019-11-30 14:52:53 +0800 CST2019-11-30 14:52:53 +0800 CST 2019-11-30 14:52:53 +0800 CST

Desabilite as tabelas de banco de dados para gravações, mas as gravações de relatório foram bem-sucedidas

  • 772

Eu gerencio um banco de dados onde milhares de GBs de dados de log inúteis são criados diariamente.

Não consigo consertar o software que está executando todo esse registro (desnecessário). Existe uma maneira de bloquear (ou desabilitar gravações) esta tabela de log para que ela nunca seja gravada, mas ao mesmo tempo relatará a gravação como bem-sucedida para que não cause problemas com o software?

Eu sei que posso apenas truncar as tabelas com um cronjob, mas gostaria de saber se existe uma abordagem melhor?

mariadb storage-engine
  • 1 1 respostas
  • 179 Views

1 respostas

  • Voted
  1. Best Answer
    Vérace
    2019-11-30T21:11:48+08:002019-11-30T21:11:48+08:00

    MySQL , e amigos, ou seja, MariaDB e Percona , têm um mecanismo de armazenamento bastante incomum chamado mecanismo Black Hole - pode ajudar com sua solicitação específica (veja o violino aqui ).

    Por exemplo, se você fizer isso:

    CREATE TABLE foo
    (
      bar INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      baz VARCHAR (30) NOT NULL
    ) ENGINE = InnoDB;
    Query OK, 0 rows affected (0.07 sec)
    

    O mecanismo padrão é de InnoDBqualquer maneira, mas estou apenas sendo explícito por uma questão de clareza aqui.

    Em seguida, inserimos alguns registros:

    mysql> INSERT INTO foo (baz) VALUES ('afadfa'), ('sfasdfa'), ('asdfadf');
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    Não há problemas lá! Então, para verificarmos:

    mysql> SELECT * FROM foo;
    +-----+---------+
    | bar | baz     |
    +-----+---------+
    |   1 | afadfa  |
    |   2 | sfasdfa |
    |   3 | asdfadf |
    +-----+---------+
    3 rows in set (0.00 sec)
    

    Tudo é rosa no jardim!

    Agora vem a parte interessante!

    mysql> ALTER TABLE foo ENGINE = BLACKHOLE;
    Query OK, 3 rows affected (0.10 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    OK. Continuamos alegremente INSERTenviando dados da seguinte forma:

    mysql> INSERT INTO foo (baz) VALUES ('xxxxx'), ('yyyyy'), ('zzzzzzz');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    Mais uma vez, tudo está bem e elegante. O banco de dados está feliz, nós estamos felizes e, o mais importante, o software de terceiros está feliz e ignorante de qualquer mudança no ambiente!

    MAS!!! Agora, quando fazemos isso:

    mysql> SELECT * FROM foo;
    Empty set (0.00 sec)
    

    Nada! Zilch! Rien! Nada...

    Nossos dados encontraram o horizonte de eventos do Buraco Negro do qual nada pode escapar! Você pode inserir quantos dados quiser - é como enviar um arquivo para /dev/null*nix!

    Você perguntou:

    Existe uma maneira de bloquear esta tabela de log para que ela nunca seja gravada, mas ao mesmo tempo ela relatará a gravação como bem-sucedida para que não cause problemas com o software?

    e agora você tem (veja acima) comportamento externamente normal no INSERT:

    Query OK, 3 rows affected (0.00 sec)
        Records: 3  Duplicates: 0  Warnings: 0
    

    Então, somos ouro! Para todos os efeitos, os dados enviados ao servidor estão sendo armazenados fielmente, exceto que não é!

    Para o software que escreve esses logs, parece que tudo está ótimo, mas nada é escrito - é realmente muito bacana.

    Parece que foi feito para sua necessidade. No MariaDB, você precisa carregar um plugin conforme explicado aqui , mas parece bem simples. A partir daqui :

    o aplicativo continuará a funcionar sem erros. Mas como os dados nunca são realmente gravados, todas as E/S extras desaparecem.

    Apenas uma palavra de advertência! Não sei qual é o seu software que está gravando todos esses dados de log no servidor, mas alguém, em algum lugar, achou que valia a pena salvar. Apenas certifique-se de não jogar o bebê fora com a água do banho!

    Além disso, se você tiver um contrato de suporte para esse software irritante, talvez queira verificar se está potencialmente invalidando esse contato ao fazer isso?

    Como nota final, se você tentar algo assim na mesa do Black Hole:

    INSERT INTO foo (baz) VALUES (23, 'asdfds'), (33), (43, 'adsfd');
    

    Resultado:

    Column count doesn't match value count at row 1
    

    Portanto, mesmo os erros são autênticos, e seu software se comportará conforme o esperado se houver um erro e continuará (todas as aparências externas) funcionando normalmente se algo assim acontecer.

    Você notará que o violino é para MySQL 8 e não MariaDB. Com MariaDB (neste violino ), recebo um erro de permissão negada se tentar executar

    ALTER TABLE foo ENGINE = BLACKHOLE;  
    

    recebo mensagem:

    Unknown storage engine 'BLACKHOLE'
    

    Isso é esperado - a partir do link MariaDB:

    O mecanismo de armazenamento BLACKHOLE foi instalado por padrão até o MariaDB 10.0. No MariaDB 10.1 e posterior, o plug-in do mecanismo de armazenamento deverá ser instalado.

    As tentativas de alterar o tipo de mecanismo e instalar o plug-in falharam (dificilmente surpreendente em um servidor público).

    INSTALL SONAME 'ha_blackhole';
    

    dá:

    INSERT command denied to user
    'fiddle_PIIYJABQHVJRTTYOTJLC'@'localhost' for table 'plugin'
    
    • 4

relate perguntas

  • Como posso melhorar minha instrução SQL com resultados semanais com semana começando na quinta-feira ou em qualquer outro dia da semana?

  • Quais são as razões **NÃO** para usar o mecanismo de armazenamento MEMORY no MySQL?

  • Acelerando a conversão de MyISAM para InnoDB

  • Quais são os prós e os contras de usar o Sphinx Storage Engine?

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

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