[root@localhost 123]#  mysqlbinlog mysql-bin.000227 > 1.sql
ERROR: Error in Log_event::read_log_event(): 'Event too big', data_len: -1291845632, event_type: 1
ERROR: Could not read entry at offset 106: Error in log format or read error.
[root@localhost 123]#  mysqlbinlog --version
mysqlbinlog Ver 3.3 for unknown-linux-gnu at x86_64[root@localhost 123]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.34-log Source distributionType 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> select version();
+------------+
| version()  |
+------------+
| 5.1.34-log | 
+------------+
1 row in set (0.00 sec)mysql> show binlog events;
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                                                                                                 |
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 |   4 | Format_desc |         1 |         106 | Server ver: 5.1.34-log, Binlog ver: 4                                                                                                | 
| mysql-bin.000001 | 106 | Query       |         1 |         297 | GRANT SELECT,RELOAD,PROCESS,FILE,SUPER,REPLICATION CLIENT,LOCK TABLES on *.* to 'backup'@'localhost' identified by 'xxxxxxxx'| 
| mysql-bin.000001 | 297 | Rotate      |         1 |         340 | mysql-bin.000002;pos=4                                                                                                               | 
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
尝试过的方法:1.网上查资料说是版本问题,但我这个mysqlbinlog文件为二进制编译安装时候生成的mysqlbinlog文件,而且环境变量也没问题。确认了不是版本问题。
2.该服务器没有做主从。
3.把该mysql-bin.000227 文件或者其他任何一个mysql-bin.xxxxx文件在该机器上或拿到其他服务器上也是安装相同版本的mysql都是报相同的错(见红色部分)。请各位大牛们帮忙处理一下!小弟在这里先谢了!

解决方案 »

  1.   

    mysqlbinlog -V 看一下你的版本号。
      

  2.   

    或者调大一下你的 max_allowed_packet  再试试。
      

  3.   

    max_allowed_packet 设置的是多大? 修改大一点试下呢?
    mysql log_event.cc 源码中有:
    00708 #ifndef max_allowed_packet
    00709   THD *thd=current_thd;
    00710   uint max_allowed_packet= thd ? thd->variables.max_allowed_packet : ~(ulong)0;
    00711 #endif
    00712 
    00713   if (data_len > max_allowed_packet)
    00714   {
    00715     error = "Event too big";
    00716     goto err;
    00717   }
    我也网上翻的,没试过,可以尝试一下。
      

  4.   

    不行,调到max_allowed_packet=500M了还是在报相同的错误!
      

  5.   

    关于这个地方的源码:log_event.cc,各位帮分析一下
    Log_event* Log_event::read_log_event(IO_CACHE* file, bool old_format)
    #endif  
    {
      char head[LOG_EVENT_HEADER_LEN];
      uint header_size= old_format ? OLD_HEADER_LEN : LOG_EVENT_HEADER_LEN;
      LOCK_MUTEX;
      if (my_b_read(file, (byte *) head, header_size))
      {
        UNLOCK_MUTEX;
        return 0;
      }
      uint data_len = uint4korr(head + EVENT_LEN_OFFSET);
      char *buf= 0;
      const char *error= 0;
      Log_event *res=  0;
      if (data_len > max_allowed_packet)
      {
        error = "Event too big";
        goto err;
      }
      if (data_len < header_size)
      {
        error = "Event too small";
        goto err;
      }
      // some events use the extra byte to null-terminate strings
      if (!(buf = my_malloc(data_len+1, MYF(MY_WME))))
      {
        error = "Out of memory";
        goto err;
      }
      buf[data_len] = 0;
      memcpy(buf, head, header_size);
      if (my_b_read(file, (byte*) buf + header_size, data_len - header_size))
      {
        error = "read error";
        goto err;
      }
      if ((res = read_log_event(buf, data_len, &error, old_format)))
        res->register_temp_buf(buf);
    err:
      UNLOCK_MUTEX;
      if (error)
      {
      
        sql_print_error("\
    Error in Log_event::read_log_event(): '%s', data_len: %d, event_type: %d",
                        error,data_len,head[EVENT_TYPE_OFFSET]);
        my_free(buf, MYF(MY_ALLOW_ZERO_PTR));
        /*
          The SQL slave thread will check if file->error<0 to know
          if there was an I/O error. Even if there is no "low-level" I/O errors
                     ...       with 'file', any of the high-level above errors is worrying
          enough to stop the SQL thread now ; as we are skipping the current event,
          going on with reading and successfully executing other events can
          only corrupt the slave's databases. So stop.
        */
        file->error= -1;
      
      }
      return res;
    }
      

  6.   

    把max_allowed_packet在Mysql源码中改大点,然后重新编译一个Mysqlbinlog出来再去解binlog呢?或者把这段直接注释掉:
    00713 if (data_len > max_allowed_packet)
    00714 {
    00715 error = "Event too big";
    00716 goto err;
    00717 }
    如果还不行,原数据在的话,直接再导出一份好了。
      

  7.   

    回楼上,这个如何在源码中改大max_allowed_packet?
      

  8.   

    是修改log_event.cc
    uint max_allowed_packet= thd ? thd->variables.max_allowed_packet : ~(ulong)0;
    红色部分吗?这个~(ulong)0是撒子意思?没看懂。
      

  9.   

    ulong data_len;
    data_length在源码里定义的是ulong类型,这里如何来的
    Log_event::read_log_event(): 'Event too big', data_len: -1291845632负数呢?
      

  10.   

    或者把这段直接注释掉:
    00713 if (data_len > max_allowed_packet)
    00714 {
    00715 error = "Event too big";
    00716 goto err;
    00717 }
    注释掉后无法make过去了。
    log_event.cc:1007:19: 错误:操作符‘*’没有左操作数
    log_event.cc:1007:1: 错误:未终止的 #if
    log_event_old.cc: In static member function ‘static Log_event* Log_event::read_log_event(IO_CACHE*, const Format_description_log_event*)’:
    log_event_old.cc:1280: 错误:无法为有抽象类型 ‘Old_rows_log_event’ 的对象分配内存
    log_event_old.h:55: 附注: 因为下列虚函数在 ‘Old_rows_log_event’ 中为纯虚函数:
    log_event_old.h:116: 附注:     virtual void Old_rows_log_event::print(FILE*, PRINT_EVENT_INFO*)
    log_event.h:1006: 附注:        virtual Log_event_type Log_event::get_type_code()
    log_event_old.cc:1277: 错误:expected primary-expression before ‘(’ token
    log_event_old.cc:1277: 错误:expected primary-expression before ‘const’
    log_event_old.cc:1277: 错误:expected primary-expression before ‘event_len’
    log_event_old.cc:1278: 错误:expected primary-expression before ‘event_type’
    log_event_old.cc:1279: 错误:expected primary-expression before ‘const’
    log_event_old.cc:1281: 错误:expected `;' before ‘:’ token
    log_event_old.cc:2906: 错误:expected `}' at end of input
    make[2]: *** [mysqlbinlog.o] 错误 1
      

  11.   

    我也遇到了这个问题,请问楼主解决了吗?最终怎么解决的?为什么data_len: -1291845632是负数?小妹在此急求帮助。。谢谢