GOEDGE主控数据库因服务器意外断电导致无法启动,根据错误日志排查API节点Mysql innodb异常,本文章记录大概的恢复思路过程。
〇、崩溃错误
GOEDGE:
MYSQL有启动但是未监听3306端口,查看错误日志文件:
一、镜像虚拟机
好在此服务跑在虚拟机上,发生问题在执行下一步之前做个快照,有个完美的容错回档空间。
二、数据导出思路和过程
1、收集所有服务的路径
godege目录:/usr/local/goedge/edge-admin/
数据库配置文件:
/usr/local/goedge/edge-admin/configs/api_db.yaml
/usr/local/goedge/edge-api/configs/db.yaml
后期原地换新数据库密码要用到。
参考文献:https://goedge.cn/docs/Admin/Transfer.md
mysql服务:
Mysql服务:cd /usr/local/mysql/bin
数据文件:/usr/local/mysql/data
错误日志:/usr/local/mysql/data/HKGoedgeMaster.err (HKGoedgeMaster这个根据主机名修改)
使用官方一键安装包在以上路径。
2、开启force_innodb_recovery
参考《force_innodb_recovery 用法和错误日志》,当发现1-6只能用6启动时,注定要有数据表GG了。
3、显示MYSQL所有数据表
mysql -uroot
内执行
show databases; #查看数据库 use edges; #进入数据库 show tables; #查看目前数据表,本地备忘录存储一份 quit; #退出
看看当前的数据表情况,因为数据量接近50G,为顺利导出放弃大量的日志。
3、mysqldump 尝试导出数据库到本地
/usr/local/mysql/bin/mysqldump edges -f --single-transaction --net_buffer_length=16384 --max_allowed_packet=16777216 --ignore-table=edges.edgeHTTPAccessLogs_20240308 --ignore-table=edges.edgeHTTPAccessLogs_20240309 --ignore-table=edges.edgeHTTPAccessLogs_20240310 --ignore-table=edges.edgeHTTPAccessLogs_20240311 --ignore-table=edges.edgeHTTPAccessLogs_20240312 --ignore-table=edges.edgeHTTPAccessLogs_20240313 --ignore-table=edges.edgeHTTPAccessLogs_20240314 --ignore-table=edges.edgeHTTPAccessLogs_20240315 --ignore-table=edges.edgeHTTPAccessLogs_20240316 --ignore-table=edges.edgeHTTPAccessLogs_20240317 --ignore-table=edges.edgeHTTPAccessLogs_20240318 --ignore-table=edges.edgeHTTPAccessLogs_20240319 --ignore-table=edges.edgeHTTPAccessLogs_20240320 --ignore-table=edges.edgeHTTPAccessLogs_20240321 --ignore-table=edges.edgeHTTPAccessLogs_20240322 --ignore-table=edges.edgeHTTPAccessLogs_20240323 --ignore-table=edges.edgeHTTPAccessLogs_20240324 --ignore-table=edges.edgeHTTPAccessLogs_20240325 --ignore-table=edges.edgeHTTPAccessLogs_20240326 --ignore-table=edges.edgeHTTPAccessLogs_20240327 --ignore-table=edges.edgeHTTPAccessLogs_20240328 --ignore-table=edges.edgeHTTPAccessLogs_20240329 --ignore-table=edges.edgeHTTPAccessLogs_20240330 --ignore-table=edges.edgeHTTPAccessLogs_20240331 --ignore-table=edges.edgeHTTPAccessLogs_20240401 --ignore-table=edges.edgeHTTPAccessLogs_20240402 --ignore-table=edges.edgeHTTPAccessLogs_20240403 --ignore-table=edges.edgeHTTPAccessLogs_20240404 --ignore-table=edges.edgeHTTPAccessLogs_20240405 --ignore-table=edges.edgeHTTPAccessLogs_20240406 > /root/goedge.sql
用法释义:
-f #忽略所有error,强制导出。 --single-transaction #用于在备份 MySQL 数据库时创建一个一致性的快照,避免了在备份过程中对数据库进行长时间锁定的情况。 --net_buffer_length #加大缓冲区(小数据库可以去掉) --max_allowed_packet #加大mysql服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小(小数据库可以去掉) --ignore-table #忽略数据表(日志又大不一定有用的话放弃掉)
4、mysqldump被中断,提示
mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `edgeNodeValues` at row: 22117 mysqldump: Couldn't execute 'ROLLBACK TO SAVEPOINT sp': Lost connection to MySQL server during query (2013) mysqldump: Couldn't execute 'show table status like 'edgeNodes'': Lost connection to MySQL server during query (2013) mysqldump: Couldn't execute 'SET SQL_QUOTE_SHOW_CREATE=1': Lost connection to MySQL server during query (2013) mysqldump: Couldn't execute 'SELECT `COLUMN_NAME` AS `Field`, `COLUMN_TYPE` AS `Type`, `IS_NULLABLE` AS `Null`, `COLUMN_KEY` AS `Key`, `COLUMN_DEFAULT` AS `Default`, `EXTRA` AS `Extra`, `COLUMN_COMMENT` AS `Comment` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE TABLE_SCHEMA = 'edges' AND TABLE_NAME = 'edgeNodes' ORDER BY ORDINAL_POSITION': Lost connection to MySQL server during query (2013)
表示在导出 edgeNodeValues 这个表时发生错误被服务器中断,那就排除掉,接在之前mysqldump命令–ignore-table=edges.edgeHTTPAccessLogs_20240406 后面加上
--ignore-table=edgeNodeValues
5、再次导出直到没有错误提示。
三、重新安装GOEDGE数据库
删除/安装/设置,参考文档:https://goedge.cn/docs/Appendix/MySQL/Install.md 一键包即可。
记录下mysql的登陆信息,并在下面2个文件
/usr/local/goedge/edge-admin/configs/api_db.yaml
/usr/local/goedge/edge-api/configs/db.yaml
更新最新的mysql密码。
四、创建导入数据库
mysql -uroot -p
输入密码登陆后执行:
CREATE DATABASE `edges` CHARSET utf8mb4; #创建数据库 use edges; #进入数据库 source /root/goedge.sql; #导入数据库 #全OK表示完美无错 show tables; #查看现在的数据表 quit; #退出
五、重启goedge
edge-admin restart
进入后则工程结束。
总的来说:
先备份并导出数据库、删除原来的整个数据库文件、重新安装全新数据库、创建并导入数据库。