
ySQL 5.7 업그레이드 준비 방법
Oracle MySQL 팀의 글
소개
MySQL 5.7은 최신 오픈 소스 데이터베이스 후보입니다.그것은 새로운 확장성을 제공합니다. 변경을 원해야 합니다.
그 중의 변화를 돋보이게 하기 위해 신축성이 크게 개선되었다.하이엔드에서 MySQL 5.7은 48개의 핵심 서버에서 선형으로 확장됩니다.로우엔드에서 MySQL 5.7은 512MB의 Digital Ocean Droplet에서 즉시 실행할 수 있습니다(MySQL 5.6의 구성 변경이 없으면 불가능합니다).
MySQL 서버의 새로운 피크 성능은 초당 640K개가 넘는 조회이며, InnoDB 메모리 엔진과 직접 대화하는memcached API가 유지됩니다over 1.1 million requests per second.

그러나 달리기
mysql_upgrade
를 서두르기 전에 준비를 마쳤다는 것을 확보해야 한다.이 강좌는 당신이 이 점을 할 수 있도록 도와줄 수 있습니다.데이터 무결성 변경, 예제 포함
MySQL 5.7의 주요 변화 중 하나는 데이터의 완전성이 개선되었고 합자 심층 개발자와 DBA의 기대에 부합된다는 것이다.이전에 MySQL은 부정확한 값을 가장 가까운 정확한 값으로 조정했지만 새 기본값에서 오류가 반환됩니다.
다음은 MySQL 5.7에서 바로 사용할 수 있도록 수정해야 하는 다섯 가지 질의 예입니다.응용 프로그램에서 이러한 비헤이비어를 사용합니까?
1) 기호 없는 열에 음수 삽입
서명하지 않은 테이블을 만들려면 다음과 같이 하십시오.
CREATE TABLE test (
id int unsigned
);
음수 값을 삽입합니다.이전 비헤이비어:
INSERT INTO test VALUES (-1);
Query OK, 1 row affected, 1 warning (0.01 sec)
MySQL 5.7:INSERT INTO test VALUES (-1);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
2) 0으로 나누기
테스트 테이블을 만들려면 다음과 같이 하십시오.
CREATE TABLE test2 (
id int unsigned
);
0으로 나누어 보십시오.이전 비헤이비어:
INSERT INTO test2 VALUES (0/0);
Query OK, 1 row affected (0.01 sec)
MySQL 5.7:INSERT INTO test2 VALUES (0/0);
ERROR 1365 (22012): Division by 0
3) 문자열 20자를 10자 열에 삽입
10자 열을 포함하는 테이블을 만듭니다.
CREATE TABLE test3 (
a varchar(10)
);
더 긴 문자열을 삽입해 보십시오.이전 비헤이비어:
INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected, 1 warning (0.00 sec)
MySQL 5.7:INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
ERROR 1406 (22001): Data too long for column 'a' at row 1
4) 비표준 제로 날짜를datetime 열에 삽입
datetime 열이 있는 테이블을 만듭니다.
CREATE TABLE test3 (
a datetime
);
삽입0000-00-00 00:00:00
.이전 비헤이비어:
INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)
MySQL 5.7:INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'a' at row 1
5) GROUP BY를 사용하고 불명확한 열을 선택합니다.
설명이
GROUP BY
의 일부가 아니며 집합 함수(예를 들어 MIN
또는 MAX
를 적용하지 않았을 때 이런 상황이 발생합니다.이전 비헤이비어:
SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
+----+------------+-------------+
| id | invoice_id | description |
+----+------------+-------------+
| 1 | 1 | New socks |
| 3 | 2 | Shoes |
| 5 | 3 | Tie |
+----+------------+-------------+
3 rows in set (0.00 sec)
MySQL 5.7:SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'invoice_line_items.description' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
sql\u 모드 설정 동작 이해
MySQL에서 이전 섹션에 표시된 모든 동작은 an
sql_mode
의 영향을 받습니다.이 기능은 MySQL 4.1(2004)에 처음 나타나지만 기본적으로 컴파일되지 않았습니다.MySQL 5.7에서는 기본적으로 다음 모드를 사용합니다.
ONLY_FULL_GROUP_BY
STRICT_TRANS_TABLES
NO_ENGINE_SUBSTITUTION
NO_AUTO_CREATE_USER
STRICT_TRANS_TABLES
도 더욱 엄격해졌고 이전에 모드 ERROR_FOR_DIVISION_BY_ZERO
, NO_ZERO_DATE
, NO_ZERO_IN_DATE
에서 지정한 행위를 사용했다.이러한 모드 이름 중 하나를 클릭하여 MySQL 매뉴얼에 액세스하여 자세한 내용을 확인하십시오.
전환 방법에 대한 건의
Wordpress, Drupal 또는 Magento의 최신 버전을 사용한다면 좋은 소식은 아무것도 할 필요가 없다는 것입니다.이 프로그램들은 MySQL의
sql_mode
기능을 알고 있으며, MySQL에 연결할 때 호환되는 옵션을 설정합니다.현재 새로운 응용 프로그램을 구축하고 있다면, 기존 MySQL 5.6 서버의 설정을 MySQL 5.7에서 제공하는
sql_mode
설정을 사용하는 것으로 변경하는 것이 좋습니다.만약 기존의 응용 프로그램이 있다면, 점차적으로 업데이트를 완성하기를 원할 수도 있습니다.이러한 권장 사항을 이행하는 데 도움이 될 수 있습니다.
sql_mode
하면 이전의 행동을 유지할 수 있습니다.단일 문장을 바탕으로 MySQL은 오류를 낮추기 위해 IGNORE
수정자를 지원합니다.예: INSERT IGNORE INTO my_table . . .
sql_mode
.이 방면의 좋은 용례는 내부 사용자가 모든 내용에 대해 베타 테스트를 실시하여 더욱 점진적인 과도를 실현하도록 허용하는 것이다.단계 1 - 경고 또는 오류가 발생한 비호환 문장 찾기
우선, 현재 조회에 경고나 오류가 발생했는지 확인합니다.이것은 매우 유용합니다. 여러 쿼리의 동작이 5.6의 경고에서 5.7의 오류로 변경되었기 때문에 업그레이드하기 전에 경고를 캡처할 수 있습니다.
MySQL
performance_schema
은 진단 기능으로 MySQL 5.6 이상에서 기본적으로 사용됩니다.performance_schema
를 사용하면 서버에서 발생한 모든 오류나 경고를 되돌려주는 검색어를 만들 수 있습니다.MySQL 5.6+ 쿼리 보고서 오류 또는 경고 문구:
SELECT
`DIGEST_TEXT` AS `query`,
`SCHEMA_NAME` AS `db`,
`COUNT_STAR` AS `exec_count`,
`SUM_ERRORS` AS `errors`,
(ifnull((`SUM_ERRORS` / nullif(`COUNT_STAR`,0)),0) * 100) AS `error_pct`,
`SUM_WARNINGS` AS `warnings`,
(ifnull((`SUM_WARNINGS` / nullif(`COUNT_STAR`,0)),0) * 100) AS `warning_pct`,
`FIRST_SEEN` AS `first_seen`,
`LAST_SEEN` AS `last_seen`,
`DIGEST` AS `digest`
FROM
performance_schema.events_statements_summary_by_digest
WHERE
((`SUM_ERRORS` > 0) OR (`SUM_WARNINGS` > 0))
ORDER BY
`SUM_ERRORS` DESC,
`SUM_WARNINGS` DESC;
MySQL 5.6+ 쿼리 보고서 오류 문구:SELECT
`DIGEST_TEXT` AS `query`,
`SCHEMA_NAME` AS `db`,
`COUNT_STAR` AS `exec_count`,
`SUM_ERRORS` AS `errors`,
(ifnull((`SUM_ERRORS` / nullif(`COUNT_STAR`,0)),0) * 100) AS `error_pct`,
`SUM_WARNINGS` AS `warnings`,
(ifnull((`SUM_WARNINGS` / nullif(`COUNT_STAR`,0)),0) * 100) AS `warning_pct`,
`FIRST_SEEN` AS `first_seen`,
`LAST_SEEN` AS `last_seen`,
`DIGEST` AS `digest`
FROM
performance_schema.events_statements_summary_by_digest
WHERE
`SUM_ERRORS` > 0
ORDER BY
`SUM_ERRORS` DESC,
`SUM_WARNINGS` DESC;
2단계 - MySQL 5.6의 동작을 MySQL 5.7과 유사하게 만들기
또한 MySQL 5.6을 사용하여 5.7과 유사하게 테스트를 실행할 수 있습니다.
작성자, MySQL 팀에서 온 Morgan Tocker는 한 개GitHub project와 한 개sample configuration file를 사용할 수 있습니다.MySQL 5.6의 기본값을 사용하면 응용 프로그램이 엄격하지 않은 행동에 의존할 가능성을 없앨 수 있습니다.
이 파일은 매우 짧기 때문에 우리도 여기에 포함한다.
# This makes a MySQL 5.6 server behave similar to the new defaults
# in MySQL 5.7
[mysqld]
# MySQL 5.7 enables more SQL modes by default, but also
# merges ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, NO_ZERO_IN_DATE
# into the definition of STRICT_TRANS_TABLES.
# Context: http://dev.mysql.com/worklog/task/?id=7467
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE"
# The optimizer changes the default from 10 dives to 200 dives by default
# Context: http://mysqlserverteam.com/you-asked-for-it-new-default-for-eq_range_index_dive_limit/
eq_range_index_dive_limit=200
# MySQL 5.7 contains a new internal server logging API.
# The setting log_warnings is deprecated in 5.7.2 in favour of log_error_verbosity.
# *But* the default fo log_warnings also changes to 2 as well:
log_warnings=2
# MySQL 5.7.7 changes a number of replication defaults
# Binary logging is still disabled, but will default to ROW when enabled.
binlog_format=ROW
sync_binlog=1
slave_net_timeout=60
# InnoDB defaults to the new Dynamic Row format with Barracuda file format.
# large_prefix is also enabled, which allows for longer index values.
innodb_strict_mode=1
innodb_file_format=Barracuda
innodb_large_prefix=1
innodb_purge_threads=4 # coming in 5.7.8
innodb_checksum_algorithm=crc32
# In MySQL 5.7 only 20% of the pool will be dumped,
# But 5.6 does not support this option
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1
# These two options had different names in previous versions
# (binlogging_impossible_mode,simplified_binlog_gtid_recovery)
# This config file targets 5.6.23+, but includes the 'loose' modifier to not fail
# prior versions.
loose-binlog_error_action=ABORT_SERVER
loose-binlog_gtid_recovery_simplified=1
# 5.7 enable additional P_S consumers by default
# This one is supported in 5.6 as well.
performance-schema-consumer-events_statements_history=ON
(선택 사항) 3단계 - 세션당 sql\U 모드 변경
때때로 단계적으로 서버를 테스트하거나 업그레이드해야 합니다.새 SQL 모드를 사용하도록 MySQL 서버 범위의 구성 파일을 변경하는 대신 각 세션을 기반으로 변경할 수도 있습니다.다음은 예입니다.
CREATE TABLE sql_mode_test (a int);
SQL 모드가 설정되지 않았습니다.set sql_mode = '';
INSERT INTO sql_mode_test (a) VALUES (0/0);
Query OK, 1 row affected (0.01 sec)
보다 엄격한 SQL 모드 세트:set sql_mode = 'STRICT_TRANS_TABLES';
INSERT INTO sql_mode_test (a) VALUES (0/0);
ERROR 1365 (22012): Division by 0
업그레이드 준비 완료
이제 MySQL 5.7로 업그레이드할 준비가 되었음을 확신해야 합니다.MySQL’s official upgrade guide에 따라 스위치를 뒤집다.
결론
MySQL 5.7은 현대 응용 프로그램의 기본 구성과 데이터 무결성을 개선하는 데 큰 걸음을 내디뎠다.우리는 본문이 당신의 순조로운 이행을 도울 수 있기를 바랍니다.
5.7의 모든 변경 사항에 대한 개요(지금까지)는 MySQL 서버 팀의 블로그 게시물을 참조하십시오.