본문 바로가기
Archive

결국한번 더터져버린 db & 삽질과 세팅의 모든것

by livemehere 2022. 4. 22.

정말 미칠노릇이지만, 이악물고 이전과같이 복구를 진행했고, 분명히 이건 sequelize에서 연결하는 부분에서 문제라고생각했다.

왜냐하면 이제껏 express, mariadb를 사용해오면서 단한번도 이런적이없었는데, sequelize를 도입한 이번에만 발생한 문제이기 때문에다.

Sequelize 문제

sequelize에서는 db와 sync하는 부분에서 스키마,테이블,컬럼들을 분석하고 차이점이있다면 반영하기위해서 db를 수정한다.

너무 의심스러운 기능이다.

개발 커뮤니티에서 이부분에대한 문제를 겪은 사람이있는지 찾아봤고, 그 유명한 제로초님께서 답변해주셨다.

sequelize에서는 sync하는 부분이 아래와같다. (alter는 그냥 optional이니 무시해도된다)

await sequelize.sync({ alter: false });

이부분은 연결하는 부분이 아니다.

이부분이 연결하는 부분인줄알았는데 다시 공식문서를 보니, 연결부가아니라, 그냥 진짜 모델링한 테이블들을 동기화시켜주는 부분이다.

 

이부분이 가장의심스러웠고, 제로초님께서 sequelize에서 sync가 버그가 있다고 했다.(오픈소스참여할기횐가?..)

그래서 우선은 모델이 변할때만 실행해주고, 평상시에는 실행하지 않도록 주석처리해놓았다.

또터지면 ...그때는... typeORM으로 갈아탈테야

mariadb 삭제, 재설치, 재설정 의 반복

코드도 수정했겠다.. 이전처럼 db를 재설치하는 과정을 밟았는데, 왜 workbench에서 접속이안되며, 서버도 잘실행되는데 root@localhost에 NO_PASSWORD_ERROR 이뜨는거지?

 

발생한 에러

Error: Access denied for user 'root'@'localhost'
code: 'ER_ACCESS_DENIED_NO_PASSWORD_ERROR', 
errno: 1698, 
sqlState:'28000', 
sqlMessage: "Access denied for user 'root'@'localhost'", 
sql: undefined

 

이번엔

root@localhost 잘남겨두고

root@% 를 새로만들어서 사용했다.

여기서 local환경은 EC2 이다.

그런데 ec2에서 서버를 실행할때는, no password 에러가나고, 내컴퓨터에서는 root@% 로 접속했을때 잘된다.

 

그럼 ec2환경 문제구나 싶었다.

결국 문제는, ubuntu 환경에서의 root계정의 auth_plugin이 달라서 발생하는 문제라한다.

그래서 간단히 새로운 계정을 만들고, 권한을주고 사용하니 해결되었다.

https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost

 

앞으로 root 계정은 무슨일이 있어도 건들지 않는걸로... 그냥 계정 새로파서해!!!!!!!!

mariadb 새로운 계정 만들기 & 권한부여 & 저장

CREATE USER '새계정'@'localhost' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON *.* TO '새계정'@'localhost';
FLUSH PRIVILEGES;

정리

  1. mariadb, mysql 사용시 root 계정은 사용하지 말고, 새로운 계정을 만들어서 사용하는 것이 좋다.
  2. 계정을 만들때는, 계정@localhost, 계정@% 두개를 만들어주어, 각각 서버에서, workbench에서 접속하도록 해주면 된다.
  3. 모든 권한을 새로만든 계정 두개에 부여하고 개발한다 (권한범위는 알아서)
  4. mariadb는 접속할수있는 IP가 127.0.0.1 로 바인딩되어있기때문에, 주석처리나 제거해줌으로서 외부접속을 허용 해줘야한다.
  5. + sequelize를 사용한다면 sync옵션은 아직 버그가있으니, 모델 정의가 수정될때만 사용하기
반응형