log_error não está funcionando no mysql no docker

1

Eu uso a imagem do docker oficial mysql:5.7 e configurei os logs general_log_file e logs_error no mysql usando o arquivo .cnf personalizado, mas aqui quando eu configuro o log de erros, ficando abaixo do erro:

$ sudo docker-compose up
db_1   | Initializing database
db_1   | Initializing database
db_1   | Initializing database
....

^CGracefully stopping... (press Ctrl+C again to force)

$ cat mysql-custom.cnf
[mysqld]
general_log_file        = /var/log/mysql/mysqld.log
general_log             = 1
log_error               = /var/log/mysql/error.log  # When i put this then getting above error.

Aqui eu recebo o erro, em seguida, coloco o log_error ou slow_query_log_file , Alguém sabe por que essa coisa simples não funciona na janela de encaixe?

    
por Nullpointer 19.04.2017 / 10:54

2 respostas

1

Quando em um contêiner, você pode não ter o suporte total das funcionalidades do sistema operacional subjacente; Esse comportamento é por design como você deseja ter um ambiente mais seguro e restrito para uma finalidade específica.

Como tal, para logs do MySQL, você pode querer logar em MYSQL DB / tables.

Para a versão 5.x em diante (5.1, 5.2, não se lembra) O SQL suporta o registro no MySQL DB / tables, em vez de arquivos, e vem por padrão com duas tabelas já criadas, mysql.general_log e mysql.slow_log .

Para configurar seu uso, você faz:

Adicionando a /etc/mysql/my.cnf :

[mysqld]
slow-query-log
general_log=1
log-output=TABLE

E, em seguida, reinicie o mysql.

Para fazer backup deles todos os dias, você pode executar em um sistema com acesso para consultar o banco de dados:

mysqldump mysql general_log  --lock-tables=0 > general_log_errors.db
mysqldump mysql slow_log  --lock-tables=0 > slow_log_errors.db

(Você precisa usar lock-tables = 0, caso contrário, você receberá a mensagem de erro:

mysqldump: Got error: 1556: You can't use locks with log tables. when doing LOCK TABLES

E, em seguida, execute as seguintes consultas para limpar as tabelas.

TRUNCATE TABLE mysql.general_log;
TRUNCATE TABLE mysql.slow_log;

Esta é a ideia geral. Você pode querer manter logs dos últimos dias e, como tal, as consultas MySQL TRUNCATE / DELETE seriam mais elaboradas.

As tabelas devem estar lá por padrão, talvez tenham sido apagadas nessa imagem do docker.

Assim, para a v5.7, você pode criá-los com:

CREATE TABLE IF NOT EXISTS 'general_log' (
  'event_time' timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON    UPDATE CURRENT_TIMESTAMP(6),
  'user_host' mediumtext NOT NULL,
  'thread_id' bigint(21) unsigned NOT NULL,
  'server_id' int(10) unsigned NOT NULL,
  'command_type' varchar(64) NOT NULL,
  'argument' mediumblob NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';

CREATE TABLE IF NOT EXISTS 'slow_log' (
  'start_time' timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  'user_host' mediumtext NOT NULL,
  'query_time' time(6) NOT NULL,
  'lock_time' time(6) 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' mediumblob NOT NULL,
  'thread_id' bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';

Outras leituras: Escrevendo Logs em Tabelas

Quanto à criação do error_file: / var / log pode nem existir em seu arquivo do docker. Se essas duas opções de log acima não forem suficientes, você poderá criar um arquivo para testar em um diretório pertencente ao usuário do MySQL; Um desses diretórios onde o MySQL reside é / var / lib / mysql.

    
por 19.04.2017 / 11:30
0

Eu corri para um problema semelhante ontem, mas o meu estava definindo o caminho para o log de erros no my.cnf. Eu estou acostumado a usar log-error=/var/log/mysql/mysql.err (que funciona bem em outro ambiente não-docker), mas mantido quando usado no docker, percebi que ele não está aceitando a extensão .err . Então eu usei a extensão .log e funcionou bem. Embora eu esteja executando a imagem de base mariadb:10.2 docker, mas deve ser o mesmo ao executar mysql:5.7 image. Apenas fyi: embora o arquivo de erro seja um log, ele não é afetado pela variável log-output=TABLE , pois não pode ser visualizado em uma tabela mysql . Eu também acho que o logging para TABLE cria uma sobrecarga desnecessária no servidor e isso deve ser evitado, se possível.

    
por 13.07.2017 / 15:01