LinQ
发布于 2024-03-13 / 23 阅读 / 0 评论 / 0 点赞

immich 升级数据库故障-数据表损坏修复

### 环境:

immich v1.95.1 -> v 1.96.0

pgsql 镜像版本: tensorchord/pgvecto-rs:pg14-v0.2.0

### 故障现象

数据库报错日志:

2024-03-07T08:43:13.530959156Z 2024-03-07 08:43:13.530 GMT [18463] ERROR: could not find tuple for opclass 143236

2024-03-07 08:43:13.530 GMT [18463] STATEMENT:

UPDATE geodata_places

2024-03-07T08:43:13.530986537Z SET "admin1Name" = admin1.name

FROM geodata_admin1 admin1

WHERE admin1.key = "admin1Key"

执行sql 失败,提示与geodata_places表交互时找不到 opclass 的元组。进一步排查发现geodata_places 数据表损坏。

### 解决办法

在discord 中发帖寻求帮助获取有效的解决思路。

1、geodata_places 表用于在元数据提取过程中查找最接近图像坐标的城市、国家/地区等。可以删除并重新创建它。我认为唯一的副作用是元数据提取在下一个版本之前不会找到城市。

2、尝试删除数据表 drop table geodata_places ; 发现同样报错无法删除。

3、向chatgpt提问,建议备份immich 数据库除geodata_places表以外的数据,后删除整个immich 数据库。

pg_dump -U immich -d immich -T geodata_places > dumpfile.sql

psql -U immich -d immich

## drop database immich;

4、搭建一个相同版本immich,从pgsql数据库中导出 geodata_places 表数据备份。

pg_dump -U immich -d immich -t geodata_places > geodata_places.sql

5、调整导出的 geodata_places.sql 内容,删除文件开通相关set设置环境信息的命令行,保留 创建table 插入数据和创建索引的语句。

6、在原环境里创建 immich 数据库 并将liang'ge两个sql 备份文件导入。

psql -U immich

## CREATE DATABASE immich;

## GRANT ALL PRIVILEGES ON DATABASE immich TO immich;

psql -U immich -d immich -f ./dumpfile.sql

psql -U immich -d immich -f ./geodata_places.sql

7、启动immich server 检查 功能是否异常。

### 其他问题

在修复完成数据库后升级immich 发现 数据库扩展和 数据表索升级时为正常创建,手动创建扩展和函数,还原同版本数据表恢复。

#查询已安装的pgsql扩展信息

\dx

#创建扩展

CREATE EXTENSION unaccent;

#显示函数的 完整定义和创建语句

SELECT pg_get_functiondef('f_unaccent(text)'::regprocedure);

#创建函数

CREATE OR REPLACE FUNCTION public.f_unaccent(text)

RETURNS text

LANGUAGE sql

IMMUTABLE PARALLEL SAFE STRICT

RETURN unaccent('unaccent'::regdictionary, $1);

评论