You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
VIPS/docs/리눅스 rocky MariaDB 설정.md

814 lines
18 KiB
Markdown

# Rocky Linux 9.5 MariaDB 설치 및 설정 가이드
## 요구사항
1. Rocky Linux 9.5 version
2. root 권한 또는 sudo 권한이 있는 계정
3. 목표: MariaDB 설치, 보안 설정, 사용자 생성, 데이터베이스 생성, 백업 스키마 복원
---
## 1단계: MariaDB 설치
### 1.1 MariaDB 서버 설치
```bash
# MariaDB 서버 및 클라이언트 설치
dnf install -y mariadb-server mariadb
# 또는 yum 사용
yum install -y mariadb-server mariadb
```
### 1.2 MariaDB 서비스 시작 및 자동 시작 설정
```bash
# MariaDB 서비스 시작
systemctl start mariadb
# 부팅 시 자동 시작 설정
systemctl enable mariadb
# 서비스 상태 확인
systemctl status mariadb
```
### 1.3 MariaDB 버전 확인
```bash
# MariaDB 버전 확인
mysql --version
# 또는 MariaDB 접속 후 확인
mysql -e "SELECT VERSION();"
```
---
## 2단계: MariaDB 보안 설정
### 2.1 초기 보안 설정 실행
```bash
# MariaDB 보안 설정 스크립트 실행
mysql_secure_installation
```
### 2.2 보안 설정 질문 및 권장 답변
설정 중 아래와 같은 질문이 나타납니다:
```
1. Enter current password for root (enter for none):
→ 처음 설치 시 비밀번호가 없으므로 Enter 입력
2. Switch to unix_socket authentication [Y/n]
→ n (기존 방식 유지 권장)
3. Change the root password? [Y/n]
→ Y (root 비밀번호 설정)
→ 새 비밀번호 입력 및 확인
4. Remove anonymous users? [Y/n]
→ Y (익명 사용자 제거)
5. Disallow root login remotely? [Y/n]
→ Y (원격 root 로그인 차단 - 보안 강화)
→ n (원격 접속이 필요한 경우)
6. Remove test database and access to it? [Y/n]
→ Y (테스트 데이터베이스 제거)
7. Reload privilege tables now? [Y/n]
→ Y (권한 테이블 즉시 적용)
```
### 2.3 root로 MariaDB 접속 확인
```bash
# root 계정으로 MariaDB 접속
mysql -u root -p
# 비밀번호 입력 후 접속
# 접속 확인 후 종료
MariaDB [(none)]> show databases;
MariaDB [(none)]> exit;
```
---
## 3단계: 커스텀 포트 설정 (53306)
### 3.1 MariaDB 포트 변경
```bash
# MariaDB 설정 파일 편집
vi /etc/my.cnf.d/mariadb-server.cnf
```
설정 파일에 포트 추가:
```ini
[mysqld]
port=53306
```
설정 변경 후 서비스 재시작:
```bash
# MariaDB 재시작
systemctl restart mariadb
# 포트 확인
ss -tlnp | grep 53306
```
### 3.2 방화벽 설정 (외부 접속 허용)
```bash
# 커스텀 포트(53306) 방화벽 허용
firewall-cmd --permanent --add-port=53306/tcp
firewall-cmd --reload
# 방화벽 설정 확인
firewall-cmd --list-all
```
---
## 4단계: 데이터베이스 생성
### 4.1 MariaDB 접속
```bash
# root로 MariaDB 접속
mysql -u root -p
# 비밀번호 입력
```
### 4.2 데이터베이스 생성
```sql
-- VIPS 데이터베이스 생성
CREATE DATABASE vips CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 데이터베이스 목록 확인
SHOW DATABASES;
-- VIPS 데이터베이스 선택
USE vips;
```
### 4.3 데이터베이스 문자셋 확인
```sql
-- 데이터베이스 문자셋 확인
SELECT
SCHEMA_NAME,
DEFAULT_CHARACTER_SET_NAME,
DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'vips';
```
---
## 5단계: 사용자 생성 및 권한 부여
### 5.1 로컬 접속용 사용자 생성
```sql
-- VIPS 로컬 접속용 사용자 생성
CREATE USER 'vips'@'localhost' IDENTIFIED BY 'xit5811807';
-- VIPS 데이터베이스에 모든 권한 부여
GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'localhost';
-- 권한 적용
FLUSH PRIVILEGES;
```
### 5.2 원격 접속용 사용자 생성
```sql
-- 특정 IP에서 접속 가능한 사용자 생성
CREATE USER 'vips'@'192.168.1.100' IDENTIFIED BY 'xit5811807';
GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'192.168.1.100';
-- 모든 IP에서 접속 가능한 사용자 생성 (application-prd.yml 설정)
CREATE USER 'vips'@'%' IDENTIFIED BY 'xit5811807';
GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'%';
-- 권한 적용
FLUSH PRIVILEGES;
```
### 5.3 읽기 전용 사용자 생성 (선택사항)
```sql
-- 읽기 전용 사용자 생성
CREATE USER 'vips_readonly'@'%' IDENTIFIED BY 'vips_readonly_password';
GRANT SELECT ON vips.* TO 'vips_readonly'@'%';
FLUSH PRIVILEGES;
```
### 5.4 사용자 목록 및 권한 확인
```sql
-- 사용자 목록 확인
SELECT User, Host FROM mysql.user;
-- VIPS 사용자의 권한 확인
SHOW GRANTS FOR 'vips'@'localhost';
SHOW GRANTS FOR 'vips'@'%';
-- 현재 사용자 확인
SELECT USER(), CURRENT_USER();
```
### 5.5 원격 접속을 위한 MariaDB 설정 변경
```bash
# MariaDB 설정 파일 편집
vi /etc/my.cnf.d/mariadb-server.cnf
```
설정 파일에서 다음 부분 수정:
```ini
[mysqld]
# bind-address를 주석 처리하거나 0.0.0.0으로 변경
# bind-address=127.0.0.1
bind-address=0.0.0.0
# 또는 특정 IP만 허용
# bind-address=192.168.1.50
```
설정 변경 후 서비스 재시작:
```bash
# MariaDB 재시작
systemctl restart mariadb
# 재시작 확인
systemctl status mariadb
```
---
## 6단계: 백업 스키마 업로드 (전체 데이터베이스 복원)
### 6.1 백업 파일 서버로 전송
**방법 1: SCP 사용 (로컬 PC에서 실행)**
```bash
# Windows PowerShell 또는 CMD에서 실행
scp C:\backup\vips_backup.sql root@서버IP:/tmp/
```
**방법 2: SFTP 사용**
```bash
# SFTP 접속
sftp root@서버IP
# 파일 전송
put vips_backup.sql /tmp/
exit
```
### 6.2 백업 파일 권한 설정
```bash
# 백업 파일 권한 확인
ls -la /tmp/vips_backup.sql
# 필요시 권한 변경
chmod 644 /tmp/vips_backup.sql
```
### 6.3 백업 파일 복원 - 방법 1 (명령행에서 직접 복원)
```bash
# 커스텀 포트 53306 사용하여 복원
mysql -u root -p -P 53306 vips < /tmp/vips_backup.sql
# 비밀번호 입력 없이 실행 (스크립트용)
mysql -u root -p비밀번호 -P 53306 vips < /tmp/vips_backup.sql
```
### 6.4 백업 파일 복원 - 방법 2 (MySQL 내부에서 복원)
```bash
# MariaDB 접속 (포트 53306 명시)
mysql -u root -p -P 53306
```
```sql
-- VIPS 데이터베이스 선택
USE vips;
-- 백업 파일 실행
SOURCE /tmp/vips_backup.sql;
-- 또는
\. /tmp/vips_backup.sql
```
### 6.5 백업 파일 복원 - 방법 3 (새 데이터베이스 생성 포함)
백업 파일에 CREATE DATABASE가 포함된 경우:
```bash
# 데이터베이스 이름 지정 없이 복원 (포트 53306)
mysql -u root -p -P 53306 < /tmp/vips_backup.sql
```
### 6.6 대용량 백업 파일 복원
대용량 파일의 경우 타임아웃 방지를 위한 옵션 추가:
```bash
# 타임아웃 설정 증가 (포트 53306)
mysql -u root -p -P 53306 \
--max_allowed_packet=512M \
--connect_timeout=3600 \
--wait_timeout=3600 \
vips < /tmp/vips_backup.sql
```
### 6.7 압축된 백업 파일 복원
```bash
# .gz 파일 복원 (포트 53306)
gunzip < /tmp/vips_backup.sql.gz | mysql -u root -p -P 53306 vips
# .zip 파일 복원 (포트 53306)
unzip -p /tmp/vips_backup.sql.zip | mysql -u root -p -P 53306 vips
```
---
## 7단계: 복원 결과 확인
### 7.1 MariaDB 접속
```bash
# VIPS 사용자로 접속 (포트 53306)
mysql -u vips -p -P 53306 vips
# 비밀번호 입력: xit5811807
```
### 7.2 데이터베이스 및 테이블 확인
```sql
-- 현재 데이터베이스 확인
SELECT DATABASE();
-- 테이블 목록 확인
SHOW TABLES;
-- 테이블 개수 확인
SELECT COUNT(*) AS table_count
FROM information_schema.tables
WHERE table_schema = 'vips';
-- 각 테이블의 상세 정보 확인
SHOW TABLE STATUS FROM vips;
```
### 7.3 테이블 구조 확인
```sql
-- 특정 테이블 구조 확인 (VIPS 테이블 예시)
DESC tb_vehicle_info;
-- 또는
DESCRIBE tb_vehicle_info;
-- 또는
SHOW COLUMNS FROM tb_vehicle_info;
-- 테이블 생성 DDL 확인
SHOW CREATE TABLE tb_vehicle_info;
```
### 7.4 데이터 확인
```sql
-- 특정 테이블의 레코드 수 확인
SELECT COUNT(*) FROM tb_vehicle_info;
-- 상위 10개 데이터 조회
SELECT * FROM tb_vehicle_info LIMIT 10;
-- 모든 테이블의 레코드 수 확인
SELECT
TABLE_NAME,
TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'vips'
ORDER BY TABLE_ROWS DESC;
```
### 7.5 인덱스 및 제약조건 확인
```sql
-- 특정 테이블의 인덱스 확인
SHOW INDEX FROM tb_vehicle_info;
-- 외래키 제약조건 확인
SELECT
CONSTRAINT_NAME,
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'vips'
AND REFERENCED_TABLE_NAME IS NOT NULL;
```
### 7.6 데이터베이스 용량 확인
```sql
-- VIPS 데이터베이스 전체 크기 확인
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'vips'
GROUP BY table_schema;
-- 테이블별 크기 확인
SELECT
table_name AS 'Table',
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'vips'
ORDER BY (data_length + index_length) DESC;
```
### 7.7 문자셋 확인
```sql
-- 데이터베이스 문자셋 확인
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
-- 포트 확인
SHOW VARIABLES LIKE 'port';
-- VIPS 테이블의 문자셋 확인
SELECT
TABLE_NAME,
TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'vips';
```
---
## 8단계: 접속 테스트 및 문제 해결
### 8.1 로컬 접속 테스트
```bash
# VIPS 사용자로 로컬 접속 테스트 (포트 53306)
mysql -u vips -p -P 53306 vips
# 접속 후 간단한 쿼리 실행
mysql -u vips -pxit5811807 -P 53306 vips -e "SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='vips';"
```
### 8.2 원격 접속 테스트 (다른 서버에서)
```bash
# 원격 서버에서 접속 테스트 (application-prd.yml 설정과 동일)
mysql -h 211.119.124.117 -P 53306 -u vips -p vips
# 비밀번호 포함하여 테스트 (스크립트용)
mysql -h 211.119.124.117 -P 53306 -u vips -pxit5811807 vips -e "SHOW TABLES;"
```
### 8.3 접속 문제 해결
**문제 1: Access denied for user**
```sql
-- MariaDB에 root로 접속하여 사용자 확인
SELECT User, Host FROM mysql.user WHERE User='vips';
-- 호스트가 일치하지 않으면 재생성
DROP USER 'vips'@'잘못된호스트';
CREATE USER 'vips'@'올바른호스트' IDENTIFIED BY 'xit5811807';
GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'올바른호스트';
FLUSH PRIVILEGES;
```
**문제 2: Can't connect to MySQL server**
```bash
# MariaDB 서비스 상태 확인
systemctl status mariadb
# 서비스가 중지되어 있으면 시작
systemctl start mariadb
# 커스텀 포트 53306 리스닝 확인
ss -tlnp | grep 53306
netstat -tlnp | grep 53306
# 포트 설정 확인
mysql -u root -p -e "SHOW VARIABLES LIKE 'port';"
# 방화벽 확인
firewall-cmd --list-all
```
**문제 3: 원격 접속 불가**
```bash
# bind-address 설정 확인
grep bind-address /etc/my.cnf.d/mariadb-server.cnf
# 0.0.0.0 또는 원하는 IP로 설정되어 있는지 확인
# 변경 후 재시작 필요
systemctl restart mariadb
```
**문제 4: 복원 중 에러 발생**
```bash
# 에러 로그 확인
tail -100 /var/log/mariadb/mariadb.log
# 또는
journalctl -u mariadb -n 100
# SQL 파일 문법 확인 (일부만 실행해보기)
head -100 /tmp/myapp_db_backup.sql
```
---
## 9단계: 백업 설정 (추가 운영 관리)
### 9.1 수동 백업 명령어
```bash
# VIPS 전체 데이터베이스 백업 (포트 53306)
mysqldump -u root -p -P 53306 vips > /backup/vips_$(date +%Y%m%d_%H%M%S).sql
# 압축 백업
mysqldump -u root -p -P 53306 vips | gzip > /backup/vips_$(date +%Y%m%d_%H%M%S).sql.gz
# 특정 테이블만 백업
mysqldump -u root -p -P 53306 vips tb_vehicle_info tb_user > /backup/vips_tables_$(date +%Y%m%d).sql
# 구조만 백업 (데이터 제외)
mysqldump -u root -p -P 53306 --no-data vips > /backup/vips_schema_only.sql
# 데이터만 백업 (구조 제외)
mysqldump -u root -p -P 53306 --no-create-info vips > /backup/vips_data_only.sql
```
### 9.2 백업 디렉토리 생성 및 권한 설정
```bash
# 백업 디렉토리 생성
mkdir -p /backup/mariadb
# 권한 설정
chown root:root /backup/mariadb
chmod 700 /backup/mariadb
```
### 9.3 자동 백업 스크립트 생성
```bash
# 백업 스크립트 생성
vi /backup/mariadb_backup.sh
```
스크립트 내용:
```bash
#!/bin/bash
# VIPS 데이터베이스 백업 스크립트
DB_NAME="vips"
DB_USER="root"
DB_PASS="your_root_password"
DB_PORT="53306"
BACKUP_DIR="/backup/mariadb"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
RETENTION_DAYS=7
# 백업 디렉토리 생성 (없으면)
mkdir -p $BACKUP_DIR
# 백업 실행
echo "Starting VIPS database backup at $(date)"
mysqldump -u $DB_USER -p$DB_PASS -P $DB_PORT $DB_NAME | gzip > $BACKUP_FILE
# 백업 결과 확인
if [ $? -eq 0 ]; then
echo "Backup completed successfully: $BACKUP_FILE"
# 파일 크기 확인
FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "Backup file size: $FILE_SIZE"
# 오래된 백업 파일 삭제 (7일 이상)
find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Old backups cleaned up (retention: $RETENTION_DAYS days)"
else
echo "Backup failed!"
exit 1
fi
echo "Backup process finished at $(date)"
```
스크립트 실행 권한 부여:
```bash
chmod 700 /backup/mariadb_backup.sh
```
### 9.4 cron을 이용한 자동 백업 설정
```bash
# crontab 편집
crontab -e
```
cron 설정 추가:
```bash
# 매일 새벽 2시에 백업 실행
0 2 * * * /backup/mariadb_backup.sh >> /backup/mariadb/backup.log 2>&1
# 매주 일요일 새벽 3시에 백업 실행
0 3 * * 0 /backup/mariadb_backup.sh >> /backup/mariadb/backup.log 2>&1
# 매월 1일 새벽 4시에 백업 실행
0 4 1 * * /backup/mariadb_backup.sh >> /backup/mariadb/backup.log 2>&1
```
cron 설정 확인:
```bash
# crontab 목록 확인
crontab -l
# cron 서비스 상태 확인
systemctl status crond
# cron 로그 확인
tail -f /var/log/cron
```
---
## 전체 실행 순서 요약
```bash
# 1. MariaDB 설치
dnf install -y mariadb-server mariadb
systemctl start mariadb
systemctl enable mariadb
# 2. 보안 설정
mysql_secure_installation
# 3. 커스텀 포트 설정 (53306)
vi /etc/my.cnf.d/mariadb-server.cnf
# [mysqld] 섹션에 port=53306 추가
# 4. 원격 접속 설정
vi /etc/my.cnf.d/mariadb-server.cnf
# bind-address=0.0.0.0 설정
systemctl restart mariadb
# 5. 방화벽 설정
firewall-cmd --permanent --add-port=53306/tcp
firewall-cmd --reload
# 6. 포트 확인
ss -tlnp | grep 53306
# 7. MariaDB 접속하여 데이터베이스 및 사용자 생성
mysql -u root -p -P 53306
```
```sql
-- VIPS 데이터베이스 생성
CREATE DATABASE vips CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- VIPS 사용자 생성 및 권한 부여
CREATE USER 'vips'@'localhost' IDENTIFIED BY 'xit5811807';
GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'localhost';
-- 원격 접속용 사용자 (application-prd.yml 설정)
CREATE USER 'vips'@'%' IDENTIFIED BY 'xit5811807';
GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'%';
FLUSH PRIVILEGES;
exit;
```
```bash
# 8. 백업 파일 업로드 (로컬 PC에서)
scp vips_backup.sql root@서버IP:/tmp/
# 9. 백업 복원 (서버에서, 포트 53306 명시)
mysql -u root -p -P 53306 vips < /tmp/vips_backup.sql
# 10. 복원 확인
mysql -u vips -pxit5811807 -P 53306 vips
```
```sql
-- 테이블 확인
SHOW TABLES;
SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='vips';
exit;
```
---
## 유용한 MariaDB 관리 명령어
### 데이터베이스 관리
```sql
-- 모든 데이터베이스 목록
SHOW DATABASES;
-- 데이터베이스 삭제 (주의!)
DROP DATABASE vips;
-- 데이터베이스 이름 변경 (직접 지원 안함, 백업/복원 필요)
-- 방법: 백업 → 새 DB 생성 → 복원 → 기존 DB 삭제
```
### 사용자 관리
```sql
-- 모든 사용자 목록
SELECT User, Host FROM mysql.user;
-- VIPS 사용자 비밀번호 변경
ALTER USER 'vips'@'localhost' IDENTIFIED BY 'new_password';
ALTER USER 'vips'@'%' IDENTIFIED BY 'new_password';
-- 사용자 삭제
DROP USER 'vips'@'localhost';
DROP USER 'vips'@'%';
-- 특정 권한만 회수
REVOKE DELETE ON vips.* FROM 'vips'@'localhost';
-- 모든 권한 회수
REVOKE ALL PRIVILEGES ON vips.* FROM 'vips'@'localhost';
```
### 테이블 관리
```sql
-- 테이블 삭제
DROP TABLE table_name;
-- 테이블 비우기 (구조는 유지)
TRUNCATE TABLE table_name;
-- 테이블 이름 변경
RENAME TABLE old_name TO new_name;
-- 테이블 복사
CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;
```
### 성능 모니터링
```sql
-- 현재 실행 중인 쿼리 확인
SHOW PROCESSLIST;
-- 특정 프로세스 강제 종료
KILL [process_id];
-- 상태 변수 확인
SHOW STATUS;
SHOW VARIABLES;
-- 느린 쿼리 확인
SHOW VARIABLES LIKE 'slow_query%';
```
---
## 보안 권장사항
1. **강력한 비밀번호 사용**
- 최소 12자 이상, 대소문자/숫자/특수문자 조합
2. **최소 권한 원칙**
- 애플리케이션 사용자에게 필요한 최소 권한만 부여
- 읽기 전용 작업에는 SELECT 권한만 부여
3. **원격 root 접속 차단**
- root는 localhost에서만 접속 허용
4. **정기적인 백업**
- 매일 자동 백업 설정
- 백업 파일 주기적 확인
5. **방화벽 설정**
- 필요한 IP만 53306 포트 접근 허용
- 특정 IP 대역만 접근 허용 설정
```bash
# 특정 IP만 허용 (예시)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="53306" accept'
firewall-cmd --reload
```
6. **MariaDB 업데이트**
- 정기적인 보안 패치 적용
```bash
dnf update mariadb-server
```
---
## 참고사항
- **VIPS 프로젝트 설정**
- 데이터베이스: vips
- 사용자: vips
- 비밀번호: xit5811807
- 포트: 53306 (커스텀 포트)
- 문자셋: UTF-8 (utf8mb4)
- **MariaDB 기본 정보**
- 기본 포트: 3306 (VIPS는 53306 사용)
- 설정 파일 위치: `/etc/my.cnf`, `/etc/my.cnf.d/mariadb-server.cnf`
- 데이터 디렉토리: `/var/lib/mysql/`
- 로그 파일: `/var/log/mariadb/mariadb.log`
- 소켓 파일: `/var/lib/mysql/mysql.sock`
---
## 문의 및 추가 정보
- MariaDB 공식 문서: https://mariadb.com/kb/
- Rocky Linux 공식 문서: https://docs.rockylinux.org/