You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅单张MySQL表触发ERROR 2013/2002连接失败问题求助

问题描述

AlmaLinux系统上运行MySQL 8.0.34数月无异常,通过Workbench远程执行user_mails表的更新操作失败后,仅该表出现故障:

  • 远程访问时报错:Error Code: 2013. Lost connection to MySQL server during query
  • 本地root登录访问时报错:ERROR 2013 (HY000): Lost connection to MySQL server during query
  • 无法对该表执行任何操作(访问、读取、修改、重命名、导出、删除),甚至无法导出或删除整个数据库
  • 其他表操作正常,可创建新表

已尝试的无效操作:

  • 杀死所有MySQL进程
  • 替换镜像站点的ibd文件
  • 删除sock文件后重启服务
  • 修改my.cnf配置

需求:不卸载重装MySQL,仅需删除该表或对应数据库即可。

相关错误日志
2023-10-01T13:50:46.465427Z 0 [系统] [MY-010116] [服务器] /usr/sbin/mysqld (mysqld 8.0.34) 以进程30934启动
2023-10-01T13:50:46.478844Z 1 [系统] [MY-013576] [InnoDB] InnoDB初始化已启动
2023-10-01T13:50:46.607584Z 1 [系统] [MY-013577] [InnoDB] InnoDB初始化已完成
2023-10-01T13:50:46.782680Z 0 [警告] [MY-010068] [服务器] CA证书ca.pem为自签名
2023-10-01T13:50:46.782712Z 0 [系统] [MY-013602] [服务器] 通道mysql_main已配置为支持TLS,该通道现在支持加密连接
2023-10-01T13:50:46.799516Z 0 [系统] [MY-010931] [服务器] /usr/sbin/mysqld: 已准备好接受连接。版本: '8.0.34' 套接字: '/var/run/mysqld/mysqld.sock' 端口: 3306 MySQL Community Server - GPL
/opt/rh/gcc-toolset-12/root/usr/include/c++/12/bits/stl_vector.h:1123: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type) [with _Tp = short unsigned int; _Alloc = std::allocator<short unsigned int>; reference = short unsigned int&; size_type = long unsigned int]: 断言 '__n < this->size()' 失败
2023-10-01T13:52:49Z UTC - mysqld收到信号6;
很可能是触发了bug,但该错误也可能由硬件故障导致
BuildID[sha1]=0b168807aaca44fa650560191d175e4fd878ff78
线程指针: 0x7f3d2c000fc0
尝试生成回溯信息,可通过以下信息定位mysqld崩溃位置。如果此后无消息,说明情况严重...
stack_bottom = 7f3da4653c10 thread_stack 0x100000
/usr/sbin/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0x41) [0x2131091]
/usr/sbin/mysqld(print_fatal_signal(int)+0x2a2) [0xfee7e2]
/usr/sbin/mysqld(handle_fatal_signal+0xa5) [0xfee995]
/lib64/libpthread.so.0(+0x12cf0) [0x7f3dab0cbcf0]
/lib64/libc.so.6(gsignal+0x10f) [0x7f3da947aacf]
/lib64/libc.so.6(abort+0x127) [0x7f3da944dea5]
/usr/sbin/mysqld() [0x2b6b800]
/usr/sbin/mysqld(dict_index_add_to_cache_w_vcol(dict_table_t*, dict_index_t*, dict_add_v_col_t const*, unsigned int, bool)+0x1c33) [0x245f773]
/usr/sbin/mysqld() [0x24637f3]
/usr/sbin/mysqld(dd_fill_dict_index(dd::Table const&, TABLE const*, dict_table_t*, THD*)+0x83) [0x2480d13]
/usr/sbin/mysqld(dict_table_t* dd_open_table_one<dd::Table>(dd::cache::Dictionary_client*, TABLE const*, char const*, dd::Table const*, THD*, std::deque<char const*, ut::allocator<char const*, ut::detail::allocator_base_pfs<char const*> > >&)+0x10d8) [0x2483d28]
/usr/sbin/mysqld(dict_table_t* dd_open_table<dd::Table>(dd::cache::Dictionary_client*, TABLE const*, char const*, dd::Table const*, THD*)+0x97) [0x2485597]
/usr/sbin/mysqld(ha_innobase::open(char const*, int, unsigned int, dd::Table const*)+0x1464) [0x218ef34]
/usr/sbin/mysqld(handler::ha_open(TABLE*, char const*, int, int, dd::Table const*)+0x57) [0x10fb957]
/usr/sbin/mysqld(open_table_from_share(THD*, TABLE_SHARE*, char const*, unsigned int, unsigned int, unsigned int, TABLE*, bool, dd::Table const*)+0x10e8) [0xf98f48]
/usr/sbin/mysqld(open_table(THD*, Table_ref*, Open_table_context*)+0x1029) [0xde4d39]
/usr/sbin/mysqld(open_tables(THD*, Table_ref**, unsigned int*, unsigned int, Prelocking_strategy*)+0x509) [0xde60e9]
/usr/sbin/mysqld(open_tables_for_query(THD*, Table_ref*, unsigned int)+0x91) [0xde74a1]
/usr/sbin/mysqld(Sql_cmd_dml::prepare(THD*)+0x105) [0xed7bc5]
/usr/sbin/mysqld(Sql_cmd_dml::execute(THD*)+0xfc) [0xee381c]
/usr/sbin/mysqld(mysql_execute_command(THD*, bool)+0xae7) [0xe7f677]
/usr/sbin/mysqld(dispatch_sql_command(THD*, Parser_state*)+0x51b) [0xe82e6b]
/usr/sbin/mysqld(dispatch_command(THD*, COM_DATA const*, enum_server_command)+0x2341) [0xe857a1]
/usr/sbin/mysqld(do_command(THD*)+0x15b) [0xe8631b]
/usr/sbin/mysqld() [0xfde9f8]
/usr/sbin/mysqld() [0x2844714]
/lib64/libpthread.so.0(+0x81ca) [0x7f3dab0c11ca]
/lib64/libc.so.6(clone+0x43) [0x7f3da9465e73]
解决步骤

方法1:跳过损坏表启动MySQL,直接删除

  1. 停止MySQL服务:
    systemctl stop mysqld
    
  2. 修改my.cnf(通常位于/etc/my.cnf或/etc/mysql/my.cnf),在[mysqld]段添加:
    innodb_force_recovery = 4
    

    说明:设为4允许数据库只读模式启动,跳过损坏表,避免崩溃

  3. 启动MySQL服务:
    systemctl start mysqld
    
  4. 登录MySQL,执行删除操作:
    -- 删除表
    DROP TABLE user_mails;
    -- 或删除数据库
    DROP DATABASE your_database_name;
    
  5. 停止MySQL服务,移除innodb_force_recovery = 4配置,重启恢复正常模式。

方法2:手动删除表物理文件(谨慎操作)

若方法1无效,可尝试手动清理:

  1. 停止MySQL服务:
    systemctl stop mysqld
    
  2. 找到数据库存储目录(通常为/var/lib/mysql/your_database_name/),删除该表相关文件:
    rm -rf /var/lib/mysql/your_database_name/user_mails.*
    
  3. 启动MySQL服务,若数据字典仍有残留,登录后执行:
    FLUSH TABLES;
    

注意事项

  • 操作前确认已备份所有正常表数据
  • innodb_force_recovery值不要超过4,更高值可能损坏正常数据
  • 手动删除文件时务必核对文件名,避免误删其他表

内容的提问来源于stack exchange,提问作者Majte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:24:55