다시 기억하고자 정리한 글
내가 다시 알아볼 수 있게 정리한 글이라 책에 적힌 순서와 내용이 다를 수 있음을 밝힘
Skip
MySQL 은 지정된 디렉터리를 순차적으로 탐색하며 처음 발견된 my.cnf(my.ini)
설정을 사용한다.
어느 디렉터리의 파일을 먼저 읽는지는 mysqld --verbose --help
명령어를 통해 확인할 수 있다.
시스템 변수는 약 570개 정도 (MySQL 8.0)
my.cnf
파일은 여러 개의 설정 그룹을 담을 수 있음
mysqldump 프로그램은 그룹 명 [mysqlDump]
mysql 프로그램은 그룹 명 [mysql]
mysqld_safe 프로그램은 그룹 명 [mysqld_safe] and [mysqld]
MySQL 시스템 변수는 적용 범위에 따라 글로벌, 세션 변수로 나눠짐
세션별로 적용되는 시스템 변수의 경우 글로벌 변수뿐만 아니라 세션 변수에도 동시에 존재 한다
Mysql 서버가 기동 중인 상태에서 변경 가능한지에 따라 동적 변수와 정적 변수로 구분 된다
-- GOLBAL 빼면 세션 변수 조회
SHOW GLOBAL VARIABLES LIKE '%%'
설정 값을 변경 하고 싶은 경우에 set
명령어를 통해 시스템 변수 값을 수정할 수 있다.
하지만 my.cnf
파일에 반영되는 것은 아님으로 MySQL을 재시작 한다면 다시 설정을 해야한다.
└영구 적용할려면 my.cnf
파일을 수정해야 한다.
MySQL 8.0 부터는
SET PERSIST
명령으로 시스템 변수를 수정과 동시에 설정 파일로 기록한다.
위 명령어로 수정된 변수는my.cnf
파일이 아닌 별도의 파일에 기록된다. (mysqld-auto.cnf)
현재 실행 중인 변수에 적용을 하지 않고 재시작시 부터 적용을 하고 싶다면
SET PERSIST_ONLY
명령어를 사용하면 된다.
└ 이런 경우는 my.cnf
파일을 직접 수정하는게 좋을듯?
└ 명령어를 사용해서 수정하면 mysqld-auto.cnf
파일에 누가, 언제, 어떤 변수를 수정했는지 기록이 남긴한다
SET PERSIST
명령어를 통해 수정된 내용을 삭제 하고 싶을때는 동일하게 명령어를 통해 삭제하는게 안전하다
RESET PERSIST
를 통해 삭제하면 된다.
SET GLOBAL max_connections=3000;
RESET PERSIST max_connections;
RESET PERSIST IF EXISTS max_connections;
-- 전체 삭제
RESET PERSIST;
MySQL 8.0 부터는 CREATE USER로 계정 생성, GRANT로 권한 부여로 구분되어 실행하도록 변경
계정 생성 시 아래와 같은 옵션을 설정할 수 있다.
-- 일반적으로 많이 사용하는 옵션
CREATE USER `hhsong`@`%`
IDENTIFIED WITH 'mysql_native_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
사용자의 인증 방식과 비밀번호 설정, WITH 뒤에는 반드시 인증 방식을 명시 해야하는데 기본 인증 방식을 사용하고자 한다면 IDENTIFIED BY 'PASSWORD'
형식으로 기입
MySQL은 다양한 인증 방식을 제공하며 아래 4가지가 가장 대표적
REQUIRE
SSL/TLS를 사용하지 않더라고 Caching SHA-2
사용 시 암호화된 채널로 접속 가능
PASSWORD EXPIRE
유효 기간 설정 옵션, 명시하지 않으면 기본값으로 설정 됨 (default_password_lifetime)
+ 4가지 상세 옵션
PASSWORD HISTORY
비밀번호 재사용 여부 옵션
+ 2가지 상세 옵션
PASSWORD REUSE INTERVAL
비밀번호 재사용 금지 기간 옵션
+ 2가지 상세 옵션
PASSWORD REQUIRE
비밀번호 변경 시 현재 비밀번호 기입 여부 옵션
+ 3가지 상세 옵션
ACCOUNT LOCK / UNLOCK
계정 생성 또는 수정 시 계정을 사용하지 못하게 LOCK 여부
비밀번호 금칙어 및 글자 조합에 대한 기능 (validate_password 컴포넌트 이용)
MySQL 8.0 부터 한 계정에 비밀번호를 2개 값을 사용할 수 있는 기능이 추가 되었다.
└ 무 중단으로 운영되고 있는 서버에 대한 비밀번호를 변경할 수 있는 기능
-- 비밀번호 변경과 동시에 기존 사용 중인 비밀번호를 세컨으로 사용
ALTER USER 'hhsong'@'%' IDENTIFIED BY 'input_new_password' RETAIN CURRENT PASSWORD;
-- 세컨 비말번호 삭제
ALTER USER 'hhsong'@'%' DISCARD OLD PASSWORD'
-- 글로벌 (DB or Table 권한이 아님으로 *.*)
GRANT SUPER ON *.* TO 'hhsong'@'%'
-- DB 권한 (Table에 부여할 수 없음으로 db.* or *.*)
GRANT EVENT ON db.* TO 'hhsong'@'%'
-- 테이블 권한(*.* or db.* 도 가능)
GRANT SELECT,INSERT,UPDTAE,DELETE ON db.* TO 'hhsong'@'%'
GRANT SELECT,INSERT,UPDTAE,DELETE ON db.table TO 'hhsong'@'%'
-- 컬럼에 대한 제한
GRANT SELECT,INSERT,UPDTAE(column),DELETE ON db.table TO 'hhsong'@'%'
테이블이나 컬럼 단위의 권한은 잘 사용하지 않는다
전체적인 성능에 영향을 미칠 수 있다. (View를 통해 대체)
MySQL 8.0 권한을 묶어서 역할(Role)을 사용
CREATE ROLE
role_db_read,
role_db_write;
GRANT SELECT ON db.* TO role_db_read;
GRANT INSERT ON db.* TO role_db_write;
GRANT role_db_read TO 'hhsong'@'%';
GRANT role_db_write TO 'hhsong'@'%';
Role을 사용자에게 부여했지만 에러가 발생한다.
└ SET ROLE
명령을 실행해 해당 Role을 활성화 필요
└ 계정 사용자가 재 로그인 시 재 활성화 필요
SET GLOBAL activate_all_roles_on_login=ON;
시스템 설정 변경으로 자동 활성화 처리