仅单张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,直接删除
- 停止MySQL服务:
systemctl stop mysqld - 修改
my.cnf(通常位于/etc/my.cnf或/etc/mysql/my.cnf),在[mysqld]段添加:innodb_force_recovery = 4说明:设为4允许数据库只读模式启动,跳过损坏表,避免崩溃
- 启动MySQL服务:
systemctl start mysqld - 登录MySQL,执行删除操作:
-- 删除表 DROP TABLE user_mails; -- 或删除数据库 DROP DATABASE your_database_name; - 停止MySQL服务,移除
innodb_force_recovery = 4配置,重启恢复正常模式。
方法2:手动删除表物理文件(谨慎操作)
若方法1无效,可尝试手动清理:
- 停止MySQL服务:
systemctl stop mysqld - 找到数据库存储目录(通常为
/var/lib/mysql/your_database_name/),删除该表相关文件:rm -rf /var/lib/mysql/your_database_name/user_mails.* - 启动MySQL服务,若数据字典仍有残留,登录后执行:
FLUSH TABLES;
注意事项
- 操作前确认已备份所有正常表数据
innodb_force_recovery值不要超过4,更高值可能损坏正常数据- 手动删除文件时务必核对文件名,避免误删其他表
内容的提问来源于stack exchange,提问作者Majte
相关产品推荐
相关产品推荐

