208 lines
5.4 KiB
Markdown
208 lines
5.4 KiB
Markdown
|
|
# 데이터베이스 동기화 가이드
|
||
|
|
|
||
|
|
## 개요
|
||
|
|
|
||
|
|
이 가이드는 서버와 로컬 개발 환경 간 데이터베이스를 동기화하는 방법을 설명합니다.
|
||
|
|
|
||
|
|
- 서버 내 계정 pro에서 가져오는 방법 : scp pro@114.203.209.83:/home/pro/chandj_backup.sql .\chandj_backup.sql
|
||
|
|
- 서버에 백업을 받은 상태로 추정한 후 처리한다.
|
||
|
|
|
||
|
|
- **로컬 → 서버**: `mysql_sync.sh` 사용 (테이블 단위 동기화)
|
||
|
|
- **서버 → 로컬**: 이 문서의 방법 사용 (전체 DB 다운로드)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 서버에서 로컬로 DB 다운로드
|
||
|
|
|
||
|
|
### 방법 1: 서버에서 덤프 생성 후 SFTP로 다운로드 (권장)
|
||
|
|
|
||
|
|
#### 1단계: 서버에서 덤프 파일 생성
|
||
|
|
|
||
|
|
서버에 SSH 접속 후:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 서버의 .env 파일 확인
|
||
|
|
cat /var/www/sales/.env
|
||
|
|
# 또는
|
||
|
|
cat /home/webservice/sales/.env
|
||
|
|
|
||
|
|
# .env에서 확인한 DB 사용자로 덤프 생성
|
||
|
|
# 예시 1: root 사용자 (비밀번호 입력 필요)
|
||
|
|
mysqldump -u root -p chandj > /tmp/chandj_backup.sql
|
||
|
|
|
||
|
|
# 예시 2: codebridge 사용자
|
||
|
|
mysqldump -u codebridge -p chandj > /tmp/chandj_backup.sql
|
||
|
|
|
||
|
|
# 예시 3: 127.0.0.1 사용 (소켓 문제 해결)
|
||
|
|
mysqldump -h 127.0.0.1 -u root -p chandj > /tmp/chandj_backup.sql
|
||
|
|
|
||
|
|
# 예시 4: 비밀번호를 환경 변수로 사용 (.env에 비밀번호가 있을 경우)
|
||
|
|
MYSQL_PWD='[비밀번호]' mysqldump -u root chandj > /tmp/chandj_backup.sql
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 2단계: VSCode SFTP로 다운로드
|
||
|
|
|
||
|
|
1. VSCode에서 `Ctrl+Shift+P` → `SFTP: Download` 실행
|
||
|
|
2. 경로 입력: `/tmp/chandj_backup.sql`
|
||
|
|
3. 다운로드 위치 선택
|
||
|
|
|
||
|
|
또는 PowerShell에서:
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
scp pro@114.203.209.83:/tmp/chandj_backup.sql .\chandj_backup.sql
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 3단계: 로컬 Docker DB에 적용
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Docker 컨테이너에 SQL 파일 복사
|
||
|
|
docker cp chandj_backup.sql sam-mysql-1:/tmp/
|
||
|
|
|
||
|
|
# Docker 컨테이너에서 SQL 파일 실행
|
||
|
|
docker exec -i sam-mysql-1 mysql -uroot -proot chandj < /tmp/chandj_backup.sql
|
||
|
|
|
||
|
|
# 또는 직접 파이프 사용
|
||
|
|
cat chandj_backup.sql | docker exec -i sam-mysql-1 mysql -uroot -proot chandj
|
||
|
|
```
|
||
|
|
|
||
|
|
### 방법 2: PHP 스크립트 사용
|
||
|
|
|
||
|
|
#### 1단계: `dump_db.php` 업로드
|
||
|
|
|
||
|
|
VSCode SFTP로 `dump_db.php`를 서버에 업로드:
|
||
|
|
- 업로드 위치: `/var/www/sales/` 또는 `/home/webservice/sales/`
|
||
|
|
|
||
|
|
#### 2단계: 서버에서 스크립트 실행
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd /var/www/sales
|
||
|
|
php dump_db.php
|
||
|
|
```
|
||
|
|
|
||
|
|
스크립트가 `.env` 파일을 읽어서 자동으로 덤프를 생성합니다.
|
||
|
|
|
||
|
|
#### 3단계: 덤프 파일 다운로드 및 적용
|
||
|
|
|
||
|
|
방법 1의 2-3단계와 동일합니다.
|
||
|
|
|
||
|
|
### 방법 3: PowerShell 스크립트 사용 (Windows)
|
||
|
|
|
||
|
|
#### 1단계: `download_db.ps1` 실행
|
||
|
|
|
||
|
|
```powershell
|
||
|
|
.\download_db.ps1
|
||
|
|
```
|
||
|
|
|
||
|
|
**주의**: 비밀번호 입력이 필요한 경우 수동으로 서버에서 실행해야 합니다.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 로컬에서 서버로 DB 업로드
|
||
|
|
|
||
|
|
### `mysql_sync.sh` 사용
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 단일 테이블 동기화
|
||
|
|
./mysql_sync.sh table_name
|
||
|
|
|
||
|
|
# 여러 테이블 동기화
|
||
|
|
./mysql_sync.sh table1,table2,table3
|
||
|
|
```
|
||
|
|
|
||
|
|
**동작 방식**:
|
||
|
|
1. 로컬 Docker에서 테이블 덤프 생성
|
||
|
|
2. 서버로 SQL 파일 전송 (SCP)
|
||
|
|
3. 서버 DB에 적용
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 문제 해결
|
||
|
|
|
||
|
|
### 문제 1: "Access denied for user 'root'@'dev-codebridgex'"
|
||
|
|
|
||
|
|
**원인**: MySQL root 사용자가 해당 호스트에서 접근 권한이 없거나, MySQL 설정 파일의 호스트 바인딩 문제
|
||
|
|
|
||
|
|
**해결**:
|
||
|
|
1. 서버의 `.env` 파일에서 실제 DB 사용자 확인
|
||
|
|
2. 해당 사용자로 mysqldump 실행
|
||
|
|
3. 또는 `127.0.0.1` 사용: `mysqldump -h 127.0.0.1 -u root -p chandj`
|
||
|
|
4. **근본 해결**: `my.cnf` 파일에서 `bind-address = localhost` 설정 (문제 4 참조)
|
||
|
|
|
||
|
|
### 문제 2: "No such file or directory" (PHP 연결 시)
|
||
|
|
|
||
|
|
**원인**: MySQL 소켓 파일 경로 문제
|
||
|
|
|
||
|
|
**해결**:
|
||
|
|
- `mysqldump`는 PHP 연결과 무관하게 작동하므로 직접 실행
|
||
|
|
- 또는 `-h 127.0.0.1` 옵션 사용
|
||
|
|
|
||
|
|
### 문제 3: 비밀번호 입력 프롬프트
|
||
|
|
|
||
|
|
**해결**:
|
||
|
|
- `.env` 파일에서 `DB_PASS` 확인
|
||
|
|
- 환경 변수 사용: `MYSQL_PWD='비밀번호' mysqldump -u root chandj`
|
||
|
|
|
||
|
|
### 문제 4: "Access denied" 오류가 계속 발생하는 경우
|
||
|
|
|
||
|
|
**원인**: MySQL 설정 파일(`my.cnf`)에서 호스트 바인딩 문제
|
||
|
|
|
||
|
|
**해결**: 서버의 `my.cnf` 파일에서 `bind-address`를 `localhost`로 설정
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# my.cnf 파일 위치 확인 (일반적으로 다음 중 하나)
|
||
|
|
# /etc/mysql/my.cnf
|
||
|
|
# /etc/my.cnf
|
||
|
|
# ~/.my.cnf
|
||
|
|
|
||
|
|
# my.cnf 파일 편집
|
||
|
|
sudo nano /etc/mysql/my.cnf
|
||
|
|
# 또는
|
||
|
|
sudo nano /etc/my.cnf
|
||
|
|
|
||
|
|
# 다음 설정 추가 또는 수정
|
||
|
|
[mysqld]
|
||
|
|
bind-address = 127.0.0.1
|
||
|
|
# 또는
|
||
|
|
bind-address = localhost
|
||
|
|
|
||
|
|
# MySQL 서비스 재시작
|
||
|
|
sudo systemctl restart mysql
|
||
|
|
# 또는
|
||
|
|
sudo service mysql restart
|
||
|
|
```
|
||
|
|
|
||
|
|
**참고**: `bind-address = 127.0.0.1` 또는 `bind-address = localhost`로 설정하면 로컬 호스트에서만 연결을 허용합니다. 이 설정 후 `mysqldump -u root -p chandj` 명령이 정상 작동합니다.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 서버 정보
|
||
|
|
|
||
|
|
- **서버 주소**: `114.203.209.83`
|
||
|
|
- **SSH 사용자**: `pro`
|
||
|
|
- **DB 이름**: `chandj`
|
||
|
|
- **서버 DB 경로**: `/var/www/sales/.env` 또는 `/home/webservice/sales/.env`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 빠른 참조
|
||
|
|
|
||
|
|
### 서버에서 덤프 생성
|
||
|
|
```bash
|
||
|
|
mysqldump -h 127.0.0.1 -u root -p chandj > /tmp/chandj_backup.sql
|
||
|
|
```
|
||
|
|
|
||
|
|
### 로컬로 다운로드 (PowerShell)
|
||
|
|
```powershell
|
||
|
|
scp pro@114.203.209.83:/tmp/chandj_backup.sql .\chandj_backup.sql
|
||
|
|
```
|
||
|
|
|
||
|
|
### 로컬 Docker에 적용
|
||
|
|
```bash
|
||
|
|
cat chandj_backup.sql | docker exec -i sam-mysql-1 mysql -uroot -proot chandj
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**마지막 업데이트**: 2025-01-06
|
||
|
|
|