julien-duponchelle / python-mysql-replication

Pure Python Implementation of MySQL replication protocol build on top of PyMYSQL
2.31k stars 678 forks source link

Get worng column values. #218

Open liuguoshun opened 7 years ago

liuguoshun commented 7 years ago

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

<class 'pymysqlreplication.row_event.TableMapEvent'>
<class 'pymysqlreplication.row_event.WriteRowsEvent'>
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<P\x10\xe6\x05\xe1\x90\x11:\x0e\x8b@\x04\xcfV\x1c\x97\x0b\x17*P\xb2A?L\xf0\xc0\x03\x110\xd9P\x11\xf9))\xb3\xc9\x07\x0bJ\x80\x04\xe9\x16T\x84\x0b|2@\xb0C?\xb0@)\x91.P\x8c\xf3Z40@$\r\t\x19\x91\xe6~\x0e\xfc\xf0\x10\x110`\xcc\x9f\x02\x13/\xdd\x16\x11\x12H\xd9\xc2\xbb\x06\xf9\xa0_\x82P?d\xc4\x0coZ\xcb\x82\xb8^\xabU\x03\xab\x0e0lP\xd3\xfb\xa5\rQ\xfe\x0f\x10\xf77\x01\xdcq\x9f\x15\xc4\xd9\t\xe8}\x90\x10i\x169\xd1\x95\xf4"\xf0w\xe0h\x81|\xe1\x04\x80J\xdc3D\x887>\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<XS\xab\xae\xadH\xcb\xc2\xe9\xb8\xd2\xd7g5\x03\x8f\r\\.\x92\x9b\xfd%\x00\x83\xec\xe1O\xc5(\x7f\xfe\x9e\xe4m\x7f\r4\xd8\xbeVb\xb8\xc0\xa3\x04\xe0\x8b\xf4\x02\xa5#\x03\xdc\xfd\xac28"\xc9`{"\x91T\xb5\x10\xd0\x02\x04\x0ep*1\xe0O\x04FW\x12\x1f4j?\xcd{\xe0U\x80`.\xf5\xa5\xa4\x06\x00\xdc\x9c\x06\xad"\x86\x18\xf0\xa9\x01v\x1b\t\xc8x\xd4\xa7\x18\x8c\xd0*\xefK\x90\x04R(\x12\x0b\xf6\xe7\x01\xec{\xe1R@(%\x08\x98\xee$\xfe48\x1a\x0c\x1c\xa8\xc3\xa6\xb4\xa0Z"<I\xf6\x08\xf0\x00\x1a\x16\x91)\xcacU\xfdP2\xbf\xfd$\xc0\x059|\xe2Q\x820\xb5~\xa1\x84z!B\x9e\x16\xa1\x02\x039\xc5O~\xa0#@\x02\xce8\xc6\xa6\x14\xe1l\x0eX\x99I\x96\x08\x81\xfe\xb5\xf1(5\x00]\x04\xecx>\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 <module>
    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.

baloo commented 7 years ago

Edited for readability