ySQL 5.7 업그레이드 준비 방법

ySQL 5.7 업그레이드 준비 방법

2022-06-01 last update

13 minutes reading CentOS MySQL CoreOS Scaling Ubuntu FreeBSD

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에서 이전 섹션에 표시된 모든 동작은 ansql_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 설정을 사용하는 것으로 변경하는 것이 좋습니다.
    만약 기존의 응용 프로그램이 있다면, 점차적으로 업데이트를 완성하기를 원할 수도 있습니다.이러한 권장 사항을 이행하는 데 도움이 될 수 있습니다.
  • Whitelist: 프로그램의 새 부분에서 기본 sql\U 모드 옵션을 사용하도록 합니다.예를 들어, 데이터 캐시를 재구성하기 위해cron 작업을 구축하고 있다면, 이 작업들은 MySQL에 연결된 후 바로 sql\u 모드를 설정할 수 있습니다.기존의 응용 프로그램 코드는 처음에는 기존의 비엄격한 행위를 보존할 수 있다.
  • Blacklist: 응용 프로그램을 전환하는 데 약간의 진전이 있을 때, 새로운 ql\U 모드를 서버의 기본 모드로 설정할 때가 되었습니다.MySQL에 연결할 때 유휴 응용 프로그램을 변경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 서버 팀의 블로그 게시물을 참조하십시오.
  • What’s New in MySQL 5.7? (So Far)
  • What’s New in MySQL 5.7? (First Release Candidate)