본문 바로가기
서버 개발 (AWS, Linux, DevOps)/도커 (DOCKER)

Docker : mysqldump를 이용하여 백업 및 마이그레이션

by 번데기 개발자 2021. 9. 28.
반응형

 

docker의 mysql 컨테이너

docker를 사용하다 보면 mysql, mongodb와 같은 데이터베이스 컨테이너를 활용하여 쉽게 DB 서버를 구축할 때가 많습니다.

 

저는 mysql 컨테이너를 이용하여 간단한 프로젝트에서 DB를 구축해서 테스트 및 배포를 진행하여 보았습니다.

 

docker를 통한 mysql 설치는 아래 링크를 참고해주세요.

 

** 저는 docker image로 mysql 5.7 버전을 사용하였습니다 **

 

http://jmlim.github.io/docker/2019/07/30/docker-mysql-setup/

 

Docker를 통한 MySQL 설치하기. · 기억하기 위한 개발노트

Docker를 통한 MySQL 설치하기. 30 Jul 2019 | Docker docker MySQL 도커 Mysql Docker 한글문제 2020-02-26 에 한글깨짐 관련 내용 추가 함. 이 글에선 docker에서 MySQL을 설정하는 방법과 docker를 통해 설치한 MySQL에 접

jmlim.github.io

 

docker에서 mysql 데이터 백업 및 복원

 

이때 local DB의 데이터를 배포한 서버로 옮겨야 하는 필요성이 생겼습니다. 

 

보통 mysql만 local에 설치했을때는 mysqldump를 사용해서 mysql 데이터를 백업 및 복원 하였는데요

 

docker를 사용하여 mysql을 이용할때도 mysqldump를 사용할 수 있는 방법이 있었습니다.

 

그래서 저는 mysqldump를 통해 백업파일을 만들고 서버에서 mysqldump 복원을 통해 데이터를 마이그래이션을 성공할 수 있었습니다.

 

그럼 이제 간단하게 해당 명령어를 정리해보겠습니다.

 

 

mysqldump를 이용한 docker에서 mysql 데이터 백업 및 복원 명령어 정리

 

테이블에 대한 백업파일 만들기

 

#docker exec [컨테이너 이름] /usr/bin/mysqldump -u [사용자 계정] -p [패스워드] [데이터베이스명] [원본 백업받을 테이블명] > [백업받을 테이블명].sql

예제는 아래와 같습니다.

#docker exec 3372c8ac483a /usr/bin/mysqldump -u root --password=root lotto-backend > backup.sql

 

실제로 동작시켜본 화면입니다. 

 

 

Warning이 나오는데 이유는 잘 모르겠습니다. (아시는분 알려주시면 감사하겠습니다.)

 

backup을 마치면 backup.sql이 생성되는 것을 확인할 수 있습니다.

 

 

테이블 복원하기

 

#cat [백업된 테이블].sql | docker exec -i [컨테이너 이름] /usr/local/mysql -u [사용자 계정] -p [패스워드] [복원할 DB]

예제는 아래와 같습니다.

#cat backup_20210829.sql | docker exec -i 385efc09cfd7 /usr/bin/mysql -u root --password=root lotto-backend

실제로 동작 시켜본 화면입니다.

 

 

저는 로또 프로젝트를 개인적으로 진행하고 있어서 아래와 같은 데이터가 복원된것을 확인하실 수 있습니다.

 

 

잘 적용이 안되거나 에러가 나는 경우 truble shooting 

 

가끔 권한이나 mysql 오류때문에 안되는 경우가 있는데 저는 아래 방법으로 시도해 보니까 해결이 되었습니다.

 

확실한 방법인지는 잘 모르겠지만 참고하시길 바랍니다.

 

방법 1

 

docker exec -it container /bin/bash // 컨테이너 접속
vim /etc/mysql/mysql.conf.d/mysqld.cnf // myusqld.cnf 수정

위의 방법으로 mysqld.cnf파일에 접근합니다.

 

bind-address    = 0.0.0.0

bind-address를 0.0.0.0 으로 바꿔줍니다.

 

 

 

방법 2

 

docker exec -it container /bin/bash // 컨테이너 접속 
mysql -u root -p // mysql 터미널 접속

위의 방법으로 mysql 터미널에 접속합니다.

mysql> grant all privileges on *.* to ‘USER’@‘%’ identified by ‘PASS’
mysql> grant all privileges on *.* to ‘root’@‘%’ identified by ‘root’
mysql> flush privileges;

USER와 ROOT에 모든 권한을 부여합니다. 

 

mysql>CREATE USER 'test'@'%' IDENTIFIED BY 'password';
mysql>GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;

 

또는 새로운 계정을 만들어서 모든 권한을 부여하고 해당 계정을 통해 mysqldump를 실행하는 방법도 있습니다.

 

에러 수정할때 참고하였던 링크들인데 자세히 보시면 답을 찾을수 있을 거라 생각합니다 :)

 

https://zetawiki.com/wiki/MySQL_%EC%9B%90%EA%B2%A9_%EC%A0%91%EC%86%8D_%ED%97%88%EC%9A%A9

 

MySQL 원격 접속 허용 - 제타위키

다음 문자열 포함...

zetawiki.com

https://kindmaster.tistory.com/146

 

Mysql 외부접속 허용 방법

Mysql 외부 접속 방법 1. Mysql 환경설정 확인 하기 콘솔 창에서 mysql 접속 - 접속시 mysql 버전을 확인하세요 버전별로 상세 설정이 조금 다릅니다. ggachi@ggachinet:~$ mysql -u root -p Enter password: Welc..

kindmaster.tistory.com

 

https://czar.tistory.com/m/1066

 

[Docker][MySQL]Access denied for user ‘’@’172.17.0.1'(using password: YES)

[Docker][MySQL]Access denied for user ‘’@’172.17.0.1'(using password: YES) Solution: Step 1: access MySQL through docker container docker exec -it mysql -uroot -p Enter password: Welcome to the M..

czar.tistory.com

 

 

반응형