# 서비스 상태 확인
sudo systemctl status mysql
# MySQL 서비스 시작
sudo systemctl start mysql
# MySQL 서비스 중지
sudo systemctl stop mysql
# MySQL 서비스 재시작
sudo systemctl restart mysql
# 부팅 시 자동 시작 설정
sudo systemctl enable mysql
# 자동 시작 해제
sudo systemctl disable mysql
MySQL 접속
로컬 접속
# root 사용자로 접속
sudo mysql -u root -p
# 특정 사용자로 접속
mysql -u username -p
# 데이터베이스 지정하여 접속
mysql -u username -p database_name
원격 접속
# 원격 서버 접속
mysql -h hostname_or_ip -u username -p
# 포트 지정 접속
mysql -h hostname_or_ip -P 3306 -u username -p
사용자 계정 관리
사용자 생성
-- 로컬 접속만 허용하는 사용자 생성
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
-- 특정 IP에서만 접속 허용
CREATE USER 'username'@'192.168.1.100' IDENTIFIED BY 'password';
-- 특정 도메인에서만 접속 허용
CREATE USER 'username'@'%.example.com' IDENTIFIED BY 'password';
-- 모든 호스트에서 접속 허용 (보안상 주의)
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
-- 패스워드 없는 사용자 생성
CREATE USER 'username'@'localhost';
사용자 목록 조회
-- 모든 사용자 조회
SELECT user, host FROM mysql.user;
-- 특정 사용자 조회
SELECT user, host FROM mysql.user WHERE user = 'username';
-- 현재 접속 중인 사용자 확인
SELECT USER();
SELECT CURRENT_USER();
-- 사용자의 권한 정보와 함께 조회
SELECT user, host, password_expired, account_locked FROM mysql.user;
사용자 삭제
-- 사용자 삭제
DROP USER 'username'@'host';
-- 여러 사용자 동시 삭제
DROP USER 'user1'@'localhost', 'user2'@'%';
-- 존재하지 않을 수도 있는 사용자 삭제 (에러 방지)
DROP USER IF EXISTS 'username'@'localhost';
계정 잠금/해제
-- 계정 잠금
ALTER USER 'username'@'host' ACCOUNT LOCK;
-- 계정 해제
ALTER USER 'username'@'host' ACCOUNT UNLOCK;
-- 잠금 상태 확인
SELECT user, host, account_locked FROM mysql.user WHERE user = 'username';
웹 애플리케이션용 사용자 생성
-- 데이터베이스 생성
CREATE DATABASE webapp_db;
-- 사용자 생성 및 권한 부여
CREATE USER 'webapp_user'@'localhost' IDENTIFIED BY 'secure_password123';
GRANT SELECT, INSERT, UPDATE, DELETE ON webapp_db.* TO 'webapp_user'@'localhost';
FLUSH PRIVILEGES;
읽기 전용 사용자 생성
-- 읽기 전용 사용자
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'readonly_password';
GRANT SELECT ON *.* TO 'readonly_user'@'%';
FLUSH PRIVILEGES;
백업 전용 사용자 생성
-- 백업 사용자 생성
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'backup_password';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
비밀번호 관리
비밀번호 변경
-- 현재 사용자의 비밀번호 변경
ALTER USER USER() IDENTIFIED BY 'new_password';
-- 특정 사용자의 비밀번호 변경 (MySQL 8.0 이상 권장)
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
-- 이전 버전의 MySQL
SET PASSWORD FOR 'username'@'host' = PASSWORD('new_password');
root 비밀번호 초기화
# 1. MySQL 서비스 중지
sudo systemctl stop mysql
# 2. 권한 테이블 없이 MySQL 시작
sudo mysqld_safe --skip-grant-tables &
# 3. root로 비밀번호 없이 접속
mysql -u root
# 4. MySQL 내부에서 비밀번호 변경 (MySQL 8.0 기준)
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
# 5. MySQL 종료 후 정상 재시작
mysql> exit
sudo systemctl restart mysql
권한 관리
권한 부여
-- 모든 데이터베이스 목록 보기
SHOW DATABASES;
-- 특정 사용자의 권한이 있는 데이터베이스 확인
SHOW GRANTS FOR 'username'@'host';
-- 모든 데이터베이스에 모든 권한 부여
GRANT ALL PRIVILEGES ON *.* TO 'username'@'host';
-- 특정 데이터베이스에 모든 권한 부여
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';
-- 특정 테이블에 권한 부여
GRANT SELECT, INSERT, UPDATE ON database_name.table_name TO 'username'@'host';
-- 읽기 전용 권한
GRANT SELECT ON database_name.* TO 'username'@'host';
-- 특정 컬럼에만 권한 부여
GRANT SELECT (column1, column2) ON database_name.table_name TO 'username'@'host';
-- WITH GRANT OPTION (다른 사용자에게 권한 부여 가능)
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host' WITH GRANT OPTION;
권한 조회
-- 특정 사용자의 권한 조회
SHOW GRANTS FOR 'username'@'host';
-- 현재 사용자의 권한 조회
SHOW GRANTS;
-- 모든 사용자의 권한 요약
SELECT user, host, Select_priv, Insert_priv, Update_priv, Delete_priv
FROM mysql.user;
권한 제거
-- 특정 권한 제거
REVOKE INSERT, UPDATE ON database_name.* FROM 'username'@'host';
-- 모든 권한 제거
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'host';
-- GRANT OPTION 제거
REVOKE GRANT OPTION ON database_name.* FROM 'username'@'host';
권한 적용
-- 권한 변경사항 즉시 적용
-- 권한 관련 오류 시 권한 테이블 새로고침
FLUSH PRIVILEGES;