도커 컴포즈로 mysql 설치

solarrrrr·2023년 7월 26일
0

Today I Learned

목록 보기
62/74

https://velog.io/@solarrrrr1010/Mysql-%EC%BB%AC%EB%9F%BC-%EC%B6%94%EA%B0%80-%EC%9D%B4%EC%8A%88

기존 서비스 중인 테이블에 컬럼 추가 후 유니크 설정 시 락 걸린 듯한 문제가 생겼었다.
라이브 DB에 테스트를 해 볼 수가 없어서 (개발 DB에서는 문제 재현이 안 됨)
로컬에 설치해서 테스트해 보기 위해 검색하던 중 도커 컴포즈로 mysql 설치하는 법이 나와 있어 참고해 보았다.

도커는 예전에 설치해 뒀었고 필요한 버전의 mysql을 포함해 yaml 파일을 작성해 주고
docker-compose up -d를 입력. 그런데 소켓 관련 오류가 났다.
검색해 보니 데몬이 띄워지지 않아서 그렇다고 한다.
도커 데스크탑을 실행하라고 해서 실행 후 다시 입력하니 정상적으로 올라갔다.

docker ps로 잘 띄워졌나 확인.
그런데 무한 재실행..

찾아본 바로는 도커 컴포즈로 띄운 컨테이너는 실행 후 명령을 수행하고 나면 종료된다고 한다.
그런데 yaml 파일에 restart : always라고 적어서 아마 계속 재실행을 시킨 것 같다.

계속 띄워두기 위해서는 command: tail -f /dev/null라는 부분을 추가해 줘야 한다고
스택 오버 플로우에서 보아서 그대로 넣었고 계속 잘 올라가 있는 걸 확인했다.

docker exec -it 컨테이너 ID bash로 도커로 진입했고 mysql을 입력하자,
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
이런 오류가 발생했다.

여러 원인이 있을 수 있는데 내 경우는 mysql을 실행하지 않아서였다.
service mysql start를 해 주고 난 후 mysql을 입력하니 mysql shell로 진입했다.

이곳에서 DB와 테이블을 만들어준 후 시퀄 에이스 프로그램으로 연결작업을 했다.
그런데 시퀄 에이스에서 아무리 해도 다양한 오류를 뿜으며 연결이 안 됨..

인터넷에 나와 있는 해결책이나 방법은 대부분 도커가 없이 mysql을 설치했을 때를 가정하고 쓰여진 것들이 많았다.

먼저 로컬에서 도커 내부로 포트포워딩이 돼야 하고 해당 설정은 yaml에서 해야 한다.
그리고 mysql에 접근 가능한 권한을 가진 계정을 추가해야 하는데

GRANT ALL ON . TO 'root'@'172.xx.x.x' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;

이 명령어를 통해 추가해 주었다.
생성된 계정은 select user, host from mysql.user; 이 명령을 통해 확인 가능하다.

이후 시퀄 에이스 host에 127.0.0.1을 넣고 권한이 부여된 위에서 만든 계정과 비밀번호를 넣고 접속을 하니 정상적으로 연결됐다.

이제 문제 재현을 위해 라이브 DB의 데이터를 덤프해서 로컬 DB에 부어주었다.
그리고 유니크를 걸었는데... 잘 되었다. 문제 재현에 실패.

CTO님과 얘기해 보았는데, 라이브 DB에서만 문제가 발생하는 이유가
write / read 따로 DB를 쓰고 있어 그런 게 아닐까라고 하셔서
chat gpt의 도움으로 master / slave 컨테이너를 두 개 띄워 mysql 2개를 동기화했다.

그리고 다시 테스트해 봤지만.. 잘 된다. 또 문제 재현 실패.

ALTER TABLE 테이블명 ADD CONSTRAINT uix UNIQUE (컬럼1, 컬럼2), ALGORITHM=INPLACE, LOCK=NONE;

이걸 꼭 테스트해 보고 싶었는데..
이슈 해결에 실패했다.
원인과 해결책이 정말 궁금하다.

profile
몰입

0개의 댓글