julien-duponchelle / julien-duponchelle/python-mysql-replication

Get worng column values.

Open
#218 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
2.4k
Forks
690
PR merge metrics
No merged PRs in 30d

Description

How to repeat:
1.Add "print row" in Class WriteRowsEvent.
```
class WriteRowsEvent(RowsEvent):
"""This event is triggered when a row in database is added
For each row you have a hash with a single key: values which contain the data of the new line.
"""
def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs):
super(WriteRowsEvent, self).__init__(from_packet, event_size,
table_map, ctl_connection, **kwargs)
if self._processed:
self.columns_present_bitmap = self.packet.read(
(self.number_of_columns + 7) / 8)

def _fetch_one_row(self):
row = {}
row["values"] = self._read_column_data(self.columns_present_bitmap)
print row
return row
```
2.
```
root@10.199.139.2(Unknow):test1 02:30:13>select version();
+------------+
| version() |
+------------+
| 5.6.25-log |
+------------+
1 row in set (0.00 sec)
flush logs;
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`timestamp_col` timestamp(6) NULL DEFAULT '0000-00-00 00:00:00.000000',
`datetime_col` datetime(6) DEFAULT '0000-00-00 00:00:00.000000',
`text_col` text,
`blob_col` blob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

INSERT INTO t1 (name,timestamp_col,text_col,blob_col) VALUES ("c",now(6),"Hello World",LOAD_FILE('/home/apps/mysql.gif'));

select id,name,timestamp_col,datetime_col,text_col,length(blob_col) from t1;
+----+------+----------------------------+----------------------------+-------------+------------------+
| id | name | timestamp_col | datetime_col | text_col | length(blob_col) |
+----+------+----------------------------+----------------------------+-------------+------------------+
| 1 | c | 2017-07-20 14:02:35.435957 | 0000-00-00 00:00:00.000000 | Hello World | 7089 |
+----+------+----------------------------+----------------------------+-------------+------------------+
1 row in set (0.01 sec)
```

3.
```
python binlog2sql.py -utest_user -ptest123 -h10.199.139.2 -P3306 -dtest1 -tt1 --start-file=mysql-bin.000086

id 3 False
name 15 False
timestamp_col 17 False
datetime_col 18 False
text_col 252 False
blob_col 252 False
{'values': {u'name': u'c', u'datetime_col': None, u'blob_col': '\x00Hello World\xb1\x1bGIF89a\x96\x01,\x01\xf7\x00\x00R\x83\xa3R\x83\xa3R\x83\xa3R\x83\xa3R\x83\xa3R\x83\xa3R\x83\xa3R\x83\xa3S\x84\xa4W\x87\xa6Z\x89\xa7^\x8b\xa9c\x8f\xaci\x94\xafo\x97\xb2u\x9c\xb5z\xa0\xb8\x85\xa7\xbd\x8c\xac\xc1\x90\xaf\xc3\x93\xad\xbc\xa6\xa7\x9a\xe7\x9c:\xf7\x99!\xf8\x99!\xf8\x99!\xf8\x99!\xf8\x99!\xf8\x9a"\xf8\x9b&\xf8\x9e,\xf8\xa36\xf8\xa6>\xf9\xa9D\xf9\xadL\xf9\xb2W\xf9\xb6a\xfa\xbbm\xf9\xc1z\xf8\xc7\x87\xf6\xcd\x99\xed\xce\xa5\xdb\xcb\xb2\xc1\xc7\xc4\xb8\xc7\xce\xb3\xc7\xd3\xb6\xca\xd8\xb9\xcc\xd9\xbc\xcf\xdb\xc2\xd3\xdd\xca\xd8\xe0\xcf\xdb\xe1\xd6\xdf\xe3\xde\xe3\xe5\xe8\xe7\xe1\xf9\xec\xda\xfc\xed\xda\xfd\xef\xdd\xfc\xf0\xe1\xfb\xf2\xe5\xf6\xf1\xea\xed\xf0\xf0\xef\xf2\xf3\xf0\xf3\xf6\xf1\xf5\xf7\xf4\xf7\xf8\xf9\xf9\xf9\xfc\xfb\xf9\xfc\xfb\xfa\xfd\xfc\xfb\xfd\xfd\xfc\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xff\x0bNETSCAPE2.0\x03\x01\x01\x00\x00!\xf9\x04\x00\r\x00\x00\x00,\x00\x00\x00\x00\x96\x01,\x01\x00\x08\xfe\x00\xc9\x08\x1cH\xb0\xa0\xc1\x83\x08\x13*\\\xc8\xb0\xa1\xc3\x87\x10#J\x9cH\xb1\xa2\xc5\x8b\x183j\xdc\xc8\xb1\xa3\xc7\x8f C\x8a\x1cI\xb2\xa4\xc9\x93(S\xaa\\\xc9\xb2\xa5\xcb\x970c\xca\x9cI\xb3\xa6\xcd\x9b8s\xea\xdc\xc9\xb3\xa7\xcf\x9f@\x83\n\x1dJ\xb4\xa8\xd1\xa3H\x93*]\xca\xb4\xa9\xd3\xa7P\xa3J\x9dJ\xb5\xaa\xd5\xabX\xb3j\xdd\xca\xb5\xab\xd7\xaf`\xc3\x8a\x1dK\xb6\xac\xd9\xb3h\xd3\xaa]\xcb\xb6\xad\xdb\xb7p\xe3\xca\x9dK\xb7\xae\xdd\xbbx\xf3\xea\xdd\xcb\xb7\xaf\xdf\xbf\x80\x03\x0b\x1eL\xb8\xb0\xe1\xc3\x88\x13+^\xcc\xb8\xb1\xe3\xc7\x90#K\x9eL\xb9\xb2\xe5\xcb\x983k\xde\xcc\xb9\xb3\xe7\xcf\xa0C\x8b\x1eM\xba\xb4\xe9\xd3\xa8S\xab^\xcd\xba\xb5\xeb\xd7\xb0c\xcb\x9eM\xbb\xb6\xed\xdb\xb8s\xeb\xde\xcd\xbb\xb7\xef\xdf\xc0\x83\x0b\x1fN\xbc\xb8\xf1\xe3\xc8\x93+_\xce\xbc\xb9\xf3\xe7\xd0\xa3K\x9fN\xbd\xba\xf5\xeb\xd8\xb3k\xdf\xce\xbd\xbb\xf7\xef\xe0\xc3\xfe\x8b\x07\r\xa4G\x0f!\xe3Y\xfbp\x01\xa1\x01\x03\x06\r \xb0\x90\xe1\x83H\xfa\xd25 \x10\xd8\xcf\x9f\xbf\x03\x163\xd8w\x1fy\x12 \xd0\xdf\x81\x04 \xc0\x80\x044\x881`gb\xbc\x90\x00\x7f\t,` \x82\xfbM@C\x11\x0fj&D\x04\xfc=\x00\x83\x0c0\xb4\x00\x81\x02\x08"\xd0\x80\x0b\x1cvx\x99\x10\x0e\xec\xa7\xc0\x0c\x0e\x92QD\x105\xb4\xd0\x00\x8a\xfd)0A\x0f.Z\x06\xe3~\x0c\x00iP\x0f\xec!\xf8\x00\rF\x049\x99\x10\x0f\xec\x87\xc0\x0c\x08\x89\xd1\xc3\x04\x0b\x1c\xd8\xc0\x04\x13\xb4\x00C\x0c5\x00Q\x84\x115:yX\x11\x13\xf0\'A\x93\t\xd5\xf0\xc0\x85\x18\xee\xb7@\x04-\xc8P\x03zf\x16&C\x96\x04,P\xc3B=\x14\x18\xe7\x81\t80\x01\x0cx\xe6\x19\x18\x10 \xee\x17\x81\x91\t\t\xd1\x02\x9f\x83\xf2\x87\x80\x02\x0f\xbc\xe0\x03\x9b\x8a\xfa5\x03\x9f\t\xb0\xc0)BE\xc8\xc0\xa5\x04\x10\xa4\xca\xc0\x84\x83B\x00\x03\x10\xfe\x9d\xfa\x85\xe6\x85\x0bP\xb9\x90\x18B\x04\x11\x84\x0f\xe6\xd5P\x83\x0b\x13\xac\n\'\x7f\x0b@P\xc3\xa8\xb1\xe2\xf5C\x04\x176\xf0gED\xcc0\x81\x03\xac\xf6\xb7\xc0\x045\x94\x99\xac]b\xd4\xd0\x80\x94\x12\xc0j\x91\x119F\xa9d\x0c\x02n\xcb\xed\x9eR\xb2\xd0\xe2\xb8A\xb8\xf0@\xb52\xfe\x88\xac\xbaq\x15\xd1\x02\x8f\x0b\xc8\xb0Q\x0f:"\xe8@\x0c\xf7\xe2\xfb\x16\x10\x82"\x00\x01\xa4\x18\x11A\x03\xb3\x07.\xd0B\xa2\x06\xc7\xd5\xc3\xb7\x19\x16\x81\xc7\x90\x9b5\x83\xd3\x044\xc0yB0\xf8`\x11\xe2G\x13\xd0u\xe7d\xf5`n\xad\x0bi\x0cQ\x10\xfbZ\xbb:\xeba\x1115\x02\xa2\x96\xc4\x02\xbd\x0b\xc0\x80\xfbX0\\\x18\x81\xd5$\x011\x01\xbd\xce\x0e\x1f\x16\x10|\xc2^\x12\xe2\xc3\x1a\xeb\x16z\xf1\x8eK\x11\xc3\x11\xf7\xf3\x82\x95\x08!lR\x9a\x00\x1f\x01\x19\x14\x1b\xaaQ\x80&\x11\x03\xbb\x9e\xc6\xc8\xa4\xe4\xd1QD$\x89\xd9\xfcVI\xa4\xbc\xc0\x8alTI\xf1(\xe4\xc4N\xfadjMtI\x10\xd2\xa8:S\x12E\x0c\x18\x93\x00\x05W\xc2\x028\xa5\xd2\x95A\xf9\xc1\x84\x18\x08\x93*\xaa\xb1\x05Y\xc4%Mh` \x05\xb8\xf0%`\xdc\x0f\x04 )\xcc\x9c\x8cr\x01\x86k\t\xde\xf8s\xccf\xf2\xa4\x05\x06R\x1cL\x88p6e.\xd2\x9a2\x99\x1a\x03\xc4\xf8\x12\x19\xc0i\x01\xd5\x04\'N\x10\xd9\x80\x99\x00\xa1\x9b\x8e\x9b\xa5:i\xc2\xce[\xc5\xe0\x9b\x1a\xfe1\x82\x0b\xaa\x05\xcdy\xae\x13\x83\n!B\x0b\xe2h\x12\xd7\xf5\'\x02\xfe\xbcI=\xab\xf49\x05\x0c\xb1$\x82\xecQ)\x13\xca\x12D\x8e\x13!\xdd#\x80"M\x02\x04\x16j\x94l\x14}\x898\x9d\xf8I"M\xb4#K\x9cbHc\x82\xcd>ES A0\xd7~Z ?\xad}o\xa50\x89A1\xd39\x90\x18x\xd4\x01\xf2\x04I\x11j\xb959\xe2T%50\x10/\x0b\x82\xb8\x88\xf1\xf4|\xac\x9c\x00H\x8f\xfaE\x1em\x94 5\x88\xd1\x81\xc2\x15\xc9\x96\x1a0\x93T\x1d\x89\xb9n\xd9\xd3fE/\x94"\xe9\x81V\xf7\xf3\x00\x19\xe03\xac\x1ea\x81\x9c\xa2\x99\xbd\x16d/\x02`\xe5\x08\xc8\xe8\xc5\x80\x08\xc0\xe0\x07\xc1\x84kFh`Umi\xd5YY\x95\x92\xadJ\x12\x84\x0bZk\x022`\xa6`9\xd2\x83\xb31`tD`\xd5\xf1\x04\xca*\xae\x9a\xe4\x92\x18Z\x80\x04b0\xd5\xc9jD\x90\xacj\xa0@j\xc0\x9f\t8\xe8\x07\xe6r\xfeh^7b\xa5\t4\x80^RR\x00\x04"kZ\x8f\x80\x96\xa0d\x90\x81\x15i*\x90IV\xed\x83-\x90\x00\x03\x86e\xc5\x08\xcc\xe0\xad\xbd\xfd\xd8\xee6\x1a\xc1>\x9d\x11\x8c\x0c\x9cmG\xc4\x80\xa3\x18D\xc0B\x07b\xc0\x04|\xa0\xdd\xe82\xe4bV\\_\x0b(9\x10G2\xe0\xa5(\xf1\x81\x89<\x1a:\x18\x04\xd5\xbc\x10\xd1\x17\xf9Le\xd2\x82\x041AIlI\x0fb\xd0M9\xfd\x08\xbf\xa7\x9b\xc0\x85\xe0\x83A\xbbE(K\x0e\x85\tw\t\xbc\xc0\xb6\x9a\x0f\xc1\x0e\t\x82\xce\xf8\xd3\x00\xf0qqB(\x94\t\x10\x06z\xce\xdbaxo\x12\xa0\x97\x03\x10\xc2(\x04\xdc4&F\xb8\x12\xa5|$\xd9\x13+D_\r\xb8\xd0\x8a\x11R\xd9Kaq&k\xeb\x1b\x01\x1ee\xe3\x88\x18\x81\x06,p\x1a\x04\x12\xd2\xad\x18\x85\x98&>0\x9a\x94HV\xe4\x88\x14\x01\x08\xbeRH\xb7r\x1c\x81\x1a\xb3\xa4\x083p\x80R\x9dU\xde*?D\x0c4x\x00\xfe\xd7\xa0\x8b\x92@\xb1\xea\x01F5\xf3E\xc8\xe5\x9e\x03\xdaDyJ%\xb2\x9c9\xe2\xa6\xf7\x96\x99$B(O\r\xfa\xb6\xcc=o\x84\\\x10\x80\xb3Kh&\x03\xbbJ \x02\x0fp@\x8e\xad\xc8\x026\x1b\x9a!\\\\\xd8\x17{@\x83\x16D\x80\x01\nH\x80\x8b\x07\x95\x00\xd5^:#\xb4;0I~\x10\x83i\xe16\xb4\x0e\x88\x00\x97~|\xea\x8c\x80\x99\x05?\x04\t\xed\x1e\x00^\x0c%@\x01}\x9dO\rz\xf0\x83 \x08\xe1\xcf\xb5f\xc8\x0f\xc8\xe9\x91\x1e\xb0\xd2Z\x0f\x90@\x0b\xee\x94l\xa44UK\x90=O\xb5\x97B\x03\xad\x11\xc0\x01@\x08\xec\xb6\x7f\xa2\xbb\xf4\xado\xdcM\xf9\xc1ZC\'\x03q\xa3\xbb\'4X7:/\xfc\xee\xa1\xac\x8d\x95\x0ch', u'text_col': u'', u'id': 2, u'timestamp_col': datetime.datetime(2017, 7, 20, 13, 54, 33, 253987)}}
id 3 False
name 15 False
Traceback (most recent call last):
File "binlog2sql.py", line 139, in
binlog2sql.process_binlog()
File "binlog2sql.py", line 92, in process_binlog
for row in binlogevent.rows:
File "/usr/lib/python2.6/site-packages/pymysqlreplication/row_event.py", line 429, in rows
self._fetch_rows()
File "/usr/lib/python2.6/site-packages/pymysqlreplication/row_event.py", line 424, in _fetch_rows
self.__rows.append(self._fetch_one_row())
File "/usr/lib/python2.6/site-packages/pymysqlreplication/row_event.py", line 477, in _fetch_one_row
row["values"] = self._read_column_data(self.columns_present_bitmap)
File "/usr/lib/python2.6/site-packages/pymysqlreplication/row_event.py", line 134, in _read_column_data
values[name] = self.__read_string(1, column)
File "/usr/lib/python2.6/site-packages/pymysqlreplication/row_event.py", line 221, in __read_string
string = string.decode(charset_to_encoding(column.character_set_name))
File "/usr/lib64/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 0: invalid continuation byte

As you can see "Hello World" is part of blob_col's value:
u'blob_col': '\x00Hello World\xb1\x1bGIF89a\x96\x01....
u'text_col': u''
```

As I tested ,mostly caused by `datetime_col` is None.

Contributor guide

Open the contributing guide

Research direction

Reproduce the binlog2sql.py command and inspect pymysqlreplication/row_event.py, especially WriteRowsEvent._fetch_one_row and the row decoding path shown in the traceback. Compare decoded values with the supplied MySQL table schema and binlog output. Done means rows decode into the correct column values without the reported traceback.

Written by the indexing model from the issue text.

Assessment

Tech stack
mysql, python
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.