트랜잭션 지원 메타데이터
데이터베이스 서버에서 테이블의 구조 정보와 스토어드 프로그램 등의 정보를 데이터 딕셔너리 또는 메타데이터라고 하는 는데, 5.7버전까지 테이블의 구조를 FRM 파일에 저장하고 일부 스토어드 프로그램 또한 파일(*.TRN ,*TRG ,*PAR, ...)기반으로 관리 했습니다. 하지만 이러한 파일 기반의 메타데이터는 생성 및 변경 작업이 트랜잭션을 지원하지 않기 때문에 테이블의 생성 또는 변경 도중에 MySQL 서버가 비정상적으로 종료되면 일관되지 않은 상태로 남는 문제가 있었습니다. 많은 사용자들이 이 같은 현상을 가리켜 '데이터베이스나 테이블이 깨졌다'라고 표현합니다.
MySQL 8.0 버전부터는 이러한 문제점을 해결하기 위해 테이블의 구조 정보나 스토어드 프로그램의 코드 관련 정보르르 모두 InnoDB의 테이블에 저장하도록 개선됐습니다. MySQL서버가 작동하는 데 기본적으로 필요한 테이블들을 묶어서 시스템 테이블이라고 하는데, 대표적으로 사용자의 인증과 권한에 관현된 테이블들이 있습니다. MySQL 서버 8.0 버전부터는 이런 시스템 테이블을 모두 InnoDB 스토리지 엔진을 사용하도록 개선했으며, 시스템 테이블과 데이터 딕셔너리 정보를 모두 모아서 mysql DB에 저장하고 있습니다. mysql DB는 통째로 mysql.ibd라는 이름의 테이블스페이스에 저장됩니다. 그래서 MySQL 서버의 데이터 디렉터리에 존재하는 mysql.ibd라는 파일은 다른 *.ibd 파일과 함꼐 특별히 주의해야 합니다.
MySQL 8.0 버전부터 데이터 딕셔너리와 시스템 테이블이 모두 트랜잭션 기반의 InnoDB 스토리지엔진에 저장되도록 개선되면서 이제 스키마 변경 작업 중간에 MySQL 서버가 비정상적으로 종료되고 하더라도 스키마 변경이 완전한 성공 또는 완전한 실패로 정리가 됩니다. 기존의 파일 기반 메다테이터를 사용할 때와 같이 작업 진행 중인 상태로 남으면서 문제를 유발하지 않게 개선됬습니다.
MySQL 서버에서 InnoDB 스토리지 엔진을 사용하는 테이블은 메타 정보가 InnoDB 이외의 테이블들에 대해서는 SDI 포맷의 *.sdi 파일이 존재하며, 이파일은 기존의 *.FRM 파일과 동일한 역할을 합니다. 그리고 SDI는 이름 그대로 직렬화(Serailized)를 위한 포맷이므로 InnoDB 테이블들의 구조도 SDI 파일로 변환 할 수 있습니다. ibd2sdi 유틸리티를 이용하면 InnoDB 테이블 스페이스에서 스키마 정보를 추출할 수 있습니다.
linux> idb2sdi mysql_data_dir/mysql.idb > mysql_schema.json
linux > cat mysql_schema.json
mysql DB에 포함된 테이블의 스키마를 JSON 파일로 덤프하고, ibd2sdi 유틸리티로 추출한 데이블의 정보 중에는 Mysql 서버에서 SHOW TABLE 명령으로 학인 할 수 없던 mysql.tables 딕셔너리 데이터를 위한 테이블 구조도 볼 수 있습니다.