前言
在每次同步或上传照片到群晖的相册中时,群晖都会自动读取文件的元数据信息并储存到特定的数据库以供后续索引等使用。
其中包括了大量的可供使用的信息,可能会有人需要这些信息。
比如我之前就需要分析我上传的照片,然后统计一下使用某款相机搭配某款变焦镜头拍的所有照片中哪几个焦段是我最常用的,以供我作为买定焦镜头时的参考数据。(虽然最终统计结果是几乎一半多的照片是 50mm 镜头拍的,所以我买了个 50F1.4 GM 镜头,然后就吃灰了,我发现我并不喜欢 50mm,哈哈哈哈)
一开始是打算自己写脚本来读取分析的,但是后来粗略看了下,照片有点太多了,自己写脚本麻烦不说,速度还很慢。
所以就想到我可以直接导出群晖已经给我存好的数据不就得了。
于是就有了这篇文章。
PS:本来这个是半年前的事了,但是我当时没做记录,今天又有这个需求时发现我已经完全忘了要怎么操作了。还好通过 shell 历史倒推出来了,吸取教训,这次边操作边记录下来。
方法简述
通过 ssh 进入群晖的终端,然后切换用户为 postgre 用户,在该用户下可以读取到群晖的所有数据库。
相册元数据数据库名为 synofoto
。
如果和群晖在同一个内网,或者群晖具有公网 IP,那么直接 ssh 连接后按照第三节所述继续操作即可。
如果当前没有与群晖同处一个内网,且群晖没有公网 IP ,则可以按照第二节所述通过群晖自带的内网穿透连接到 DSM (即使用群晖的 Quick Connect),然后在 DSM 中开启一个 Debian 容器,在 Debian 中连接到群晖主机。
从 Docker 容器中连接到宿主机的终端
- 在 Docker 中下载 Debian 的镜像并新建一个容器
- 启动 Debian 容器(需要将网络设置为桥接模式)
- 打开该镜像的终端(选中该容器,点击 操作-打开终端机)
- 安装 ssh 客户端程序(如果已存在请忽略):
apt update
apt install -y iproute2 ssh-client
因为默认的安装仓库大概率连不上,可以用腾讯的镜像仓库:
url=http://mirrors.cloud.tencent.com
sed -i "s@http.*\(com\|org\|cn\)@$url@g" /etc/apt/sources.list
安装完成后连接到群晖宿主机:
ssh user@192.168.1.1
user
为你当前登录的 DSM 用户名(或其他有权限的用户也行)
192.168.1.1
为你当前群晖主机所处的内网 IP (可直接在桌面的系统状态窗口看到,也可以到设置中查看)
注意,需要开启群晖的 ssh 连接才行
如果设置的 ssh 端口不是默认的 22 端口,则需要指定端口:
ssh -p 123 user@192.168.1.1
其中 123 即为你设置的 ssh 端口。
导出数据
首先切换登录用户到 postgre :
sudo su - postgres
现在我们可以通过 psql synofoto
执行 postgresSQL 命令或 sql。
其中 synofoto
为数据库名。
导出我们需要的相册数据到 sql 文件可以用:
pg_dump synofoto > synofoto_$(date+%Y%m%d_%H%M%S).sql
注意:这个命令不是在 psql 中执行,而是直接在 postgres 用户的终端中执行
上述命令会把 synofoto 数据库(即存放相册的数据库)数据导出到按照时间命名的 sql 文件中。
备份完成后需要将 sql 文件移动到外部储存空间,不然在 DSM 中找不到该文件:
mv synofoto_20240507_1412.sql /volume1/@tmp
exit
sudo mv /volume1/@tmp/synofoto_20240507_1412.sql ~/temp
注意这里需要先移动到 /volume1/@tmp
文件夹中转一下,移动到其他文件夹是没有权限的,@tmp 是个共享文件夹,所有用户都可以读写。
然后退出 postgres 用户,返回我们自己用户,就可以把 @temp 文件夹中的文件复制到任意需要的地方了。
查看数据
在上一步中我们可以导出为 SQL 文件,当然也可以用 SQL 语句直接导出成 csv 文件或其他文件。
如果导出的是 SQL 的话可以随便用一个什么数据库管理软件,新建一个 postgresSQL 数据库,然后执行这个 SQL 文件,把数据导入即可。
这里推荐 jetBrains 家的 DataGrip,当然,这是收费的。
所以也可以用他家免费的 WebStorm 代替。