본문 바로가기
MySQL별책부록

MySQL Server bootstrapping and dictionary initialization

by 모모레 2016. 12. 2.

http://mysqlserverteam.com/mysql-server-bootstrapping-and-dictionary-initialization/

이 문서는 위 블로그의 내용을 번역하여 기재한 것입니다. 



MySQL Ver. 8.0부터 MySQL 내부의 data dictionary에 대한 관리 방법및 내용이 많이 변경되었다. 또한, 처음 설치 시 초기화 하는 방법도 변경되었다. 

이 글에서는 각 버젼 벌로 설치 방법이 어떻게 변경되고, data dictionary 에서 관리되는 메타 데이터가 어떻게 관리되는지 그 방법에 대해 알아보도록 하자. 


MySQL 서버는 2가지의 다른 방법으로 실행할 수 있다. 


1. 초기화를 위한 실행 : MySQL 서버가 Data Dictionary 가 없는 상태에서 새로운 Data Dictionary를 만들기 위해 실행되는 것을 말한다. 

이 모드에서는 Data Dictionary를 만들고 나면 바로 작업을 끝내고 실행이 완료된다. 


2. 초기화를 하지 않는 일반적인 MySQL 서버 시작 : MySQL 서버가 사용하는 Data Dictionary가 있는 상태에서 프로세스를 실행하여 MySQL을 시작하는 것을 말한다. 

이 모드에서 서버는 Data Dictionary가 잘 있는지만 확인할 뿐 새로 생성하지는 않는다. 


[ MySQL Ver. 5.6 에서 mysql_install_db 와 파일 기반의 Data Dictionary ]

MySQL Ver. 5.6에서는 초기화를 하기 위해 펄로 작성된 mysql_install_db라는 프로그램을 사용했다. 이 스크립트는 --bootstrap 이라는 옵션으로 mysqld를 실행하면서 

쿼리로 만들어진 데이터를 실행하여 Data Dictionary 를 생성했다. 




이와 같은 초기화 방식은 다음과 같은 문제점을 가지고 있다. 

-- 실행 방식이 독립적이지 못하다. 즉, 스크립트 파일도 있어야 하고, 해당 스크립트를 실행할 실행 파일도 있어야 한다. 

-- 여러개의 스크립트를 관리하기 복잡하다. 

-- 여러 OS 및 플랫폼에 맞게 초기화 하는 스크립트가 존재해야 한다. 


[ MySQL Ver. 5.7 에서 mysqld --initialize 옵션을 사용한 실행과 파일 기반의 Data Dictionary ] 

MySQL Ver. 5.7에서는 이전에 초기화에서 존재하던 단점중의 몇가지를 수정했다. mysql_install_db를 사용하지 않는다. 

대신에, mysqld 에 --initialize 옵션을 추가하여 해당 옵션으로 초기화 작업을 할 수 있게 수정하였다. 이전에 여러 파일로 되어있던 SQL 파일들은 mysqld의 내부에 포함하여 

외부에서 보이지 않게 하였다. 




그래서, MySQL Ver. 5.7에서는 다음과 같은 내용이 수정되었다. 

-- SQL 스크립트 파일을 mysqld 내부에 넣어서 봉합했기 때문에 이제 하나의 파일만 관리하는게 가능해 졌다. 

-- mysqld 컴파일시에 SQL 스크립트 파일이 같이 컴파일되어서 바이너리로 관리되기 때문에 쉽게 변경되어 문제가 될 가능성이 없다. 

-- 펄 스크립트를 이제 사용하지 않기 때문에 여러 플래폼에서 실행 시 발생되었던 문제는 사라지게 되었다. 


[ MySQL Ver. 8.0 에서 mysqld --initialize 옵션을 사용한 실행과 트랜잭션 기반의 Data Dictionary ]

개념적으로 MySQL Ver. 8.0 에서 실행되는 초기화 작업은 MySQL Ver. 5.7과 유사하다. 그러나, 관리하는 내부 구조 측면에서는 변경되는 것이 많다. 

MySQL Ver. 8.0 부터 Data Dictionary 테이블을 일반적인 테이블과 같이 SQL 구문을 이용하여 표현하지 않고 추상화 하여 표현한다.이를 통해 

이전보다 버전에 따른 Data Dictionary 업그레이드를 쉽게 할 수 있게 지원할 예정이다. 




위에서 설명한 것처럼 트랜잭션 기반의 Data Dictionary는 이전의 파일 기반 Data Dictionary와 다른 방법으로 초기화된다. 

-- 테이블에 대한 메터 정보는 InnoDB 테이블안에 저장된다. frm 파일에 있는 내용은 이제 사용되지 않을것이다. 

-- Data Dictionary 테이블들은 C++ 오브젝트 인스턴스로 정의되어 관리된다. 그래서 내부 데이터및 기타 정보들이 관리된다. 그래서 

초기화 시에 해당 오브젝트에 대한 정보로 만들어진 쿼리들이 생성되어 사용된다. 


[ 미래의 bootstrapping ]

MySQL Ver. 8.0에서 Data Dictionary를 추상화로 관리하듯이 Data Dictionary 가 아닌 다른 시스템 관련 테이블들도 이와 같이 추상화 형태로 즉, C++의 오브젝트 형태로 관리될것이다. 

그리고 그렇게 관리됨으로서 다음과 같은 효과를 기대할 수 있다. 


-- 주어진 Collation으로 비교 함수를 사용하여 시스템 데이터를 비교할 수 있다. 

-- 올바른 유형 및 필드 수, 올바른 색인 등을 사용하여 테이블에서 레코드를 가져 오기위한 키를 자동으로 생성합니다.

-- MySQL 업그레이드 시에 훨씬 더 최적화된 지원이 가능하다. 

-- Data Dictionary 및 시스템 테이블 및 정보를 이전보다 훨씬 강력하게 보호할 수 있다.