replicate-do-db只控制SQL线程是否执行语句,不控制IO线程是否接收建表事件;若主库CREATE TABLE未匹配该规则(如缺USE或库名前缀),从库根本不会收到建表语句,后续INSERT因表不存在报1146错误。

replicate-do-db 配置后从库没建表,为什么同步 INSERT 会报 1146?
因为 replicate-do-db 只控制“语句是否被 SQL 线程执行”,不控制“建表语句是否被接收”。主库上 CREATE TABLE 若没命中 replicate-do-db 规则(比如没 USE db_name 或没带库名前缀),从库压根不会执行建表,后续的 INSERT 自然报 Table 'xxx' doesn't exist。
常见诱因:
- 主库执行
CREATE TABLE t1前没USE target_db,而从库只配置了replicate-do-db = target_db - 建表语句写成
CREATE TABLE other_db.t1,但replicate-do-db没包含other_db - 用
mysqldump --databases导出时未加--skip-triggers --no-create-info,触发器或视图建语句干扰过滤逻辑
如何验证建表语句是否被从库接收?
别只看 SHOW SLAVE STATUS\G,它不显示中继日志里有没有建表事件。直接查从库的中继日志文件:
先确认中继日志位置:SHOW SLAVE STATUS\G 中找 Relay_Master_Log_File 和 Exec_Master_Log_Pos,再用 mysqlbinlog 解析对应 relay-log 文件(路径见 SHOW VARIABLES LIKE 'relay_log'):
mysqlbinlog --no-defaults -v -v /var/lib/mysql/relay-bin.000001 | grep -A 5 "CREATE TABLE"
如果输出为空,说明建表语句根本没进 relay log —— 问题出在 IO 线程过滤阶段,不是 SQL 线程跳过了。
关键点:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
-
replicate-do-db是 SQL 线程级过滤,不影响 IO 线程拉取 binlog;但若主库用了binlog_do_db,IO 线程就根本收不到该库的任何事件 - 查
SHOW VARIABLES LIKE 'binlog_do_db'确认主库是否做了源头过滤 - 查
SELECT * FROM performance_schema.replication_applier_status_by_coordinator(MySQL 5.7+)看 coordinator 是否丢弃过事件
修复表不存在错误的实操步骤
不能直接在从库 CREATE TABLE 就完事——得确保结构、字符集、索引、分区完全一致,否则后续 DML 可能隐式失败。
安全做法:
- 在主库执行:
SHOW CREATE TABLE db.t\G,复制完整建表语句(含ENGINE、COLLATE、PARTITION) - 在从库执行前,先设
SET SQL_LOG_BIN = 0(GTID 模式下必须) - 手动创建表后,用
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='db' AND table_name='t'双重确认 - 如果主库已插入数据,需补全:用
mysqldump --no-create-info --where="1=1" db t > t_data.sql导出,从库导入前仍要SET SQL_LOG_BIN = 0
注意:replicate-wild-do-table = db.t 能避免这类问题,因为它匹配语句中的库表组合,不依赖 USE,建表和 DML 都能捕获。
为什么改了 replicate-do-db 还是不生效?
最常踩的坑:改完配置没重启 MySQL 进程,只 reload 了配置文件。
replicate-do-db 是启动时加载的静态参数,SET GLOBAL replicate_do_db = 'db1' 完全无效。必须:
- 编辑从库
/etc/my.cnf的[mysqld]段,新增或修改replicate-do-db = db_name(每库一行) - 执行
systemctl restart mysql(或对应服务名),不能只mysqladmin reload - 重启后检查
SHOW SLAVE STATUS\G中Replicate_Do_DB字段是否非空
另外,replicate-do-db 和 replicate-ignore-db 绝对不要混用——规则冲突时行为未定义,MySQL 官方文档明确警告“unpredictable results”。

















