log_error가 docker의 mysql에서 작동하지 않습니다.

log_error가 docker의 mysql에서 작동하지 않습니다.

공식 docker 이미지를 사용 하고 mysql:5.7사용자 정의 .cnf 파일을 사용하여 mysql을 설정 general_log_file하고 로그인하고 logs_error있지만 오류 로그를 설정하면 다음 오류가 발생합니다.

$ 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.

여기에 오류가 발생하고 log_erroror 을 입력했는데 slow_query_log_file, 이 간단한 것이 왜 docker에서 작동하지 않는지 아는 사람이 있습니까?

답변1

컨테이너 내부에서는 기본 운영 체제의 기능을 완전히 지원하지 못할 수 있습니다. 이는 특정 목적을 위해 보다 안전하고 제한된 환경을 원하기 때문에 의도적으로 설계된 것입니다.

따라서 MySQL 로그의 경우 아마도 MYSQL DB/테이블에 기록하고 싶을 것입니다.

버전 5.x(5.1, 5.2, 기억할 수 없음)의 경우 SQL은 파일 대신 MySQL DB/테이블에 대한 로깅을 지원하며 기본적으로 두 개의 테이블이 이미 생성되어 있습니다 mysql.general_log.mysql.slow_log

사용을 설정하려면 다음이 필요합니다.

에 추가 /etc/mysql/my.cnf:

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

그런 다음 mysql을 다시 시작하십시오.

매일 백업하려면 데이터베이스 쿼리 권한이 있는 시스템에서 다음을 실행할 수 있습니다.

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

(lock-tables=0을 사용해야 합니다. 그렇지 않으면 오류 메시지가 표시됩니다.

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

)

그런 다음 다음 쿼리를 실행하여 테이블을 정리합니다.

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

이것이 일반적인 생각입니다. 지난 며칠 동안의 로그를 보관하려고 할 수 있으므로 MySQL TRUNCATE/DELETE 쿼리가 더 장황해집니다.

테이블은 기본적으로 거기에 있어야 하며 해당 Docker 이미지에서 지워졌을 수도 있습니다.

따라서 v5.7의 경우 다음을 사용하여 생성할 수 있습니다.

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';

추가 자료:테이블에 로그 쓰기

error_file 생성에 관해서는: /var/log가 docker 파일에 존재하지 않을 수도 있습니다. 위의 두 가지 로깅 옵션이 충분하지 않은 경우 MySQL 사용자가 소유한 디렉터리에 테스트용 파일을 만들 수 있습니다. MySQL이 있는 디렉터리 중 하나는 일반적으로 /var/lib/mysql입니다.

답변2

어제 비슷한 문제가 있었지만 my.cnf의 오류 로그 경로를 설정하고 있었습니다. 나는 (docker가 아닌 다른 환경에서는 잘 작동하는) 사용에 익숙했지만 log-error=/var/log/mysql/mysql.errdocker에서 사용할 때 .err확장을 허용하지 않는다는 것을 깨달았습니다. 그런 다음 확장 프로그램을 사용했는데 .log훌륭하게 작동했습니다. 기본 Docker 이미지를 실행하고 있지만 mariadb:10.2이미지를 실행할 때도 동일해야 합니다. 참고: 오류 파일은 로그이지만 테이블로 볼 수 없으므로 mysql:5.7변수의 영향을 받지 않습니다 . 또한 로깅은 서버에 불필요한 부담을 주기 때문에 가능하면 피해야 한다고 생각합니다 .log-output=TABLEmysqlTABLE

관련 정보