故障现象

运行在 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信息,服务已恢复正常。

文章来源

个人技术私库