【发布时间】:2020-05-14 07:06:07
【问题描述】:
正在使用COPY 查询将文件写入目录:
Copy (SELECT * FROM animals) To '/var/lib/postgresql/data/backups/2020-01-01/animals.sql' With CSV DELIMITER ',';
但是如果目录2020-01-01 不存在,我们会得到错误
无法打开文件“/var/lib/postgresql/data/backups/2020-01-01/animals.sql”进行写入:没有这样的文件或目录
PostgeSQL 服务器在 Docker 容器中运行,卷映射为 /mnt/backups:/var/lib/postgresql/data/backups
Copy 查询是从 Docker 容器外部的 Node.js 应用发送的。
映射的主机目录/mnt/backups由Docker Compose创建,归root所有,因此发送COPY查询的Node.js应用由于权限不足而无法创建缺失的目录。
备份文件旨在从 Docker 容器中传输到 Docker 主机。
问题:如果目录不存在,是否可以使用 SQL 查询要求 PostgreSQL 11.2 创建目录?如果没有,您会建议如何创建目录?
在 Ubuntu 18.04 主机上使用 Node.js 12.14.1。在容器内使用 PostgreSQL 11.2,Docker 19.03.5
【问题讨论】:
-
这个文件需要在服务器中创建吗?是否可以选择直接在客户端计算机中创建它?
-
@JimJones 可以直接在客户端机器(Ubuntu,也是Docker主机)中创建。如果在客户端计算机上创建,您是否认为它会明显变慢?
-
速度不会有差异。我会添加一个答案让你尝试一下
-
@JimJones 速度可能会有所不同,具体取决于网络和客户端的效率。使用
to stdin,数据必须从服务器传输到客户端,然后再传输到磁盘。使用to 'file',它直接进入磁盘。 -
Postgres has its own backup and restore utilities。它们可能是比自己构建更好的选择。
标签: sql node.js postgresql docker docker-compose