maxwell 能正常运行的前提是 mysql 必须开启 binlog 且配置正确:server_id=1、log_bin=mysql-bin、binlog_format=row(全大写),三者缺一不可;还需创建专用用户并授予 select、replication client、replication slave 及 maxwell 库的 all 权限;启动前须验证配置并确保 config.properties 中 host、user、password 和 producer 正确。

maxwell 能跑起来,前提是 MySQL 的 binlog 不仅要开,还得开对——错一个配置项,它连连接都建立不了,更别说读日志了。
MySQL 必须开启 ROW 格式 binlog,且 server_id 唯一
maxwell 只认 ROW 格式的 binlog,STATEMENT 或 MIXED 会直接报错或丢数据。
启动前必须确认以下三项全在 [mysqld] 段里:
-
server_id=1(不能为 0,不能和其他 MySQL 实例重复) -
log_bin=mysql-bin(路径可省略,默认在 datadir 下) -
binlog_format=ROW(必须大写,小写row会被忽略)
改完配置后一定要重启 MySQL:systemctl restart mysqld。
验证命令:mysql -e "show variables like 'log_bin';" → 返回 ONmysql -e "show variables like 'binlog_format';" → 返回 ROW
必须创建专用用户并授予最小必要权限
maxwell 不需要 ALL PRIVILEGES,但以下四条缺一不可:
-
SELECT(读取表结构和初始快照) -
REPLICATION CLIENT(查看 binlog 状态,比如SHOW MASTER STATUS) -
REPLICATION SLAVE(拉取 binlog 内容) - 对
maxwell元数据库的ALL权限(默认库名就是maxwell,用于存 offset、schema 等)
建库建用户示例:
CREATE DATABASE maxwell CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; CREATE USER 'maxwell'@'%' IDENTIFIED BY 'your_strong_password'; GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%'; GRANT ALL ON maxwell.* TO 'maxwell'@'%'; FLUSH PRIVILEGES;
注意:'maxwell'@'%' 中的 % 要和 maxwell 连接时用的 host 匹配;如果 Maxwell 和 MySQL 在同一台机器,用 'maxwell'@'localhost' 更安全,但得确保连接时 host 参数也设为 localhost(否则可能因 socket vs TCP 认证失败)。
启动前检查 config.properties 里三个关键字段
maxwell 启动失败最常见的原因是配置项拼写错误或值缺失。重点关注:
-
host:填 MySQL 实际监听的 IP,不是127.0.0.1(Docker 或远程部署时尤其容易错) -
user和password:必须和上一步创建的用户完全一致(包括大小写) -
producer:至少得指定一个输出目标,比如kafka、stdout或file;若选kafka,还必须配kafka.bootstrap.servers
一个最小可用配置片段:
host=user01 user=maxwell password=your_strong_password producer=stdout
运行:bin/maxwell --config=config.properties。如果看到类似 Starting Maxwell daemon with PID 和几行 JSON 输出,说明已成功捕获变更。
第一次启动卡住?大概率是 GTID 或 position 初始化问题
新装 MySQL 5.7 默认开启 GTID(gtid_mode=ON),而 maxwell 默认不启用 GTID 模式,会导致它试图从 position 0 开始读 binlog,但 MySQL 5.7 的第一个 binlog 文件往往不是 mysql-bin.000001,或者该位置已过期。
解决办法二选一:
- 方案一(推荐):在
config.properties加一行init_position=true,让maxwell自动跳到当前最新 position - 方案二:手动指定起始点,先查当前位置:
mysql -e "SHOW MASTER STATUS;",再在配置里加:replication_slave_type=binlog+init_position=mysql-bin.000001:12345(数字替换成Position列的值)
GTID 模式下更稳妥的做法是显式启用:gtid_mode=true + init_position=true,但需确保 MySQL 确实开了 GTID(show variables like 'gtid_mode'; 返回 ON)。
真正麻烦的不是配置项本身,而是 MySQL 和 maxwell 对“从哪开始读”这件事的理解差异——它不会主动告诉你卡在哪,只会静默等待,你得盯着日志里有没有 Maxwell started 或 bootstrapping 字样。











