Docker Mysql 데이터 백업 자동화

동오·2025년 3월 7일

트러블 슈팅

목록 보기
2/2

🛠 트러블슈팅 기록

1. 문제 요약

발생 일시: 2025/03/06

증상: Oracle Cloud 인스턴스에 실행중인 Mysql 강제 종료 현상

  • 강제 종료도 문제지만 데이터 백업이 제대로 이루어지지 않아서 강제 종료 이후엔 DB가 다 날라가는 문제 발생

2. 원인 분석

Mysql 컨테이너 로그 기록

  • 메모리 부족 및 최대 연결 수 설정 문제로 유추
    mysql 컨테이너 로그

3. 해결 방법

  • Mysql 컨테이너에 bash로 접속해서 my.cnf 파일에 아래 설정 추가
    • 참고 URL

    • 메모리 부족 및 연결 수 설정 문제일 가능성 발견

      innodb_buffer_pool_size=512M  # InnoDB 버퍼 풀 크기 설정
      max_connections=100  #
      # 컨테이너 터미널 접속
      docker exec -it 컨테이너명 bash
      
      # 설정 파일 출력
      cat my.cnf
      
      # 출력 결과 복사 후 위에 설정 추가해서 덮어쓰기
      echo -e "
      # For advice on how to change settings please see
      # http://dev.mysql.com/doc/refman/9.2/en/server-configuration-defaults.html
      
      [mysqld]
      innodb_buffer_pool_size=512M  # InnoDB 버퍼 풀 크기 설정
      max_connections=100  #
      # Remove leading # and set to the amount of RAM for the most important data
      # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
      # innodb_buffer_pool_size = 128M
      #
      # Remove leading # to turn on a very important data integrity option: logging
      # changes to the binary log between backups.
      # log_bin
      #
      # Remove leading # to set options mainly useful for reporting servers.
      # The server defaults are faster for transactions and fast SELECTs.
      # Adjust sizes as needed, experiment to find the optimal values.
      # join_buffer_size = 128M
      # sort_buffer_size = 2M
      # read_rnd_buffer_size = 2M
      
      host-cache-size=0
      skip-name-resolve
      datadir=/var/lib/mysql
      socket=/var/run/mysqld/mysqld.sock
      secure-file-priv=/var/lib/mysql-files
      user=mysql
      
      pid-file=/var/run/mysqld/mysqld.pid
      [client]
      socket=/var/run/mysqld/mysqld.sock" > my.cnf
      
      # 추가한 설정 들어갔는지 확인
      cat my.cnf
      
      exit
      
      # 컨테이너 재시작
      docker stop 컨테이너명
      docker start 컨테이너명
  • DB 자동 백업 설정으로 추후 다시 발생하더라도 복구 가능하게 조치
    • 쉘 스크립트 작성

      vi db_backup/backup.sh
      # 1. I 눌러서 Insert mode에서 아래 내용 복사
      # 2. :wq + Enter로 저장
      DEV_FILE_NAME=dev_backup_`date +"%Y%m%d%H%M%S"`
      TESTDB_FILE_NAME=testdb_backup_`date +"%Y%m%d%H%M%S"`
      
      # mysql db 데이터 백업
      docker exec mysql-server mysqldump -u root -ptest1 dev > $DEV_FILE_NAME.sql;
      docker exec mysql-server mysqldump -u root -ptest1 testdb > $TESTDB_FILE_NAME.sql;
      
      # 백업 디렉토리에서 백업 파일들 중 가장 최신 3개를 제외하고 나머지 삭제
      ls -t testdb_backup_*.sql | tail -n +4 | xargs rm -ff
      ls -t dev_backup_*.sql | tail -n +4 | xargs rm -f
    • 자동 실행 설정

      vi /etc/crontab
      # 1. I 눌러서 Insert mode에서 아래 내용 복사
      # 2. :wq + Enter로 저장
      
      # 1시간마다 자동 실행
      # */60 * * * * 는 cron 표현법이고 따로 찾아보시길 바랍니다.
      # root -> 사용자
      # /var/lib/docker/volumes/mysql-data-vol/db_backup/backup.sh -> 쉘 스크립트 경로
      */60 * * * *    root    /var/lib/docker/volumes/mysql-data-vol/db_backup/backup.sh
      

4. 결과 및 추가 조치

  • 현재까지는 서버 다운 없이 정상 가동중

5. 회고 및 예방 조치

  • 실제 운영 서버라면 당연히 무슨 일이 일어날지 모르기 때문에 DB는 자동으로 백업 조치를 해주어야하는데 볼륨 설정만 해두고 백업을 하지 않았어서 발생했던 거 같다.
    추후에는 컨테이너 띄우면서 초기 백업 작업까지 해주어야겠다.

  • 최대 커넥션 수랑 InnoDB 버퍼 풀 사이즈는 정확히 어떻게 동작하는지 또 설정 값을 어느정도로 두어야 하는지는 아직 확인해보지 못해서 추후 학습해볼 예정이다.

0개의 댓글