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つのDETERMINISTIC
、NO 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は、バイナリロギングが有効になっている場合でもそのような関数の作成を許可します。
4。保存されたルーチンとビューのSQLSECURITY特性。
MySQLはSQL SECURITY
を許可します ストアプログラムまたはビューの作成時に指定するコンテキスト。 SQL SECURITY
特性はDEFINER
として指定できます またはINVOKER
。 SQL_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.
|
概要
この2部構成のブログシリーズでは、データとストアドプログラムの移行を成功させるために処理する必要のある重要な前提条件について説明しました。 ScaleGrid MySQLホスティングは、これらのガイドラインを処理して、データをScaleGridプラットフォームにインポートする際のスムーズなエクスペリエンスを提供します。 MySQLデータ移行に採用した経験とベストプラクティスを私たちと共有してください!