![log_error가 docker의 mysql에서 작동하지 않습니다.](https://linux55.com/image/109838/log_error%EA%B0%80%20docker%EC%9D%98%20mysql%EC%97%90%EC%84%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
공식 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_error
or 을 입력했는데 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.err
docker에서 사용할 때 .err
확장을 허용하지 않는다는 것을 깨달았습니다. 그런 다음 확장 프로그램을 사용했는데 .log
훌륭하게 작동했습니다. 기본 Docker 이미지를 실행하고 있지만 mariadb:10.2
이미지를 실행할 때도 동일해야 합니다. 참고: 오류 파일은 로그이지만 테이블로 볼 수 없으므로 mysql:5.7
변수의 영향을 받지 않습니다 . 또한 로깅은 서버에 불필요한 부담을 주기 때문에 가능하면 피해야 한다고 생각합니다 .log-output=TABLE
mysql
TABLE