ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커로 MySQL 다루기
    분석과탐구 2023. 6. 9. 02:50

    도커로 MySQL 다루기

    MySQL을 사용할 때, MySQL을 따로 설치하지 않고 도커 이미지로 가져와 컨테이너로 돌려서 사용하곤 했다. 도커 데스크탑과 컴포즈로 인해서 연관된 프로그램들을 하나로 묶는다는 개념이 좋았기 때문이다.

    도커 컴포즈로 연관된 프로그램들이 시각화된 모습

    설치와 설정의 반복에서 벗어나 docker-compose.yml파일을 하나 잘만들어두면 여기저기 쓸 수 있어서 좋기도 했다. 그래서, 사용하면서 그때 그때 처리하고 넘어갔던 것들을 정리해보려고 한다.  예제 링크

    설정파일 변경

    mysql의 설정파일은 /etc/my.cnf에서 다룬다. 설저을 바꾸기 위해서 my.cnf를 직접 수정하는 식으로 접근하면, 적어도 컨테이너에서는 여러 에러가 발생한다. 에러를 해결하기 위해 이런저런 명령어를 쓰는 것도 나쁘진 않지만, my.cnf파일을 보면 적절한 대처법을 찾을 수 있다.

     

    my.cnf 파일을 보면 가장 아래에 이런 코드가 있다.

    !includedir /etc/mysql/conf.d/

    /etc/mysql/conf.d/디렉토리 안에 있는 파일들을 설정파일로 불러오는 것이다. 따라서 설정을 바꾸고 싶다면, 설정을 적용한 파일을 conf.d파일 안에 넣어주는 식으로 접근하는 것이 올바른 방향일 것이다.

    binary log 설정

    설정 파일을 하나 만들어서 바이너리 로그 생성 옵션을 추가해보자.

    [mysqld]
    log_bin=/var/lib/mysql/bin.log
    binlog_format=STATEMENT
    expire_logs_days=3
    binlog_checksum=NONE
    binlog_row_image=FULL

    docker-compose.yml 안에서 volume를 이용하여 복사해보자.

    volumes:
    	- ./custom.cnf:/etc/mysql/conf.d/custo.cnf

    이러면 별다른 에러 없이 제대로 동작할 것이다. 다음과 같이 바이너리로그가 생성된 것을 알 수 있다.

    생성된 바이너리로그

    다만 이렇게 설정 파일 하나를 각각 volume의 옵션으로 주는 것보단 conf폴더를 하나 만들고, 그 안에 설정파일들을 모두 가져다 사용하는 것이 좋을 것이다. 그리고, 주려고 하는 옵션을 개별 파일로 만들어 놓으면 관리하기도 편할 것이다. docker-compose.yml의 volume이 다음과 같이 변할 것이다.

    volumes:
        - ./mysql/conf:/etc/mysql/conf.d

    general log 설정

    [mysqld]
    general_log=ON
    log_output=FILE
    general_log_file=/var/lib/mysql/general.log

    설정이 되어 있는지 확인해보려면, 다음 명령어를 사용하여 알 수 있다.

    SHOW VARIABLES LIKE '%general_log%';

    error log 설정

    log_error=/var/log/mysql/error.log

    slow query 설정

    slow_query_log=ON
    slow_query_log_file=/var/log/mysql/slow.log
    long_query_time=2
    log-queries-not-using-indexes

    발생할 수 있는 문제

    대부분의 문제들은 권한이나 호환성 관련된 것이었다. 호스트에 있는 파일을 도커에 마운팅하는 과정에서 발생한다.

    World-writable config file '/etc/mysql/conf.d/설정파일이름' is ignored

    이 문제는 설정파일의 권한 문제이다. mysql은 world writable 권한인 설정 파일을 무시한다. 호스트에서 해당 파일을 '읽기전용'으로 수정해야 한다.

    Found option without preceding group

    cnf 파일 첫번째 줄에 [mysqld] 헤더를 넣지 않아서 생기는 문제이다.

    명령어

    docker에서 mysql 명령어를 쓰는 것은 docker의 exec 명령으로 컨테이너 내부에 다시 명령을 내려서 사용하는 것이라 외부에서 하는 명령과 별 차이는 없을 것이다. 따라서 기존에 mysql에서 쓰던 명령어 그대로 응용가능하다.

    덤프

    덤프와 복원쪽 명령어에서 주의할점은 -u -p 명렁어 다음에 한 칸 띄우지 말고 바로 유저와 비밀번호를 적어줘야 한다는 점이다.

    특정 데이터베이스의 특정 테이블

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 데이터베이스 테이블이름 > test.sql

    특정 데이터베이스의 테이블 여러개

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 데이터베이스 테이블이름1 테이블이름2 > test.sql

    특정 데이터베이스의 모든 테이블

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 데이터베이스 > test.sql

    모든 데이터베이스에 있는 모든 테이블

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 --all-databases > test.sql

    프로시저

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 --routines --no-create-info --no-data --no-create-db --skip-opt 데이터베이스 > test.sql

    플래그의 의미.

    • --routines : 프로시저, 함수, 뷰
    • --no-create-info: CREATE TAABLE 문을 제외
    • --no-data: 테이블의 데이터를 제외
    • --no-create-db: CREATE DATABASE를 제외
    • --skip-opt: --add-drop-table, add-locks를 제외
    • --add-drop-table : DROP TABLE을 제외
    • --add-locks: LOCK TABLES을 제외

    프로시저,함수,뷰와 테이블

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 --routines --tables 데이터베이스 > test.sql

    트리거와 테이블

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 --triggers --tables 데이터베이스 > test.sql

    프로시저,함수,뷰,트리거와 테이블

    docker exec 컨테이너이름 /usr/bin/mysqldump -u유저 -p비밀번호 --triggers --routines --tables 데이터베이스 > test.sql

    모든 데이터베이스의 모든 프로시저, 함수, 뷰, 트리거

    docker exec blog-db /usr/bin/mysqldump -u유저 -p비밀번호 --triggers --routines --tables --all-databases > test.sql

    복원

    특정 데이터베이스 복원

    cat test.sql | docker exec 컨테이너이름 mysql -u유저 -p비밀번호 데이터베이스

    모든 데이터 베이스 복원

    cat test.sql | docker exec 컨테이너이름 mysql -u유저 -p비밀번호 --all-databases

    참고

    댓글

Designed by Tistory.