개발 환경
host server: Ubuntu
mysql: mysql:8.0.17 docker
Disclaimer
mysql 복구 방법 A to Z 에 대한 글이 아니다.
Ubuntu 서버에서 mysql 도커를 사용하다 실행이슈가 생겼고 복구할 수 있는 방법을 한가지 찾아낸 것 뿐이다.
비슷한 환경을 두고 비슷한 문제가 발생한 분들에게는 조금이나마 도움이 되도록 정리해본다.
(일반적인 경우)
내용
mysql 도커 내부의 /var/lib/mysql 을 호스트의 특정 경로와 바인딩 된 상태로 개발했다.
HOST_DATA_DIRECTORY=~/mysqlfolder/data
docker run -d -p 3306:3306 -v $HOST_DATA_DIRECTORY:/var/lib/mysql mysql:8.0.17
몇개월에 한 번씩 이 디비를 조작해야하는 업무 프로세스가 있어 오래간만에 들어가보면,
꼭! 도커가 꼬여있다.
더이상 꼬여있지 않도록 손을 썼지만, 서비스라는게 계속해서 관리를 해주지 않으면 아무래도 어딘가에서는 failure가 나는 것 같다...
여하튼
※ 참고로 /var/lib/mysql/ 폴더는 데이터가 물리적으로 저장되는 공간이다.
/var/lib/mysql/{데이터베이스명}/ 아래에 들어가보면
- {테이블명1}.ibd
- {테이블명2}.ibd
등등 (일반적인 경우) 테이블별로 ibd 파일이 있음을 알 수 있다.
(한 테이블을 분할해 저장할 수도 있다.)
오랜만에 mysql 도커를 재시작을 하는데 에러메세지가 막..
You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
무언가가 끔찍하게 잘못됐습니다.. 라는 말에 정말 식은땀이.. ㅠㅠ 무서워..
해결
위와 같은 무서운 문구를 보아도 걱정하지말자.
호스트에 $HOST_DATA_DIRECTORY 에 모~든 ibd파일들이 존재한다!
이것으로 복구할 수있어!
일단 컨테이너 정지&삭제 해두자.
$ docker stop {컨테이너명}
$ docker rm {컨테이너명}
$HOST_DATA_DIRECTORY 가 예를들어 ~/mysqlfolder/data 폴더라고 할 때
# 기존 폴더 백업후 카피
$ cd ~/mysqlfolder
$ mv data data.bak
$ mkdir data
$ cp -r data.bak/* data
# 로그파일 모두 삭제
$ rm -rf data/binlog.*
$ rm -rf data/그외불필요한파일들
이렇게 새롭게 저장을 해둔후
docker start {컨테이너명} 을 하여 예쁘게 다시 잘 실행시켰다. >< !!
위에서 삭제한 binlog같은 경우에는 DDL, DML 등의 수정작업을 하였을때 그 이벤트를 기록하는 로그파일이다.
이 파일은 보통 디비 replication구성 또는 복원을 할 때 사용되는 파일이다.
그리고 "그외불필요한파일들"같은 경우에는 내가 초반에 시행착오를 겪으면서
ibdata1 파일 등을 backup해도보고 여러가지를 시도하면서 부수적으로 생성한 파일들을 뜻한다.
따로 이렇게 생성한 파일이 없다면 지우지 않아도 된다.
아쉬운 점
아쉬운점은, 이 에러가, binlog의 문제였는지, 내가 부수적으로 생성한 파일에 의해 실행이 잘못된 것인지는 확인하지 못했다.
mysql docker 컨테이너를 재시작하는 과정에서
기존 HOST 데이터와 충돌이 나는 걸까?
지금 당장 명쾌한 해답을 찾지 못한게 아쉽다.
나중에 업무를 하면서 관련된 원리를 알 수 있다면 한 번 더 들여다봐야겠다.
'Mysql' 카테고리의 다른 글
직장인의 SQLD 합격기 (준비부터 합격까지) (0) | 2022.04.11 |
---|---|
[Mysql] JSON ARRAY의 모든 값을 변경시켜 UPDATE하기 (0) | 2021.12.24 |
Mysql 프로세스 목록 확인 (0) | 2021.06.07 |
[Mysql] 기존 테이블의 CREATE 문 보기 (0) | 2021.03.19 |
Mysql 테이블 별 사이즈, Row개수 출력 (0) | 2021.03.19 |