sql >> データベース >  >> RDS >> Mysql

MySQL5.7からMySQL8にアップグレードするためのヒント

    MySQL 8.0はすでにかなり前から使用されており、多くのMySQLユーザーはすでにこのバージョンにアップグレードしています。古いバージョンのMySQLをまだ使用している方のために、このブログを紹介し、MySQL8.0のアップグレードプロセスに役立つヒントと情報を共有します。

    バージョンに注意

    ソフトウェアのバージョンは、アップグレードプロセスにおいて非常に重要です。手始めに、1つのメジャーバージョンの違いのみがサポートされています。 MySQL 8.0にアップグレードする前に、MySQL5.7を実行している必要があります。 MySQL 5.6が寿命に近づいており、サポートされなくなることを考えると、これは非常に重要です。 MySQL 5.6を使用するすべての人は、最初にMySQL 5.7にアップグレードしてから、最終的にはMySQL8.0にアップグレードする必要があります。

    MySQL5.7で利用可能な最新バージョンにアップグレードすることを強くお勧めします。このブログを書いている時点では5.7.31でしたが、これは最終的には変更されるため、MySQLのWebサイトでいつでも調べることができます。

    非GA(および非GA)バージョンからのアップグレードはサポートされていないことにも注意してください。非GAバージョンを本番環境で実行することは意味がありませんが、これも明確にしたかったのです。

    片道チケットです

    アップグレードを実行する場合は、アップグレードが完了すると元に戻らないことに注意してください。変更には互換性がなく、MySQL5.7でMySQL8.0のデータディレクトリを使用することはできません。アップグレードの直前にMySQL5.7データのバックアップを取るようにしてください。変更を元に戻す必要がある場合は、MySQL5.7インスタンスでデータを復元できます。また、意外なことに、MySQL8.0.xからMySQL8.0.x + 1へのアップグレードにも互換性がない可能性があり、マイナーバージョンのアップグレードであっても、そのダウングレードを期待しないでください。可能だろう。これは、Oracleの展開サイクルの結果です。以前のバージョンの場合のように最新のGAブランチの機能をフリーズする代わりに、新しい機能、場合によっては互換性のない機能が8.0ブランチの新しいリリースとしてプッシュされます。

    インプレースアップグレードは成功です

    これまで、MySQLのインプレースアップグレードを実行できるとは限りませんでした。場合によっては、データをSQL形式にダンプしてから、新しいバージョンにロードし直す必要がありました。幸い、MySQL 8.0の方が管理しやすく、インプレースアップグレードがサポートされています。 aptupgradeまたはyumupdateを実行するだけで、準備は完了です。アップグレードはさらに便利です。これまでは、mysql_upgradeを実行して、すべてのシステムテーブルが新しいバージョンのMySQLで必要な形式に適切にアップグレードされるようにする必要がありました。 MySQL 8.0では、MySQL 8.0.16以降、これは不要になりました。必要なのは、MySQLプロセスmysqldを開始することだけです。デフォルトでは、アップグレードは、データディクショナリやその他のシステムスキーマに対して実行されます。必要であると判断されました。 --upgrade server optionにさまざまなパラメータを渡すことでこの動作を変更することは可能ですが、ほとんどの場合、この改善の恩恵を受けたいと考えています。

    アップグレードしても安全ですか?

    もちろん、安全にアップグレードするための前提条件があります。 MySQL8.0に安全にアップグレードできるようにするために役立ついくつかの方法を見てみましょう。

    健全性チェック

    何かを試みる前に、MySQL 8.0にアップグレードする前に、既存のMySQL5.7セットアップが健全性チェックリストのすべてのチェックボックスをオンにしていることを再確認する必要があります。 MySQLのドキュメントには、テストするものの広範なリストが記載されています。 MySQLのドキュメントで説明されているため、ここでリストを確認することは意味がありませんが、覚えておくとよい点がいくつかあります。

    まず、パーティショニングは、NDBとInnoDBのみであるエンドでそれを実装するエンジンでのみサポートされるようになりました。すべてのパーティションテーブルがこれらのストレージエンジンのいずれかを使用していること、またはアップグレード前にパーティションを削除していることを確認してください。

    実行したい場合があります

    mysqlcheck -u root -p --all-databases --check-upgrade
    テーブルが適切な形式であることを再確認します。

    実行する必要のある他のチェックもあります。ほとんどすべての新しいMySQLバージョンには、予約語の更新されたリストが付属しており、データベースでそれらを使用していないことを確認する必要があります。外部キー制約名を確認する必要があります。64文字を超えることはできません。 sql_modeの一部のオプションが削除されたため、それらを使用しないようにする必要があります。すでに述べたように、テストするものの広範なリストがあります。

    MySQLシェルから救助へ

    これらすべての条件のテストには非常に時間がかかるため、Oracleは、既存のインストールがMySQL8.0に安全にアップグレードできるかどうかを確認する一連のテストを実行することを目的としたオプションをMySQLシェルに作成しました。手始めに、MySQL Shellがインストールされていない場合は、それを行う必要があります。ダウンロードは、OracleのWebサイトで見つけることができます。設定したら、MySQL5.7に接続してテストを実行できます。それがどのように見えるか見てみましょう:

    [email protected]:~# mysqlsh
    
    MySQL Shell 8.0.21
    
    
    
    Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
    
    Other names may be trademarks of their respective owners.
    
    
    
    Type '\help' or '\?' for help; '\quit' to exit.
    
     MySQL  JS > \c [email protected]
    
    Creating a session to '[email protected]'
    
    Please provide the password for '[email protected]': ****
    
    Save password for '[email protected]'? [Y]es/[N]o/Ne[v]er (default No):
    
    Fetching schema names for autocompletion... Press ^C to stop.
    
    Your MySQL connection id is 71 (X protocol)
    
    Server version: 5.7.31-log MySQL Community Server (GPL)
    
    No default schema selected; type \use <schema> to set one.

    MySQLShellを使用してローカルホスト上のMySQLインスタンスに接続しました。これで、チェックを実行できます。より広範なテストのために、構成ファイルへのパスを渡します:

    MySQL  localhost:33060+ ssl  JS > util.checkForServerUpgrade({"configPath":"/etc/mysql/my.cnf"})

    すると、出力が長くなります。

    The MySQL server at localhost:33060, version 5.7.31-log - MySQL Community
    
    Server (GPL), will now be checked for compatibility issues for upgrade to MySQL
    
    8.0.21...
    
    
    
    1) Usage of old temporal type
    
      No issues found
    
    
    
    2) Usage of db objects with names conflicting with new reserved keywords
    
      No issues found
    
    
    
    3) Usage of utf8mb3 charset
    
      No issues found
    
    
    
    4) Table names in the mysql schema conflicting with new tables in 8.0
    
      No issues found
    
    
    
    5) Partitioned tables using engines with non native partitioning
    
      No issues found
    
    
    
    6) Foreign key constraint names longer than 64 characters
    
      No issues found
    
    
    
    7) Usage of obsolete MAXDB sql_mode flag
    
      No issues found
    
    
    
    8) Usage of obsolete sql_mode flags
    
      No issues found
    
    
    
    9) ENUM/SET column definitions containing elements longer than 255 characters
    
      No issues found
    
    
    
    10) Usage of partitioned tables in shared tablespaces
    
      No issues found
    
    
    
    11) Circular directory references in tablespace data file paths
    
      No issues found
    
    
    
    12) Usage of removed functions
    
      No issues found
    
    
    
    13) Usage of removed GROUP BY ASC/DESC syntax
    
      No issues found
    
    
    
    14) Removed system variables for error logging to the system log configuration
    
      No issues found
    
    
    
    15) Removed system variables
    
      Error: Following system variables that were detected as being used will be
    
        removed. Please update your system to not rely on them before the upgrade.
    
      More information:
    
        https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html#optvars-removed
    
    
    
      log_warnings - is set and will be removed, consider using log_error_verbosity
    
        instead
    
      query_cache_size - is set and will be removed
    
      query_cache_type - is set and will be removed
    
    
    
    16) System variables with new default values
    
      Warning: Following system variables that are not defined in your
    
        configuration file will have new default values. Please review if you rely on
    
        their current values and if so define them before performing upgrade.
    
      More information:
    
        https://mysqlserverteam.com/new-defaults-in-mysql-8-0/
    
    
    
      back_log - default value will change
    
      character_set_server - default value will change from latin1 to utf8mb4
    
      collation_server - default value will change from latin1_swedish_ci to
    
        utf8mb4_0900_ai_ci
    
      event_scheduler - default value will change from OFF to ON
    
      explicit_defaults_for_timestamp - default value will change from OFF to ON
    
      innodb_flush_neighbors - default value will change from 1 (enable) to 0
    
        (disable)
    
      innodb_max_dirty_pages_pct - default value will change from 75 (%)  90 (%)
    
      innodb_max_dirty_pages_pct_lwm - default value will change from_0 (%) to 10
    
        (%)
    
      innodb_undo_log_truncate - default value will change from OFF to ON
    
      innodb_undo_tablespaces - default value will change from 0 to 2
    
      log_error_verbosity - default value will change from 3 (Notes) to 2 (Warning)
    
      max_error_count - default value will change from 64 to 1024
    
      optimizer_trace_max_mem_size - default value will change from 16KB to 1MB
    
      performance_schema_consumer_events_transactions_current - default value will
    
        change from OFF to ON
    
      performance_schema_consumer_events_transactions_history - default value will
    
        change from OFF to ON
    
      slave_rows_search_algorithms - default value will change from 'INDEX_SCAN,
    
        TABLE_SCAN' to 'INDEX_SCAN, HASH_SCAN'
    
      transaction_write_set_extraction - default value will change from OFF to
    
        XXHASH64
    
    
    
    17) Zero Date, Datetime, and Timestamp values
    
      No issues found
    
    
    
    18) Schema inconsistencies resulting from file removal or corruption
    
      No issues found
    
    
    
    19) Tables recognized by InnoDB that belong to a different engine
    
      No issues found
    
    
    
    20) Issues reported by 'check table x for upgrade' command
    
      No issues found
    
    
    
    21) New default authentication plugin considerations
    
      Warning: The new default authentication plugin 'caching_sha2_password' offers
    
        more secure password hashing than previously used 'mysql_native_password'
    
        (and consequent improved client connection authentication). However, it also
    
        has compatibility implications that may affect existing MySQL installations.
    
        If your MySQL installation must serve pre-8.0 clients and you encounter
    
        compatibility issues after upgrading, the simplest way to address those
    
        issues is to reconfigure the server to revert to the previous default
    
        authentication plugin (mysql_native_password). For example, use these lines
    
        in the server option file:
    
    
    
        [mysqld]
    
        default_authentication_plugin=mysql_native_password
    
    
    
        However, the setting should be viewed as temporary, not as a long term or
    
        permanent solution, because it causes new accounts created with the setting
    
        in effect to forego the improved authentication security.
    
        If you are using replication please take time to understand how the
    
        authentication plugin changes may impact you.
    
      More information:
    
        https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues
    
        https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-replication
    
    
    
    Errors:   3
    
    Warnings: 18
    
    Notices:  0
    
    
    
    3 errors were found. Please correct these issues before upgrading to avoid compatibility issues.

    ご覧のとおり、合計21のテストが実行され、チェックにより、MySQL8.0.21には存在しない構成オプションに関連する3つのエラーが見つかりました。テストは非常に詳細です。特に、MySQL構成で構成していない変数のデフォルト値の変更について学習します(したがって、MySQL 8.0をインストールすると、これらの設定が変更されます)。

    失敗したアップグレードのロールバック

    前述のように、アップグレードが完了すると、MySQL8.0からダウングレードすることはできません。幸いなことに、途中で失敗した場合にアップグレードをロールバックできないわけではありません。実際には、前のセクションで説明した問題の1つが検出された場合、半自動的に発生します。必要な唯一の手動アクションは、REDOログを削除し、MySQL 5.7を起動して、アップグレード中に検出された問題に対処することです。次に、低速シャットダウン(innodb_fast_shutdown =0)を実行して、すべてがテーブルスペースに書き込まれていることを確認してから、アップグレードをもう一度試行してください。

    最後のヒント

    MySQL 8.0に付属するデフォルトの動作には、2つの非常に重要な変更があります。

    デフォルトとしてのCaching_sha2_password

    MySQL 8.0ではデフォルトのプラグインになるため、アプリケーションとプロキシがcaching_sha2_password認証プラグインで正しく機能するかどうかを再確認してください。古いアプリケーションが影響を受け、データベースに接続できない可能性があります。もちろん、これを任意の認証プラグイン(たとえば、以前のMySQLバージョンのデフォルトであったmysql_native_passwordなど)に変更できるため、決してブロッカーにはなりません。アップグレードの前にテストすることを忘れないでください。古い認証メカニズムを使用するようにデータベースを再構成しない限り、MySQL8.0やそれに接続できないアプリになってしまうことはありません。

    デフォルトの文字セットとしてのUTF8mb4

    コミュニティでUTF8への変更がどれほど広く議論されているかを考えると、これは驚くべきことではありませんが、それは事実です。MySQL8.0にはデフォルトでUTF8mb4文字セットが付属しています。これには、注意が必要な追加の影響があります。まず、UTF8mb4文字セットを使用すると、データセットのサイズが大きくなる可能性があります。これにより、メモリバッファは、latin1文字セットを使用するデータよりも少量のデータを格納できます。次に、MySQLのパフォーマンスが低下すると予想されます。確かに、オラクルはこの変更の影響を最小限に抑えるという素晴らしい仕事をしましたが、パフォーマンスへの影響がまったくないことを期待することはできません。多少の影響はあります。

    このブログ投稿が、MySQL5.7からMySQL8.0へのアップグレードプロセスの実行に役立つことを願っています。プロセスについてご意見がございましたら、この投稿の下のコメントで共有することをお勧めします。


    1. JDBCOracle-クエリのExplainPlanを取得します

    2. PostgreSQL:タイムスタンプフィールドに「いいね」が付いたデータを選択します

    3. Oracleポートをポート8080から変更します

    4. SQLiteException:データベースから読み取るときに認識されないトークン