Database

Docker-compose MySQL 연동 및 백업, 복구

foxlee 2022. 2. 7. 21:19

* Docker 이미지로 실행된 MySQL 데이터를 연동, 백업 및 복구하자

* 백업의 경우 도커 컨테이너로 백업 명령어를 실행하여 호스트에 ***.sql 로 저장

* 복구의 경우 ***.sql 를 도커 컨테이너로 복구 명령어 실행

 

MySQL 연결 및 백업, 복구 Shell script

# 변수는 ./.env
version: "3"

services:
  flask:
    container_name: "${FLASK}"
    restart: always
    build: ./flask
    volumes:
      - ./flask/logs:/usr/src/flask_app/logs
    expose:
      - "${FLASK_PORT}"
    env_file:
      - ./.env
    command: gunicorn -c ./gunicorn.conf.py "app:create_app('prod')"
    depends_on:
      - mysql


  mysql:
    image: mysql:5.7
    restart: always
    container_name: "${MYSQL}"
    ports:
      - "${MYSQL_EXTERNAL_PORT}:${MYSQL_PORT}" # External port 는 DB 툴로 접속하기 위함 # MySQL port는 flask 앱에서 EXTERNAL PORT이 아닌 PORT로 URL 설정해야함  
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - TZ=Asia/Seoul
    command:
      - --lower_case_table_names=1
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./mysql/data:/var/lib/mysql  # 볼륨 설정
 
 other servieces...



# backup.sh, restore.sh  # ../.env 변수들 사용
if [ -f ../.env ]; then
  export $(echo $(cat ../.env | sed 's/#.*//g'| xargs) | envsubst)
fi
# docker exec [cotainer_name] /usr/bin/mysqldump -uroot --password=[password] [targatDatabase] > [saveto].sql
docker exec $MYSQL /usr/bin/mysqldump -uroot --password=$MYSQL_PASSWORD $MYSQL_DATABASE >  backup/$(date '+%Y-%m-%d_%H:%M:%S').sql

# cat [saved].sql | docker exec -i [container_name] /usr/bin/mysql -uroot --password=[password] [targetDatabase]
cat ./backup/20220209.sql | docker exec -i $MYSQL /usr/bin/mysql -uroot --password=$MYSQL_PASSWORD backup_db