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

MySQL5.7からMySQL8.0への移行-知っておくべきこと

    2018年4月は、MySQLの世界の単なる日付ではありません。 MySQL 8.0がそこでリリースされ、1年以上経った今、おそらくこの新しいバージョンへの移行を検討する時期です。

    MySQL 8.0には重要なパフォーマンスとセキュリティの改善があり、新しいデータベースバージョンへのすべての移行と同様に、データの損失や過度の問題などの難しい問題を回避するために、本番環境に移行する前に考慮すべきことがいくつかあります。ダウンタイム、または移行タスク中のロールバック。

    このブログでは、MySQL 8.0の新機能、廃止された機能、および移行する前に覚えておく必要のある事項について説明します。

    MySQL8.0の新機能

    次に、この新しいMySQLバージョンの公式ドキュメントに記載されている最も重要な機能のいくつかを要約します。

    • MySQLには、データベースオブジェクトに関する情報を格納するトランザクションデータディクショナリが組み込まれています。
    • アトミックDDLステートメントは、データディクショナリの更新、ストレージエンジン操作、およびDDL操作に関連付けられたバイナリログ書き込みを単一のアトミックトランザクションに結合します。
    • MySQLサーバーは、次回の起動時に必要なすべてのアップグレードタスクを自動的に実行して、mysqlスキーマのシステムテーブルと、sysスキーマやユーザースキーマなどの他のスキーマのオブジェクトをアップグレードします。 DBAがmysql_upgradeを呼び出す必要はありません。
    • リソースグループの作成と管理をサポートし、サーバー内で実行されているスレッドを特定のグループに割り当てて、グループで使用可能なリソースに従ってスレッドを実行できるようにします。
    • 暗号化のデフォルトを定義して適用することにより、テーブルの暗号化をグローバルに管理できるようになりました。 default_table_encryption変数は、新しく作成されたスキーマと一般表領域の暗号化のデフォルトを定義します。暗号化のデフォルトは、table_encryption_privilege_check変数を有効にすることで適用されます。
    • デフォルトの文字セットがlatin1からutf8mb4に変更されました。 データ型仕様のデフォルト値としての式の使用をサポートします。これには、BLOB、TEXT、GEOMETRY、およびJSONデータ型のデフォルト値としての式の使用が含まれます。
    • MySQLコンポーネントアーキテクチャを使用するようにエラーログが書き直されました。従来のエラーログは組み込みコンポーネントを使用して実装され、システムログを使用したログはロード可能なコンポーネントとして実装されます。
    • 新しいタイプのバックアップロックにより、オンラインバックアップ中にDMLが許可されると同時に、スナップショットの一貫性が失われる可能性のある操作が防止されます。新しいバックアップロックは、LOCK INSTANCEFORBACKUPおよびUNLOCKINSTANCE構文でサポートされています。これらのステートメントを使用するには、BACKUP_ADMIN特権が必要です。
    • MySQL Serverは、管理接続専用にTCP/IPポートを構成できるようになりました。これは、max_connections接続がすでに確立されている場合でも、通常の接続に使用されるネットワークインターフェイスで許可される単一の管理接続の代替手段を提供します。
    • 非表示のインデックスをサポートします。このインデックスはオプティマイザによって使用されないため、インデックスを削除せずに、クエリのパフォーマンスに対するインデックスの削除の影響をテストできます。 単一のデータベースを使用してSQLとNoSQLの両方のドキュメントアプリケーションを開発するためのドキュメントストア。
    • MySQL 8.0では、通常のSETGLOBALコマンドの代わりにSETPERSISTコマンドを使用して、グローバルで動的なサーバー変数を永続化できます。

    MySQLのセキュリティとアカウント管理

    セキュリティとユーザー管理に関連する多くの改善点があるため、それらを別のセクションにリストします。

    • mysqlシステムデータベースのgrantテーブルがInnoDBテーブルになりました。
    • 新しいcaching_sha2_password認証プラグインは、MySQL8.0のデフォルトの認証方法になりました。 SHA-256パスワードハッシュを実装しますが、接続時の遅延の問題に対処するためにキャッシュを使用します。 mysql_native_passwordプラグインよりも安全なパスワード暗号化を提供し、sha256_passwordよりも優れたパフォーマンスを提供します。
    • MySQLは、特権のコレクションという名前のロールをサポートするようになりました。ロールには、権限の付与と取り消しが可能であり、ユーザーアカウントへの権限の付与と取り消しが可能です。
    • MySQLはパスワード履歴に関する情報を保持するようになり、以前のパスワードの再利用を制限できるようになりました。
    • 管理者は、パスワードが正しくないために連続してログインに失敗しすぎると一時的にアカウントがロックされるように、ユーザーアカウントを構成できます。

    InnoDBの機能強化

    前のポイントと同様に、このトピックに関連する多くの改善点もあるため、それらも別のセクションにリストします。

    • 現在の最大自動インクリメントカウンター値は、値が変更されるたびにREDOログに書き込まれ、各チェックポイントのエンジンプライベートシステムテーブルに保存されます。これらの変更により、現在の最大自動インクリメントカウンター値がサーバーの再起動後も持続します
    • インデックスツリーの破損が発生すると、InnoDBは破損フラグをREDOログに書き込みます。これにより、破損フラグがクラッシュセーフになります。 InnoDBは、メモリ内の破損フラグデータを各チェックポイントのエンジンプライベートシステムテーブルにも書き込みます。リカバリ中に、InnoDBは両方の場所から破損フラグを読み取り、結果をマージしてから、メモリ内のテーブルとインデックスオブジェクトを破損としてマークします。
    • 新しい動的変数innodb_deadlock_detectを使用して、デッドロック検出を無効にすることができます。同時実行性の高いシステムでは、多数のスレッドが同じロックを待機している場合、デッドロックの検出によって速度が低下する可能性があります。場合によっては、デッドロック検出を無効にし、デッドロックが発生したときのトランザクションのロールバックをinnodb_lock_wait_timeout設定に依存する方が効率的な場合があります。
    • InnoDB一時テーブルが、共有一時テーブルスペースibtmp1に作成されるようになりました。
    • mysqlシステムテーブルとデータディクショナリテーブルが、MySQLデータディレクトリのmysql.ibdという名前の単一のInnoDBテーブルスペースファイルに作成されるようになりました。以前は、これらのテーブルはmysqlデータベースディレクトリの個々のInnoDBテーブルスペースファイルに作成されていました。
    • デフォルトでは、UNDOログはMySQLインスタンスの初期化時に作成される2つのUNDOテーブルスペースに存在するようになりました。元に戻すログは、システムテーブルスペースに作成されなくなりました。
    • デフォルトで無効になっている新しいinnodb_dedicated_server変数を使用すると、サーバーで検出されたメモリの量に応じて、InnoDBで次のオプションを自動的に構成できます:innodb_buffer_pool_size、innodb_log_file_size、およびinnodb_flush_method。このオプションは、専用サーバーで実行されるMySQLサーバーインスタンスを対象としています。
    • サーバーがオフラインのときに、innodb_directoriesオプションを使用して、テーブルスペースファイルを新しい場所に移動または復元できます。

    では、この新しいMySQLバージョンで使用する必要がなくなった機能のいくつかを見てみましょう。

    MySQL 8.0で廃止されたものは何ですか?

    次の機能は廃止され、将来のバージョンで削除される予定です。

    • utf8mb3文字セットは非推奨です。代わりにutf8mb4を使用してください。
    • caching_sha2_passwordはMySQL8.0のデフォルトの認証プラグインであり、sha256_password認証プラグインの機能のスーパーセットを提供するため、sha256_passwordは非推奨になりました。
    • validate_passwordプラグインは、サーバーコンポーネントインフラストラクチャを使用するように再実装されました。 validate_passwordのプラグイン形式は引き続き使用できますが、非推奨です。
    • ALTERTABLESPACEおよびDROPTABLESPACEステートメントのENGINE句。
    • PAD_CHAR_TO_FULL_LENGTHSQLモード。
    • AUTO_INCREMENTサポートは、タイプFLOATおよびDOUBLE(および任意のシノニム)の列では非推奨になりました。そのような列からAUTO_INCREMENT属性を削除するか、整数型に変換することを検討してください。
    • UNSIGNED属性は、タイプFLOAT、DOUBLE、およびDECIMAL(および任意の同義語)の列では非推奨になっています。そのような列の代わりに、単純なCHECK制約を使用することを検討してください。
    • FLOAT(M、D)およびDOUBLE(M、D)構文は、タイプFLOATおよびDOUBLE(および任意の同義語)の列の桁数を指定するための非標準のMySQL拡張機能です。この構文は廃止されました。
    • 非標準のCスタイル&&、||、および!標準のSQLAND、OR、およびNOT演算子の同義語である演算子は、それぞれ非推奨になっています。非標準演算子を使用するアプリケーションは、標準演算子を使用するように調整する必要があります。
    • mysql_upgradeクライアントは、mysqlシステムスキーマのシステムテーブルと他のスキーマのオブジェクトをアップグレードする機能がMySQLサーバーに移動されたため、非推奨になりました。
    • mysql_upgrade_infoファイル。データディレクトリが作成され、MySQLのバージョン番号を保存するために使用されます。
    • relay_log_info_fileシステム変数と--master-info-fileオプションは廃止されました。以前は、relay_log_info_repository=FILEおよびmaster_info_repository=FILEが設定されている場合、これらはリレーログ情報ログおよびマスター情報ログの名前を指定するために使用されていましたが、これらの設定は非推奨になりました。リレーログ情報ログとマスター情報ログのファイルの使用は、MySQL8.0のデフォルトであるクラッシュセーフスレーブテーブルに置き換えられました。
    • MySQL_PWD環境変数を使用してMySQLパスワードを指定することは推奨されていません。

    では、このMySQLバージョンで使用を停止する必要のある機能のいくつかを見てみましょう。

    MySQL 8.0で削除されたものは何ですか?

    MySQL8.0では次の機能が削除されました。

    • innodb_locks_unsafe_for_binlogシステム変数が削除されました。 READCOMMITTED分離レベルは同様の機能を提供します。
    • GRANTを使用してユーザーを作成します。代わりに、CREATEUSERを使用してください。この方法に従うと、NO_AUTO_CREATE_USER SQLモードはGRANTステートメントにとって重要ではなくなるため、それも削除され、オプションファイルのsql_modeオプションにこの値が存在するためにmysqldが起動できない場合、サーバーログにエラーが書き込まれるようになりました。
    • GRANTを使用して、特権の割り当て以外のアカウントプロパティを変更します。これには、認証、SSL、およびリソース制限のプロパティが含まれます。代わりに、CREATE USERを使用してアカウント作成時にそのようなプロパティを確立するか、後でALTERUSERを使用してそれらを変更します。
    • IDENTIFIED BY PASSWORD'auth_string'構文(CREATE USERおよびGRANT)。代わりに、CREATEUSERおよびALTERUSERにはIDENTIFIEDWITH auth_plugin AS'auth_string'を使用します。ここで、'auth_string'値は、指定されたプラグインと互換性のある形式です。
    • PASSWORD()関数。さらに、PASSWORD()の削除は、SET PASSWORD ... =PASSWORD('auth_string')構文が使用できなくなったことを意味します。
    • old_passwordsシステム変数。
    • FLUSHQUERYCACHEおよびRESETQUERYCACHEステートメント。
    • これらのシステム変数:query_cache_limit、query_cache_min_res_unit、query_cache_size、query_cache_type、query_cache_wlock_invalidate。
    • これらのステータス変数:Qcache_free_blocks、Qcache_free_memory、Qcache_hits、Qcache_inserts、Qcache_lowmem_prunes、Qcache_not_cached、Qcache_queries_in_cache、Qcache_total_blocks。
    • これらのスレッドの状態:キャッシュされたクエリの権限の確認、クエリのクエリキャッシュの確認、クエリキャッシュエントリの無効化、キャッシュされた結果のクライアントへの送信、クエリキャッシュへの結果の保存、クエリキャッシュロックの待機。
    • tx_isolationおよびtx_read_onlyシステム変数が削除されました。代わりにtransaction_isolationとtransaction_read_onlyを使用してください。
    • .frmファイルが廃止されたため、sync_frmシステム変数が削除されました。
    • secure_authシステム変数と--secure-authクライアントオプションは削除されました。 mysql_options()CAPI関数のMYSQL_SECURE_AUTHオプションが削除されました。
    • log_warningsシステム変数と--log-warningsサーバーオプションが削除されました。代わりにlog_error_verbosityシステム変数を使用してください。
    • sql_log_binシステム変数のグローバルスコープが削除されました。 sql_log_binにはセッションスコープのみがあり、@@GLOBAL.sql_log_binへのアクセスに依存するアプリケーションを調整する必要があります。
    • 未使用のdate_format、datetime_format、time_format、およびmax_tmp_tablesシステム変数が削除されます。
    • GROUPBY句の非推奨のASCまたはDESC修飾子が削除されました。以前にGROUPBY並べ替えに依存していたクエリは、以前のMySQLバージョンとは異なる結果を生成する可能性があります。特定の並べ替え順序を生成するには、ORDERBY句を指定します。
    • パーサーは、SQLステートメントで\NをNULLの同義語として扱わなくなりました。代わりにNULLを使用してください。この変更は、LOADDATAまたはSELECT...INTOOUTFILEで実行されるテキストファイルのインポートまたはエクスポート操作には影響しません。NULLは引き続き\Nで表されます。
    • クライアント側の--sslおよび--ssl-verify-server-certオプションは削除されました。 --ssl=1または--enable-sslの代わりに--ssl-mode=REQUIREDを使用します。 --ssl =0、-skip-ssl、または--disable-sslの代わりに--ssl-mode=DISABLEDを使用します。 --ssl-verify-server-certオプションの代わりに--ssl-mode=VERIFY_IDENTITYを使用します。
    • mysql_install_dbプログラムはMySQLディストリビューションから削除されました。データディレクトリの初期化は、代わりに--initializeまたは--initialize-insecureオプションを指定してmysqldを呼び出すことによって実行する必要があります。さらに、mysql_install_dbによって使用されていたmysqldの--bootstrapオプションが削除され、mysql_install_dbのインストール場所を制御するINSTALL_SCRIPTDIRCMakeオプションが削除されました。
    • mysql_pluginユーティリティが削除されました。別の方法としては、サーバーの起動時に--plugin-loadまたは--plugin-load-addオプションを使用してプラグインをロードするか、実行時にINSTALLPLUGINステートメントを使用してプラグインをロードします。
    • resolveipユーティリティが削除されました。代わりに、nslookup、host、またはdigを使用できます。

    多くの新機能、非推奨機能、および削除された機能があります。詳細については、公式ウェブサイトを確認してください。

    MySQL8.0に移行する前の考慮事項 このMySQLバージョンに移行する前に考慮すべき最も重要なことのいくつかに言及しましょう。

    認証方法

    前述のように、caching_sha2_passwordはデフォルトの認証方法ではないため、アプリケーション/コネクタがそれをサポートしているかどうかを確認する必要があります。そうでない場合は、デフォルトの認証方法とユーザー認証プラグインを「mysql_native_password」に再度変更する方法を見てみましょう。

    デフォルトの認証方法を変更するには、my.cnf構成ファイルを編集し、次の行を追加/編集します。

    $ vi /etc/my.cnf
    
    [mysqld]
    
    default_authentication_plugin=mysql_native_password

    ユーザー認証プラグインを変更するには、特権ユーザーで次のコマンドを実行します。

    $ mysql -p
    
    ALTER USER ‘username’@’hostname’ IDENTIFIED WITH ‘mysql_native_password’ BY ‘password’;

    とにかく、古い認証は間もなく廃止される可能性があるため、これらの変更は永続的な解決策ではありません。将来のデータベースのアップグレードのためにそれを考慮に入れる必要があります。

    ここでは、役割も重要な機能です。ロールに割り当てる個々の特権を減らし、そこに対応するユーザーを追加することができます。

    たとえば、マーケティングチームと開発者チームの新しい役割を作成できます。

    $ mysql -p
    
    CREATE ROLE 'marketing', 'developers';

    これらの新しい役割に特権を割り当てます:

    GRANT SELECT ON *.* TO 'marketing';
    
    GRANT ALL PRIVILEGES ON *.* TO 'developers';

    次に、ユーザーに役割を割り当てます。

    GRANT 'marketing' TO 'marketing1'@'%';
    
    GRANT 'marketing' TO 'marketing2'@'%';
    
    GRANT 'developers' TO 'developer1'@'%';
    そしてそれだけです。次の権限があります:

    SHOW GRANTS FOR 'marketing1'@'%';
    
    +-------------------------------------------+
    
    | Grants for [email protected]%                   |
    
    +-------------------------------------------+
    
    | GRANT USAGE ON *.* TO `marketing1`@`%`    |
    
    | GRANT `marketing`@`%` TO `marketing1`@`%` |
    
    +-------------------------------------------+
    
    2 rows in set (0.00 sec)
    
    SHOW GRANTS FOR 'marketing';
    
    +----------------------------------------+
    
    | Grants for [email protected]%                 |
    
    +----------------------------------------+
    
    | GRANT SELECT ON *.* TO `marketing`@`%` |
    
    +----------------------------------------+
    
    1 row in set (0.00 sec)
    文字セット

    新しいデフォルトの文字セットはutf8mb4であるため、変更されるため、デフォルトの文字セットを使用していないことを確認する必要があります。

    いくつかの問題を回避するには、my.cnf構成ファイルでcharacter_set_server変数とcollat​​ion_server変数を指定する必要があります。

    $ vi /etc/my.cnf
    
    [mysqld]
    
    character_set_server=latin1
    
    collation_server=latin1_swedish_ci

    MyISAMエンジン

    MySQLスキーマのMySQL特権テーブルがInnoDBに移動されます。テーブルengine=MyISAMを作成すると、以前と同じように機能しますが、実行中のMySQLサーバーにMyISAMテーブルをコピーすると、検出されないため機能しません。

    パーティショニング ネイティブパーティショニングをサポートしていないストレージエンジンを使用するパーティション化されたテーブルがあってはなりません。次のクエリを実行して、この点を確認できます。

    $ mysql -p
    
    SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

    テーブルのエンジンを変更する必要がある場合は、次を実行できます:

    ALTER TABLE table_name ENGINE = INNODB;
    アップグレードチェック

    最後のステップとして、check-upgradeフラグを使用してmysqlcheckコマンドを実行し、すべてが正常に見えるかどうかを確認できます。

    $ mysqlcheck -uroot -p --all-databases --check-upgrade
    
    Enter password:
    
    mysql.columns_priv                                 OK
    
    mysql.component                                    OK
    
    mysql.db                                           OK
    
    mysql.default_roles                                OK
    
    mysql.engine_cost                                  OK
    
    mysql.func                                         OK
    
    mysql.general_log                                  OK
    
    mysql.global_grants                                OK
    
    mysql.gtid_executed                                OK
    
    mysql.help_category                                OK
    
    mysql.help_keyword                                 OK
    
    mysql.help_relation                                OK
    
    mysql.help_topic                                   OK
    
    mysql.innodb_index_stats                           OK
    
    mysql.innodb_table_stats                           OK
    
    mysql.password_history                             OK
    
    mysql.plugin                                       OK
    
    mysql.procs_priv                                   OK
    
    mysql.proxies_priv                                 OK
    
    mysql.role_edges                                   OK
    
    mysql.server_cost                                  OK
    
    mysql.servers                                      OK
    
    mysql.slave_master_info                            OK
    
    mysql.slave_relay_log_info                         OK
    
    mysql.slave_worker_info                            OK
    
    mysql.slow_log                                     OK
    
    mysql.tables_priv                                  OK
    
    mysql.time_zone                                    OK
    
    mysql.time_zone_leap_second                        OK
    
    mysql.time_zone_name                               OK
    
    mysql.time_zone_transition                         OK
    
    mysql.time_zone_transition_type                    OK
    
    mysql.user                                         OK
    
    sys.sys_config                                     OK
    
    world_x.city                                       OK
    
    world_x.country                                    OK
    
    world_x.countryinfo                                OK
    
    world_x.countrylanguage                            OK
    アップグレードを実行する前に確認することがいくつかあります。詳細については、MySQLの公式ドキュメントを確認してください。

    アップグレード方法

    MySQL5.7を8.0にアップグレードするにはさまざまな方法があります。アップグレードをインプレースで使用することも、新しいバージョンでレプリケーションスレーブを作成することもできるため、後で昇格させることができます。

    ただし、アップグレードする前に、ステップ0でデータをバックアップする必要があります。バックアップには、システムデータベースを含むすべてのデータベースが含まれている必要があります。したがって、問題が発生した場合は、できるだけ早くロールバックできます。

    利用可能なリソースに応じて、カスケードレプリケーションを作成する別のオプションMySQL 5.7-> MySQL 8.0-> MySQL 5.7。したがって、新しいバージョンをプロモートした後、問題が発生した場合は、プロモートできます。古いバージョンに戻ったスレーブノード。ただし、データに問題があると危険な場合があるため、その前にバックアップを作成する必要があります。

    使用する方法には、新しいMySQL8.0バージョンを使用してアプリケーションが問題なく動作していることを確認するためのテスト環境が必要です。

    結論

    MySQL 8.0のリリースから1年以上経ち、古いMySQLバージョンの移行を検討し始めますが、幸いなことに、MySQL 5.7のサポートの終了は2023年であるため、移行計画を作成してアプリケーションの動作をテストする時間があります。急ぐことなく。移行後の問題を回避するには、そのテスト手順に時間をかける必要があります。


    1. Integrated Security=TrueとIntegratedSecurity=SSPIの違いは何ですか?

    2. postgresqlポートの混乱5433または5432?

    3. 完全なmysqlmysqldumpファイルから単一のテーブルを復元できますか?

    4. OracleのRRとYY