나만의 배당주 사이트 만들기) 4-2. 배포 단계 - 로컬에 있는 DB(postgresql) 백업 후 EC2에 복원하기 (docker 사용함)

2025. 2. 14. 13:00프로젝트

이 전 글들이 궁금하다면 ?

 

0. 사이트를 만드려는 이유

https://hsjoo126.tistory.com/80

 

1-1. 프로젝트 가능성 보기

https://hsjoo126.tistory.com/81

 

pandas 와 jupyter 이용해서 테스트해보기 

https://hsjoo126.tistory.com/82

 

1-2. 기획 단계 - 디자인, 와이어 프레임, ERD 등

https://hsjoo126.tistory.com/83

 

2. 개발 단계 - 계획짜기, 구현해보기

https://hsjoo126.tistory.com/84

 

2-1. 개발 단계 - 배당지불일, 시장별 티커리스트 구하기

https://hsjoo126.tistory.com/85

 

2-2. 개발 단계 - 코드 정리

https://hsjoo126.tistory.com/86

 

2-3. 개발 단계 - 사이트에 적용하기(장고)

https://hsjoo126.tistory.com/87

 

2-4. 개발 단계 - 사이트 로딩 속도 줄이기

https://hsjoo126.tistory.com/88

 

2-5. 개발 단계 - 주식별 동적인 페이지 만들기

https://hsjoo126.tistory.com/89

 

2-6. 개발 단계 - 티커리스트 db에 저장해서 불러오기, 해결하지 못한 트러블슈팅

https://hsjoo126.tistory.com/91

 

2-7. 429에러를 해결하기위한 노력, 로직 대폭 수정하기 엉엉... 그리고 해냄...

https://hsjoo126.tistory.com/92

 

2-8. cron.py , view.py 작성하기, 디테일 잡기

https://hsjoo126.tistory.com/93

 

2-9. 개발 단계 - 주가그래프그리기(matplotlib), Non-GUI 백엔드? Agg가 뭐야!, 상세페이지 수정, 페이지네이션 등

https://hsjoo126.tistory.com/94

 

2-10. 개발 단계 - 배포를 위한 준비단계!(pip list 정리, 도커 관련, postgresql 접속하기, 트러블 슈팅 등)

https://hsjoo126.tistory.com/96

 

3. 디자인 - 잠깐 쉬어가자! 그런김에 디자인~!

https://hsjoo126.tistory.com/90

 

4-1. 배포 단계 - nginx작성 ec2 배포, http 설정

https://hsjoo126.tistory.com/97


거의 다왔다.. 싶었는데 ㅋㅋㅋㅋ 

생각해보니 데이터베이스가 존재하지 않다는 걸 깨달았다 ... 허허 

데이터를 다시 수집해도 되지만, 정말 너무너무 오래걸려서 ... 

로컬에 있는 데이터를 ec2로 붙여넣는 방법을 찾아보았다.

gpt 를 열심히 괴롭히고 시행착오를 겪으면서 정리한 방법은 다음과 같다.

 

로컬에 있는 DB(postgresql) 백업 후 EC2에 복원하기 (docker 사용함)

과정을 간단하게 설명하면 이렇게 정리할 수 있다.

 

1️⃣ 로컬) postgresql 컨테이너 안에 들어간다.

2️⃣ 로컬) 덤프파일을 만든다. (여기에 모든 데이터를 복사하는 거임)

3️⃣ 로컬) 만든 덤프파일을 컨테이너 밖에 복붙한다.

4️⃣ 로컬) 덤프파일을 ec2에 전송한다

5️⃣ ec2) ec2에 넘어온 덤프파일을 postgresql 컨테이너 안에 복붙한다

6️⃣ ec2) 덤프파일 가지고 데이터를 복원한다.

 

그럼 더 자세히 정리 ㄱㄱ


1️⃣ 로컬) postgresql 컨테이너 안에 들어간다.

데이터를 복사하려면 컨테이너 안에 들어가야 한다.

#컨테이너 접속
docker exec -it postgres-db bash

postgres-db는 컨테이너 이름임

나와는 다를 수 있으니 본인 컨테이너 이름을 확인 하고 그걸 넣자!

 

확인하는 방법? docker ps 해서 NAME 부분 확인하면 됨! 

 

 

 

2️⃣ 로컬) 덤프파일을 만든다. (여기에 모든 데이터를 복사하는 거임)

pg_dump -U 사용자이름 -d 백업할db이름 -f /tmp/backup.sql

#예시
pg_dump -U postgresql -d postgresql -f /tmp/backup.sql

명령어가 어떤 명령어인지 설명해보겠음!

  • pg_dump는 데이터베이스의 백업을 만드는 명령어
  • -U는 사용자를 지정하는 옵션, 'postgresql'은 백업을 만들기 위해 사용하는 데이터베이스 사용자 이름임
  • -d는 백업하려는 데이터베이스 이름을 지정하는 옵션, 여기서 'postgresql'은 백업하려는 데이터베이스의 이름
  • -f는 백업을 파일로 출력하겠다는 옵션
  • /tmp/backup.sql은 백업 파일을 저장할 경로 및 파일 이름

참고로 tmp는 임시 파일을 저장하는 디렉토리이고, 모든 사용자에게 쓰기 권한이 부여되어있음

그러니 그냥 저 파일 경로 그대로 써도 아무문제 없음(굳이 바꿀 필요없단 소리)

 

 

여기서 이런 궁금증이 생길 수 있음

1.  사용자 이름 뭔지 모르는데?

2. 백업할 db 이름 뭔지 모르는데? 

아는 사람들은 넘어가고 모르는 사람들은? ⬇️⬇️⬇️⬇️⬇️⬇️

더보기

1.  사용자 이름 뭔지 모르는데?

사용자 이름은 postgresql 처음 설정할 때 USER 이름 그대로 쓰면 됨!

아마 settings.py 나 .env나 그런데 적혀있겠죠...? 사람마다 설정해놓은 게 다다르니까 ... 

이건 내가 도와줄 수 없는 부분..

 

 

2. 백업할 db 이름 뭔지 모르는데? 

이걸 확인하려면 컨테이너 안에 접속해야함

#컨테이너 접속
docker exec -it postgres-db bash

#postgresql 접속
psql -U 사용자이름

 

두 가지 다 해서 접속 했다면 어떤 데이터베이스가 있는지 확인해야함

#데이터베이스 리스트 확인하기
\l

 

이런식으로 될텐데 우리가 볼 것은 Name 부분! 

총 4개의 데이터베이스를 하나씩 들어가보면서 백업하고 싶은 데이터베이스가 어떤 건지 확인하면 됨!

 

방법은? 매우 간단 

일단 psql 상태에서 다시 나와주고 

다시 접속을 할 건데 db 이름을 함께 넣어서 접속할 거임.

그리고 \dt 명령어를 통해 테이블이 있는지 없는지 확인 하면 됨

#psql 빠져나오기
\q

#데이터베이스 이름과 함께 다시 접속하기
psql -U 사용자이름 -d 데이터베이스 이름

#예시
psql -U postgres -d template0

#테이블 조회
\dt

 

이런식으로 \dt 까지 조회해서 있으면 ㅇㅎ 있네 확인- 

그리고 다음 데이터베이스 넘어가서 ㅇㅎ 여긴 없네 확인 -

이렇게 돌면서 내가 백업하고 싶은 데이터베이스 이름 기억해두면 됨!

 

사실 postgres or postgresql 둘 중 하나에 들어있겠지만 ....
나는 확실히 확인하고 싶어서 위와 같은 방법을 선택했음!

 

만약 귀찮다 ? 

그럼 그냥 psql -U 사용자이름 해서 접속한다음에  바로 \dt 쳐보셈! 

나온 테이블이 내가 계속 쓰던 테이블이다? 그럼 그게 백업할 데이터베이스인 거임

 

 

 

 

 

3️⃣ 로컬) 만든 덤프파일을 컨테이너 밖에 복붙한다.

 

우리가 만든 덤프는 postgresql 컨테이너 안에 존재하고 있음!

컨테이너 밖에 옮겨서 그 상태에서 ec2에 전송해야함

 

하는 방법은 간단함 

컨테이너 밖을 빠져나와서 (나오는 명령어는 exit)

터미널에 다음과 같이 치면 됨.

#컨테이너 빠져나와서
docker cp postgres-db:/tmp/backup.sql .

 

그럼 이런식으로 새로 생길 것임!



 

 

 

4️⃣ 로컬) 덤프파일을 ec2에 전송한다

여기가 조금! 복잡한데, 

이걸 하려면

1. ec2 인스턴스 만들 때 썼던 pem 키 위치

2. backup.sql 위치

3. 인스턴스에 나와있는 퍼블릭 IPv4 DNS 주소

를 알아야함.

#ec2로 백업한 파일 전송하기
scp -i pem키위치 backup.sql위치 ubuntu@퍼블릭 IPv4 DNS 주소 :/tmp/

#예시
scp -i /Users/Han/Downloads/server-key.pem /Users/Han/Desktop/stocks/dividend_stock/backup.sql ubuntu@어쩌구저쩌구.amazonaws.com:/tmp/

 

음 1,2번 같은 경우 컴퓨터에서 절대경로 복사붙여넣기 하는게 제일 빠름!

 

pem 키 & backup.sql 둘다 컴퓨터에서 어딨는지 찾은 다음에 

(mac기준) 우클릭 -> 정보가져오기 -> 위치 부분 복사 

붙여넣기 하면 됨

 

그리고 퍼블릭 IPv4 DNS 주소는 인스턴스 들어오면

사진에 빨간 박스 보이시나요 ? 저거 복붙하면 됨!!

 

지금은 삭제된 인스턴스입니당 ㅋㅋㅋㅋ

 

 

자 이렇게 해서 경로도 다 잘 넣어주고, 엔터를 땅치면! ec2로 전송 끄읕 ~

 

아무 오류없이 잘 됐다면 로컬에서 할 건 끝났음! (오류 떴다면 ... gpt를 괴롭히세요..)

다시 ec2로 넘어옵시다! 

 

 

 

 

 

5️⃣ ec2) ec2에 넘어온 덤프파일을 postgresql 컨테이너 안에 복붙한다

ec2로 넘어온 덤프파일은 도커 밖에 있기 때문에

컨테이너 안에 복붙해줘야 함!

#잘넘어왔는지 확인하기
ls /tmp #backup.sql 뜨면 잘 넘어온것!

#docker postgresql컨테이너 안에 복붙
sudo docker cp /tmp/backup.sql postgres-db:/tmp/backup.sql

 

 

어려운 명령어는 아니라고 생각해서 설명은 패스!

잘 들어왔는지 확인 해봐야겠죠 ?

 

 

컨테이너 들어간 다음에 ls로 확인해봅시다!

#컨테이너 접속하기
sudo docker exec -it postgres-db bash

#잘 들어갔는지 확인하기
ls /tmp

 

 

 

마찬가지로 backup.sql뜨면 잘 들어간 것! 

 

 

 

 

 

 

6️⃣ ec2) 덤프파일 가지고 데이터를 복원한다.

여기까지 오신 여러분 고생하셨습니다 ㅋㅋㅋㅋ

이제 데이터를 복원할 차례에요!

 

컨테이너 접속하시고! (컨테이너만 접속해야합니다 psql까지 가면 안 돼요!)

백업할 때 사용했던 사용자이름, 데이터베이스이름 기억하시죠 ? 

그거 사용해서 다음 명령어를 입력하시면 됩니다!

#복원하는 명령어(컨테이너 들어와서 쳐야됨)
psql -U 사용자이름 -d 데이터베이스이름 -f /tmp/backup.sql

#예시
psql -U postgresql -d postgresql -f /tmp/backup.sql

 

잘 됐다면 뭐가 쫘라라락 뜨면서 복원을 했을 것이고! 

안 됐다면 .... 어... 많은 이유가 있을 것 .... gpt ㄱㄱㄱㄱ 

 


휴 - 

원래는 이거 포함 배포 마무리 글을 올리려고 했는데 .. 아무래도 글이 길어져서! 

마무리 글은 다음에 찾아오겠습니다 하핳

그럼 다음글에서 만나유 여러분!