서버 시작/종료
sudo /usr/local/mysql-8.4.2-macos14-arm64/support-files/mysql.server stop
sudo /usr/local/mysql-8.4.2-macos14-arm64/support-files/mysql.server start
02. 설치와 설정
SET 명령으로 변경한 값은 MySQL의 설정 파일 (my.cnf, my.ini)에 자동으로 기록되지 않음.
재시작 후에도 변경 사항을 유지하려면 :
• 설정 파일을 수동으로 수정
[mysqld]
max_connections = 200
• SET PERSIST 명령어 사용
SET PERSIST max_connections = 200;
: SET PERSIST 명령을 사용하여 변경된 시스템 변수는 my.cnf 파일이 아닌 mysqld-auto.cnf라는 별도의 파일에 저장.
시스템 변수가 'Both'(global&session)인 경우, 세션 변수와 글로벌 변수는 독립적으로 작동. → 세션 변수를 변경해도 글로벌 변수에는 영향을 미치지 않음.
SET PERSIST 명령어는 글로벌 변수에만 적용.
• SET PERSIST_ONLY : 글로벌 시스템 변수를 변경하고 변경 내용을 mysqld-auto.cnf 파일에 저장하지만, 현재 실행 중인 MySQL 서버의 동작에는 즉시 반영되지 않음. = 서버를 재시작한 후에만 변경 사항이 적용.
SET PERSIST_ONLY는 정적인 변수(static variables)를 영구적으로 변경할 때도 사용.
• mysqld-auto.cnf 파일 :
{
"max_connections": 200,
"innodb_buffer_pool_size": 134217728,
"read_only": false
}
JSON 형식으로, 설정된 각 변수와 그 값이 JSON 객체로 저장.
• RESET PERSIST : SET PERSIST 명령으로 저장한 모든 변수 설정을 초기 상태로 되돌리는 명령.
RESET PERSIST max_connections;
특정 변수 max_connections의 영구적 설정을 제거
03. 사용자 및 권한
MySQL에서는 사용자 계정을 관리하고 인증하기 위해 사용자 이름과 호스트 정보를 함께 사용하여 사용자를 구분.
'svc_id'@'127.0.01'
• 'sec_id': 사용자명
• '127.0.0.1': 호스트 (IP 주소)
'127.0.0.1'는 로컬호스트(localhost)를 의미하는 IP 주소.
= 같은 서버 내에서만 MySQL에 접속 가능.
모든 외부 컴퓨터에서 접속을 허용하려면 host 부분을 % (모든 호스트)로 설정.
'sec_id'@'127.0.0.1'
'sec_id'@'%'
: 둘은 호스트가 다르므로 다른 계정으로 취급.
• 두 개의 계정이 있는 경우 : MySQL은 더 구체적인 호스트 정의를 가진 계정을 우선적으로 선택.
→ 127.0.0.1로 접속하는 경우 MySQL은 'sec_id'@'127.0.0.1' 계정을 선택
• 시스템 계정과 일반 계정
시스템 계정 :
mysql.infoschema
: MySQL의 Information Schema와 관련된 내부 작업에 사용.
Information Schema : 데이터베이스 메타데이터(테이블 정보, 칼럼 정보 등)를 조회할 수 있는 가상 데이터베이스.
mysql.session
: MySQL 서버의 내부 세션(백그라운드 작업을 처리하거나 일시적인 세션 데이터)을 관리하는 데 사용.
mysql.sys
: sys 스키마에서 MySQL 서버 상태 및 성능을 확인하는 데 사용
sys 스키마 : MySQL의 상태 및 성능을 모니터링하기 위한 기능 제공.
위 계정들은 보안을 위해 잠겨 있는 상태로 설정 :
• 계정 생성
CREATE USER 'user'@'%'
CREATE USER 'user'@'%'
IDENTIFIED WITH 'caching_sha2_password' BY 'password'
REQUIRE NONE
PASSWORD EXPIRE INTERVAL 30 DAY
ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT;
• IDENTIFIED WITH
: 사용자의 인증 방식(인증 플러그인의 이름)과 비밀번호 설정
• REQUIRE
: 사용자가 MySQL 서버에 접속할 때 필요한 보안 요구사항을 설정
(MySQL 서버에 접속할 떄 암호화된 SSL/TLS 채널을 사용하는지 여부 설정.)
• PASSWORD EXPIRE
: 비밀번호의 유효 기간을 설정하는 옵션
• PASSWORD HISTORY
: 한 번 사용했던 비밀번호를 재사용하지 못하게 설정하는 옵션
• PASSWORD REUSE INTERVAL
: 한 번 사용했던 비밀번호의 재사용 금지 기간을 설정하는 옵션
• PASSWORD REQUIRE
: 비밀번호가 만료되어 새로운 비밀번호로 변경할 때 현재 비밀번호(만료된 비밀번호)를 필요로 할지 말지를 결정하는 옵션
• ACCOUNT LOCK/UNLOCK
: 사용자 계정을 잠그거나 잠금을 해제하여 계정의 접속 가능 상태를 관리하는 옵션
• validate_password : 비밀번호 강도 검증 플러그인.
사용자가 MySQL 계정의 비밀번호를 설정할 때 비밀번호의 복잡성을 검사하여, 보안성이 낮은 비밀번호가 사용되는 것을 방지.
validate_password 시스템 변수 :
LOW : 최소 길이(validate_password.length)만 확인.
MEDIUM : 길이, 대소문자, 숫자, 특수 문자를 검사.
STRONG : MEDIUM 정책의 검사에 더해, 사전에 포함된 단어가 아닌지도 검사.
• 금칙어 파일 설정
: 공통적으로 사용되는 단어나 사전 단어가 포함된 비밀번호 사용을 방지하고자 할 때 사용. 비밀번호 정책이 STRONG일 때만 금칙어 파일이 적용됨.
SET GLOBAL validate_password.dictionary_file = 'prohibitive_word.txt';
SET GLOBAL validate_password.policy = 'STRONG';
ex) prohibitive_words.txt 파일에 "password"가 포함되어 있어, MySQL이 설정하려는 비밀번호를 거부:
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'password';
--------------
Error Code: 1819. Your password does not satisfy the current policy requirements
• 정적 권한과 동적 권한
• GRANT : 사용자에게 권한을 부여하는 명령어
GRANT 권한 ON 데이터베이스.테이블 TO '사용자'@'호스트' [IDENTIFIED BY '비밀번호'];
• 글로벌 권한 (Global Privilege)
: 특정 데이터베이스나 테이블에 국한되지 않고, MySQL 서버 전체에 있는 모든 데이터베이스와 모든 오브젝트에 대해 적용되는 권한.
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
• 데이터베이스 권한 (Database Privilege)
: 특정 데이터베이스에 대해 적용되는 권한.
GRANT SELECT, INSERT, UPDATE, DELETEON mydb.* TO 'user'@'localhost';
user 사용자에게 mydb 데이터베이스의 모든 테이블에 대해 SELECT, INSERT, UPDATE 권한을 부여.
• 테이블 권한 (Table Privilege)
: 특정 데이터베이스의 특정 테이블에만 적용되는 권한
GRANT SELECT, INSERT ON mydb.employees TO 'user'@'localhost';