julien-duponchelle / julien-duponchelle/python-mysql-replication
Get worng column values.
- 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
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