web-dev-qa-db-ja.com

--log-slave-updatesはオフですが、一部の更新はまだスレーブバイナリログに記録されていますか?

MySQLバージョン5.5.14

document によると、デフォルトでは、スレーブはマスターから受信した更新をバイナリログにnotログします。サーバ。

これが私の設定です。奴隷に:

# egrep 'bin|slave' /etc/my.cnf
relay-log=mysqld-relay-bin
log-bin = /var/log/mysql/mysql-bin
binlog-format=MIXED
sync_binlog = 1
log-bin-trust-function-creators = 1

mysql> show global variables like 'log_slave%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| log_slave_updates | OFF   |
+-------------------+-------+
1 row in set (0.01 sec)

mysql> select @@log_slave_updates;
+---------------------+
| @@log_slave_updates |
+---------------------+
|                   0 |
+---------------------+
1 row in set (0.00 sec)

しかし、スレーブはまだバイナリログへのいくつかの変更をログに記録します。ファイルサイズを見てみましょう。

-rw-rw---- 1 mysql mysql  37M Apr  1 01:00 /var/log/mysql/mysql-bin.001256
-rw-rw---- 1 mysql mysql  25M Apr  2 01:00 /var/log/mysql/mysql-bin.001257
-rw-rw---- 1 mysql mysql  46M Apr  3 01:00 /var/log/mysql/mysql-bin.001258
-rw-rw---- 1 mysql mysql 115M Apr  4 01:00 /var/log/mysql/mysql-bin.001259
-rw-rw---- 1 mysql mysql 105M Apr  4 18:54 /var/log/mysql/mysql-bin.001260

そして、これらのバイナリファイルを mysqlbinlog ユーティリティで読み取るときのサンプルクエリ:

#120404 19:08:57 server id 3  end_log_pos 110324763     Query   thread_id=382435        exec_time=0     error_code=0
SET TIMESTAMP=1333541337/*!*/;
INSERT INTO norep_SplitValues VALUES ( NAME_CONST('cur_string',_utf8'118212' COLLATE 'utf8_general_ci'))
/*!*/;
# at 110324763

私は何か見落としてますか?


@ RolandoMySQLDBAへの返信:

レプリケーションによってこれが発生した場合、同じクエリがリレーログにある必要があります。同じTIMESTAMP(1333541337)のINSERTクエリを含むリレーログを探してください。

リレーログに同じTIMESTAMPを持つそのようなクエリはありません。

リレーログで見つからない場合は、InfobrightがINSERTクエリを投稿しているかどうかを確認してください。その場合、INSERTはスレーブのバイナリログに記録する必要があります。

binaryログをさらに詳しく見ると、ほとんどのクエリがCREATE/INSERT/UPDATE/DROPの「一時的な」テーブルであることがわかります。

# at 123873315
#120405  0:42:04 server id 3  end_log_pos 123873618     Query   thread_id=395373        exec_time=0     error_code=0
SET TIMESTAMP=1333561324/*!*/;
SET @@session.pseudo_thread_id=395373/*!*/;
CREATE TEMPORARY TABLE `norep_tmpcampaign` (
    `campaignid` INTEGER(11)  NOT NULL DEFAULT '0' ,
    `status` INTEGER(11)  NOT NULL DEFAULT '0' ,
    `updated` DATETIME,
         KEY `campaignid` (`campaignid`)             
        )ENGINE=MEMORY
/*!*/;
# at 123873618
#120405  0:42:04 server id 3  end_log_pos 123873755     Query   thread_id=395373        exec_time=0     error_code=0
SET TIMESTAMP=1333561324/*!*/;
DROP TABLE IF EXISTS `norep_tmpcampaign1` /* generated by server */

ここでの「一時的」とは、計算が行われた後にそれらが削除されることを意味します。また、norep_ワイルドカードパターンに一致するステートメントを複製しないようにスレーブに指示します。

replicate-wild-ignore-table=%.norep_%

ただし、バイナリログには例外テーブルがあります。

# at 123828094
#120405  0:37:21 server id 3  end_log_pos 123828495     Query   thread_id=395209        exec_time=0     error_code=0
SET TIMESTAMP=1333561041/*!*/;
INSERT INTO sessions  (SessionId, ApplicationName, Created, Expires,   LockDate, LockId, Timeout, Locked, SessionItems, Fla
gs)  Values('pgv2exo4y4vo4ccz44vwznu0', '/', '2012-04-05 00:37:21', '2012-04-05 00:57:21',   '2012-04-05 00:37:21', 0, 20, 
0, 'AwAAAP////8IdXNlcm5hbWUGdXNlcmlkCHBlcm1pdGlkAgAAAAQAAAAGAAAAAQABAAEA', 0)
/*!*/;

説明:

mysql> desc reportingdb.sessions;
+-----------------+------------------+------+-----+---------------------+-------+
| Field           | Type             | Null | Key | Default             | Extra |
+-----------------+------------------+------+-----+---------------------+-------+
| SessionId       | varchar(64)      | NO   | PRI |                     |       |
| ApplicationName | varchar(255)     | NO   |     |                     |       |
| Created         | timestamp        | NO   |     | 0000-00-00 00:00:00 |       |
| Expires         | timestamp        | NO   |     | 0000-00-00 00:00:00 |       |
| LockDate        | timestamp        | NO   |     | 0000-00-00 00:00:00 |       |
| LockId          | int(11) unsigned | NO   |     | NULL                |       |
| Timeout         | int(11) unsigned | NO   |     | NULL                |       |
| Locked          | bit(1)           | NO   |     | NULL                |       |
| SessionItems    | varchar(255)     | YES  |     | NULL                |       |
| Flags           | int(11)          | NO   |     | NULL                |       |
+-----------------+------------------+------+-----+---------------------+-------+

これらのクエリはすべてMySQLによって投稿されていると確信していますInfobrightではありません:

$ mysql-ib -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48971
Server version: 5.1.40 build number (revision)=IB_4.0.5_r15240_15370(ice) (static)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from information_schema.tables where table_name='sessions';
Empty set (0.02 sec)

マスターのテストテーブルでいくつかのINSERT/UPDATEクエリを試しましたが、スレーブのバイナリログではなく、relayログにコピーされます。

# at 311664029
#120405  0:15:23 server id 1  end_log_pos 311664006     Query   thread_id=10458250      exec_time=0     error_code=0
use testuser/*!*/;
SET TIMESTAMP=1333559723/*!*/;
update users set email2='[email protected]' where id=22
/*!*/;

server idに注意してください。relayログでは、サーバーIDはマスター(1)であり、binaryログ、サーバーIDはスレーブ(この場合は3)です。


@ RolandoMySQLDBAへの返信:Thu Apr 5 10:06:00 ICT 2012

今すぐマスターでCREATE DATABASE quantatest;を実行してください。 CREATE DATABASE quantatest;がスレーブのバイナリログに表示されたかどうかを教えてください。

私が上で言ったように:

マスターのテストテーブルでいくつかのINSERT/UPDATEクエリを試しましたが、バイナリログではなくrelayログにコピーされます

推測できますが、IOスレッドは、バイナリログではなくリレーログにコピーしました。

#120405 10:07:25 server id 1  end_log_pos 347573819     Query   thread_id=10480775      exec_time=0     error_code=0
SET TIMESTAMP=1333595245/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
create database quantatest
/*!*/;

質問はおそらく次のように変更する必要があります:--log-slave-updatesが無効になっているにもかかわらず、スレーブバイナリログにまだログが記録されている更新クエリがあるのはなぜですか?彼らはどこから来たのですか?

最後にいくつかあります:

/*!*/;
# at 27492197
#120405 10:12:45 server id 3  end_log_pos 27492370      Query   thread_id=410353        exec_time=0     error_code=0
SET TIMESTAMP=1333595565/*!*/;
CREATE TEMPORARY TABLE norep_SplitValues (
        value VARCHAR(1000) NOT NULL
      ) ENGINE=MEMORY
/*!*/;
# at 27492370
#120405 10:12:45 server id 3  end_log_pos 27492445      Query   thread_id=410353        exec_time=0     error_code=0
SET TIMESTAMP=1333595565/*!*/;
BEGIN
/*!*/;
# at 27492445
#120405 10:12:45 server id 3  end_log_pos 27492619      Query   thread_id=410353        exec_time=0     error_code=0
SET TIMESTAMP=1333595565/*!*/;
INSERT INTO norep_SplitValues VALUES ( NAME_CONST('cur_string',_utf8'119577' COLLATE 'utf8_general_ci'))
/*!*/;
# at 27492619
#120405 10:12:45 server id 3  end_log_pos 27492695      Query   thread_id=410353        exec_time=0     error_code=0
SET TIMESTAMP=1333595565/*!*/;
COMMIT
/*!*/;
# at 27492918
#120405 10:12:46 server id 3  end_log_pos 27493115      Query   thread_id=410353        exec_time=0     error_code=0
SET TIMESTAMP=1333595566/*!*/;
SELECT `reportingdb`.`selfserving_get_locationad`(_utf8'3' COLLATE 'utf8_general_ci',_utf8'' COLLATE 'utf8_general_ci')
/*!*/;
# at 27493199
#120405 10:12:46 server id 3  end_log_pos 27493353      Query   thread_id=410353        exec_time=0     error_code=0
SET TIMESTAMP=1333595566/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
DROP TEMPORARY TABLE IF EXISTS `norep_SplitValues` /* generated by server */
/*!*/;
2
quanta

Server-idの値は、物事が期待どおりに機能していることを示しています。

各ステートメントは、そのステートメントが発信されたサーバーのserver-idに関連付けられています(これは、特定の設定を使用しない限り、mysqlサーバーがそれ自体からステートメントを複製しないことを認識する方法です)。この関連付けは、レプリケーションを介しても保持されます。

マスター(server-id 1)からのステートメントは複製され、リレーログに保存されてから、スレーブのbinlogに書き込まずにスレーブで実行されることがわかります。 server-id 3(スレーブ)に関連するステートメントは、スレーブデータベースでローカルに実行されている必要があります。これが、binlogに書き込まれる理由です。 log-slave-updatesは、ローカルに書き込まれたクエリを除外しません。

スレーブデータベースのトラフィックを確認する必要があります。これらのクエリを接続して実行しているものが必要です。プロセスリストに何も表示されない(持続的接続がない)場合は、一般ログをオンにするか、tcpdumpなどを使用してmysqlトラフィックをキャプチャしてみてください。

また、増分バックアップ用にスレーブにbinlogが必要だと言います。スレーブbinlogからレプリケーショントラフィックを意図的に除外している場合、特定の時点のバックアップ/リカバリにそれらのbinlogを実際に使用できるようには思えません。すべてのレプリケーショントラフィックが失われます。結局、log-slave-updatesを使用する必要があるのでしょうか?わからない。

-ダン

1
drogart

あなたの質問では、スレーブのバイナリログには

#120404 19:08:57 server id 3  end_log_pos 110324763     Query   thread_id=382435        exec_time=0     error_code=0
SET TIMESTAMP=1333541337/*!*/;
INSERT INTO norep_SplitValues VALUES ( NAME_CONST('cur_string',_utf8'118212' COLLATE 'utf8_general_ci'))
/*!*/;
# at 110324763

レプリケーションによってこれが発生した場合は、同じクエリをリレーログに含める必要があります。同じTIMESTAMP(1333541337)のINSERTクエリを含むリレーログを探してください。

リレーログで見つからない場合は、InfobrightがINSERTクエリを投稿しているかどうかを確認してください。その場合、INSERTはスレーブのバイナリログに記録する必要があります。

PDATE 2012-04-04 14:49 EDT

これが実験です。マスターで次のクエリを実行します。

CREATE DATABASE quantatest;

このステートメントは、マスターで実行した後、スレーブのリレーログに記録する必要があります。通常の状況では、このステートメントは、log-slave-updatesが無効になっているスレーブのバイナリログには表示されません。

あなたの質問によると、log-slave-updatesを無効にすると、このクエリはスレーブのバイナリログに表示されると言います。

今すぐマスターでCREATE DATABASE quantatest;を実行してください。 CREATE DATABASE quantatest;がスレーブのバイナリログに表示されたかどうかを教えてください。

2
RolandoMySQLDBA