MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

ストアドプロシージャや関数内で実行される操作は、どのようにレプリケーションされるのか?

MySQLの標準的なレプリケーション構成において、ストアドプロシージャやストアドファンクション内で実行される通常の操作は、マスターMySQLサーバーからスレーブMySQLサーバーへ複製されます。

さらに、マスター側で通常のDDLステートメントによって作成されたストアドプロシージャやファンクションの定義自体も、スレーブ側へ複製されます。その結果、これらのオブジェクトは両方のサーバー上に存在することになります。

レプリケーションの仕組み

ストアドプロシージャやファンクションの内部で実行される操作が複製されるのは、MySQLがそれらの内部で発生した各DDLイベントを記録し、その記録をスレーブサーバーへ転送するためです。イベントとして記録された内容が順次スレーブに反映されることで、両サーバーの状態が同期されます。

CALLステートメントそのものは複製されない

一方で、ストアドプロシージャを実際に実行するためのCALLステートメントは複製の対象になりません。プロシージャの呼び出しはマスター上でのみ実行され、その内部で発生した個々の操作(イベント)がスレーブへ伝播する仕組みになっています。

次の例では、プロシージャへのCALLは複製されません。実際にはマスター側で一度だけ実行されるためです。

例:プロシージャの作成

mysql> DELIMITER //
mysql> CREATE PROCEDURE myproc()
-> BEGIN
-> DELETE FROM mytable LIMIT 1;
-> END //

例:プロシージャの呼び出し

このプロシージャをマスター側で呼び出しても、呼び出し自体はスレーブに複製されません。

mysql> DELIMITER ;
mysql> CALL myproc();

このように、MySQLのレプリケーションでは「プロシージャの定義」はDDLとして複製されますが、「プロシージャの実行呼び出し」は複製されず、代わりにその内部で発生した個々のイベントがスレーブに反映されるという点を理解しておくことが重要です。

  1. MySQLストアドプロシージャ内で変数を宣言する方法を解説

    MySQLのプロシージャ内で変数を宣言するには? MySQLのストアドプロシージャ内で変数を宣言するには、DECLAREコマンドを使用します。DECLARE文は必ずBEGIN ... ENDブロックの先頭に記述する必要がある点に注意してください。 それでは、実際に変数を宣言するストアドプロシージャを作成してみましょう。 mysql> DELIMITER // mysql> CREATE PROCEDURE DECLARE_VARIABLE_DEMO(IN value int) -> BEGIN -> DECLARE searchValue int;

  2. MySQLストアドプロシージャでDELIMITER(区切り文字)を正しく使って値を挿入する方法

    MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の扱いに戸惑う方は少なくありません。デフォルトではMySQLクライアントがセミコロン「;」を文の終端として解釈するため、プロシージャ内の複数のSQL文が途中で分割されてしまうことがあります。本記事では、区切り文字を正しく変更しながら、ストアドプロシージャを使ってテーブルへ値を挿入する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、データを挿入するためのテーブルを作成します。ここでは学生の名前と姓を格納するテーブルを用意しました。 mysql> create table DemoTable