MySQL을 Docker 컨테이너 기반으로 이전한 썰

Apr 21, 2019

집에서 서버 돌리는 사람?!

우선.. 나는 아주 오래전부터 데스크탑을 서버로 활용하며 지내왔고.. 이 경험은 현재에도 개인 서버 구축, 운영으로 이어졌다.

오늘 적어보려는 내용은 리눅스 애플리케이션 기반으로 설치된 MySQL을 도커의 컨테이너 기반으로 옮기며 겪었던 간단한 썰.

사실 리눅스에 능숙하거나 삽질에 능숙하거나… 도커에 능숙하거나..
셋중 하나만 해당된다면 이 글은 큰 도움이 되진 못할 것 같다.

우선 내 서버는 시놀로지라는 플랫폼을 이용하고 있다. 정확히 하드웨어는 다른 데스크탑을 이용하는.. 즉 Xpenology 기반이다.
따지고보면 기성품하고는 많이 다를수도 있지만 이 글에선 크게 중요한 내용은 아니니 여기까지만 적겠다.

시놀로지가 알고보면..?

사람들이 잘 모를 수도 있지만 (???) 시놀로지는 리눅스 기반이고 도커를 지원한다. (그것도 네이티브로..)

하지만 나는 도커가 지원되기 이전부터 이 플랫폼을 이용했고 MySQL도 도커가 지원되기 이전에 설치하여 사용했었다.

Docker가 뜨면서 이렇게 OS에 종속되는 애플리케이션의 테스트와 배포가 매우 간결해졌고.. 사용패턴도 일관되게 바뀌게 된건 정말 환영할 일이다. (물론 몇몇 사람들에겐 큰 산일수도 있는 CLI를 어느정도 익혀야 하지만..)

도커는 장난감.. 찾아온 불행 ㅠㅠ

그리곤 도커에 매력에 빠져 이런저런 이미지와 컨테이너를 마구마구 올려 놀던중 시놀로지의 디스크 볼륨이 깨져 데이터를 이전하고.. 디스크를 포맷해야 하는 일이 생겼다.

불행히도.. MySQL이 설치된 디스크였고.. db덤프를 뜬 상황은 아니었다. (쓰기 권한이 막히면서 MySQL을 켤수도 없게 되버리더군요?)

그 중 다행은 디스크내부 데이터는 하나도 유실되지 않은 것… (만약 유실됫다면 여기에 글 안쓰고 울고 있었을 것이다 ㅠㅠ)

추가로 MySQL의 엔진을 innoDB로 사용 했다면 MySQL 애플리케이션 폴더에 frm, ibd라는 파일로 테이블의 데이터, 레코드 정보를 읽어올수 있다는 사실을 확인하고 데이터를 이전하기 시작했다.

또 다른 삽질의 시작

데스크탑에는 개발툴을 최소한으로 깔고 싶은게 당연히 개발자들의 마음이라 생각한다. (??)

그리하여 최초에는 리눅스 서버 내부에서 frm과 ibd를 이용한 복구 작업을 했으나.. 시놀로지 라는 녀석이 apt-get을 편하게 쓸수 있는 것도 아니었고.. 도커의 MySQL은 딱 애플리케이션 레이어만 설치 되다보니…

내가 해야할 frm, ibd 정보를 볼 수 있는 MySQLfrm를 쓰려면 MySQL Utilities 를 깔 수 밖에 없었다.

이 글을 쓰고 몇일뒤에 다시 읽어보면서.. mysql-utilities 를 찾아보니.. docker 이미지가 무수히 많았다… ㅠㅠ

결국.. 이 작업은 맥에서 진행하게 되었다. (처음부터 맥이나 윈도우에서 깔았다면..)

그리하여 MySQL를 설치하고..

$ brew install MySQL

MySQLworkbench 라는 녀석을 설치해야 비로소 우리가 필요한 MySQL Utilities 를 사용할 수 있다. 이때는 caskMySQLworkbench를 설치해야 한다.

$ brew cask install MySQLworkbench

MySQL, MySQLfrm 을 쳐보면 잘 작동할 것이다.. 만약 명령어가 먹히지 않으면.. 환경 변수를 추가해야한다.. 그것마저 귀찮으니 cd를 이용해서 MySQL폴더로 이동하는 것도 간단한 해결 방법 일 것이다.

$ cd /usr/local/opt/MySQL/bin

여기서 바로 되면 좋겠지만 불행히도 (?) 난 바로 되지 않았다.. MySQLfrm을 실행하면 파이썬 에러가 났다.

정확한 이유는 모르겠지만 대략.. 잘 살펴보면… MySQLfrm이라는 녀석이 파이썬으로 코딩되어 있고..

파이썬에서 종속된 라이브러리를 import 하는 과정에서 에러가 나는 문구로 보아.. 무언가를 깔아줘야 할거 같았다.

(사실 제가 쓰고도 무슨 말인지 모르겠습니다. 또한 어떻게 유추했냐고 물으신다면.. 크흠..)

검색해보니 python3-MySQL.connector 인지 뭔지를 깔아야 한댄다.. 별수 있나.. 깔아야지.

설치 방법을 찾다보니 stackoverflow에서 PyMySQL을 깔으면 된다고 나와있더라..(??) 이글은 문제 해결하고 2주 가량 지난뒤에 작성하는 것이므로.. 명확한 출처는 없다 ㅠㅠ

$ python3 -m pip install PyMySQL

넘나 감사해서 PyMySQL Repository에 star눌렀다 여러분도 눌러라 (?)

  • https://github.com/PyMySQL/PyMySQL

이제 준비는 끝났다. MySQLfrm –diagnostic 명령어를 이용하면 frm에서 테이블 정보를 읽어올 수 있다. 그대로 쿼링하면 해당 테이블을 생성 할 수 있다. 맨뒤에 frm의 파일 경로를 넣어주면 된다.

MySQLfrm –diagnostic /Users/Document/MySQL/myDB/TEST_TB.frm

나는 레코드 복구는 하지 않았지만 ibd를 이용한 레코드 복구도 크게 어렵지 않다. 우선 테이블을 만들면 MySQL에 해당 ibd, frm파일이 다시 생성될 것이다.
그럼 이때 테이블과 파일간의 연동을 SQL쿼링을 통해 끊어준다. DISCARD 명령이다.

MySQL> ALTER TABLE %테이블명% DISCARD TABLESPACE

그후 MySQL폴더에 가서 ibd파일을 이전의 데이터로 덮어씌우고 IMPORT 명령을 하면 된다.

상단의 명령어에서 DISCARD만 IMPORT로 변경하면 된다.

MySQL> ALTER TABLE %테이블명% DISCARD TABLESPACE

데이터 복구 끝!!

이 보다 빠르게 해결하기 위해 중간에 여러 삽질 과정이 생략되어 있다.. (?)

항상 헷깔렸던 Docker Volume을 어느정도 감 잡을수 있는 계기가 되었다. 이래서 회사 일보다는 스스로 뭔가를 만드는 삽질이 배우는게 많습니다.

생략된 단계에서는 MySQL 컨테이너에 frm, ibd파일을 cp명령어를 통해 옮겨넣는 과정… MySQL 컨테이너에서 MySQLfrm 명령어도 쳐보고.. DB 비밀번호에 해당하는 환경변수도 요리조리 바꿔도 안되는 일도 있었다.. (나중에 뜻이 생기면 이것도 포스팅 해보고 싶다.)

결론은..

맥이든 윈도우든 MySQL 유틸리티를 설치하고 이 안에서 테이블나 레코드 정보의 SQL을 뽑아내서 집어넣는게 가장 쉬운 방법이 아닐까 싶다.

참고 출처

  • https://blog.bpscal.com/291
  • https://webigotr.tistory.com/160