본문 바로가기
Archive

원인모를 DB 폭파현상

by livemehere 2022. 4. 21.
서버는 잘돌아가는데 디비가 끊겼다

express 서버 + sequelizeORM을 사용해 mariadb 를 사용하고있다.

처음엔 도커를 이용해, node 컨테이너, db컨테이너 두개를 따로두었다.

일주일즘 지났을까.. 서버는 잘돌아가는데 db커넥션 오류가 떠서, 클라우드 서버에 들어가보니

디비 컨테이너가 중지되어있었다.

그래서 단순히 재실행해보니, 데이터는 모두 날아가고 없어졌다.

 

다행히 나는 Ctrl + s 중독자에, 백업에 미친사람이라 데이터는 그대로 import해올수있어서 다행이었지만 아찔했다.

 

두번째.. 폭파

또한 일주일즘 지난 오늘, 똑같이 디비가 날아갔다.

메모리가 1GB인 네이버 클라우드 플랫폼 무료서버를 이용하고있는데,

무료서버인와중에 express 서버 두개에 디비하나를 사용하고, 도커까지 쓰니 아무레도 메모리오버플로우가 발생한것 아닐까라는 생각에 도꺼는 빼고, 날것으로 db설치, node설치로 변경했었다.

 

그런데도 또이런다..

사실 db도 에러로그를 남기기때문에, 그걸 봤어야됬는데, 복구하기 급급했던 나는 에러로그도 확인하지 않고 "또이러네.."라는 생각으로

바로 디비재설치하고 복구를 했다.

 

에러로그를 못봐서, 정말 server의 메모리 문제인지 무슨문제인지 모르겠다..

진짜.. 조언구할사람이 필요해 ㅠㅠ

 

2시간의 삽질

위에서 디비를 재설치했다고했는데, 이과정에서 2시간이걸렸다.

디비가 날아가는 과정에서 user의 권한도 이상해진것 같았다.

각종 config파일들이 날아가서일지는 모르겠지만, 복구하기위해 스키마를 생성하고, 유저에게 권한을주고 하는 명령어들이 다 권한없음으로 반려되었다.

서버에 직접 root@localhost 로들어가도 안됬다.

심지어 mysql db에 접근도안됬다.(mysql.user 여기)

 

아이러니하게.. 나는 root@%에 모든권한을 주고 사용하고있어서

오히려 workbench로 원격접속시에 mysql.user를 조회할수있었다.

살펴보니 권한이 이상하게 되있었고, 권한을주려하니, 권한을부여하는 권한이없단다...

 

그럼 권한을 부여할 권한을 가진 user로 접속해야되는데..

여기서 또 과거의 과오가 발목을 잡았다.

root@localhost -> root@% 로 바꿨었기 때문이다.

 

결국, 난 마스터계정을 온전히 놔두지않고, 변경해서 사용했기때문에, 모든권한을 가진 root계정이없다.

즉, root 없는 디비가 되버렸다. 

 

결국 db를 완전히 삭제하는 방법을택했다.

 

혹여나 config파일들에서 권한을 수정할수있지 않을까해서 찾아봤는데, 찾진못했다.

 

그과정에서 디비도 완전 깔끔히 삭제해줘야 문제가없었고, 여기서도 열심히 구글링해서

깔끔히 삭제하고 재설치를 해서 복구를 완료했다.

 

아마 한번더 날아갈거같다. 그때는 에러 로그보고 구글링해봐야겠다

진짜... 무섭다..

 

Ubuntu 환경에서 mariadb 깔끔하게 삭제 하기

sudo apt-get purge mariadb-*
sudo apt autoremove #의존성 패키지 제거

dpkg -l | grep mysql # mysql키워드가 들어간 패키지 찾기
sudo apt-get purge [찾은패키지명]# 그리고 삭제하기 ex)mysql-common

sudo rm -rf /var/log/mysql
sudo rm -rf /var/log/mysql.*
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql

Ubuntu환경에 mariadb 설치 & 필수 설정

apt-get install mariadb-server

# 외부 IP에서 접속가능한 계정 만들어주기
update mysql.user SET Host='%' where Host='localhost' and User='root'; # root계정의 접속가능 IP를 wildCard로 변경
grant all privileges on *.* to 'root'@'%'; # root@% 에게 모든 권한 부여
flush privileges; # 변경사항 저장

# db종료하고 설정파일 수정 후 ubuntu에서 mariadb 재시작
vim /etc/mysql/mariadb.conf.d/50-server.cnf 에서 "bind-address = 127.0.0.1" 이부분 주석처리(외부접속허용)
service mysql restart

지금 localhost -> % 로 변경해주고있는데, 이렇게하지말고 새로운 user를 만들어서, 권한을 주고 사용하길 바랍니다.

보안도 보안이지만, 저처럼 주인잃는 디비가 되지 않도록.. root는 고유하게 냅둡시다!

 

그리고 최초에 root@localhost 는 Password가 없기때문에, 반드시 설정해주기. 그냥 UPDATE문 사용해서 바꿔주면된다.

 

mariadb 관련 명령어

service mysql status # mariadb 상태 확인
service mysql start # db 서버 실행
service mysql stop # db 서버 종료
systemctl status | start | stop mysql.service 도 동일하게 동작합니다.

 

반응형