–log-slave-updates是closures的,但有些更新仍然logging到从属二进制日志中?

MySQL版本5.5.14

根据该文档 ,从属服务器在默认情况下不会将从主服务器接收到的任何更新logging到其二进制日志中。

这是我的configuration。 在奴隶上:

# 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) 

但奴隶仍然logging一些更改二进制日志,让我们看看文件大小:

 -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查询。 在这种情况下,应将INSERTlogging在从站的二进制日志中。

仔细查看二进制日志,我发现几乎所有的查询都是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_% 

但是二进制日志中有一个exception表:

 # 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查询与主表testing表,它被复制到中继日志,而不是奴隶的二进制日志:

 # 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 ,在中继日志中,服务器ID是主服务器(1),在二进制日志中,服务器ID是从服务器(在这种情况下是3)。


回复@RolandoMySQLDBA:星期四4月5日10:06:00 ICT 2012

运行CREATE DATABASE quantatest; 现在请在法师面前。 告诉我,如果CREATE DATABASE quantatest; 出现在奴隶的二进制日志中。

正如我上面所说:

我一直在尝试一些INSERT / UPDATE查询与主表testing表,它被复制到中继日志,而不是二进制日志

你可以猜测,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 /*!*/; 

这个问题可能必须改变为: 为什么一些更新查询仍然logging到奴隶二进制日志al --log-slave-updates日志--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 */ /*!*/; 

服务器ID值显示事情正在按预期工作,对我来说。

每个语句都与服务器的服务器ID相关联(这是一个MySQL服务器如何知道不从自身复制语句,除非你使用特定的设置)。 即使通过复制也可以保持这种关联。

您可以看到主服务器(服务器标识1)的语句仅被复制,存储在中继日志中,然后在从服务器上执行,而不写入从服务器的二进制日志。 您看到的与服务器标识3(从服务器)关联的语句必须在从服务器上本地执行。 这就是为什么他们被写入binlogs。 日志 – 从属更新不会排除本地写入的查询。

你应该看看你的奴隶数据库的stream量:一定要连接和执行这些查询。 如果你在进程列表中没有看到任何东西(没有永久连接),你可以尝试打开通用日志或使用tcpdump或其他东西来捕获mysql通信。

另外:你说你想要从站上的binlog进行增量备份。 如果您有意将复制stream量从您的从站二进制日志中排除,那听起来并不像您实际上有能力使用这些二进制日志进行时间点备份/恢复。 您将错过所有的复制stream量。 所以也许你应该使用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查询。 在这种情况下,应将INSERTlogging在从站的二进制日志中。

更新2012-04-04 14:49 EDT

这是一个实验。 在主服务器上运行以下查询:

 CREATE DATABASE quantatest; 

在主设备上执行之后,该声明必须着陆在从设备上的中继日志中 。 在正常情况下,这个语句不应该出现在禁止log-slave-updates的Slave二进制日志中。

根据你的问题,在你禁用了log-slave-updates ,你说这个查询会出现在Slave的二进制日志中。

运行CREATE DATABASE quantatest; 现在请在法师面前。 告诉我,如果CREATE DATABASE quantatest; 出现在奴隶的二进制日志中。