### 环境:
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);