MySQLスレーブが「mysql」データベースへの変更を複製しないようにするにはどうすればよいですか?


9

これで説明されているように、「mysql」データベースを複製しないようにスレーブを設定しています SHOW SLAVE STATUS\G;

           Slave_IO_State: Waiting for master to send event
              Master_Host: 127.0.0.1
              Master_User: replication
              Master_Port: 3306
            Connect_Retry: 60
          Master_Log_File: master-bin.000001
      Read_Master_Log_Pos: 1660
           Relay_Log_File: mysql-relay-bin.000004
            Relay_Log_Pos: 478
    Relay_Master_Log_File: master-bin.000001
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          Replicate_Do_DB: 
      **Replicate_Ignore_DB: mysql**
       Replicate_Do_Table: 
   Replicate_Ignore_Table: 
  Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
               Last_Errno: 0
               Last_Error: 
             Skip_Counter: 0
      Exec_Master_Log_Pos: 1660
          Relay_Log_Space: 633
          Until_Condition: None
           Until_Log_File: 
            Until_Log_Pos: 0

今、私がマスターサーバーに行き、そしてを発行するGRANTFLUSH PRIVILEGES

GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';
FLUSH PRIVILEGES;

次に、SLAVEサーバーに戻って発行します。

SHOW GRANTS FOR `foo`@`localhost`;

そして応答を受け取ります:

+-------------------------------------------------------------------------------------------------------------+
| Grants for foo@localhost                                                                                    |
+-------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' |
+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

スレーブがmysqlデータベースの変更を複製しないようにするにはどうすればよいですか?「replicate_ignore_db」で十分だと考えました。

回答:


8

さてさて、さらに数時間の調査の後、私はそれを理解したと思います。これが他の人に役立つ場合に備えて私の答えを追加します。

replicate-ignore-dbドキュメントによると:

ステートメントベースのレプリケーション。 デフォルトのデータベース(つまり、USEによって選択されたデータベース)がdb_nameであるステートメントを複製しないようにスレーブSQLスレッドに指示します。

もちろん、ステートメントベースのレプリケーションがデフォルトであり、私が使用していたものです。そこで、マスターを再起動してbinlog_format=row何が起こるかを確認して、フォーマットを変更しようとしました。サイコロはありません。GRANTSおよび取り消しは、まだレプリケートされていました。

さらに調査MySQLのテーブル上の複製変更に関するドキュメントが明らかに

mysqlデータベースを間接的に変更するステートメントは、binlog_formatの値に関係なく、ステートメントとしてログに記録されます。これは、GRANT、REVOKE、SET PASSWORD、RENAME USER、CREATE(CREATE TABLE ... SELECTを除くすべての形式)、ALTER(すべての形式)、DROP(すべての形式)などのステートメントに関係します。

ガ!わかりましたので、使用mysqlbinlogしてbinlogをチェックしましたが、私のGRANTステートメントはUSE mysqlデータベース呼び出しを発行していませんでした(なぜそれが必要なのですか?)。だからreplicate-ignore-db良心的に声明を無視することはできませんでした。

私の解決策は、my.cnfに追加してmysqlテーブルへの変更をバイナリログから完全に切り取り、サーバーを再起動することでした。魅力のように働いた。binlog-ignore-db=mysql


_do__ignore_句の両方がある場合は、アルゴリズムを慎重に検討してください。トリッキーになります。
リックジェームズ

4

この投稿でのDerek Downeyの回答の問題は、常に同じように機能する(オンまたはオフ)ことです。

ほとんどの許可を複製したいが、これは許可しない状況にある場合、またはmysqlをバウンスしたくない場合(変更したmy.confファイルをロードするために必要)、次のように実行できます。

SET session sql_log_bin = 0;

GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';

SET session sql_log_bin = 1;

最後の行の設定sql_log_bin = 1は非常に重要です。これがないと何も複製されません。


2
他の回答を参照する場合、「上記の回答」ではなく、回答を追加したユーザーの名前で参照する必要があります。解答などの変更は、ダウンなどを投票している回答の順序
マックス・バーノン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.