가상머신으로 DB이전하기
가상머신으로 DB이전하기 — #개발자의도구들 #가상머신DB #DB이전 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하...
#DevOps/cloudOps#Naver Blog
#개발자의도구들 #가상머신DB #DB이전
AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다
\* 현재 Spring x 프로젝트를 진행하고 있습니다. 전체 목차를 보시려면 여기를 눌러주세요.
\* Devops stack: 여기
\* 리눅스 기본기: 여기
상황
윈도우에서 서버 개발을 진행하며 윈도우 내부의 maria DB를 사용 중이다.
- 이를 VM 노드로 이전하고 싶다.
사용 DB: MaraiDB
서버를 온전하게 돌리려면 DB와 커넥션이 올바르게 되어야한다. 이때 테이블이 올바르게 설정되어야 오류가 없이 잘 돌아간다.
그렇게 하려면 VM DB 서버내에서 Create 문을 새롭게 작성해서 테이블을 생성해야하는데 너무 번거롭다. 이를 빠르게 해결할 수 있는 솔루션을 찾아보자.
솔루션
Github를 이용하면 편하게 테이블들을 생성할 수 잇다.
- Table Create 명령어를 저장한다.
- VM에서 이를 내려받고 돌린다.
github repository 구조
아무래도 프로젝트별, table 별로 개별 저장하는 구조가 편리할 것 같다.
db-schema/
├── README.md # 프로젝트 설명
├── init/ # 초기 스키마 (최초 DB 생성 시 적용)
│ ├── 001_create_users.sql
│ ├── 002_create_posts.sql
│ └── ...
├── migrations/ # 점진적 변경 (ALTER, 추가 테이블 등)
│ ├── 2025-09-20_add_index_users.sql
│ ├── 2025-09-25_add_comments_table.sql
│ └── ...
└── scripts/ # 적용 스크립트 (자동 실행용)
├── apply.sh # VM에서 실행하면 init/migrations 순서대로 적용
└── rollback.sh # 필요시 롤백용
| #!/bin/bashDB\_HOST=localhostDB\_USER=rootDB\_PASS=rootpasswordDB\_NAME=myapp# init 디렉토리 스크립트 실행for file in init/\.sql; do echo "Applying $file..." mysql -h $DB\_HOST -u $DB\_USER -p$DB\_PASS $DB\_NAME < $filedone# migrations 디렉토리 스크립트 실행for file in migrations/\.sql; do echo "Applying $file..." mysql -h $DB\_HOST -u $DB\_USER -p$DB\_PASS $DB\_NAME < $filedone |
|---|
스크립트도 미리 저장해두면 편리하게 실행 가능하다.
MariaDB Create Query 추출
기존 사용하던 테이블 구조에 대한 쿼리를 추룰하려면 아래 명령어를 입력한다.
show create table <table_name>;
vm에 DB 설치하기 (알면 Skip)
Ubuntu
sudo apt update
# MariaDB 서버 설치
sudo apt install -y mariadb-server
# 서비스 실행 및 부팅시 자동시작
$ sudo systemctl start mariddb
$ sudo systemctl enable mariadb
# 상태 확인
$ systemctl status mariadb
✅
● mariadb.service - MariaDB 10.11.13 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: enabled)
Active: active (running) since Fri 2025-09-19 07:45:22 UTC; 1min 12s ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 2596 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 10 (limit: 30074)
Memory: 78.9M (peak: 81.8M)
CPU: 837ms
CGroup: /system.slice/mariadb.service
└─2596 /usr/sbin/mariadbd
Enter current password for root
1. root 계정 현재 비밀번호 입력
2. Switch to unix_socket authentication [Y/n] → n
root 인증을 OS 계정 기반(unix_socket)으로 바꿀지 여부
n: 기존 비밀번호 기반 로그인 유지
3. Change the root password? [Y/n] → n
root 비밀번호 새로 설정 여부
n: 현재 비밀번호 그대로 유지
4. Remove anonymous users? [Y/n] → y
익명 사용자 계정 삭제
✅ 보안상 반드시 삭제하는 게 좋음
5. Disallow root login remotely? [Y/n] → y
root 계정 원격 접속 차단 (localhost에서만 접속 가능)
✅ 보안상 권장
6.Remove test database and access to it? [Y/n] → y
기본 생성되는 test 데이터베이스 삭제
✅ 불필요한 DB 제거, 보안성 강화
7.Reload privilege tables now? [Y/n] → n
지금 바로 권한 테이블을 다시 불러와 변경사항 적용할지 여부
n: 스킵 (하지만 보통은 y 권장 → 변경 즉시 적용됨)
github 파일 불러와서 스크립트 실행 시키기
Ubuntu
DB 셋팅
👉 User 하나 만들기
CREATE USER '<USER-NAME>'@'%' IDENTIFIED BY '<PASSWORD>';
👉 '%': 모든 호스트에서 접근 가능(원격 접근 테스트 시에는 이렇게 둬도 ok)
GRANT ALL PRIVILEGES ON '<DATABASE-NAME>'.* TO '<USERNAME>'@'<HOST=%>';
FLUSH PRIVILEGES
VM 에서
git clone <repository-url>
cd dir
chmod +x <scriptfile-name>.sh
./<scriptfile-name>.sh
db@db:~$ git clone https://github.com/keyveloper/DB_Query
Cloning into 'DB_Query'...
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 32 (delta 12), reused 32 (delta 12), pack-reused 0 (from 0)
Receiving objects: 100% (32/32), done.
Resolving deltas: 100% (12/12), done.
db@db:~$ cd DB_query
-bash: cd: DB_query: No such file or directory
db@db:~$ cd DB_Query
db@db:~/DB_Query$ ls
x-lite
db@db:~/DB_Query$ cd x-lite
db@db:~/DB_Query/x-lite$ chmod +x ./apply.sh
db@db:~/DB_Query/x-lite$ ./apply.sh
Applying init/create_board.sql...
Applying init/create_followes.sql...
Applying init/create_images.sql...
Applying init/create_likes.sql...
Applying init/create_like_types.sql...
Applying init/create_notifications.sql...
Applying init/create_roles.sql...
Applying init/create_timelines.sql...
Applying init/create_user_imgs.sql...
Applying init/create_user_roles.sql...
Applying init/create_users.sql...
MariaDB [x]> show tables;
+---------------+
| Tables_in_x |
+---------------+
| boards |
| followes |
| images |
| like_types |
| likes |
| notifications |
| roles |
| timelines |
| user_imgs |
| user_roles |
| users |
+---------------+
- MariaDB에 접속해서 보면 테이블이 잘 생성된 것을 볼 수 있습니다.
외부 접속 안될 때
- 오타확인
- DB이름, 유저이름, 비밀번호, IP 등
- mariadb server의 설정
/etc/mysql/mariadb.conf.d/50-server.cnf # Ubuntu/Debian
bind-address = 0.0.0.0
sudo systemctl restart mariadb