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和当前逻辑保持一致
相关推荐
曹牧1 小时前
Oracle:前缀匹配之REGEXP_LIKE
数据库·oracle
暴躁小师兄数据学院3 小时前
【AI大数据工程师特训笔记】第05讲:关联查询
数据库·sql·oracle
倔强的石头_4 小时前
《Kingbase护城河》——跨平台环境下的数据库联调实战
数据库
lzhdim4 小时前
SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析
数据库·sql·mysql·json
骄马之死4 小时前
MySQL-InnoDB 核心原理
mysql
杨云龙UP4 小时前
Oracle RAC / ODA 生产环境指定 PDB 启动 SOP
linux·运维·数据库·oracle
kingwebo'sZone4 小时前
在Cent上安装Mysql 8.0的遇到的问题和解决办法
数据库·mysql·adb
幽络源小助理4 小时前
最新知识付费系统网站源码 PC+H5双端 附安装教程 – 幽络源源码网
大数据·数据库
小白考证进阶中5 小时前
Oracle OCP证书报考&考试全指南
数据库·oracle·oracle ocp·ocp认证·oracle认证·甲骨文认证·oracle ocp题库
Leon-Ning Liu6 小时前
【真实经验分享】 ORA-600 [qesmaGetTblSeg1]
数据库·oracle