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


    摘要:

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

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

    DDL:

    1. create table t1(c1 int primary key);
    2. create table t2(c2 int);

    alter table t2 add foreign key(c2) references t1(c1);

    错误日志:

    1. 375: ha_create_table: mdb: mdb exec ok, query: alter table t2 add foreign key(c2) references t1(c1);
    2. 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
    3. 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

    调用堆栈:

    1. #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)
    2. at /root/work/trunk/mysql-server-mysql-8.0.33/sql/monetdb_adaptor/monetdb_adaptor.cc:344
    3. #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",
    4. table_def=0x7f0267b0b528, generate_warning=false) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/handler.cc:2598
    5. #2 0x0000000003781050 in quick_rm_table (thd=0x7f0598000c90, base=0xbe38680, db=0x7f0267c23480 "db3", table_name=0x7f061c6f2a00 "#sql2-132ae8-14", flags=11)
    6. at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_table.cc:3852
    7. #3 0x00000000037ac2d5 in mysql_alter_table (thd=0x7f0598000c90, new_db=0x7f0267c23480 "db3", new_name=0x0, create_info=0x7f061c6f5010, table_list=0x7f0267c22e30, alter_info=0x7f061c6f4ea0)
    8. at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_table.cc:18095
    9. #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
    10. #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
    11. #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
    12. #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
    13. #8 0x00000000036b7790 in do_command (thd=0x7f0598000c90) at /root/work/trunk/mysql-server-mysql-8.0.33/sql/sql_parse.cc:1439
    14. #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
    15. #10 0x000000000594c187 in pfs_spawn_thread (arg=0xbfffa70) at /root/work/trunk/mysql-server-mysql-8.0.33/storage/perfschema/pfs.cc:3042
    16. #11 0x00007f066bc401ca in start_thread () from /lib64/libpthread.so.0
    17. #12 0x00007f066a1f0e73 in clone () from /lib64/libc.so.6

    出错原因:

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

    解决方案:

    1. 在调用mdb前, 确保执行的sql时候的sql_command和当前逻辑保持一致

  • 相关阅读:
    工具篇--分布式定时任务springBoot 整合 elasticjob使用(3)
    C#的基于.net framework的Dll模块编程(五) - 编程手把手系列文章
    【闲聊杂谈】源码追踪Spring的JDK和CGLib动态代理
    Spring Boot面试必问:启动流程(自动装配)
    java基于微信小程序的培训机构报名作业管理系统 uniapp 小程序
    小型k8s
    No suitable driver found for jdbc:mysql://localhost:3306/BookManagement
    Spring Cloud 学习笔记(2 3)
    Linux信号解析
    Python实现番茄小说内容下载
  • 原文地址:https://blog.csdn.net/adofsauron/article/details/133674893