Comment 2 for bug 587170

Revision history for this message
Ovais Tariq (ovais-tariq) wrote :

This does not seem to be repeatable on Percona Server 5.5.28 when using default replication not the galera one.

Server version: 5.5.28-rel29.1-log Percona Server with XtraDB (GPL), Release rel29.1, Revision 334

-- master server:
master [localhost] {msandbox} (test) > show global variables like 'auto_increment%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 2 |
| auto_increment_offset | 1 |
+--------------------------+-------+
2 rows in set (0.00 sec)

master [localhost] {msandbox} (test) > select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW |
+-----------------+
1 row in set (0.00 sec)

-- slave server:
slave1 [localhost] {msandbox} (test) > show global variables like 'auto_increment%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 2 |
| auto_increment_offset | 2 |
+--------------------------+-------+
2 rows in set (0.00 sec)

-- test case run:

master [localhost] {msandbox} (test) > show tables;
Empty set (0.00 sec)

master [localhost] {msandbox} (test) > create table t (i int);
Query OK, 0 rows affected (0.14 sec)

master [localhost] {msandbox} (test) > insert into t values (1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.16 sec)
Records: 5 Duplicates: 0 Warnings: 0

master [localhost] {msandbox} (test) > ALTER TABLE `t` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
Query OK, 5 rows affected (1.18 sec)
Records: 5 Duplicates: 0 Warnings: 0

master [localhost] {msandbox} (test) > select * from t;
+----+------+
| id | i |
+----+------+
| 1 | 1 |
| 3 | 2 |
| 5 | 3 |
| 7 | 4 |
| 9 | 5 |
+----+------+
5 rows in set (0.00 sec)

slave1 [localhost] {msandbox} (test) > select * from t;
+----+------+
| id | i |
+----+------+
| 1 | 1 |
| 3 | 2 |
| 5 | 3 |
| 7 | 4 |
| 9 | 5 |
+----+------+
5 rows in set (0.00 sec)

And you can see that the AUTO_INC column has identical values.

The binary log contents on the master server are as follows:

*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#130124 10:20:58 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.28-rel29.1-log created 130124 10:20:58
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
+vwAUQ8BAAAAZwAAAGsAAAABAAQANS41LjI4LXJlbDI5LjEtbG9nAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#130124 10:21:08 server id 1 end_log_pos 215 Query thread_id=2 exec_time=0 error_code=0
use test/*!*/;
SET TIMESTAMP=1359019268/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
DROP TABLE `t` /* generated by server */
/*!*/;
# at 215
#130124 10:21:30 server id 1 end_log_pos 305 Query thread_id=2 exec_time=1 error_code=0
SET TIMESTAMP=1359019290/*!*/;
create table t (i int)
/*!*/;
# at 305
#130124 10:21:35 server id 1 end_log_pos 378 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1359019295/*!*/;
BEGIN
/*!*/;
# at 378
# at 418
#130124 10:21:35 server id 1 end_log_pos 418 Table_map: `test`.`t` mapped to number 36
#130124 10:21:35 server id 1 end_log_pos 472 Write_rows: table id 36 flags: STMT_END_F

BINLOG '
H/0AURMBAAAAKAAAAKIBAAAAACQAAAAAAAEABHRlc3QAAXQAAQMAAQ==
H/0AURcBAAAANgAAANgBAAAAACQAAAAAAAEAAf/+AQAAAP4CAAAA/gMAAAD+BAAAAP4FAAAA
'/*!*/;
### INSERT INTO test.t
### SET
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO test.t
### SET
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO test.t
### SET
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO test.t
### SET
### @1=4 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO test.t
### SET
### @1=5 /* INT meta=0 nullable=1 is_null=0 */
# at 472
#130124 10:21:35 server id 1 end_log_pos 499 Xid = 21
COMMIT/*!*/;
# at 499
#130124 10:21:44 server id 1 end_log_pos 637 Query thread_id=2 exec_time=1 error_code=0
SET TIMESTAMP=1359019304/*!*/;
ALTER TABLE `t` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

The important thing to note is that the binary log sets the correct session variables first:
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;

So when the slave thread replays the binary logs, the variables auto_increment_increment and auto_increment_offset for the slave thread match the values set on the master and hence the correct values are used during the ALTER.