MySQL: Arquivo de Log Separado para Cada Banco de Dados

4

Eu tenho um servidor com vários bancos de dados nele. Na verdade, é uma instância no AmazonRDS, portanto, não tenho acesso ao arquivo my.cnf. O que estou tentando fazer é criar um log para cada banco de dados separadamente que registre as consultas que foram executadas anteriormente e possíveis erros gerados por essas consultas. Isso é possível com o mysql para ter um arquivo de log separado para cada db / schema?

Atualizar

Estou procurando uma solução como essa, mas não para o servidor inteiro. link

    
por Devin Dixon 31.12.2012 / 15:45

4 respostas

4

Eu não posso falar em termos de AmazonRDS, mas aqui está algo genérico para tentar

Você sabia que o log lento é um arquivo CSV ativado?

Se você olhar para o mysql.slow_log, verá isto:

mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: CREATE TABLE 'slow_log' (
  'start_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  'user_host' mediumtext NOT NULL,
  'query_time' time NOT NULL,
  'lock_time' time NOT NULL,
  'rows_sent' int(11) NOT NULL,
  'rows_examined' int(11) NOT NULL,
  'db' varchar(512) NOT NULL,
  'last_insert_id' int(11) NOT NULL,
  'insert_id' int(11) NOT NULL,
  'server_id' int(10) unsigned NOT NULL,
  'sql_text' mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

mysql>

Isso não é bom para você como um arquivo CSV. Você pode convertê-lo para MyISAM e usá-lo .

Veja o que você pode fazer:

  • Faça uma cópia do log lento CSV original
  • Converta o CSV para MyISAM
  • Adicione dois índices
    • por start_time
    • por db, start_time
  • Ativar o log lento

Aqui estão os passos básicos:

CREATE TABLE mysql.slow_log_original LIKE mysql.slow_log;
ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX starttime (start_time);
ALTER TABLE mysql.slow_log ADD INDEX db_starttime (db,start_time);

Em seguida, ative o registro em log para mysql.slow_log adicionando isso a /etc/my.cnf

[mysqld]
slow-query-log
log-format=TABLE

Se você ainda quiser um arquivo de texto para consultas lentas além de uma tabela, use

[mysqld]
slow-query-log
slow-query-logfile=/var/log/mysql_slow.log
log-format=TABLE

Agora você provavelmente está se perguntando por que estou mostrando a tabela mysql.slow_log e não mysql.general_log . Bem, aqui está o mysql.general_log :

mysql> desc mysql.general_log;
+--------------+------------------+------+-----+-------------------+-----------------------------+
| Field        | Type             | Null | Key | Default           | Extra                       |
+--------------+------------------+------+-----+-------------------+-----------------------------+
| event_time   | timestamp        | NO   | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user_host    | mediumtext       | NO   |     | NULL              |                             |
| thread_id    | int(11)          | NO   |     | NULL              |                             |
| server_id    | int(10) unsigned | NO   |     | NULL              |                             |
| command_type | varchar(64)      | NO   |     | NULL              |                             |
| argument     | mediumtext       | NO   |     | NULL              |                             |
+--------------+------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.01 sec)

mysql>

Não há nada que aponte uma consulta para o banco de dados em mysql.general_log .

Ah, a propósito, você tem que definir outras coisas para pegar o mysql.slow_log pegar tudo

[mysqld]
slow-query-log
log-format=TABLE
log-query-time=0
log-queries-not-using-indexes

Dessa forma, toda consulta e sua avó são registradas em mysql.slow_log .

EPÍLOGO

Tudo o que você precisa fazer é executar consultas em relação a mysql.slow_log . Por exemplo, para ver todas as consultas do banco de dados mydb de hoje, você executaria:

SELECT * FROM mysql.slow_log
WHERE db = 'mydb'
AND start_time >= DATE(NOW()) + INTERVAL 0 SECOND;

Como você está usando o Amazon RDS, você terá que verificar a documentação para ver se você pode manipular mysql.slow_log do seu jeito.

Aqui estão minhas postagens anteriores no StackExchange sobre o uso de mysql.slow_log :

por 01.01.2013 / 00:33
0

dê uma olhada em pt-query-digest - pode tomar como uma saída de entrada do tcpdump e parece que é possível criar filtros personalizados para extrair apenas consultas de um tipo específico [provavelmente também consultas a um banco de dados específico].

observe que isso pode ser uma boa ferramenta de solução de problemas, mas não é uma solução muito útil para o registro permanente.

    
por 31.12.2012 / 17:08
0

Isso não é possível. O log de consulta é uma configuração no nível do servidor.

Se você quiser um log de consulta para cada banco de dados, precisará usar um produto diferente. Os possíveis candidatos são o MySQL Proxy ou o aplicativo ou a estrutura do aplicativo para registrar as consultas.

    
por 31.12.2012 / 16:21
0

O RDS suporta a ativação do Registro geral por meio de uma configuração de grupo de parâmetros de banco de dados. Por padrão, ele vai para TABLE, mas você pode modificar o log_output para FILE e reinicializar a instância do BD e, em seguida, pode fazer o download e analisar o arquivo por meio da API de acesso do log. ( link )

Com o MySQL 5.6 no RDS, você pode usar a funcionalidade de acesso ao log boglog para transmitir log binários para outro ambiente e manipulá-los como quiser.

    
por 21.08.2013 / 07:01