我在两台机器上安装了 Samba 和 Postgres。
当文件的用户和组是两台机器的登录用户和组时,我可以成功地将文件从一台机器复制到另一台机器。(两台机器上的登录名和密码相同。)
我的目标目录 /mnt/pg-ralph12/ 已成功挂载。
mount: //192.168.29.205/pg-ralph12 mounted on /mnt/pg-ralph12
我的源计算机上的 Postgres 目录的用户和组是:
getfacl: Removing leading '/' from absolute path names
# file: var/lib/postgresql
# owner: postgres
# group: postgres
user::rwx
group::r-x
other::r-x
对于我的目标目录
getfacl: Removing leading '/' from absolute path names
# file: mnt/pg-ralph12/not-main
# owner: real-owner
# group: sudo
user::rwx
group::r-x
group:postgres:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:postgres:rwx
default:mask::rwx
default:other::r-x
当我尝试运行 rsync 时
sudo rsync -a /var/lib/postgresql /mnt/pg-ralph12/not-main
我明白了
[sudo] password for real-estate-data-mining:
rsync: chown "/mnt/pg-ralph12/not-main/postgresql" failed: Permission denied (13)
rsync: chown "/mnt/pg-ralph12/not-main/postgresql/9.6" failed: Permission denied (13)
rsync: chown "/mnt/pg-ralph12/not-main/postgresql/9.6/main" failed: Permission denied (13)
rsync: chown "/mnt/pg-ralph12/not-main/postgresql/9.6/main/base" failed: Permission denied (13)
etc
我在网上搜索了好多地方试图找到答案,但没有成功。
答案1
我想到解决方案是以下 bash 脚本:
#!/bin/bash
# Copy/replace myDatabase from Ralph07 to Ralph12
dropdb -e -h 192.168.29.205 --no-password --if-exists -U postgres myDatabase
# createdb -e -h 192.168.29.205 --no-password -U postgres myDatabase # The database will automagically be created
pg_dump -C -h localhost --no-password -U postgres myDatabase | psql -h 192.168.29.205 --no-password -U postgres
192.168.29.205 是目标计算机的 (静态) IP 地址。您的 IP 可能会有所不同。
为了使 --no-password 选项起作用,您必须编辑 ~/.pgpass。我的 (已编辑!) 如下所示:
localhost:5432:*:postgres:MyPassword
192.168.29.205:5432:*:postgres:MyPassword
例如,https://www.postgresql.org/docs/9.6/static/libpq-pgpass.html有关 .pgpass 的解释
您可能还需要编辑 /etc/postgresql/9.6/main/postgresql.conf(如果您使用的是 Postgres 9.6 版本)。请参阅https://blog.bigbinary.com/2016/01/23/configure-postgresql-to-allow-remote-connection.html
这个解决方案似乎很可靠。在我使用它的短时间内(不到一天),我没有遇到任何问题。如果我遇到问题,我会在这里报告。
我在网上看到的其他删除数据库的解决方案(例如进入 psql)对我来说不起作用。
什么对我不起作用
作为参考,以下内容对于我删除数据库不起作用。
UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'myDatabase';
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'myDatabase' AND pid <> pg_backend_pid();
DROP DATABASE "myDatabase";
我收到错误“错误:无法删除当前打开的数据库”
进一步的问题:
有什么区别删除数据库还有上面的代码吗?