MySQL

chelseey·2024년 11월 14일

서버 시작/종료

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 명령어는 글로벌 변수에만 적용.

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

권한 (Privilege)

• 정적 권한과 동적 권한

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

0개의 댓글