MySQL 8.0에서 추가된 모든 기능

MySQL 8.0에서 추가된 모든 기능 – SQL DDL

Estimated reading: 3 minutes 81 views

1. 인스턴트 ADD COLUMN

[원본제공링크 1]

인스턴트 ADD COLUMN 기능은 테이블에 새로운 컬럼을 추가할 때 데이터 복사나 테이블 잠금 없이 즉시 적용되도록 해줍니다. MySQL 8.0에서는 ALTER TABLE ... ADD COLUMN 문을 사용하여 대용량 테이블에서도 빠르게 컬럼을 추가할 수 있으며, 서비스 중단 없이 스키마 변경이 가능합니다. 이는 테이블 구조를 변경할 때 발생하던 오랜 대기 시간을 크게 줄여줍니다.

예시:

ALTER TABLE employees
ADD COLUMN middle_name VARCHAR(50);

이 명령은 employees 테이블에 middle_name 컬럼을 즉시 추가하며, 테이블의 데이터나 구조를 재작성하지 않습니다.

2. 인스턴트 RENAME COLUMN

[원본제공링크 1]

인스턴트 RENAME COLUMN 기능은 테이블의 컬럼 이름을 즉시 변경할 수 있도록 합니다. ALTER TABLE ... RENAME COLUMN 문을 사용하여 테이블 재작성이나 데이터 복사 없이 컬럼의 이름을 변경할 수 있습니다. 이는 스키마 변경 작업을 더 효율적으로 만들어주며, 애플리케이션의 필드명 변경 등에 유용합니다.

예시:

ALTER TABLE employees
RENAME COLUMN middle_name TO middle_initial;

이 명령은 employees 테이블에서 middle_name 컬럼의 이름을 middle_initial로 즉시 변경합니다.

3. 인스턴트 RENAME TABLESPACE

[원본제공링크 1]

인스턴트 RENAME TABLESPACE 기능은 테이블스페이스의 이름을 데이터 이동이나 복사 없이 즉시 변경할 수 있게 해줍니다. ALTER TABLESPACE ... RENAME TO 문을 사용하여 스토리지 작업 없이도 테이블스페이스의 이름을 변경할 수 있으며, 스토리지 관리와 데이터베이스 유지보수를 더 편리하게 합니다.

예시:

ALTER TABLESPACE ts_old_name
RENAME TO ts_new_name;

이 명령은 ts_old_name이라는 테이블스페이스의 이름을 ts_new_name으로 즉시 변경합니다.

참고 - DDL ALGORITHM=INSTANT
1,2,3번 항목은 인스턴트 방식의 DDL 옵션에 대한 설명입니다. ALGORITHM=INSTANT는 8.0.12에 추가된 새로운 DDL 적용 알고리즘입니다.

SQL 문법에서는 아무 차이가 없어보이는데, 만약 명시적으로 인스턴트 옵션을 적용하려면 ALGORITHM=INSTANT라고 추가하면 됩니다. 하지만 INSTANT라는 옵션을 넣지 않아도 기본적으로 INSTANT 옵션이 적용됩니다. 이 방식이 제일 뛰어난 방식이고, 현재 디폴트값이기도 합니다. 
INSTANT 옵션을 적용할 수 없는 경우라면 INPLACE를 적용하고, INPLACE조차 적용할 수 없다면 COPY방식을 사용하게 됩니다. 

INSTANT 옵션을 적용하여 테이블을 수정하면, 데이터 영역은 전혀 건드리지 않고, 데이터 딕셔너리상의 메타데이터만 수정하게 됩니다. 하여 매우 빠르게 작업이 완료됩니다. 테이블이 아무리 크더라도, 컬럼 추가 작업 같은 것은 그야말로 엔터치자 마자 완료됩니다. 

주의
다큐멘테이션등에 DML과의 호환성이 있다고 소개되고 있지만 현실적으로는 주의할 부분이 있습니다. 이 옵션을 적용하더라도 짧은 순간이지만 Metadata Lock을 잡아야 합니다. DDL작업보다 먼저 Metadata Lock을 잡고있는 작업이 있다면, 그 작업 완료되기 전까지 DDL 작업이 시작되지 않습니다.
기존의 INPLACE로 인덱스 추가한다거나 할때와 마찬가지 이야기인데, 인덱스 생성중에 DML이 가능하지만, 인덱스 생성을 시작하기 전에, 예를 들어 데이터가 엄청 많은 어떤 고객을 대상으로 대량의 UPDATE를 수행해서 1분가량 테이블이 수정되고 있는 중이라치면, 그 UPDATE 작업이 끝나기 전에는 인덱스 생성이 시작되지 않습니다. 헌데, 이때 1 row만 update하는 소량의 update가 들어오면 metadata lock을 대기하게 됩니다. 
 즉, 대량의 UPDATE중 -> 영향 받지 않는 row update 가능
     인덱스 생성중 -> 아무 row나 update 가능
하지만, 대량의 UPDATE중 -> 인덱스 생성은 UPDATE 완료까지 대기함 -> 이때 실행된 소규모 UPDATE 또한 연달아서 metadata lock 대기함
이 과정이 INSTANT 옵션으로 ADD COLUMN하는 경우에도 똑같이 발생합니다. DDL 작업의 시작과, 끝에 짧게나마 metadata lock이 필요하다는 점에 유의가 필요합니다. 자세한 내용은 별도의 문서에서 다루겠습니다. 

4. RESTART 문

[원본제공링크 1]

RESTART 문SQL 세션 내에서 MySQL 서버를 재시작할 수 있게 해주는 명령어입니다. 이를 통해 관리자는 셸 접속 없이도 서버 설정 변경 후 즉시 재시작하여 변경 사항을 적용할 수 있습니다. 이는 운영 환경에서의 가용성을 높이고 유지보수를 간소화하는 데 도움이 됩니다.

예시:

RESTART;

이 명령은 현재 MySQL 서버를 안전하게 종료하고 즉시 다시 시작합니다.
간단한 명령인데, 실행하는 그 순간 바로 DB가 재기동되어버리므로 주의가 필요합니다. 단, 시스템 권한으로 SHUTDOWN이 있어야 실행할 수 있습니다.

5. SET PERSIST 문

[원본제공링크 1]

SET PERSIST 문글로벌 시스템 변수를 영구적으로 설정할 수 있게 해주는 기능입니다. 이 명령을 사용하면 서버 재시작 후에도 설정이 유지되며, my.cnf 파일을 직접 수정할 필요가 없습니다. 이는 실시간으로 구성 변경을 적용하고 서버를 재시작하더라도 설정이 유지되도록 합니다.

예시:

SET PERSIST max_connections = 500;

이 명령은 max_connections 변수를 500으로 설정하고, 서버를 재시작하더라도 해당 값이 유지됩니다.
이 명령은 my.cnf파일에 변경사항을 직접적으로 적용해주는 것은 아니고, datadir 내에 mysqld-auto.cnf라는 파일에 변경 사항을 적용합니다.

예시
[mysql@MySQL8032 datadir]$ cat mysqld-auto.cnf 
{"Version": 2, "mysql_dynamic_parse_early_variables": {"max_connections": {"Value": "500", "Metadata": {"Host": "localhost", "User": "mysql", "Timestamp": 1732349868916650}}}}


6. LOCK TABLES 상태에서 RENAME TABLES

[원본제공링크 1]

MySQL 8.0에서는 LOCK TABLES로 테이블을 잠근 상태에서도 RENAME TABLE 명령을 실행할 수 있게 되었습니다. 이는 동시성 제어와 데이터 무결성을 유지하면서 테이블의 이름을 변경할 수 있음을 의미합니다. 이 기능은 원자적이고 안전한 테이블 교체 작업 등에 활용됩니다.

예시:

LOCK TABLES old_table WRITE, new_table WRITE;

RENAME TABLE old_table TO backup_table, new_table TO old_table;

UNLOCK TABLES;

이 예시에서는 테이블의 이름을 교체하여 데이터 스왑 작업을 수행합니다.

7. PK 없는 테이블 사용 금지 옵션

[원본제공링크 1]

PK 없는 테이블 사용 금지 옵션이란, 기본 키(PK)가 없는 테이블의 생성을 금지하는 설정입니다. 시스템 변수 sql_require_primary_keyON으로 설정하면, 모든 테이블은 반드시 기본 키를 가져야 하며, 그렇지 않으면 테이블 생성이나 변경이 거부됩니다. 이는 복제나 클러스터링 환경에서 기본 키가 없는 테이블로 인한 문제를 예방하는 데 유용합니다.

예시:

SET PERSIST sql_require_primary_key = ON;

이 명령은 기본 키 없는 테이블의 생성을 금지합니다.

예시
mysql> create table minhang.nopktest ( a int);
ERROR 3750 (HY000): Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting.

8. 캐릭터셋 변환을 in-place 작업으로

[원본제공링크 1 2]

MySQL 8.0에서는 테이블의 캐릭터셋(Character Set)과 콜레이션(Collation)을 데이터 복사 없이 In-Place 방식으로 변경할 수 있게 되었습니다. 이는 대용량 테이블에서도 빠르고 효율적으로 문자 세트를 변경할 수 있음을 의미하며, 서비스 중단 시간을 최소화합니다.

예시:

ALTER TABLE messages
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

이 명령은 messages 테이블의 문자 세트를 utf8mb4, 콜레이션을 utf8mb4_unicode_ci로 In-Place 방식으로 변환합니다.
조건을 만족하는 경우에만 적용이 가능하니 위에 Doc1 링크 참고바랍니다.

9. DATAFILE 절 없이 CREATE TABLESPACE

[원본제공링크 1]

DATAFILE 절 없이 CREATE TABLESPACE 기능은 데이터파일(Datafile)을 명시하지 않고도 테이블스페이스를 생성할 수 있게 해줍니다. 이를 통해 MySQL은 자동으로 데이터파일의 위치와 크기를 관리하며, DBA는 테이블스페이스 생성 시 더 간단한 문법으로 작업할 수 있습니다. 이 기능은 스토리지 관리의 복잡성을 줄이고 표준적인 설정으로 테이블스페이스를 손쉽게 생성하는 데 도움이 됩니다.

예시:

-- 기존 방식
CREATE TABLESPACE my_tablespace
ADD DATAFILE 'my_tablespace.ibd'
ENGINE=InnoDB;

-- 신규 방식
CREATE TABLESPACE test_space ENGINE=InnoDB;

이 명령은 test_space라는 테이블스페이스를 생성하며, 데이터파일의 경로와 크기는 MySQL이 자동으로 결정합니다.

10. CREATE RESOURCE GROUP

[원본제공링크 1 2]

CREATE RESOURCE GROUP 문은 서버의 리소스 사용을 제어하기 위한 리소스 그룹(Resource Group)을 생성할 수 있게 해줍니다. 리소스 그룹은 CPU 및 I/O 자원에 대한 할당량과 우선순위를 지정하여 특정 세션이나 스레드가 사용하는 자원을 제어합니다. 이를 통해 워크로드 관리성능 최적화에 도움이 됩니다.

예시:

CREATE RESOURCE GROUP rg_high_priority
  TYPE = USER
  VCPU = 0-3
  THREAD_PRIORITY = 10;

이 명령은 rg_high_priority라는 리소스 그룹을 생성하며, CPU 코어 0부터 3까지 사용하고, 스레드 우선순위가 10인 그룹을 만듭니다.

11. ALTER RESOURCE GROUP

[원본제공링크 1 2]

ALTER RESOURCE GROUP 문은 기존의 리소스 그룹의 속성을 변경할 수 있게 해줍니다. 이를 통해 리소스 할당을 동적으로 조정하여 서버의 부하나 운영 상황에 따라 자원을 효율적으로 관리할 수 있습니다.

예시:

ALTER RESOURCE GROUP rg_high_priority
  VCPU = 0-5;

이 명령은 rg_high_priority 리소스 그룹이 사용할 수 있는 CPU 코어 범위를 0부터 5까지로 확장합니다.

12. DROP RESOURCE GROUP

[원본제공링크 1 2]

DROP RESOURCE GROUP 문은 기존의 리소스 그룹을 삭제할 수 있게 해줍니다. 사용하지 않는 리소스 그룹을 제거하여 시스템 자원을 정리하고 관리의 복잡성을 줄일 수 있습니다.

예시:

DROP RESOURCE GROUP rg_high_priority;

이 명령은 rg_high_priority 리소스 그룹을 삭제합니다.

참고
리소스그룹이라는 기능 자체가 이번에 MySQL 8.0에서 추가된 기능입니다. 리소스 그룹은 데이터베이스 관리자가 특정 작업이나 세션에 CPU 등의 시스템 리소스를 제어하고 할당할 수 있게 해줍니다. 이를 통해 중요한 작업에 더 많은 리소스를 배정하거나, 비중요 작업의 리소스 사용을 제한하여 시스템의 성능과 안정성을 향상시킬 수 있습니다.

13. 기본값으로 표현식 사용 가능

[원본제공링크 1]

MySQL 8.0.13부터 컬럼의 기본값을 단순한 리터럴 값뿐만 아니라 표현식(expression)으로 설정할 수 있습니다. 이를 통해 열의 기본값을 더 동적으로 설정할 수 있으며, 다양한 비즈니스 로직을 기본값으로 구현할 수 있습니다. 예를 들어, 현재 날짜나 특정 계산식을 기본값으로 설정할 수 있습니다.

예시:

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATETIME DEFAULT NOW(),
    quantity INT,
    unit_price DECIMAL(10,2),
    total_price DECIMAL(10,2) DEFAULT (quantity * unit_price)
);

이 예시에서는 order_date 컬럼의 기본값을 NOW() 함수로 지정하여 현재 날짜와 시간을 자동으로 입력합니다. 또한 total_price 컬럼의 기본값을 (quantity * unit_price)로 지정하여 수량과 단가의 곱을 자동 계산합니다.

14. CHECK 제약 조건

[원본제공링크 1]

MySQL 8.0.16부터 CHECK 제약 조건이 완전히 지원됩니다. CHECK 제약 조건은 테이블의 컬럼에 데이터 무결성 검증을 위한 조건을 부여할 수 있게 해줍니다. 입력되는 데이터가 지정된 조건을 만족해야만 저장되며, 이를 통해 데이터의 일관성과 정확성을 유지할 수 있습니다.

예시:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    CHECK (age >= 18)
);

이 예시에서는 age 컬럼에 대해 CHECK 제약조건을 설정하여 나이가 18세 이상인 경우에만 데이터를 입력할 수 있도록 합니다.

15. ALTER TABLE … ADD CONSTRAINT

[원본제공링크 1]

ALTER TABLE … ADD CONSTRAINT 문은 기존 테이블에 새로운 제약조건을 추가할 수 있게 해줍니다. 이를 통해 기본 키, 외래 키, 고유 키, CHECK 제약조건 등을 테이블 생성 후에도 추가할 수 있습니다.

예시:

ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

이 명령은 orders 테이블에 customer_id 컬럼을 customers 테이블의 customer_id 컬럼과 연결하는 외래 키 제약조건을 추가합니다.

16. ALTER TABLE … DROP CONSTRAINT

[원본제공링크 1]

ALTER TABLE … DROP CONSTRAINT 문은 테이블에 설정된 기존 제약조건을 제거할 수 있게 해줍니다. 이를 통해 데이터 모델 변경이나 제약조건 수정이 필요할 때 유연하게 대응할 수 있습니다.

예시:

ALTER TABLE employees
DROP CONSTRAINT chk_age;

이 명령은 employees 테이블에서 이름이 chk_ageCHECK 제약조건을 삭제합니다.

17. ALTER TABLE … ALTER CONSTRAINT

[원본제공링크 1]

ALTER TABLE … ALTER CONSTRAINT 문은 기존 제약조건의 속성을 변경할 수 있게 해줍니다. 예를 들어, 검사 조건을 수정하거나 제약조건을 활성화/비활성화할 수 있습니다.

예시:

ALTER TABLE employees
ALTER CONSTRAINT chk_age CHECK (age >= 21);

이 명령은 employees 테이블의 chk_age 제약조건을 수정하여 나이가 21세 이상인 경우에만 데이터를 입력할 수 있도록 변경합니다.

참고
14 ~ 17번의 ALTER TABLE ... ADD/DROP/ALTER CONSTRAINT 구문의 경우 기존에도 존재하던 SQL 문법입니다.
이 부분에 특별히 언급된 이유는 Check 제약조건 기능 추가되었기 때문으로 보입니다.
레퍼런스 매뉴얼에서 5.7과 8.0의 동일한 ALTER TABLE 페이지를 확인해보면, 5.7에서는 CHECK 제약조건은 무시된다 라는식의 언급이 있습니다.

18. CLONE INSTANCE

[원본제공링크 1]

CLONE INSTANCE는 MySQL 8.0.17에서 도입된 새로운 기능으로, MySQL 서버 인스턴스 전체를 복제하여 새로운 인스턴스를 빠르게 생성할 수 있게 해줍니다. 이를 통해 데이터베이스 복제, 백업 및 복구, 테스트 환경 구축 등을 효율적으로 수행할 수 있습니다.

예시:

CLONE INSTANCE FROM 'source_user'@'source_host':3306
IDENTIFIED BY 'password';

이 명령은 source_host의 MySQL 인스턴스를 현재 서버로 복제합니다. source_user는 복제에 필요한 권한을 가진 사용자이며, IDENTIFIED BY 절을 통해 인증합니다.
여기서 복제라는 것은, Replication 연결을 해주는 것은 아니고, 여기서 지정한 원본 DB에서 백업을 받아다가, 명령어 입력한 DB쪽에 풀어줍니다. 즉, 1회성으로 현재 시점의 복제본을 구성해 주는 것이며, 원본DB쪽에는 BACKUP_ADMIN 권한이 있는 계정이 생성되어 있어야 합니다.

Leave a Comment



이 문서 공유

MySQL 8.0에서 추가된 모든 기능 – SQL DDL

링크 복사

CONTENTS