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

18 KiB

Rocky Linux 9.5 MariaDB 설치 및 설정 가이드

요구사항

  1. Rocky Linux 9.5 version
  2. root 권한 또는 sudo 권한이 있는 계정
  3. 목표: MariaDB 설치, 보안 설정, 사용자 생성, 데이터베이스 생성, 백업 스키마 복원

1단계: MariaDB 설치

1.1 MariaDB 서버 설치

# MariaDB 서버 및 클라이언트 설치
dnf install -y mariadb-server mariadb

# 또는 yum 사용
yum install -y mariadb-server mariadb

1.2 MariaDB 서비스 시작 및 자동 시작 설정

# MariaDB 서비스 시작
systemctl start mariadb

# 부팅 시 자동 시작 설정
systemctl enable mariadb

# 서비스 상태 확인
systemctl status mariadb

1.3 MariaDB 버전 확인

# MariaDB 버전 확인
mysql --version

# 또는 MariaDB 접속 후 확인
mysql -e "SELECT VERSION();"

2단계: MariaDB 보안 설정

2.1 초기 보안 설정 실행

# 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 접속 확인

# root 계정으로 MariaDB 접속
mysql -u root -p
# 비밀번호 입력 후 접속

# 접속 확인 후 종료
MariaDB [(none)]> show databases;
MariaDB [(none)]> exit;

3단계: 커스텀 포트 설정 (53306)

3.1 MariaDB 포트 변경

# MariaDB 설정 파일 편집
vi /etc/my.cnf.d/mariadb-server.cnf

설정 파일에 포트 추가:

[mysqld]
port=53306

설정 변경 후 서비스 재시작:

# MariaDB 재시작
systemctl restart mariadb

# 포트 확인
ss -tlnp | grep 53306

3.2 방화벽 설정 (외부 접속 허용)

# 커스텀 포트(53306) 방화벽 허용
firewall-cmd --permanent --add-port=53306/tcp
firewall-cmd --reload

# 방화벽 설정 확인
firewall-cmd --list-all

4단계: 데이터베이스 생성

4.1 MariaDB 접속

# root로 MariaDB 접속
mysql -u root -p
# 비밀번호 입력

4.2 데이터베이스 생성

-- VIPS 데이터베이스 생성
CREATE DATABASE vips CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 데이터베이스 목록 확인
SHOW DATABASES;

-- VIPS 데이터베이스 선택
USE vips;

4.3 데이터베이스 문자셋 확인

-- 데이터베이스 문자셋 확인
SELECT
    SCHEMA_NAME,
    DEFAULT_CHARACTER_SET_NAME,
    DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'vips';

5단계: 사용자 생성 및 권한 부여

5.1 로컬 접속용 사용자 생성

-- VIPS 로컬 접속용 사용자 생성
CREATE USER 'vips'@'localhost' IDENTIFIED BY 'xit5811807';

-- VIPS 데이터베이스에 모든 권한 부여
GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'localhost';

-- 권한 적용
FLUSH PRIVILEGES;

5.2 원격 접속용 사용자 생성

-- 특정 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 읽기 전용 사용자 생성 (선택사항)

-- 읽기 전용 사용자 생성
CREATE USER 'vips_readonly'@'%' IDENTIFIED BY 'vips_readonly_password';
GRANT SELECT ON vips.* TO 'vips_readonly'@'%';
FLUSH PRIVILEGES;

5.4 사용자 목록 및 권한 확인

-- 사용자 목록 확인
SELECT User, Host FROM mysql.user;

-- VIPS 사용자의 권한 확인
SHOW GRANTS FOR 'vips'@'localhost';
SHOW GRANTS FOR 'vips'@'%';

-- 현재 사용자 확인
SELECT USER(), CURRENT_USER();

5.5 원격 접속을 위한 MariaDB 설정 변경

# MariaDB 설정 파일 편집
vi /etc/my.cnf.d/mariadb-server.cnf

설정 파일에서 다음 부분 수정:

[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

설정 변경 후 서비스 재시작:

# MariaDB 재시작
systemctl restart mariadb

# 재시작 확인
systemctl status mariadb

6단계: 백업 스키마 업로드 (전체 데이터베이스 복원)

6.1 백업 파일 서버로 전송

방법 1: SCP 사용 (로컬 PC에서 실행)

# Windows PowerShell 또는 CMD에서 실행
scp C:\backup\vips_backup.sql root@서버IP:/tmp/

방법 2: SFTP 사용

# SFTP 접속
sftp root@서버IP

# 파일 전송
put vips_backup.sql /tmp/
exit

6.2 백업 파일 권한 설정

# 백업 파일 권한 확인
ls -la /tmp/vips_backup.sql

# 필요시 권한 변경
chmod 644 /tmp/vips_backup.sql

6.3 백업 파일 복원 - 방법 1 (명령행에서 직접 복원)

# 커스텀 포트 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 내부에서 복원)

# MariaDB 접속 (포트 53306 명시)
mysql -u root -p -P 53306
-- VIPS 데이터베이스 선택
USE vips;

-- 백업 파일 실행
SOURCE /tmp/vips_backup.sql;

-- 또는
\. /tmp/vips_backup.sql

6.5 백업 파일 복원 - 방법 3 (새 데이터베이스 생성 포함)

백업 파일에 CREATE DATABASE가 포함된 경우:

# 데이터베이스 이름 지정 없이 복원 (포트 53306)
mysql -u root -p -P 53306 < /tmp/vips_backup.sql

6.6 대용량 백업 파일 복원

대용량 파일의 경우 타임아웃 방지를 위한 옵션 추가:

# 타임아웃 설정 증가 (포트 53306)
mysql -u root -p -P 53306 \
  --max_allowed_packet=512M \
  --connect_timeout=3600 \
  --wait_timeout=3600 \
  vips < /tmp/vips_backup.sql

6.7 압축된 백업 파일 복원

# .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 접속

# VIPS 사용자로 접속 (포트 53306)
mysql -u vips -p -P 53306 vips
# 비밀번호 입력: xit5811807

7.2 데이터베이스 및 테이블 확인

-- 현재 데이터베이스 확인
SELECT DATABASE();

-- 테이블 목록 확인
SHOW TABLES;

-- 테이블 개수 확인
SELECT COUNT(*) AS table_count
FROM information_schema.tables
WHERE table_schema = 'vips';

-- 각 테이블의 상세 정보 확인
SHOW TABLE STATUS FROM vips;

7.3 테이블 구조 확인

-- 특정 테이블 구조 확인 (VIPS 테이블 예시)
DESC tb_vehicle_info;
-- 또는
DESCRIBE tb_vehicle_info;
-- 또는
SHOW COLUMNS FROM tb_vehicle_info;

-- 테이블 생성 DDL 확인
SHOW CREATE TABLE tb_vehicle_info;

7.4 데이터 확인

-- 특정 테이블의 레코드 수 확인
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 인덱스 및 제약조건 확인

-- 특정 테이블의 인덱스 확인
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 데이터베이스 용량 확인

-- 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 문자셋 확인

-- 데이터베이스 문자셋 확인
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 로컬 접속 테스트

# 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 원격 접속 테스트 (다른 서버에서)

# 원격 서버에서 접속 테스트 (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

-- 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

# 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: 원격 접속 불가

# bind-address 설정 확인
grep bind-address /etc/my.cnf.d/mariadb-server.cnf

# 0.0.0.0 또는 원하는 IP로 설정되어 있는지 확인
# 변경 후 재시작 필요
systemctl restart mariadb

문제 4: 복원 중 에러 발생

# 에러 로그 확인
tail -100 /var/log/mariadb/mariadb.log

# 또는
journalctl -u mariadb -n 100

# SQL 파일 문법 확인 (일부만 실행해보기)
head -100 /tmp/myapp_db_backup.sql

9단계: 백업 설정 (추가 운영 관리)

9.1 수동 백업 명령어

# 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 백업 디렉토리 생성 및 권한 설정

# 백업 디렉토리 생성
mkdir -p /backup/mariadb

# 권한 설정
chown root:root /backup/mariadb
chmod 700 /backup/mariadb

9.3 자동 백업 스크립트 생성

# 백업 스크립트 생성
vi /backup/mariadb_backup.sh

스크립트 내용:

#!/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)"

스크립트 실행 권한 부여:

chmod 700 /backup/mariadb_backup.sh

9.4 cron을 이용한 자동 백업 설정

# crontab 편집
crontab -e

cron 설정 추가:

# 매일 새벽 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 설정 확인:

# crontab 목록 확인
crontab -l

# cron 서비스 상태 확인
systemctl status crond

# cron 로그 확인
tail -f /var/log/cron

전체 실행 순서 요약

# 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
-- 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;
# 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
-- 테이블 확인
SHOW TABLES;
SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='vips';
exit;

유용한 MariaDB 관리 명령어

데이터베이스 관리

-- 모든 데이터베이스 목록
SHOW DATABASES;

-- 데이터베이스 삭제 (주의!)
DROP DATABASE vips;

-- 데이터베이스 이름 변경 (직접 지원 안함, 백업/복원 필요)
-- 방법: 백업 → 새 DB 생성 → 복원 → 기존 DB 삭제

사용자 관리

-- 모든 사용자 목록
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';

테이블 관리

-- 테이블 삭제
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;

성능 모니터링

-- 현재 실행 중인 쿼리 확인
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 대역만 접근 허용 설정
    # 특정 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 업데이트

    • 정기적인 보안 패치 적용
    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

문의 및 추가 정보