쌓고 쌓다

MySQL 데이터 백업 및 가져오기/Docker MySQL 볼륨 마운트 본문

프로그래밍/docker

MySQL 데이터 백업 및 가져오기/Docker MySQL 볼륨 마운트

승민아 2024. 4. 30. 19:16

MySQL의 데이터를 백업해보고 그 데이터를 Docker MySQL에 가져와보자. 그리고

Docker 컨테이너를 통해 올린 DB 데이터를 Host에서 관리해보자.

 

먼저 Docker MySQL 볼륨을 마운트해보자.

즉, Docker 컨테이너에 올려진 DB의 데이터가 Host에서 관리되길 원하는것이다.

docker-compose.yml

version: '3'
services:
  db:
    image: mysql:8.0.33
    container_name: spot-db
    restart: always
    ports:
      - "3306:3306"
    command:
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      TZ: Asia/Seoul
    volumes:
      - ./mysql/db:/var/lib/mysql
      - ./mysql-init-files/:/docker-entrypoint-initdb.d
  server:
    image: [아이디]/[이미지명]:[버전]
    container_name: spot-server
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/[DB명]
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "1234"
    depends_on:
      - db
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 10s
      retries: 3
  • volumes
    • ./mysql/db:/var/lib/mysql : mysql의 파일들을 ./mysql/db로 마운트(연결)함.
      • [HOST 경로]:[컨테이너경로]
      • 즉, ./mysql/db는 docker-compose.yml 기준 경로이며
      • /var/lib/mysql는 docker exec -it [컨테이너명] /bin/bash로 접속한 경로임.
    • ./mysql-init-files/:/docker-entrypoint-initdb.d
      • [docker-compose.yml 기준 경로]:/docker-entrypoint-initdb.d
      • docker-compose.yml의 위치에 mysql-init-files 폴더에 있는 .sql을 모두 실행시켜 초기 데이터를 설정.
  • SPRING_DATASOURCE_URL : 스프링부트 애플리케이션이 도커 컨테이너로 띄어진 DB와 통신하기 위해 작성
  • depends_on : db 컨테이너가 먼저 실행된 후 server 컨테이너가 실행되도록 순서를 지정할 수 있음
  • healthcheck : depends_on이 실행 순서만 보장해주지 완전한 상태까지 기다려주지 않기에 healthcheck로 체크.

depends_on과 healthcheck를 사용해도 자꾸 DB가 완전히 준비되기전에 서버가 켜져서 문제가 되어

docker compose db -> docker compose server 순서로 명령어로 컨테이너를 띄움...

 

이제 로컬의 DB 데이터를 Docker DB로 옮겨보자.

현재 컨테이너로 올린 DB에는 comment ROW 값이 없다.

현재 컨테이너로 올라간 DB에는 ROW 값이 없다.

 

 

HOST의 3306 포트와 컨테이너의 3306 포트가 충돌이 나니깐

MySQL 컨테이너를 중지해주자.

docker compose stop db

 

Host의 MySQL을 접속하기위해 우분투 기준으로 아래의 명령어를 실행.

service mysql restart

 

 

아래의 명령어를 통해 DB를 지정하여 sql 파일로 생성하자.

mysqldump -u [계정명] -p [DB명] > [파일명].sql

명령어를 실행한 위치에 .sql 파일이 생긴다.

 

다시 Host MySQL을 중지시키고.

service mysql stop

 

MySQL 컨테이너 접속을 위해 다시 restart

docker compose restart db

 

spot-db 컨테이너에 접속하자.

docker exec -it spot-db /bin/bash

 

도커 컨테이너로 파일을 옮기려면 아래의 명령어를 치면된다.

docker cp [옮길 파일명] [container ID or Name]:[컨테이너 내 저장위치(경로)]

위의 명령어로 이전의 .sql 파일을 컨테이너로 복사해준다.

 

CREATE DATABASE [DB명]으로 DB를 생성해주고

아래의 명령어로 DB에 가져오면 된다.

mysqldump -u [계정명] -p [DB명] < [덤프 파일 경로]

 

그러나 도커 컨테이너에서 난 잘 안되어서 다음 명령어로 해결했다.

mysql -u root -p spot < data.sql

 

 

한글이 ???로 나오며 깨져있다..

잘 저장되어 있지만 깨져 보이는거 같다.

 

도커 컨테이너의 locale을 설정해줌으로써 해결할 수 있다.

현재 POSIX로 언어가 설정되어 있다.

 

locale -a로 사용 가능한 언어들을 볼 수 있다.

C.utf8이 있다면 아래의 명령어를 실행해주자.

export LC_ALL="C.UTF-8"

 

그러면 C.UTF-8로 설정이 된다.

 

 

MySQL 컨테이너에 데이터를 잘 가져왔으며,

 

HOST와 마운트하여 /mysql/db/ 에 mysql 파일들이 관리되고 있다.

Comments