version:5.7.20-log
case:
Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'shop_center.tb_shop_info' doesn't exist' on query.Default database: 'order_center'. Query: 'Alter table `shop_center`.`tb_shop_info`
原因分析:主库执行SQL语句更新表结构时报错,报错信息为此表不存在。
原因分析:
1、可以看到在从库设置了参数 Replicate_Do_DB: order_center,而此条SQL语句修改的表不属于此库。
Replicate_Do_DB参数含义就是设置从库复制的库。
2、此条SQL不属于order_center为何会被应用到此。
经过二进制日志和全日制发现,语句的写法有问题 Alter table `shop_center`.`tb_shop_info` ,有个同学可能已经发现,我们习惯于在第一部都是USE 库名,而MySQL在未使用USE的条件下会将此SQL对应的binlog默认为设置同步库的binlog日志,所有会执行此语句。
而此条SQL却没有所以不能说是故障问题,而是使用不规范。
解决方案:
stop slave;
set global sql_slave_skip_counter=1;
start slave;
案例反思:
1、权限分配
尽量给RD人员的数据库权限仅限DML,若有修改表结构时应该符合MySQL使用规范。
2、若有SQL评审台应该强调此类SQL语句。