我正在运行 Ubuntu 16。我已经安装了 Postgresql。Postgresql 曾经可以工作,但后来我重新启动了。
nmap 命令显示端口 5432 已打开。Postgres 似乎工作正常:
service postgresql status
Run Code Online (Sandbox Code Playgroud)
postgresql.service - PostgreSQL RDBMS 已加载:已加载(/lib/systemd/system/postgresql.service;已启用;供应商预设:已启用)活动:自美国东部时间周六 2017-07-29 18:42:59 起处于活动状态(退出);1min 4s ago Process: 201 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 201 (code=exited, status=0/SUCCESS)
Memory: 0B CGroup: /system.slice/postgresql.服务
我跑了这个: psql
但我得到了这个:
psql:无法连接到服务器:没有这样的文件或目录 服务器是否在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?
上面列出的文件似乎不存在。
我如何进入 Postgresql?通常我会跑psql或sudo -i -u postgres然后psql。但是这些命令不起作用。我不断收到有关“无法连接到服务器”的错误消息。几次重新启动都没有帮助。
更新:
我运行了这个命令: dpkg -l | grep postgres
rc postgresql-9.5 9.5.6-0ubuntu0.16.04 amd64 对象关系 SQL 数据库,版本 9.5 服务器 ii postgresql-client 9.5+173 PostgreSQL 的所有前端程序(支持版本) ii postgresql-client-9.5 9.5.7-0ubuntu0.16.04 …
从 PostgreSQL 9.0 开始,每个大对象都有自己的访问权限,这些权限被授予:
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Run Code Online (Sandbox Code Playgroud)
SELECT 权限允许以只读模式打开对象,对于 UPDATE,文档说:
For large objects, this privilege allows writing or truncating the object.
Run Code Online (Sandbox Code Playgroud)
但是如果一个大对象属于user1,我找不到如何授予user2删除(lo_unlink)这个对象的权限。如果 user1 说GRANT UPDATE on LARGE OBJECT xyz TO user2;并且 user2 运行SELECT lo_unlink(xyz);,则会被拒绝: …
我想使用 psql 列出 Postgres 服务器上的所有数据库,以便由脚本解析。此命令列出了它们:
psql -l -A -t
Run Code Online (Sandbox Code Playgroud)
但输出显示了一个明显的问题:记录由换行符分隔,但也包含换行符。
$ psql -l -A -t
postgres|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|
template0|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|=c/postgres
postgres=CTc/postgres
template1|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|=c/postgres
postgres=CTc/postgres
Run Code Online (Sandbox Code Playgroud)
使用 -R 选项我可以更改记录分隔符,但似乎无论我将其更改为什么,都存在该字符串出现在数据中的风险。是否可以告诉 psql 用其他东西替换数据中的换行符?(然后如果该字符串也出现在数据中呢?)
我还尝试设置的记录分隔符为空字符这样的序列-R '\000'和-R "\0",但它似乎并没有解释转义序列在所有的参数,并且只使用文本字符串\000代替。
我知道列出所有数据库的另一个选项是:
psql --quiet --no-align --tuples-only --dbname=postgres --username=postgres --host=127.0.0.1 --port=5432 --command="SELECT datname FROM pg_database"
Run Code Online (Sandbox Code Playgroud)
但这需要我为 postgres 用户提供密码,所以这是不可取的。也许还有另一种方法可以获得所有数据库的名称列表?