mysql 同步线程出现ERROR 2006 (HY000): MySQL server has gone away

本文记录了一次线上MySQL备库同步线程出现错误的具体情况,包括错误日志提示及InnoDB数据页损坏后的处理过程。通过尝试使用--innodb_force_recovery参数启动MySQL,最终采取数据重做并导入的方式解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天线上一个备库的同步线程出现ERROR 2006 (HY000): MySQL server has gone away,感觉很奇葩,如下:

mysql> show slave status\G
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/home/mysql/mysql/tmp/mysql.sock' (2)
ERROR:
Can't connect to the server

果断查看错误日志:

InnoDB: If the corrupt page is an index page
InnoDB: you can also try to fix the corruption
InnoDB: by dumping, dropping, and reimporting
InnoDB: the corrupt table. You can use CHECK
InnoDB: TABLE to scan your table for corruption.
InnoDB: See also http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: about forcing recovery.
InnoDB: Ending processing because of a corrupt database page.
130602 12:53:40 mysqld_safe Number of processes running now: 0
130602 12:53:40 mysqld_safe mysqld restarted

说明数据页已经损坏了,怎么办?

抱着侥幸的心里加了--innodb_force_recovery=4 参数启动,重启实例,出现如下错误

Error 'Got error -1 from storage engine' on query. Default database: ‘xxx. Query: 'insert into xxxxxx (xx, xx, xxt) values ('efe99421b8038e79843acd0b650afb65', '鏃呮父', '{\"d\":{\"1369977481439\":[{\"n\":\"886101552531604045\",\"c\":\"1543429242 2847814627\"},{\"n\":\"9783085646656052076\",\"c\":\"65157479 2148290874\"},{\"n\":\"8842770608579691284\",\"c\":\"2828403933 962579475\"},{\"n\":\"4532336517264170948\",\"c\":\"2775100323 1262656757\"},{\"n\":\"10283011393799334833\",\"c\":\"832035076 2124070745\"},{\"n\":\"1636910875901144556\",\"c\":\"2441385694 4180750260\"},{\"n\":\"1454801548211122109\",\"c\":\"3872414415 1758090072\"},{\"n\":\"9617252920492977348\",\"c\":\"931080628 4009789701\"},{\"n\":\"10532308482238392940\",\"c\":\"2626421970 2517210497\"},{\"n\":\"3697079241674906690\",\"c\":\"878991478 2838000654\"},{\"n\":\"8877643288045826882\",\"c\":\"3769206655 4119371468\"},{\"n\":\"8720596808003303846\",\"c\":\"91351183 1451699941\"},{\"n\":\"3905702330576

数据物理页损坏,已经无法修复,重做数据,将数问题表据导出,然后倒入数据库;

然后重新同步,问题消失!


public function ReverseDeliveryFeeVerifyDo($yearMonth): bool { $monthTimeRange = $this->getMonthTimeRange($yearMonth); // 一次性查询出逆向配送费报价表数据 避免重复查询数据库 $quoteList = QuoteModel::field('warehous,price')->select()->toArray(); $quoteMap = []; if (!empty($quoteList)) { $quoteMap = array_column($quoteList, 'price', 'warehous'); } else { //Log::warning('【逆向配送费核对仓库名称不匹配】--月份为:' . $yearMonth . "的费用核对匹配不到逆向配送费报价表的仓库名称"); return false; } $status = true; // 初始化状态 $itemizationModel = new ItemizationModel(); $batchCount = 0; // 批次计数器 $reconnectInterval = 100; // 每100批重连一次 try { // 使用chunk方法分批处理数据,每批处理50条 ItemizationModel::whereBetween('business_time', [ $monthTimeRange['startTime'], $monthTimeRange['endTime'] ])->field('id,billing_amount,warehouse_name,theoretical_amount,fee_difference')->chunk(10, function ($items) use ($yearMonth, $quoteMap, &$status, $itemizationModel, &$batchCount, $reconnectInterval) { // 批次计数递增 $batchCount++; // 达到重连间隔时,重新连接数据库 if ($batchCount % $reconnectInterval === 0) { $this->reconnectDatabase(); //Log::info("【数据库重连】已处理{$batchCount}批,重新连接数据库"); } $batchData = []; foreach ($items as $item) { $itemData = $item->toArray(); // 转换为数组便于处理 if (!empty($itemData['warehouse_name']) && isset($quoteMap[$itemData['warehouse_name']])) { $itemData['theoretical_amount'] = $quoteMap[$itemData['warehouse_name']]; $itemData['fee_difference'] = $itemData['billing_amount'] - $quoteMap[$itemData['warehouse_name']]; } else { $itemData['theoretical_amount'] = ''; $itemData['fee_difference'] = ''; //Log::warning('【逆向配送费核对仓库名称不匹配】--月份为:' . $yearMonth . "的费用核对匹配不到逆向配送费报价表的仓库名称,明细数据id为" . $itemData['id']); } $batchData[] = $itemData; unset($item, $itemData); // 释放单条数据内存 } // 使用模型批量更新 if (!empty($batchData)) { $itemizationModel->saveAll($batchData); } // 释放批次数据内存并触发垃圾回收 unset($items, $batchData); gc_collect_cycles(); }); } catch (\Exception $e) { print_r("报错了直接干死整个进程,具体报错信息如下:".$e->getMessage());die; //Log::error('【逆向配送费核对异常】--月份为' . $yearMonth . "的费用核对发生错误:" . $e->getMessage()); $status = false; } // 释放主函数中的大型变量 unset($quoteList, $quoteMap, $itemizationModel); gc_collect_cycles(); return $status; } /** * 数据库重连方法 */ private function reconnectDatabase() { try { $connection = \think\facade\Db::connect(); $connection->close(); $connection->connect(); } catch (\Exception $e) { print_r("数据库连接失败:".$e->getMessage());die; Log::error('【数据库重连失败】' . $e->getMessage()); } } | 我利用上面的代码读取mysql的数据然后进行逻辑运算然后再更新回去 100万的数据到了80万左右就会报错:SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 错误 我的mysql的配置如下: [mysqld] #服务Id唯一 server-id = 1 port = 3306 log-error = /var/log/mysql/error.log # 只能用IP地址 skip_name_resolve # 数据库默认字符集 character-set-server = utf8 # 数据库字符集对应一些排序等规则 collation-server = utf8_general_ci # 设置client连接mysql时的字符集,防止乱码 init_connect='SET NAMES utf8' # 最大连接数 max_connections = 10000 # 增加连接错误上限 max_connect_errors = 10000 # 服务器等待客户端请求的超时时间(秒),默认8小时 wait_timeout = 28800 # 交互式连接超时时间(秒),默认28800 interactive_timeout = 28800 # 关闭前等待活动的时间(秒),默认28800 net_read_timeout = 28800 net_write_timeout = 28800 我的php.ini里设置如下: post_max_size = 100M upload_max_filesize = 50M memory_limit = 1024M 我的nginx里面的设置如下: client_max_body_size 100M; client_body_buffer_size 1024k; proxy_connect_timeout 3600; # 与上游服务器的连接超时 proxy_read_timeout 3600; # 从上游服务器读取响应的超时 proxy_send_timeout 3600; # 发送请求到上游服务器的超时 fastcgi_connect_timeout 3600; fastcgi_read_timeout 3600; fastcgi_send_timeout 3600; 请帮我分析一下这到底是什么问题导致的呢?
最新发布
07-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值