排查 Maxwell can not find database 并且使用 MySQL binlog 解决相关问题

目前我们在使用 Maxwell 在读线上机器的 binlog 同步我们的离线数据库。

这次错误定位上,首先线要确定问题是发生在生产者 还是队列 还是消费者。经过查看各机器上任务的运行日志,定位到了问题出在了任务的生产者上。

于是我试图去调看生产者上的 Maxwell 日志。之前一直跑得好好的 Maxwell 错误日志里面打出了这样一段内容:

17:53:24,420 INFO  OpenReplicator - starting replication at mysql-bin.000055:17870889
17:53:24,944 INFO  TaskManager - stopping 3 tasks
17:53:24,944 ERROR TaskManager - cause:
com.zendesk.maxwell.schema.ddl.InvalidSchemaError: Couldn‘t find database ‘remain_db‘
    at com.zendesk.maxwell.schema.Schema.findDatabaseOrThrow(Schema.java:52) ~[maxwell-1.10.3.jar:1.10.3]
    at com.zendesk.maxwell.schema.ddl.TableCreate.resolve(TableCreate.java:34) ~[maxwell-1.10.3.jar:1.10.3]
    at com.zendesk.maxwell.schema.ddl.TableCreate.resolve(TableCreate.java:13) ~[maxwell-1.10.3.jar:1.10.3]

可以看到 Maxwell 尝试去读 MySQL binlog.00055:17870889 这条 position 的内容是需要 find 一个叫 remain_db 的东西,由于没有 remain_db 所以这个行为失败了,导致整个同步的生产者卡住了。

排查这个问题我们需要知道一件事情,就是 Maxwell 会主动在被同步的数据库上面建立一个自己的数据库叫 Maxwell like this:

Maxwell 数据库里面会记录各种自己同步的时候会需要用到的信息,当他在同步到主数据库有建库建表相关 dll 的时候,他会使用相关语句在 自己的数据库把这些东西建出来。这里提示的找不到 remain_db 就是因为 Maxwell 自己数据库维护的 databases 表里面没有 remain_db 这个数据库的记录,所以就报错了。

正常维护的时候为啥会有漏掉的 DDL ? 仔细想想如果 binlog 没有出过问题是不应该发生这种情况的。所以如果着么思考的话应该很容易的定位到问题出在了 binlog 日志上面。后来我通过的 MySQL 的配置文件的查看配置的时候发现了问题所在,原来是我们数据库指定只同步了某一个数据库,但是之前有人在数据库 use 某个库的时候还执行了别的库的创建操作,导致这个创建行为的 DDL 被错误的同步到了 user 表的 binlog 上,也导致了这次错误。

发现了错误解决起来就相对容易了,由于错误信息以及 Maxwell 的数据表中都明确记录了 binlog 的中断位置,我只需要前往中断位置跳过相关语句就可以了。

具体的 binlog 查看操作命令可以参考 reference 里面的内容 这里只提几个最实用的,例如我会实用

mysqlbinlog   --start-position=205    --stop-position=314     mysql-bin.000001
来指定开始结束位置获取中间的 binlog 信息

我也可以使用 mysqlbinlog mysql-bin.0000001 | grep ‘xxxx‘ 来获取我关注的信息

另外还可以在 mysql shell 里面使用类似语句:

show binlog events from 4 limit 2;

来查看指定 position 位置的以及指定多少条数来查看相关的 binlog 日志。

Reference:

http://soft.dog/2016/06/13/dig-mysql-binlog/#%E5%91%BD%E4%BB%A4%E6%B1%87%E6%80%BB  MySQL binlog 查看方法

原文地址:https://www.cnblogs.com/piperck/p/9135316.html

时间: 2024-08-30 15:50:12

排查 Maxwell can not find database 并且使用 MySQL binlog 解决相关问题的相关文章

MySQL Binlog 解析工具 Maxwell 详解

maxwell 简介 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Google Cloud Pub/Sub.文件或其它平台的应用程序.它的常见应用场景有ETL.维护缓存.收集表级别的dml指标.增量到搜索引擎.数据分区迁移.切库binlog回滚方案等.官网(http://maxwells-daemon.io).GitHub(https://github.com/zende

Maxwell读取MySQL binlog日志到Kafka

启动MySQL 创建maxwell的数据库和用户 在MySQL中创建一个测试数据库和表 前面三个步骤详见 Maxwell读取MySQL binlog日志通过stdout展示 启动Zookeeper [[email protected] ~]$ cd $ZK_HOME/bin [[email protected] bin]$ ./zkServer.sh start 启动kafka,并创建主题为maxwell的topic [[email protected] bin]$ cd $KAFKA_HOME

Developing DataBase Applications Using MySQL Connector/C++ 中文文本

Developing DataBase Applications Using MySQL Connector/C++ 中文文本 ? by grayondream 翻译自mysql Connector C++帮助文档[http://download.csdn.net/detail/midle110/4931166] ? 本教程将利用从MySQL数据库中链接,插入和检索数据的简单示例向您展示构建和安装MySQL Connector / C ++驱动程序的基本步骤.因为本文的重点是使用C++ Conn

centos修改mysql密码或者进入mysql后解决Access denied for user ''@'localhost' to database 'mysql错误

原因是MySQL的密码有问题 用mysql匿名用户可以进入数据库,但是看不见mysql数据库. 解决办法:具体操作步骤:关闭mysql:# service mysqld stop然后:# mysqld_safe --skip-grant-tables开启另一个终端并启动mysql:# service mysqld startmysql -u rootmysql> use mysqlmysql> UPDATE user SET Password=PASSWORD('root') WHERE us

Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'username' cannot be null

今天程序中遇见这个错误一直找不到哪里错后来重写了一遍jsp页面才知道 username我写成了name 和po中的代码对应不上导致了这个错误 写代码一定要认真一点啊     好坑啊 Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'username' cannot be null

通过Maxwell实时增量抽取MySQL binlog并通过stdout展示

下载Maxwell 解压Maxwell 修改MySQL的配置文件my.cnf [[email protected] etc]# vi my.cnf [mysqld] server-id = 1 binlog_format = ROW binlog_format必须设为ROW模式,如果设为其他模式,比如binlog_format = STATEMENT,启动maxwell时会报错 [[email protected] maxwell-1.17.1]# bin/maxwell --user='max

Windows 7 64bit上安装Oracle Database 12c [INS-30131] 错误的解决方法

Windows 7 64bit上安装Oracle Database 12c,出现以下错误: 解决方法: 第一步:控制面板>所有控制面板项>管理工具>服务>SERVER  启动 第二步:控制面板>所有控制面板项>管理工具>计算机管理>系统工具>共享文件夹>共享   右键单击“共享”>新建共享> 点击“下一步”>   单击“浏览”> 选择"本地磁盘(C:)">确定   单击“下一步”:     单击“

go database/sql sql-driver/mysql 操作

这里使用的是github.com/Go-SQL-Driver/MySQL, 所以需要下载一个github.com/Go-SQL-Driver/MySQL 引入 database/sql 和 github.com/Go-SQL-Driver/MySQL 这里实现了对数据库的 增.删.改.查.事务 这里直接上代码,代码中有详细的解释.并且这些操作都经过我实际操作 引入需要的包 import( "database/sql" _"github.com/Go-SQL-Driver/My

全量恢复gprecoverseg -F出现Unable to connect to database时的相关分析及解决方法

之前有两位朋友碰到过在对greenplum的系统构架更改后,出现全量恢复gprecoverseg -F也无法正常运行的情况. 报错信息为Unable to connect to database. Retrying 1 gprecoverseg failed. (Reason='Unable to connect to database and start transaction') exiting... 有幸拷得一份虚拟机上的全部文件,对其进行分析. 发现其实出现这个问题只需要修改pg_cha