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

MySQLレプリケーション:特定のSQLステートメントをスレーブに一時的に複製させない方法

MySQLレプリケーション環境では、マスターで実行されたSQLステートメントが基本的にすべてスレーブへ複製されます。しかし、メンテナンス作業や一時的なデータ修正など、「この操作だけはスレーブに反映させたくない」というケースも少なくありません。そのような場合は、システム変数 sql_log_bin を 0 に設定することで、該当するステートメントをバイナリログに記録せず、結果としてスレーブへの複製を一時的に防止できます。

ここからは、実際にテーブルを作成して動作を確認していきましょう。

1. 検証用テーブルの作成

まず、動作確認のためのサンプルテーブル「SQLStatementsDemo」を作成します。実行するクエリは以下のとおりです。

mysql> create table SQLStatementsDemo
    -> (
    -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> UserName varchar(20)
    -> );
Query OK, 0 rows affected (0.79 sec)

2. テストデータの挿入

続いて、INSERTコマンドでいくつかのレコードを挿入します。

mysql> insert into SQLStatementsDemo(UserName) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into SQLStatementsDemo(UserName) values('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SQLStatementsDemo(UserName) values('Bob');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SQLStatementsDemo(UserName) values('Mike');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SQLStatementsDemo(UserName) values('Sam');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SQLStatementsDemo(UserName) values('David');
Query OK, 1 row affected (0.14 sec)

3. 登録されたデータの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from SQLStatementsDemo;

以下が出力結果です。

+--------+----------+
| UserId | UserName |
+--------+----------+
|      1 | John     |
|      2 | Carol    |
|      3 | Bob      |
|      4 | Mike     |
|      5 | Sam      |
|      6 | David    |
+--------+----------+
6 rows in set (0.00 sec)

4. sql_log_binによるレプリケーションの一時停止

ここからが本題です。SET sql_log_bin = 0; を実行すると、そのセッションで以降に実行されるSQLステートメントはバイナリログに書き込まれなくなり、スレーブには複製されません。まずはUPDATE文でデータを更新してみます。

mysql> SET sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> update SQLStatementsDemo set UserName='Maxwell' where UserId=6;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

さらにINSERTとDELETEも実行して、動作を確認します。

mysql> insert into SQLStatementsDemo(UserName) values('Chris');
Query OK, 1 row affected (0.16 sec)
mysql> select *from SQLStatementsDemo;
+--------+----------+
| UserId | UserName |
+--------+----------+
|      1 | John     |
|      2 | Carol    |
|      3 | Bob      |
|      4 | Mike     |
|      5 | Sam      |
|      6 | Maxwell  |
|      7 | Chris    |
+--------+----------+
7 rows in set (0.00 sec)
mysql> delete from SQLStatementsDemo where UserId=7;
Query OK, 1 row affected (0.10 sec)

これらの操作(UserId=6のユーザー名変更、Chrisの追加と削除)はマスター上では反映されていますが、スレーブ側には伝わりません。

作業が完了したら、忘れずに SET sql_log_bin = 1; を実行して、通常どおりバイナリログへの記録を再開しましょう。

mysql> SET sql_log_bin=1 ;
Query OK, 0 rows affected (0.00 sec)

利用時の注意点

  • セッション単位の設定: sql_log_binはセッションスコープの変数のため、設定は現在の接続にのみ適用され、他の接続には影響しません。
  • 必要な権限: この変数を変更するには、SUPER権限(MySQL 8.0系ではSESSION_VARIABLES_ADMIN権限)が必要です。
  • トランザクション中は変更不可: トランザクションの途中でsql_log_binを変更することはできません。
  • 復旧忘れに注意: 設定を1に戻し忘れると、以降のすべての変更がスレーブに反映されず、データ不整合の原因になります。作業後は必ず元に戻してください。
  1. MySQLコマンドラインクライアント(mysql)の使い方と基本操作

    mysqlは、入力行編集機能を備えたシンプルなSQLシェルです。対話型と非対話型の両方の利用方法をサポートしており、MySQLデータベースを操作する際の基本的なツールとして広く使われています。出力フォーマットの特徴対話モードで使用した場合、クエリの実行結果はASCIIテーブル形式で整形されて表示されます。一方、フィルタのようにパイプやリダイレクトと組み合わせて非対話的に使用した場合は、結果がタブ区切り形式で出力されます。この出力形式は、コマンドラインオプションを使って自由に変更することが可能です。--quickオプションによるメモリの節約大量の結果セットを扱う際にメモリ不足で問題が発生する場合

  2. MySQLクライアントでテキストファイルからSQLステートメントを実行する方法

    MySQLクライアント(mysqlコマンド)は、通常は対話形式で使用されますが、テキストファイルに保存したSQLステートメントを読み込んで実行することも可能です。この記事では、その具体的な方法を解説します。対話形式での基本的な使い方まず、mysqlクライアントを対話的に起動する一般的な方法を見てみましょう。shell> mysql db_nameこのようにコマンドを実行すると、指定したデータベース(db_name)に接続し、対話形式でSQLステートメントを入力できる状態になります。テキストファイルにSQLステートメントを記述する実行したいSQLステートメントをあらかじめテキストファイルに