# MySQL 5.6 주요 서버변수 변경점
중요한 설정 변수의 기본값이 변경되거나 호환성을 위해 설정이 필요한 부분들이 있습니다.
MySQL 5.6은 대체로 확장성을 증대시키는 방향으로 기본 설정들이 변경되었으며 binlog_checksum 과 innodb_checksum_algorithm 등
구 버전과의 연계를 위한 호환 설정도 다수 추가되었습니다. 특히 bufferpool이나 redo log 등에 대해 세부적인 동적 튜닝이 가능해지면서
이에 대한 신규 설정이나 기본값들에 대한 숙지가 필요해졌습니다. 추가되었거나 변경된 부분을 살피고 업그레이드 서버의 워크로드에 맞는
설정 튜닝을 찾아내야 하겠습니다.
# MySQL 5.6 주요 내부 변경점
가장 큰 변경점은 TIME, DATETIME, TIMESTAMP 에 대한 정밀도 표현(ms)이 가능해졌다는 점입니다.
신규 스키마는 DATETIME(숫자1~6) 과 같이 타입선언을 하면 소수점 이하 6자리까지 사용 가능하고,
기존 스키마는 ALTER 등으로 데이터타입의 바이너리포맷이 변경되기 전까지 기존 형식대로 유지됩니다.
MySQL 5.6의 신규 변수인 show_old_temporals를 켠다면 업그레이드 후 스키마 조회 시 바이너리포맷 버전을 확인 가능합니다.
mysql> SET SESSION show_old_temporals = on; #바이너리타입 확인
mysql> CREATE TABLE `frac` (`frac` DATETIME(6)); #소수점 여섯자리까지 표현
# 신규 예약어 추가
SQL에서 중요한 의미를 가지는 단어들을 예약어Reserved Words라고 하는데 이렇게 예약어를
식별자Identifier로 사용한다면 단어를 백쿼트(`)로 묶어줘야 SQL 구문 에러가 발생하지 않습니다.
5.6 에서 신규로 추가된 예약어는 GET, IO_AFTER_GTIDS, IO_BEFORE_GTIDS, MASTER_BIND 의 4개의 단어로,
식별자로 사용하기 위해서는 `GET`, `IO_AFTER_GTIDS`, `IO_BEFORE_GTIDS`, `MASTER_BIND` 로 표기를 해야합니다.
실제로 개발DB를 업그레이드 한 이후 컬럼명이 get 인 테이블을 사용하는 쿼리에서 구문 오류가 발생하여 수정을 한 경우가 있었습니다.
# YEAR(2) 데이터타입 변경
YEAR(2) 년도 뒤 두 자리만을 출력하는 데이터타입이 더 이상 사용되지 않습니다.
MySQL 5.6에서는 신규테이블 생성시 YEAR(2)를 사용한다면 경고 발생 후 YEAR(4)로 전환됩니다
# TIMESTAMP 컬럼 생성 시 자동 속성 생성 변경
MySQL 5.5 까지는 TIMESTAMP 데이터타입이 비표준 방식의 속성을 포함 하였습니다.
5.6 부터는 explicit_defaults_for_timestamp 변수를 사용하여 표준방식으로 TIMESTAMP 컬럼을 처리하도록 변경되었습니다.
(향후 변수는 제거되고 기본 동작으로 변경됩니다.) explicit_defaults_for_timestamp 이 on 이라면,
스키마 생성 시 특별히 명시하지 않는 한 컬럼 속성은 표준방식인 NULL DEFAULT NULL로 지정됩니다.
더 이상 자동적으로 NOT NULL DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP 속성이 붙지 않습니다.
MySQL 5.6 서버 기동 시 explicit_defaults_for_timestamp 가 OFF라면 TIMESTAMP 동작은
구 버전의 비표준 동작을 따르게 되고 다음과 같은 경고가 출력됩니다.