# 데이터베이스 동기화 가이드 ## 개요 이 가이드는 서버와 로컬 개발 환경 간 데이터베이스를 동기화하는 방법을 설명합니다. - 서버 내 계정 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:/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