MySQL Data Dictionary initialization failed. 문제 해결
MySQL을 업데이트한 이후 서비스를 시작하려하면 다음과 같이 문제가 발생하며 실행되지 않는 경우가 있습니다.
문제의 원인 파악을 위해서 MySQL의 로그 파일(/var/log/mysql.log
)을 열어보았습니다.
2019-04-30T12:18:15.152802Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.16) starting as process 3129 2019-04-30T12:18:15.154526Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous. 2019-04-30T12:18:15.154551Z 0 [Warning] [MY-013244] [Server] --collation-server: 'utf8_unicode_ci' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead. 2019-04-30T12:18:15.358253Z 1 [System] [MY-011090] [Server] Data dictionary upgrading from version '80014' to '80016'. 2019-04-30T12:18:15.758363Z 1 [ERROR] [MY-013178] [Server] Execution of server-side SQL statement 'UPDATE mysql.index_partitions ip JOIN mysql.tablespaces ts ON ts.id = ip.tablespace_id JOIN mysql.table_partitions p ON p.id = ip.partition_id JOIN mysql.tables t ON t.id = p.table_id JOIN mysql.indexes i ON i.table_id = t.id SET ts.options=CONCAT(IFNULL(ts.options,''), IF(LOWER(GET_DD_PROPERTY_KEY_VALUE(t.options,'encrypt_type'))='y' , 'encryption=Y;','encryption=N;')) WHERE t.tablespace_id IS NULL AND i.tablespace_id IS NULL AND p.tablespace_id IS NULL AND ts.engine='InnoDB' AND GET_DD_PROPERTY_KEY_VALUE(t.options,'encrypt_type') IS NOT NULL AND GET_DD_PROPERTY_KEY_VALUE(ts.options,'encryption') IS NULL ' failed with error code = 1267, error message = 'Illegal mix of collations (utf8_general_ci,COERCIBLE) and (utf8_unicode_ci,COERCIBLE) for operation '=''. 2019-04-30T12:18:15.771602Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2019-04-30T12:18:15.771832Z 0 [ERROR] [MY-010119] [Server] Aborting 2019-04-30T12:18:17.390228Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.16) MySQL Community Server - GPL.
내용이 조금 많지만 여기에서 대략 문자셋(Character-Set)의 설정란에 의해 문제가 발생한 것이라고 추측해볼 수 있었습니다.
에러 메세지를 해석하면 MySQL 설정 파일 내에서 utf8mb3
라는 명칭을 줄여서 표현한(Alias) utf8
이라는 문자셋은 더 이상 사용되지 않는다는 내용입니다.
해결 방법
해결 방법은 간단합니다. 먼저 MySQL 설정 파일을 편집해야 합니다. 대부분의 경우 다음 경로를 사용합니다 : /etc/my.cnf
[root@localhost ~]# vim /etc/my.cnf
파일이 열렸다면 문자셋 설정 부분에 utf8로 입력된 부분을 모두 찾습니다. 예를 들면 다음과 같습니다.
[mysqld] init_connect="SET collation_connection=utf8_general_ci" init_connect="SET NAMES utf8" collation-server = utf8_unicode_ci character-set-server = utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8
도중에 다른 내용이 끼어있을 수 있으니 character-set
이나 utf8
이 입력된 부분을 잘 살펴보셔야 합니다.
utf8
은 utf8mb3
의 줄임말이자 별명(Alias)입니다. 여기서 mb3은 문자셋이 3바이트의 문자 저장 공간을 사용한다는 것입니다. 마찬가지로 mb4를 사용하면 4바이트를 사용하겠다는 의미입니다.
설정 파일에 선언된 utf8
은 MySQL 이전 버전에서 utf8mb3
을 가리켰지만 이제는 utf8mb4
를 가리키게 되면서 혼란을 방지하고자 서비스 재시작을 막은 것입니다. 따라서 애매모호한 별명을 utf8mb3
또는 utf8mb4
로 명확하게 지정해야 합니다. 여기서는 utf8mb4
로 변경해보겠습니다. (이렇게한다고 데이터베이스 내 데이터가 변동되는 것은 아닙니다.)
위 설정 파일에서 utf8
을 아래와 같이 바꾸었습니다.
[mysqld] init_connect="SET collation_connection=utf8mb4_general_ci" init_connect="SET NAMES utf8mb4" collation-server = utf8mb4_unicode_ci character-set-server = utf8mb4 [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4
변경이 완료되었다면 파일을 저장하고 빠져나옵니다.
이제 서비스를 다시 시작해보도록 하겠습니다. 다음 명령어 중 하나를 입력하여 MySQL Server의 서비스를 재시작해줍니다. (운영체제 및 패키지 버전에 따라 서비스명이 mysqld
가 아닐 수 있음)
[root@localhost ~]# service mysqld restart 또는 [root@localhost ~]# systemctl restart mysqld
참조링크
- Problems upgrading from 8.0.15 to 8.0.16 : https://forums.mysql.com/read.php?11,674344,674344#msg-674344