简介
最近我购买了一台新的服务器,需要把 Umami 服务器从旧服务器迁移到新服务器上。但我是用 Docker 安装的 Umami。
迁移中最困难和重要的部分就是导出 Umami 的数据。我们有几种方法可以实现:
导出 Docker 卷(非常复杂)
导出数据库(我的选择)
复制整个路径(不推荐)
比较方法
首先,我们要知道 Umami 的数据是存储在卷(Volume)中的。因为 docker-compose.yml
指定了:
services:
db:
volumes:
- umami-db-data:/var/lib/postgresql/data
volumes:
umami-db-data:
如果我把路径挂载到容器里而不是卷,那就可以直接把路径复制到新机器上。比如:
services:
db:
volumes:
- /root/umami/data:/var/lib/postgresql/data
最后,我决定只导出数据库并导入到新实例中。让我们一步一步来。
迁移数据库
首先,让我们进入旧容器的 Shell,导出.sql
文件,复制到/root
目录并删除容器内临时.sql
文件。
docker exec umami-db-1 sh -c 'pg_dump --username=umami umami > /umami.sql' && \
docker cp umami-db-1:/umami.sql /root/ && \
docker exec umami-db-1 rm /umami.sql
命令解析:
在名为 umami-db-1 的容器中执行 pg_dump,将 PostgreSQL 数据库导出为 /umami.sql 文件(容器内部路径)
docker exec umami-db-1 sh -c 'pg_dump --username=umami umami > /umami.sql'
将容器内的备份文件复制到宿主机的 /root 目录
docker cp umami-db-1:/umami.sql /root/
删除容器内的临时备份文件,避免占用空间
docker exec umami-db-1 rm /umami.sql
接着,你需要把这个备份文件传输到新主机上。在新主机上 docker compose up -d
后,umami-db-1
容器就会被创建。然后你可以通过以下命令把数据库备份文件复制到容器中执行以下命令
docker exec umami-db-1 psql -U umami -d umami -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" && \
docker cp /root/umami.sql umami-db-1:/ && \
docker exec umami-db-1 sh -c "psql -U umami -d umami -f /umami.sql && rm /umami.sql"
命令解析:
清空数据库:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
复制 SQL 文件到容器:
docker cp /root/umami.sql umami-db-1:/
导入 SQL 并删除容器内文件:使用
psql
执行 SQL,执行完后rm /umami.sql
删除临时文件
最后,重启 Umami 实例:
docker compose down
docker compose up -d
检查
现在可以检查数据库是否迁移成功了。打开新 Umami 的 URL,尝试用原来的账号登录。如果能登录,那数据库很可能迁移成功了(账号信息是存在数据库里的)。
为了进一步确认,你可以进入仪表盘,看看所有数据是否正常显示。
如果不正常,说明数据库没有成功迁移。你可以检查导出的备份文件(里面是否包含正确的数据?),以及导入的方式(看看备份文件是否成功导入到新的 Postgres)
评论区