AKS集群中MariaDb切换至Azure文件共享卷启动失败求助
在AKS中使用Azure文件共享卷部署MariaDB启动失败问题排查
问题现象
- 未挂载卷时,Pod可正常创建并访问数据库;
- 挂载Azure文件共享卷后,容器启动报错,错误日志如下:
2023-04-14 14:29:11+00:00 [Note] [Entrypoint]: Initializing database files 2023-04-14 14:29:11 0 [ERROR] InnoDB: The Auto-extending data file './ibdata1' is of a different size 0 pages than specified by innodb_data_file_path 2023-04-14 14:29:11 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error 2023-04-14 14:29:11 0 [ERROR] Plugin 'InnoDB' init function returned error. 2023-04-14 14:29:11 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 2023-04-14 14:29:11 0 [ERROR] Unknown/unsupported storage engine: InnoDB 2023-04-14 14:29:11 0 [ERROR] Aborting Installation of system tables failed! Examine the logs in /var/lib/mysql/ for more information.
- 查看文件共享,发现MariaDB创建了0字节的
ibdata1、aria_log.00000001和aria_log_control文件; - 使用nginx镜像挂载同一卷可正常读写;
- 部署方式为StatefulSet,相关配置如下:
PersistentVolume配置
kind: PersistentVolume apiVersion: v1 metadata: name: mariadb-pv annotations: pv.kubernetes.io/provisioned-by: file.csi.azure.com spec: capacity: storage: 50Gi azureFile: secretName: storage-account shareName: mariadb accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: azurefile-csi mountOptions: - file_mode=0777 - nobrl - mfsymlinks - gid=999 - uid=999 - dir_mode=0777 - nosharesock - cache=strict volumeMode: Filesystem
PersistentVolumeClaim配置
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: mariadb-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi volumeName: mariadb-pv storageClassName: azurefile-csi volumeMode: Filesystem
MariaDb StatefulSet配置
kind: StatefulSet apiVersion: apps/v1 metadata: name: mariadb-sts spec: replicas: 1 selector: matchLabels: app: mariadb template: metadata: labels: app: mariadb spec: volumes: - name: datadir persistentVolumeClaim: claimName: mariadb-pvc containers: - name: mariadb image: mariadb:10.11 ports: - name: mariadb-port containerPort: 3306 protocol: TCP env: - name: MARIADB_ROOT_PASSWORD valueFrom: secretKeyRef: name: mariadb key: password optional: false volumeMounts: - name: datadir mountPath: /var/lib/mysql mountPropagation: None restartPolicy: Always serviceName: mariadb
已调整挂载选项中的uid和gid为mysql用户的999,问题仍未解决。
问题原因及解决方案
核心原因
Azure文件共享基于SMB协议,不支持InnoDB所需的**稀疏文件(Sparse File)**特性。MariaDB初始化时尝试创建自动扩展的ibdata1稀疏文件,但SMB无法正确处理这种文件类型,导致文件实际大小为0字节,触发InnoDB的大小校验错误。
解决办法
1. 修改InnoDB配置,禁用稀疏文件创建
创建ConfigMap存储自定义MariaDB配置,强制InnoDB创建预分配的非稀疏文件:
apiVersion: v1 kind: ConfigMap metadata: name: mariadb-config data: my.cnf: | [mysqld] innodb_data_file_path = ibdata1:12M:autoextend innodb_file_per_table = 1 innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 8M innodb_log_file_size = 512M innodb_sparse = 0
在StatefulSet中挂载该ConfigMap到/etc/mysql/conf.d目录,修改StatefulSet的spec.template.spec部分:
volumes: - name: datadir persistentVolumeClaim: claimName: mariadb-pvc - name: config configMap: name: mariadb-config containers: - name: mariadb image: mariadb:10.11 # 其他原有配置保持不变 volumeMounts: - name: datadir mountPath: /var/lib/mysql mountPropagation: None - name: config mountPath: /etc/mysql/conf.d
2. 清理现有无效文件
删除Azure文件共享中已创建的0字节ibdata1、aria_log.00000001和aria_log_control文件,避免初始化时读取无效文件。
3. 验证部署
重新创建StatefulSet,观察Pod启动日志确认InnoDB初始化正常:
kubectl logs mariadb-sts-0
内容的提问来源于stack exchange,提问作者nimbusparis
相关产品推荐
相关产品推荐

