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和当前逻辑保持一致
相关推荐
ltl11 分钟前
TiFlash Learner:Raft 日志如何进列存
数据库
ltl12 分钟前
BM25 与 Lucene Similarity:公式如何落到 postings
数据库
ltl13 分钟前
RocksDB Block Cache 与 Bloom Filter:读放大怎么裁
数据库
deli0070072 小时前
JSON 树形查看器:粘贴即解析,折叠展开一目了然
前端·数据库·json·ai编程
国科安芯2 小时前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座
好好学习的星熊2 小时前
SQL 面试题(数据分析师)
sql·mysql
破土士V2 小时前
MySQL基础知识集合
数据库·mysql
笃行3503 小时前
达梦 VS 金仓:数据库替换项目里,迁移工具的差距体现在哪一层
数据库
笃行3503 小时前
向量数据库之后,一份合同为什么在五个库里对不上
数据库
笃行3503 小时前
数据库迁移工具装在一台笔记本上的年代,该翻篇了
数据库