데이터베이스 관리
# 데이터베이스 생성
CREATE DATABASE 데이터베이스명;
CREATE DATABASE 데이터베이스명 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS 데이터베이스명;
# 데이터베이스 목록 확인
SHOW DATABASES;
SHOW DATABASES LIKE '패턴';
# 데이터베이스 선택
USE 데이터베이스명;
# 어느 데이터베이스에 있는지 알아보기
SELECT DATABASE();
# 데이터베이스 삭제
DROP DATABASE 데이터베이스명;
DROP DATABASE IF EXISTS 데이터베이스명;
사용자 관리
유저는 localhost용과 원격에서 접속하는 유저를 따로 생성한다. localhost에서 접속하는 유저는 서버
# 사용자 목록 확인
SELECT user, host FROM mysql.user;
SELECT user, host FROM mysql.user WHERE user = '사용자명';
# 사용자 생성
CREATE USER '사용자명'@'localhost' IDENTIFIED BY '비밀번호';
CREATE USER '사용자명'@'192.168.1.100' IDENTIFIED BY '비밀번호'; # 특정 IP
CREATE USER '사용자명'@'%' IDENTIFIED BY '비밀번호'; # 모든 IP
CREATE USER '사용자명'@'호스트명' IDENTIFIED BY '비밀번호';
# 사용자 비밀번호 변경
SET PASSWORD FOR '사용자명'@'localhost' = PASSWORD('새비밀번호'); # MySQL 5.7
ALTER USER '사용자명'@'localhost' IDENTIFIED BY '새비밀번호'; # MySQL 8.0 이상
FLUSH PRIVILEGES;
# 사용자 삭제
DROP USER '사용자명'@'localhost';
DROP USER '사용자명'@'localhost', '사용자명'@'%';
DROP USER IF EXISTS '사용자명'@'localhost';
권한 관리
주요 권한 종류
- ALL PRIVILEGES: 모든 권한
- SELECT: 데이터 조회
- INSERT: 데이터 삽입
- UPDATE: 데이터 수정
- DELETE: 데이터 삭제
- CREATE: 테이블/데이터베이스 생성
- DROP: 테이블/데이터베이스 삭제
- ALTER: 테이블 구조 변경
- INDEX: 인덱스 생성/삭제
- GRANT OPTION: 다른 사용자에게 권한 부여 가능
# 권한 확인
SHOW GRANTS;
SHOW GRANTS FOR '사용자명'@'localhost';
SELECT * FROM mysql.user WHERE user = '사용자명' AND host = 'localhost';
SELECT * FROM mysql.db WHERE user = '사용자명' AND host = 'localhost';
SELECT * FROM mysql.tables_priv WHERE user = '사용자명' AND host = 'localhost';
# 권한 부여
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자명'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO '사용자명'@'localhost';
GRANT SELECT, INSERT, UPDATE ON 데이터베이스명.테이블명 TO '사용자명'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON 데이터베이스명.* TO '사용자명'@'localhost';
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '사용자명'@'%'; # 외부 접속
FLUSH PRIVILEGES;
# 권한 삭제
REVOKE ALL PRIVILEGES ON 데이터베이스명.* FROM '사용자명'@'localhost';
REVOKE ALL PRIVILEGES ON *.* FROM '사용자명'@'localhost';
REVOKE SELECT, INSERT ON 데이터베이스명.* FROM '사용자명'@'localhost';
REVOKE GRANT OPTION ON 데이터베이스명.* FROM '사용자명'@'localhost';
FLUSH PRIVILEGES;
실전 예제
# 웹 애플리케이션용 데이터베이스 및 사용자 생성
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'%' IDENTIFIED BY '강력한비밀번호';
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'myapp_user'@'%';
# 읽기 전용 사용자 생성
CREATE USER 'readonly_user'@'%' IDENTIFIED BY '비밀번호';
GRANT SELECT ON 데이터베이스명.* TO 'readonly_user'@'%';
FLUSH PRIVILEGES;
# 특정 IP에서만 접속 가능한 사용자 생성
CREATE USER 'admin_user'@'192.168.1.100' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'192.168.1.100';
FLUSH PRIVILEGES;
주의사항
- FLUSH PRIVILEGES: 권한 변경 후 반드시 실행하여 변경사항 즉시 적용
- 보안: 프로덕션 환경에서는
%사용을 최소화하고 특정 IP만 허용 - 비밀번호: 강력한 비밀번호 사용 필수
- 최소 권한 원칙: 필요한 최소한의 권한만 부여
- MySQL 8.0:
PASSWORD()함수가 제거되어ALTER USER사용 - 호스트 지정:
localhost는 로컬 접속만,%는 모든 IP에서 접속 가능