• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

백엔드 MySQL에서 Drop Database 후 DB 생성 시 table이 생성되지 않습니다!

24.02.05 13:41 작성 24.02.05 13:44 수정 조회수 307

0

안녕하세요 제로초님!
AWS에 배포하기 및 카카오톡 공유하기 강의까지 끝마친 수강생 입니다!

사전에 back 폴더 이미지 모델에서 이미지 문자열 길이를 수정하였습니다.
백엔드 루트 MySQL에서 react-nodebird DB 삭제 후
react-nodebird DB를 다시 만들어도 table이 재생성 되지 않아 질문 드립니다!

DB를 삭제한 이유는 에러 로그 확인 시 아래 문제가 발생했기 때문입니다.
이상하게도 두 에러 메시지 모두 DB와 Table이 존재하는 상태일 때 발생하였습니다.
Error: Unknown database 'react-nodebird'
DatabaseError [SequelizeDatabaseError]: Table 'react-nodebird.테이블명'

db2.PNG

캡처.PNG


문제를 해결하기 위해 제로초님의 섹션6 프론트 서버 배포하기 강의 14:00 와
똑같은 방법으로 해결하려 하였습니다. 그러나 해결되지 않았습니다.

react-nodebird DB를 지우기 전 테이블 상태
테이블.PNG


DROP DATABASE 후 CREATE DATABASE react-nodebird DB 생성.
테이블1.PNG


백엔드 루트 경로에 npx sequelize db:create 명령어 입력 및 성공
테이블4.PNG


똑같이 테이블이 생성되지 않는 문제가 발생한 다른 수강생 분의 질문 글
https://www.inflearn.com/course/lecture?courseSlug=%EB%85%B8%EB%93%9C%EB%B2%84%EB%93%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%A6%AC%EB%89%B4%EC%96%BC&unitId=49016&category=questionDetail&tab=community&q=685995

문제를 해결하기 위해 다른 방법을 찾던 중 같은 문제가 발생한 분을 찾았습니다!
위 글에서 제로초 님께서는 테이블만 따로 재생성 하라고 하셨습니다.

구글링 해보니 table을 만들기 위해서는 각 컬럼을 정의하는
스키마를 작성하여 table을 만드는 방법이 많았습니다.
강의에서는 나오지 않은 방법이라 함부로 시도하진 않았습니다...


어떻게 하면 다시 table만 따로 생성할 수 있을까요?
질문 글 읽어주셔서 감사합니다!

답변 4

·

답변을 작성해보세요.

0

이가은님의 프로필

이가은

질문자

2024.02.07

이미지 모델과 사용자 모델의 collate을 utf8mb4_general_ci로 변경하고,
sudo git pull 후 우분투 백엔드 경로에서 npx sequelize db:create 명령어 입력 후,
백엔드 start 스크립트인 node app을 실행하여 테이블 생성에 성공하였습니다!
(CREATE DATABASE react-nodebird;는 하지 않았습니다.)


백엔드 start 스크립트를 pm2 start app.js로 되돌린 후
테이블이 생성에 성공했으므로 react-nodebird DB의 Table이 리셋되지 않도록
back/app.js의 force를 false로 바꿨습니다.
문제를 해결할 수 있게 도와주셔서 감사합니다 제로초님!

npx sequelize db:create 명령어를 강의와 같이 루트 서버에서 진행하지 않고
우분투 백엔드 서버에서 진행하라고 말씀하신 이유가 있을까요?
문제는 해결했지만 똑같은 실수를 저지르지 않도록 확실하게 기억하고 싶어서요!!

image
image
image

0

이가은님의 프로필

이가은

질문자

2024.02.05

질문 글이 길어진 것 같아 짧게 다시 정리하자면 아래와 같습니다!

본문에 말씀드린 것과 같이 image 모델의 코드를 수정하였습니다.
수정 후 sudo git pull 과정을 거쳤습니다.
(back폴더 image.js 모델에서 이미지 경로 소스 문자열이 짧아서 늘렸습니다.)


모델에 변경 사항이 있다면 MySQL 서버에서 DB를 지우고
다시 생성해야 해야만 변경 사항이 적용된다고 생각하였습니다!

그래서 백엔드 root에서 MySQL에 접속하여 Drop DB 후에 Create DB를 진행한 것입니다.


DB를 지운 후 다시 생성하는 방법은 제로초님의 NodeBird 강의 중
섹션6 프론트 서버 배포하기 14:00 부분과 똑같이 진행하였습니다.
(혹시 몰라서 FLUSH PRIVILEGES; 명령어도 추가로 해주었습니다.)

저는 DB만 지웠다가 생성하였으며, Table은 지우지 않았습니다.
(강의에서는 DB를 지워도 Table이 지워지진 않았지만
저의 경우 DB를 지우면서 Table도 같이 지워진 것은 아닐까 추측해봅니다.)


react-nodebird DB를 재생성한 다음,
use react-nodebird로 해당 DB를 선택한 후
show tables 명령어로 table을 확인하였으나 생성되지 않았습니다.



그래서 table 생성에 대한 질문 글을 올렸고,
이에 제로초님 께서는 아래와 같이 table을 생성하는 방법을 제시해주셨습니다.

1. back/app.js 에서 sequelize의 force: true 소스 코드를 추가하기
2. 백엔드 서버 재시작 후 바로 sudo npx pm2 monit 하기


그러나 1번, 2번 방법을 실행했음에도 여전히
react-nodebird 테이블은 생성되지 않았습니다.
MySQL에 접속하여 react-nodebird DB의 show tables을 확인했을 때는
table이 비어있었습니다. (Empty set (0.00 sec))


위와 같은 방법으로도 table이 생성되지 않는다면
어떤 방법을 사용해야 하는지 질문 드린 것입니다!

DB를 지우면 내부 테이블은 같이 지워집니다. DB가 테이블의 상위 그룹입니다. 앞으로는 모델 수정 시 sql을 통해 테이블을 수정하시길 바랍니다. DB나 테이블을 지우지 마시고요.

테이블을 생성하는 건 이 방법밖에 없습니다. 지금 이 방법으로 테이블이 생성되지 않는 건 매우 이상합니다. 뭔가 이상하게 하고있다고밖에 추측되지 않습니다.

궁금한 것은 처음에는 그럼 서버에서 테이블을 어떻게 생성하셨나요? 그 때는 force: true가 있었나요?

서버에서 sudo npx sequelize db:create 치면 이미 react-nodebird 존재한다고 뜨나요?

이가은님의 프로필

이가은

질문자

2024.02.06

질문 글이 계속 길어짐에도 답변해주셔서 감사합니다 ㅜㅜ

루트 서버에서 테이블을 생성할 때는
mysql에 접속하여 create database react-nodebird를 한 후,
루트 서버로 돌아와 npx sequelize db:create 을 입력하면
react-nodebird DB가 생성되었다고 합니다.
(mysql에 접속했을 때 create table 명령어는 사용하지 않았습니다!)

여기서 매우 이상한 건 중복으로 명령어를 입력해도
이미 react-nodebird DB가 존재한다는 메시지는 뜨지 않는다는 것입니다.

image
force: true 가 없었음에도 테이블은 생성되었습니다.
sudo su로 루트 서버로 간 후, mysql에 접속했을 때 순서대로
use react-nodebird; => show tables; 했을 때는 테이블이 존재했습니다!

++++
MySQL 워크벤치 접속 문제는 해결했습니다!
접속이 되지 않는 MySQL 커넥션에서 우클릭 후
Edit Connection에서 비밀번호를 입력하여 Test Connection을 눌렀더니 접속 되었습니다.
기존에 만들어두었던 테이블들도 삭제되지 않고 그대로 있습니다!
테이블은 루트 서버에서 npx sequelize db:create를 입력해도 생성되지 않았습니다!

sudo su를 입력하지 말고 해보세요

이가은님의 프로필

이가은

질문자

2024.02.07

제로초님께서 말씀하신 것처럼 sudo su를 하지 않고
백엔드 우분투 서버에서 sudo npx sequelize db:create 를 입력하였습니다.
답글이 많이 길기에 결론부터 말씀드리면 에러를 해결하지 못했습니다!

image
(이상하게도 여러 번 입력해도 에러가 없습니다...)
image

노드버드 섹션6 - 우분투에 MySQL 설치하기 강의를 참고하여
back/package.json의 start 스크립트를 pm2 start app.js에서 node app으로 수정한 후 sudo git pull 했습니다.
start 스크립트를 바꾼 이유는 pm2 start app.js로 start, 리로드로 백엔드를 실행하면
본문과 똑같이 테이블이 없다고 에러가 나기 때문입니다.


백엔드 우분투 서버에서 아래와 같이 sudo npm start 명령어를 실행하였습니다.
DROP TABLE IF EXISTS(테이블이 존재하는 경우) 메시지가 터미널에 뜨고,
CREATE TABLE IF NOT EXISTS(테이블이 존재하지 않는 경우 작성) 도중 에러가 발생합니다.
(이상하게도 users 테이블이 존재하는 경우의 코드가 두 번 뜹니다.)

image

시퀄라이즈 데이터베이스 오류가 나타났습니다. 메시지를 해석하면 아래와 같습니다.
COLLATION 'utf8mb3_general_ci' is not valid for CHARACTER SET 'utf8mb4'
COLATION 'utf8mb3_general_ci'가 문자 집합 'utf8mb4'에 대해 유효하지 않습니다.

이 에러는 루트 서버에서 npx sequelize db:create 후 npm start를 진행했을 때도 똑같이 나타납니다.
image

아래는 가장 의심되는 코드입니다.
전체 코드 중에서 utf-8(utf8mb3)로 작성된 코드 부분은 front/pages/_app.js 파일의 meta charSet 부분입니다.

// 노드버드 컴포넌트(사용자 정의 태그)
const NodeBird = ({ Component }) => {
  return (
    <>
      <Head>
        <meta charSet="utf-8" />
        <title>NodeBird</title>
      </Head>
      <Component />
    </>
  )
};


그리고 utf8mb4이 적힌 코드는 아래 사진과 같습니다.
노드버드 강의에서는 hashtag 모델, post 모델만 utf8mb4 를 해주었으나
저는 user 모델과 image 모델에도 utf8 대신 utf8mb4를 사용하였습니다.
utf8mb4 설정을 해주면 MySQL에서 한글, 이모티콘을 사용 가능하게 해주기 때문입니다.
image

위와 같은 방법을 썼음에도 테이블은 생성되지 않았습니다.
MySQL이 꼬였음을 감안하여 서버에서 MySQL을 완전히 지우고 다시 진행하였음에도 마찬가지였습니다!
테이블이 생성되지 않았기에 force는 true인 상태입니다.

그러면 밑에 collate도 utf8mb4_general_ci로 변경하셔야 합니다.

0

이가은님의 프로필

이가은

질문자

2024.02.05

제로초님의 답변
지금 app.js 소스 코드에 force: true 되어있는 게 맞나요?
sequelize.sync({ force: true }) 되어있어야 테이블을 생성합니다.
생성 후에는 force: false로 바꿔주어야 테이블이 리셋되지 않습니다.


답변 감사합니다!
노드버드 섹션6 강의까지는 sequelize.sync({ force: true }) 코드가 없었으나
제로초님의 방안을 통해 force를 true로 설정하고, 추가로 alter도 true로 설정하였습니다.
sudo git pull 작업은 꼭 진행하였습니다.


이럼에도 table이 안 생겨서 다시 sudo npx pm2 kill 후
sudo npm start → sudo npx pm2 reload all 하고,
react-nodebird DB를 Drop 한 후 Create 해보아도 table이 안 생깁니다...



비슷한 문제가 생기신 다른 수강생 분은 back/config/config.js의 database 부분을
'react-nodebird' 로 바꾸니 해결이 되셨습니다.
그러나 저의 경우 원래부터 database: 'react-nodebird' 로 되어있었습니다.
강의 진행에서 한 번도 나지 않던 문제라 당황스럽습니다...
혹시 table을 생성하는 다른 방법을 사용하는 것이 좋을까요?
긴 글 읽어주셔서 감사합니다...



참고한 제로초님의 노드버드 ch7 깃허브 링크
여기는 sequelize.sync({ force: true }) 코드가 없습니다.
https://github.com/ZeroCho/react-nodebird/blob/master/ch7/back/app.js

참고한 force: true 관련 글
위 글을 참고하여 force true을 설정하였습니다.
table 생성을 성공한다면 false로 바꿀 예정입니다.
https://noonestaysthesame.tistory.com/entry/Nodejs-Sequelize

// 서버 실행 시 데이터베이스 시퀄라이즈 연결(수정 전)
db.sequelize.sync()
  .then(() => {
    console.log('db 연결 성공');
  })
  .catch(console.error);



// 서버 실행 시 데이터베이스 시퀄라이즈 연결(수정 후)
/*  force: true는 테이블이 존재하지 않을 경우 테이블을 생성, 존재할 경우 테이블을 삭제하기 */
db.sequelize.sync({ force: true })
  .then(() => {
    console.log('db 연결 성공');
  })
  .catch(console.error);


++++
image
서버 배포 후 MySQL 워크벤치에 접속 되지 않습니다. 원래 그런 건가요?
MySQL 윈도우 서비스를 실행한 상태든 중지한 상태든
root localhost:3306 커넥션 클릭 시 Schemas 부분에 No connection established 이 뜹니다.
혹시 본문 문제와 연관이 있을까 추가로 작성해봅니다!

일단 mysql을 서버에 설치하신 것 맞죠? 그러면 자신의 컴퓨터에서는 당연히 localhost로 접속하면 서버 db에는 접속이 안됩니다. 컴퓨터가 다르니까요. 그런데 적어도 자신의 컴퓨터 db에는 접근이 돼야하는데요. 서버 실습 과정에서 실수로 명령어를 자신의 컴퓨터에 쳐서 설정이 꼬인게 아닌가 싶습니다.

서버쪽에서는 서버 재시작 후 바로 sudo npx pm2 monit을 입력하면 시퀄라이즈에서 테이블 생성하는 CREATE TABLE IF NOT EXIST 명령어가 좌르륵 뜹니다. 안 뜨면 뭔가 이상한 겁니다.

이가은님의 프로필

이가은

질문자

2024.02.05

MySQL은 제대로 AWS 우분투 back 서버에 설치했습니다!
저의 경우 이전 질문 글처럼 MySQL 설치 시 문제가 발생한 적이 있어서
깨끗하게 지운 후 다시 MySQL 서버에 설치한 상황입니다.

혹시 아래와 같이 꼬인 설정을 해결하려면 서버에서 MySQL을 완전히 지우고
다시 재설치를 진행하는 방법 밖엔 없을까요? 답변 해주셔서 감사합니다.

image

이해가 안 되는데 워크벤치로 뭘 보려고 하시는 건가요?

워크벤치로 서버 mysql에 연결하신 게 아니지 않나요? 서버가 아니라 자신의 컴퓨터 mysql에 연결이 안 되는 것인데 왜 서버의 mysql을 지우나요?

애초에 워크벤치로 서버 mysql에 연결하신 적이 없습니다.

이가은님의 프로필

이가은

질문자

2024.02.05

답글을 더 달 수 없어서 맨 위쪽에 질문 글을 정리하여 답글을 달았습니다!
그쪽을 봐주시면 감사하겠습니다!

+++
MySQL 워크벤치 부분을 확인한 이유는 도메인을 연결하고
코드의 프론트 포트 3000, 백엔드 포트 3065을
각각 도메인으로 수정한 뒤에 사진과 같은 에러가 발생해서
혹시 이 문제의 원인이 아닐까 추측한 것 뿐입니다!
사실 MySQL 워크벤치에서 에러가 발생해도 배포한 사이트는
잘 작동되었기에 크게 문제 삼지 않았습니다.

현재는 서버 쪽의 MySQL은 삭제하지 않았습니다.

0

테이블은 백엔드 서버를 재시작하면 sequelize의 force: true로 인해 알아서 다시 생깁니다.

이가은님의 프로필

이가은

질문자

2024.02.05

질문 글 읽어주셔서 감사합니다!

sudo npx pm2 reload all 명령어로 우분투 백엔드 서버를 재시작 하였으나
우분투 백루트에서 mysql react-nodebird DB의 table을 확인해도
에러 로그에서는 여전히 테이블이 없다고 뜹니다.

image(monit에서는 posts 테이블이, 에러 로그에서는 users 테이블이 없다고 뜹니다.)


sudo npx pm2 kill 후 아래 명령어를 순서대로 재입력해도 마찬가지였습니다!
질문 글이 많이 길어져 죄송합니다..
MySQL 서비스는 실행 중입니다!

image

지금 app.js 소스 코드에 force: true 되어있는게 맞나요?

sequelize.sync({ force: true }) 되어있어야 테이블을 생성합니다. 생성 후에는 force: false로 바꿔주어야 테이블이 리셋되지 않고요.