1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

WL#3228 (NDB) : RBR using different table defs on slave/master

This patch adds the ability to store extra field metadata in the table
map event. This data can include pack_length() or field_lenght() for
fields such as CHAR or VARCHAR enabling developers to add code that
can check for compatibilty between master and slave columns. More 
importantly, the extra field metadata can be used to store data from the
master correctly should a VARCHAR field on the master be <= 255 bytes 
while the same field on the slave is > 255 bytes. 

The patch also includes the needed changes to unpack to ensure that data
which is smaller on the master can be unpacked correctly on the slave.

WL#3915 : (NDB) master's cols > slave

Slave starts accepting and handling rows of master's tables which have more columns.
The most important part of implementation is how to caclulate the amount of bytes to
skip for unknown by slave column.


mysql-test/suite/binlog/t/binlog_row_mix_innodb_myisam.test:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch changes the test to coincide with changes to binlog
  size of table map event.
mysql-test/suite/rpl/r/rpl_row_basic_11bugs.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_create_table.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_flsh_tbls.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_inexist_tbl.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_log.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_log_innodb.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_max_relay_size.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_tabledefs_2myisam.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_tabledefs_3innodb.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_row_until.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/r/rpl_skip_error.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/t/disabled.def:
  WL#3915  master's cols > slave
  
  Disabled the rpl_stm_extraColmaster_ndb test because statement-based
  replication is not supported in NDB at this time. It can be enabled
  when statement-based replication for NDB is released.
mysql-test/suite/rpl/t/rpl_row_create_table.test:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch corrects binlog positions a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl/t/rpl_row_flsh_tbls.test:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch corrects binlog positions a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
mysql-test/suite/rpl_ndb/r/rpl_truncate_7ndb.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new result file as a result of the change to the
  size of the tablemap log event.
sql/field.cc:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch includes updates to the unpack() methods for the variable
  length fields. A new parameter was added (from_length) that is the
  value stored in the field_metadata of the table map from the table_def
  class. If the value is non-zero and less than what the field on the 
  slave is then use the from_length else use the original value from the
  field on the slave.
sql/field.h:
  L#3228 : RBR using different table defs on slave/master
  
  This patch includes updates to the unpack() methods for the variable
  length fields. A new parameter was added (from_length) that is the
  value stored in the field_metadata of the table map from the table_def
  class.
sql/log_event.cc:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch adds methods to calculate the field metadata size, prepare
  the field metadata for writing to the binlog, and additions to the
  Table_map_log_event::write_body method to include the field metadata 
  in the table map that is written to the binlog.
  
  WL#3915  master's cols > slave
  
  copying extra (slave's) fields returns early if master's table version is wider;
  removing assert in the way of master > slave cols.
sql/log_event.h:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch adds method declarations and variables needed to support
  storing field metadata in the table map that is written to the binlog.
sql/rpl_record.cc:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch modifies the unpack_row() method to unpack fields passing in
  the value from the table_def class. This value is the extra field
  metadata stored there from the master.
  
  WL#3915  master's cols > slave
  
  adding a snippet that shift exectution curson donw the row skipping unknown by slave
  fields' data.
sql/rpl_rli.h:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch adds a helper function to retrieve the table_def for a given
  table in the RPL_TABLE_LIST structure.
sql/rpl_utility.cc:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch adds a helper method that retrieves the correct size 
  parameter for the field. This method is used to compare the size as
  sent by the master with that on the slave for all types of fields that
  can vary in size and storage requirements. 
  
  WL#3915  master's cols > slave
  
  Remove warning message for master's cols > slave.
sql/rpl_utility.h:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch changes the table_def class constructor to pass in the raw
  data read from the table map and extract it into an array of dimension
  size (number of fields). It also adds a method to return the field 
  metadata for any field. The method returns the data stored in the table
  map or 0 if no data was stored for that field. Lastly, a method to return
  the results of field->maybe_null() is included so that the slave can
  determine if a field that is not on the slave is null.
mysql-test/suite/rpl/t/rpl_colSize.test:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a new test designed to test the feature of having
  columns on the master that are smaller than what is on the slave.
mysql-test/suite/rpl/t/rpl_extraColmaster_innodb-master.opt:
  WL#3915  master's cols > slave
  
  option for innodb
mysql-test/suite/rpl/t/rpl_extraColmaster_innodb-slave.opt:
  WL#3915  master's cols > slave
  
  option for innodb
mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test:
  WL#3915  master's cols > slave
  
  Test of innodb. Test runs in both statement- and row-based replication.
mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test:
  WL#3915  master's cols > slave
  
  Test of myisam. Test runs in both statement- and row-based replication.
mysql-test/suite/rpl/r/rpl_colSize.result:
  WL#3228 : RBR using different table defs on slave/master
  
  This patch contains a result file for the new test designed to test the 
  feature of having columns on the master that are smaller than what is 
  on the slave.
mysql-test/suite/rpl/t/rpl_row_extraColmaster_ndb.test:
  WL#3915  master's cols > slave
  
  Test of ndb. Test runs in row-based replication.
mysql-test/suite/rpl/t/rpl_stm_extraColmaster_ndb.test:
  WL#3915  master's cols > slave
  
  Test of ndb. Test runs in statement-based replication.
mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result:
  WL#3915  master's cols > slave
  
  new results
mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result:
  WL#3915  master's cols > slave
  
  new results
mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test:
  WL#3915  master's cols > slave
  
  basic tests checking altering and skipping extra fields by slave.
  The fields can be of any possible types.
mysql-test/suite/rpl/r/rpl_row_extraColmaster_ndb.result:
  WL#3915  master's cols > slave
  
  new results
This commit is contained in:
unknown
2007-07-29 18:10:42 -04:00
parent 975acfbb60
commit d4671354f1
37 changed files with 1718 additions and 674 deletions

View File

@ -127,7 +127,7 @@ NULL 5 10
NULL 6 12
CREATE TABLE t7 (UNIQUE(b)) SELECT a,b FROM tt3;
ERROR 23000: Duplicate entry '2' for key 'b'
SHOW BINLOG EVENTS FROM 1098;
SHOW BINLOG EVENTS FROM 1100;
Log_name Pos Event_type Server_id End_log_pos Info
CREATE TABLE t7 (a INT, b INT UNIQUE);
INSERT INTO t7 SELECT a,b FROM tt3;
@ -137,11 +137,11 @@ a b
1 2
2 4
3 6
SHOW BINLOG EVENTS FROM 1098;
SHOW BINLOG EVENTS FROM 1100;
Log_name Pos Event_type Server_id End_log_pos Info
# 1098 Query # 1198 use `test`; CREATE TABLE t7 (a INT, b INT UNIQUE)
# 1198 Table_map # 1238 table_id: # (test.t7)
# 1238 Write_rows # 1294 table_id: # flags: STMT_END_F
# 1100 Query # 1200 use `test`; CREATE TABLE t7 (a INT, b INT UNIQUE)
# 1200 Table_map # 1242 table_id: # (test.t7)
# 1242 Write_rows # 1298 table_id: # flags: STMT_END_F
SELECT * FROM t7 ORDER BY a,b;
a b
1 2
@ -154,10 +154,10 @@ INSERT INTO t7 SELECT a,b FROM tt4;
ROLLBACK;
Warnings:
Warning 1196 Some non-transactional changed tables couldn't be rolled back
SHOW BINLOG EVENTS FROM 1294;
SHOW BINLOG EVENTS FROM 1298;
Log_name Pos Event_type Server_id End_log_pos Info
# 1294 Table_map # 1334 table_id: # (test.t7)
# 1334 Write_rows # 1390 table_id: # flags: STMT_END_F
# 1298 Table_map # 1340 table_id: # (test.t7)
# 1340 Write_rows # 1396 table_id: # flags: STMT_END_F
SELECT * FROM t7 ORDER BY a,b;
a b
1 2
@ -192,10 +192,10 @@ Create Table CREATE TABLE `t9` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SHOW BINLOG EVENTS FROM 1390;
SHOW BINLOG EVENTS FROM 1396;
Log_name Pos Event_type Server_id End_log_pos Info
# 1390 Query # 1476 use `test`; CREATE TABLE t8 LIKE t4
# 1476 Query # 1615 use `test`; CREATE TABLE `t9` (
# 1396 Query # 1482 use `test`; CREATE TABLE t8 LIKE t4
# 1482 Query # 1621 use `test`; CREATE TABLE `t9` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
)
@ -276,31 +276,31 @@ SHOW BINLOG EVENTS;
Log_name Pos Event_type Server_id End_log_pos Info
# 4 Format_desc # 106 Server ver: #, Binlog ver: #
# 106 Query # 192 use `test`; CREATE TABLE t1 (a INT)
# 192 Table_map # 231 table_id: # (test.t1)
# 231 Write_rows # 275 table_id: # flags: STMT_END_F
# 275 Query # 343 use `test`; BEGIN
# 343 Query # 468 use `test`; CREATE TABLE `t2` (
# 192 Table_map # 233 table_id: # (test.t1)
# 233 Write_rows # 277 table_id: # flags: STMT_END_F
# 277 Query # 345 use `test`; BEGIN
# 345 Query # 470 use `test`; CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB
# 468 Table_map # 507 table_id: # (test.t2)
# 507 Write_rows # 551 table_id: # flags: STMT_END_F
# 551 Xid # 578 COMMIT /* XID */
# 578 Query # 646 use `test`; BEGIN
# 646 Query # 771 use `test`; CREATE TABLE `t3` (
# 470 Table_map # 511 table_id: # (test.t2)
# 511 Write_rows # 555 table_id: # flags: STMT_END_F
# 555 Xid # 582 COMMIT /* XID */
# 582 Query # 650 use `test`; BEGIN
# 650 Query # 775 use `test`; CREATE TABLE `t3` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB
# 771 Table_map # 810 table_id: # (test.t3)
# 810 Write_rows # 854 table_id: # flags: STMT_END_F
# 854 Xid # 881 COMMIT /* XID */
# 881 Query # 949 use `test`; BEGIN
# 949 Query # 1074 use `test`; CREATE TABLE `t4` (
# 775 Table_map # 816 table_id: # (test.t3)
# 816 Write_rows # 860 table_id: # flags: STMT_END_F
# 860 Xid # 887 COMMIT /* XID */
# 887 Query # 955 use `test`; BEGIN
# 955 Query # 1080 use `test`; CREATE TABLE `t4` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB
# 1074 Table_map # 1113 table_id: # (test.t4)
# 1113 Write_rows # 1157 table_id: # flags: STMT_END_F
# 1157 Xid # 1184 COMMIT /* XID */
# 1184 Table_map # 1223 table_id: # (test.t1)
# 1223 Write_rows # 1267 table_id: # flags: STMT_END_F
# 1080 Table_map # 1121 table_id: # (test.t4)
# 1121 Write_rows # 1165 table_id: # flags: STMT_END_F
# 1165 Xid # 1192 COMMIT /* XID */
# 1192 Table_map # 1233 table_id: # (test.t1)
# 1233 Write_rows # 1277 table_id: # flags: STMT_END_F
SHOW TABLES;
Tables_in_test
t1
@ -367,15 +367,15 @@ SHOW BINLOG EVENTS;
Log_name Pos Event_type Server_id End_log_pos Info
# 4 Format_desc # 106 Server ver: #, Binlog ver: #
# 106 Query # 192 use `test`; CREATE TABLE t1 (a INT)
# 192 Table_map # 231 table_id: # (test.t1)
# 231 Write_rows # 275 table_id: # flags: STMT_END_F
# 275 Query # 375 use `test`; CREATE TABLE t2 (a INT) ENGINE=INNODB
# 375 Query # 443 use `test`; BEGIN
# 443 Table_map # 482 table_id: # (test.t2)
# 482 Write_rows # 526 table_id: # flags: STMT_END_F
# 526 Table_map # 565 table_id: # (test.t2)
# 565 Write_rows # 604 table_id: # flags: STMT_END_F
# 604 Xid # 631 COMMIT /* XID */
# 192 Table_map # 233 table_id: # (test.t1)
# 233 Write_rows # 277 table_id: # flags: STMT_END_F
# 277 Query # 377 use `test`; CREATE TABLE t2 (a INT) ENGINE=INNODB
# 377 Query # 445 use `test`; BEGIN
# 445 Table_map # 486 table_id: # (test.t2)
# 486 Write_rows # 530 table_id: # flags: STMT_END_F
# 530 Table_map # 571 table_id: # (test.t2)
# 571 Write_rows # 610 table_id: # flags: STMT_END_F
# 610 Xid # 637 COMMIT /* XID */
SELECT * FROM t2 ORDER BY a;
a
1
@ -394,10 +394,10 @@ INSERT INTO t2 SELECT a+2 FROM tt2;
ROLLBACK;
SELECT * FROM t2 ORDER BY a;
a
SHOW BINLOG EVENTS FROM 631;
SHOW BINLOG EVENTS FROM 637;
Log_name Pos Event_type Server_id End_log_pos Info
# 631 Query # 711 use `test`; TRUNCATE TABLE t2
# 711 Xid # 738 COMMIT /* XID */
# 637 Query # 717 use `test`; TRUNCATE TABLE t2
# 717 Xid # 744 COMMIT /* XID */
SELECT * FROM t2 ORDER BY a;
a
DROP TABLE t1,t2;