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

mysqldumpのベストプラクティス:パート2 –移行ガイド

    mysqldumpのベストプラクティスの2番目の最後の部分では、MySQLデータベースからのストアドプログラムオブジェクトとビューの移行とインポートを処理する方法について説明します。大規模なMySQLデータベースのダンプおよび復元操作を成功させるための前提条件の詳細については、この2部構成のブログシリーズの最初の部分を確認してください。

    ストアドプロシージャ、関数、トリガーのインポート

    デフォルトでは、mysqldumpはビューとトリガーをインポートします。ただし、プロシージャ、関数、およびイベントはインポートされません。プロシージャと関数をインポートするには、--routines オプションを指定する必要があります。イベントをインポートするには、--events オプションを指定する必要があります。

    1。トリガーのインポート

    Mysqldumpは、デフォルトでデータベース内のすべてのトリガーをダンプしようとします。テーブルのtriggersをダンプできるようにするため 、TRIGGERが必要です テーブルの特権。ダンプユーザーがこの特権を持っていない場合、トリガーはスキップされ、mysqldumpはエラーをスローしません。したがって、宛先データベースにインポートされたトリガーが表示されなくても驚かないでください。

    2。イベントのインポート

    イベントをインポートするには、--eventsを指定する必要があります mysqldumpユーティリティの呼び出し中のオプション。このオプションにはEVENTが必要です それらのデータベースの特権。繰り返しになりますが、mysqldumpを呼び出すときに–eventオプションを指定した場合でも、dumpユーザーがこれらの特権を持っていない場合、mysqldumpはサイレントにイベントをスキップします。

    3。関数とストアドプロシージャのインポート

    ルーチンをインポートするには、--routinesを指定する必要があります mysqldumpユーティリティの呼び出し中のオプション。このオプションには、global selectが必要です 特権。この場合でも、--routinesを指定した場合でも、dumpユーザーがこれらの権限を持っていない場合、mysqldumpはサイレントに関数とプロシージャをスキップします。 mysqldumpを呼び出すときのオプション。

    3.1非決定論的関数のインポート

    データを変更するストアドプログラムは、再現可能な結果が得られない場合、非決定論的と呼ばれます。 rand()関数の例。ソースとレプリカで異なるデータが生成される可能性があるため、複製されたセットアップでこのような関数を使用することは特に困難です。このような可能性を制御するために、バイナリログが有効になっている場合、MySQLは関数の作成に特定の制限を課します。

    デフォルトでは、CREATE FUNCTION 受け入れられるステートメント、少なくとも1つのDETERMINISTICNO SQL 、またはREADS SQL DATA 明示的に指定する必要があります。それ以外の場合はエラーが発生します:

    ERROR 1418 (HY000) at line 181: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_funable)
    >

    したがって、関数がソースで決定論的として宣言されておらず、宛先でバイナリロギングが有効になっている場合、ダンプの復元中に上記のエラーが表示されます。したがって、関数の決定論的性質を事前に理解することが重要です。関数が決定論的であることが確実な場合は、log_bin_trust_function_creatorsをオンにする必要があります。 復元操作の前に、宛先で構成します。有効にすると、MySQLは、バイナリロギングが有効になっている場合でもそのような関数の作成を許可します。

    mysqldumpのベストプラクティス:パート2-移行ガイドクリックしてツイート

    4。保存されたルーチンとビューのSQLSECURITY特性。

    MySQLはSQL SECURITYを許可します ストアプログラムまたはビューの作成時に指定するコンテキスト。 SQL SECURITY 特性はDEFINERとして指定できます またはINVOKERSQL_SECURITYの場合 コンテキストはDEFINER 、ルーチンは、ルーチンDEFINERで指定されたアカウントの特権を使用して実行されます 句。コンテキストがINVOKERの場合 、ルーチンは、それを呼び出すユーザーの特権を使用して実行されます。デフォルト値はDEFINERです。 。

    保存されたルーチンまたはビューを復元する場合は、適切な権限を使用して、定義者のユーザーアカウントが宛先データベースに存在することを確認する必要があります。そうしないと、復元中に障害が発生します。

    ビューに関連する例を使用してこれを示しましょう。

    ビューV1とV2で次のように定義されているとします。

    CREATE definer=admin@'%' VIEW mydb.V1 AS SELECT * FROM solution_table;
    CREATE definer=admin@'%' VIEW mydb.V2 AS SELECT * FROM V1 where num1=10;

    ビューはデフォルトでmysqldumpによってダンプされ、宛先にユーザー'admin'がない場合、復元操作中に以下のエラーが発生することに注意してください。

    Command failed with error - ERROR 1449 (HY000) at line 206 in file: '/mysql_data/mysqldump/sqldump_1582457155758.sql': The user specified as a definer ('admin'@'%') does not exist.

    ユーザーが存在することを確認するだけで十分ではないことに注意してください。ただし、ユーザーはビューを実行するための適切な権限を持っている必要があります。たとえば、ユーザーがadmin@'%'の場合 宛先に存在しますが、SELECTがありません mydbデータベースに対する権限がある場合、エラーメッセージが表示されます:

    '/mysql_data/mysqldump/sqldump_1582456858033.sql':View 'mydb.V2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them.

    フルマネージドMySQLソリューションに興味がありますか?

    ScaleGridなどのDBaaSプロバイダーがMySQLデータベースの管理にどのように役立つかについて詳しくは、MySQLページをご覧ください。 ScaleGridを使用すると、データベースの管理ではなく、製品の開発に集中できるようになります。

    概要

    この2部構成のブログシリーズでは、データとストアドプログラムの移行を成功させるために処理する必要のある重要な前提条件について説明しました。 ScaleGrid MySQLホスティングは、これらのガイドラインを処理して、データをScaleGridプラットフォームにインポートする際のスムーズなエクスペリエンスを提供します。 MySQLデータ移行に採用した経験とベストプラクティスを私たちと共有してください!


    1. CloverDXでODBCデータを変換する

    2. DISTINCT <>GROUPBYの場合

    3. Android:データベース行を削除した後にカーソルを再クエリしてListViewを更新するにはどうすればよいですか?

    4. 1つの選択列の値を保存して、次の列に使用することは可能ですか?