2023-10-08 mysql-代号m-增加外键导致crash-问题分析

摘要:

2023-10-08 mysql-代号m-增加外键导致crash-问题分析

相关bug: https://devops.aliyun.com/projex/project/36ed2d8a9a29e7f8407c6f5498/bug/5e13f3c4165c590665a1693edf

DDL:

sql 复制代码
create table t1(c1 int primary key);

create table t2(c2 int);
sql 复制代码
alter table t2 add foreign key(c2) references t1(c1);

错误日志:

sql 复制代码
    375: ha_create_table: mdb: mdb exec ok, query: alter table t2 add foreign key(c2) references t1(c1);
    344: ha_delete_table: mdb: ERROR: mdb monetdbe_query fail, dbname: db3 query: alter table t2 add foreign key(c2) references t1(c1); err: ParseException:SQLparser:42000!CONSTRAINT FOREIGN KEY: key 't2_c2_fkey' already exists

    344: bool Sql_cmd_alter_table::execute: mdb: ERROR: mdb monetdbe_query fail, dbname: db3 query: alter table t2 add foreign key(c2) references t1(c1); err: ParseException:SQLparser:42000!CONSTRAINT FOREIGN KEY: key 't2_c2_fkey' already exists

核心逻辑:

Mondetdb_Adaptor::execute_query

调用堆栈:

cpp 复制代码
#0  Mondetdb_Adaptor::execute_query (this=0x7f06527d59d0, dbname=0xbfe1580 "db3", sql=0x7f0267c21fe0 "alter table t5 add foreign key(c7) references t4(c6)", table_def=0x0)
    at /root/work/trunk/mysql-server-mysql-8.0.33/sql/monetdb_adaptor/monetdb_adaptor.cc:344
#1  0x0000000003aeddf5 in ha_delete_table (thd=0x7f0598000c90, table_type=0xbe38680, path=0x7f061c6f1ed0 "./db3/#sql2-132ae8-14", db=0x7f0267c23480 "db3", alias=0x7f061c6f2a00 "#sql2-132ae8-14", 
    table_def=0x7f0267b0b528, generate_warning=false) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/handler.cc:2598
#2  0x0000000003781050 in quick_rm_table (thd=0x7f0598000c90, base=0xbe38680, db=0x7f0267c23480 "db3", table_name=0x7f061c6f2a00 "#sql2-132ae8-14", flags=11)
    at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_table.cc:3852
#3  0x00000000037ac2d5 in mysql_alter_table (thd=0x7f0598000c90, new_db=0x7f0267c23480 "db3", new_name=0x0, create_info=0x7f061c6f5010, table_list=0x7f0267c22e30, alter_info=0x7f061c6f4ea0)
    at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_table.cc:18095
#4  0x0000000003e48d5c in Sql_cmd_alter_table::execute (this=0x7f0267c23728, thd=0x7f0598000c90) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_alter.cc:350
#5  0x00000000036c1843 in mysql_execute_command (thd=0x7f0598000c90, first_level=true) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_parse.cc:4714
#6  0x00000000036c3aff in dispatch_sql_command (thd=0x7f0598000c90, parser_state=0x7f061c6f68b0) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_parse.cc:5363
#7  0x00000000036b9848 in dispatch_command (thd=0x7f0598000c90, com_data=0x7f061c6f79a0, command=COM_QUERY) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_parse.cc:2050
#8  0x00000000036b7790 in do_command (thd=0x7f0598000c90) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_parse.cc:1439
#9  0x000000000393e43e in handle_connection (arg=0xbf89ef0) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/conn_handler/connection_handler_per_thread.cc:302
#10 0x000000000594c187 in pfs_spawn_thread (arg=0xbfffa70) at /root/work/trunk/mysql-server-mysql-8.0.33/storage/perfschema/pfs.cc:3042
#11 0x00007f066bc401ca in start_thread () from /lib64/libpthread.so.0
#12 0x00007f066a1f0e73 in clone () from /lib64/libc.so.6

出错原因:

  1. mysql在执行alter, 会先create一个新表,然后drop掉旧表
  2. 导致调用mdb两次, 但是语句却是同一个

解决方案:

  1. 在调用mdb前, 确保执行的sql时候的sql_command和当前逻辑保持一致
相关推荐
风哥2号5 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
YangYang9YangYan5 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技6 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m6 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
风哥2号8 小时前
数据库教程FGMT43‑MySQL性能分析与优化调整
数据库·mysql
随身数智备忘录9 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶10 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea11 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
默 语11 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
probex_11 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库