无备份情况下如何从持久卷恢复K8s误删的Neo4j 3.5数据库?
恢复可行性结论
可以恢复。GCP Persistent Disk是独立于Kubernetes集群的持久化存储资源,只要磁盘本身未被删除、数据未被覆写,磁盘中存储的Neo4j图数据、集群元数据均完整保留。原密码Secret丢失不影响磁盘上的实体数据,仅需要重置认证配置即可恢复访问。
具体操作步骤
- 前置校验
确认3块留存的GCP PD状态为未挂载,记录每块磁盘的名称、可用区、容量,操作前先对所有磁盘创建手动快照,避免操作失误导致数据损坏。 - 重建Kubernetes静态存储资源
在和PD同可用区的Kubernetes集群中,为每块磁盘分别创建静态PV,配置示例如下:
PV创建完成后,再为每个PV创建对应PVC,PVC名称、命名空间和磁盘标签中标注的原PVC信息(比如示例中的apiVersion: v1 kind: PersistentVolume metadata: # 对应磁盘标签中标注的原PV名称,3块磁盘分别替换为各自对应的原PV名 name: pvc-fd4fe6eb-2c24-11ea-bd38-42010a8e0228 spec: accessModes: - ReadWriteOnce capacity: storage: 100Gi # 替换为对应磁盘的实际容量 gcePersistentDisk: pdName: 替换为GCP控制台中对应PD的实际名称 fsType: ext4 persistentVolumeReclaimPolicy: Retain storageClassName: standard # 替换为集群对应GCP存储类名称datadir-neo4j-neo4j-core-2、default命名空间)保持一致,PVC配置的容量、存储类和对应PV匹配,PVC会自动绑定到对应静态PV。 - 重置Neo4j管理员密码
针对每个PVC分别创建临时调试Pod挂载PVC,删除Neo4j认证文件,配置示例:
Pod启动后执行apiVersion: v1 kind: Pod metadata: name: neo4j-debug namespace: default spec: volumes: - name: neo4j-data persistentVolumeClaim: claimName: 替换为对应PVC名称 containers: - name: debug image: neo4j:3.5-enterprise command: ["sleep", "3600"] volumeMounts: - name: neo4j-data mountPath: /datakubectl exec -it neo4j-debug -- bash进入容器,执行rm /data/dbms/auth删除认证文件,删除后销毁调试Pod。3个PVC都需要执行相同操作。 - 重新部署Neo4j集群
部署和原版本完全一致的Neo4j 3.5企业版集群,存储配置直接关联之前创建的3个PVC,不需要新建存储资源。 - 数据验证
集群启动完成后,使用默认账号密码neo4j/neo4j登录,按提示修改新的管理员密码后,执行查询语句验证数据完整性,确认无误后及时制作全量备份。
注意事项
- 新部署的Neo4j版本必须和原部署的3.5小版本完全匹配,避免版本不兼容导致数据无法加载
- 恢复完成后将新的管理员密码存入Kubernetes Secret,后续部署可以直接通过Secret注入认证信息
- 所有操作全程不要对留存的PD执行格式化、删除操作
内容的提问来源于stack exchange,提问作者rdimicheleb
相关产品推荐
相关产品推荐

