故障现象
运行在 k8s 里的nacos-mysql
突然无法正常连接,日志报错如下:
[Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
[ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
故障排查
-
磁盘或inode空间不足
-
ibdata1 文件被其他的进程占用 (日志中已说明)
-
其他
故障处理
由于是容器运行且该镜像没有常用的linux命令工具(netstat、ss、ps、top等),所以看不到一些进程细节。为了快速处理此问题,此次提供两种比较稳妥的方式。
这两种方式有个共同的前提步骤:新建一个nacos-mysql的pod(其实重新绑定一个新的pvc)。
前提步骤
对卷进行备份:
cp -rvf tsp-nacos-mysql-pvc-pvc-1cb53596-ab43-4dd4-ad9e-f3ea3e61f9ea tsp-nacos-mysql-pvc-pvc-1cb53596-ab43-4dd4-ad9e-f3ea3e61f9ea.bak-20240219
创建新卷:
---
## cat nacos-mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nacos-mysql-pvc2
namespace: tsp
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
storageClassName: k8s-baidu-tsp-sc
volumeMode: Filesystem
创建新的pvc:
kubectl apply -f nacos-mysql-pvc.yaml
重新拉起的nacos-mysql
服务此时是个空的库,并没有我们之前库的数据信息。接下来就是恢复数据。
方式一:使用备份sql文件恢复
备份的sql并不是实时的,所以本次数据恢复并没有采用该方式。
方式二:数据拷贝
将之前卷的数据拷贝至当前nacos-mysql数据卷中,操作前先将副本减为0:
nacos-mysql的rc副本数减为0:
kubectl scale rc nacos-mysql --replicas=0 -n tsp
拷贝数据:
cd tsp-nacos-mysql-pvc-pvc-1cb53596-ab43-4dd4-ad9e-f3ea3e61f9ea.bak-20240219
cp -rvf ibdata1 ../tsp-nacos-mysql-pvc2-pvc-ffac46a6-cfe8-472d-b7f9-bb49efc865d4
cp -rvf nacos ../tsp-nacos-mysql-pvc2-pvc-ffac46a6-cfe8-472d-b7f9-bb49efc865d4
cp -rvf ib_logfile0 ../tsp-nacos-mysql-pvc2-pvc-ffac46a6-cfe8-472d-b7f9-bb49efc865d4
cp -rvf ib_logfile1 ../tsp-nacos-mysql-pvc2-pvc-ffac46a6-cfe8-472d-b7f9-bb49efc865d4
启动nacos-mysql
:
kubectl scale rc nacos-mysql --replicas=1 -n tsp
查看服务log信息,服务已恢复正常。