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 */
/*!*/;
Server-idの値は、物事が期待どおりに機能していることを示しています。
各ステートメントは、そのステートメントが発信されたサーバーのserver-idに関連付けられています(これは、特定の設定を使用しない限り、mysqlサーバーがそれ自体からステートメントを複製しないことを認識する方法です)。この関連付けは、レプリケーションを介しても保持されます。
マスター(server-id 1)からのステートメントは複製され、リレーログに保存されてから、スレーブのbinlogに書き込まずにスレーブで実行されることがわかります。 server-id 3(スレーブ)に関連するステートメントは、スレーブデータベースでローカルに実行されている必要があります。これが、binlogに書き込まれる理由です。 log-slave-updatesは、ローカルに書き込まれたクエリを除外しません。
スレーブデータベースのトラフィックを確認する必要があります。これらのクエリを接続して実行しているものが必要です。プロセスリストに何も表示されない(持続的接続がない)場合は、一般ログをオンにするか、tcpdumpなどを使用してmysqlトラフィックをキャプチャしてみてください。
また、増分バックアップ用にスレーブにbinlogが必要だと言います。スレーブbinlogからレプリケーショントラフィックを意図的に除外している場合、特定の時点のバックアップ/リカバリにそれらのbinlogを実際に使用できるようには思えません。すべてのレプリケーショントラフィックが失われます。結局、log-slave-updatesを使用する必要があるのでしょうか?わからない。
-ダン
あなたの質問では、スレーブのバイナリログには
#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はスレーブのバイナリログに記録する必要があります。
これが実験です。マスターで次のクエリを実行します。
CREATE DATABASE quantatest;
このステートメントは、マスターで実行した後、スレーブのリレーログに記録する必要があります。通常の状況では、このステートメントは、log-slave-updates
が無効になっているスレーブのバイナリログには表示されません。
あなたの質問によると、log-slave-updates
を無効にすると、このクエリはスレーブのバイナリログに表示されると言います。
今すぐマスターでCREATE DATABASE quantatest;
を実行してください。 CREATE DATABASE quantatest;
がスレーブのバイナリログに表示されたかどうかを教えてください。