标签: postgresql

PostgreSQL:从 psql 参数设置

按照这个关于限制 PostgreSQL 中每个查询的资源的答案,我被建议为查询执行设置超时值

SET statement_timeout TO '1min';
Run Code Online (Sandbox Code Playgroud)

这很好,但有时我想放宽对特定脚本的限制。

  • 有没有办法将超时设置为psql参数?我试过了psql --set statement_timeout=50,不成功。
  • 有没有办法从使用 psycopg2 的 Python 脚本中设置它?

postgresql performance ubuntu

8
推荐指数
1
解决办法
4626
查看次数

PostgreSQL 模式和 search_path

我正在阅读 Oreilly 的PostgreSQL: Up and Running,并且在使用模式组织数据库部分中,它说search_path可以在数据库级别设置:

例如,如果我们希望 contrib 中的所有对象都可以在没有模式限定的情况下访问,我们将更改我们的数据库,如下所示:

ALTER DATABASE mydb SET search_path="$user",public,contrib;

但是,在键入上面的命令后,我仍然无法在public不限定它们的情况下引用其他模式中的表:

ALTER DATABASE auth SET search_path="$user",public,staging;`
\d users
Run Code Online (Sandbox Code Playgroud)

给出:

Did not find any relation named "users".
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用\d staging.users,它会起作用。

SHOW search_path;
Run Code Online (Sandbox Code Playgroud)

给出:

   search_path   
----------------
 "$user",public
Run Code Online (Sandbox Code Playgroud)

是否默认search_pathpostgresql.conf覆盖每个数据库的设置值与ALTER DATABASE ... SET search_path?如果是这样,每个数据库的值有什么用?

schema postgresql

8
推荐指数
1
解决办法
1万
查看次数

如何等待 PostgreSQL 可启动/可恢复?

我正在运行自定义 Linux 发行版的虚拟机上测试从 PostgreSQL 8.2.1 到 9.2 的升级。升级过程如下:

  1. 启动pg服务
  2. 清空所有数据库(不确定是否需要)
  3. 备份与 pg_dumpall
  4. 停止pg服务
  5. 移开存储数据的目录(/var/pg;这是一个简单的单服务器设置)
  6. 安装 PostgreSQL 9.2
  7. initdb
  8. 启动服务器
  9. 恢复转储的数据
  10. reindexdb 所有数据库
  11. 重新创建referential_constraints视图
  12. 清空所有数据库(此升级后需要 AFAIK)

此过程在一台主机上运行良好,备份和恢复顺利。在另一台具有不同数据库点 1 到 7 的机器上工作正常,但服务器不会启动,除非我添加sleep 1after initdb,即使这样,转储的数据也无法恢复,因为“数据库系统正在启动”。处理这个问题的标准方法是什么,除了这些可怕的黑客:

  1. sleep在任一操作之前花一些时间,
  2. 循环直到它工作或直到达到慷慨的超时,或
  3. 循环直到它接受一个简单的查询或达到超时。

编辑:“解决方案”毕竟不起作用。如何确保数据库准备好运行还原?

postgresql upgrade restore

8
推荐指数
1
解决办法
3560
查看次数

tsrange 上的 2 个 B 树索引或 1 个 GiST 索引——哪个性能更好?

我有一个表,它使用列存储预订数据starts_atends_at每当我查询表以查找重叠预订时,我都可以选择使用以下查询之一:

SELECT * FROM reservations
WHERE starts_at < '2014-01-03 00:00:00'
AND   ends_at   >='2014-01-01 00:00:00';
Run Code Online (Sandbox Code Playgroud)

或者

SELECT * FROM reservations
WHERE tsrange(starts_at, ends_at) && ('2014-01-01 00:00:00', '2014-01-03 00:00:00')
Run Code Online (Sandbox Code Playgroud)

我在starts_atends_at列上有常规的 B 树索引,因此第一个查询总是使用它们。但是,除非我在 tsrange 上定义功能性 GiST 索引,否则第二个查询会执行完整扫描。

create index tsrange_idx on reservations using gist(tsrange(starts_at, ends_at)); 
Run Code Online (Sandbox Code Playgroud)

我的问题是,随着表的增长,哪个索引会更快?查看查询执行计划,答案可能很明显,但我不精通读取EXPLAIN ANALYZE输出。

postgresql index index-tuning postgresql-9.2 gist-index

8
推荐指数
1
解决办法
3802
查看次数

如何在 PostgreSQL 中为单元测试伪造 inet_client_addr()?

我有一个简单的存储过程,其返回值取决于inet_client_addr(). inet_client_addr()在测试我的存储过程时,如何为了单元测试的目的而覆盖?

到目前为止,我想出的唯一解决方案是围绕inet_client_addr()以下内容创建一个包装函数:

CREATE FUNCTION my_inet_client_addr() RETURNS INET AS $$
    SELECT inet_client_addr();
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

然后在我的函数中使用它:

CREATE local_connection() RETURNS BOOLEAN AS $$
    SELECT my_inet_client_addr() = '127.0.0.1';
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

然后在我的单元测试中,我可以重新定义my_inet_client_addr()

BEGIN;
SELECT PLAN(2);
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
    SELECT '127.0.0.1'::INET;
$$ LANGUAGE sql;

is(local_connection(),TRUE,'Connection from 127.0.0.1 is local');

REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
    SELECT '192.168.1.1'::INET;
$$ LANGUAGE sql;

is(local_connection(),FALSE,'Connection from 192.168.1.1. is not local');

ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有包装功能的情况下完成相同的任务my_inet_client_addr()

postgresql stored-procedures unit-test

8
推荐指数
1
解决办法
689
查看次数

在不同的所有者下创建数据库

我正在尝试在 Postgres 中设置一个角色,它可以 a) 创建一个新角色 b) 创建一个新数据库 c) 使该新角色成为数据库的所有者 d) 没有其他权限(尽可能!)

我试过这个:

sc_1=# CREATE ROLE tenant_admin CREATEDB CREATEROLE;
CREATE ROLE
sc_1=# CREATE ROLE user1 IN ROLE tenant_admin LOGIN NOINHERIT ENCRYPTED PASSWORD 'xyz';
CREATE ROLE
sc_1=# 
Run Code Online (Sandbox Code Playgroud)

其次是(在另一个会话中)

tahaan@Komputer:~/projects/acme-project$ psql -U user1 -h localhost -d postgres
Password for user user1: 
psql (9.3.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

postgres=> SET ROLE tenant_admin;
SET                                                                                                                     
postgres=> CREATE DATABASE "Tenant1" TEMPLATE "tenant_template";
CREATE DATABASE
postgres=> CREATE ROLE "owner1";
CREATE ROLE
postgres=> …
Run Code Online (Sandbox Code Playgroud)

postgresql security permissions

8
推荐指数
2
解决办法
4万
查看次数

移动大型 PostgreSQL/PostGIS 数据库

我需要将一个非常大(约 320 GB)的 PostGIS 数据库从server1(PostgreSQL 9.1,PostGIS 1.5)移动并升级到server2(PostgreSQL 9.3,PostGIS 2.1)。

升级过程有据可查。问题是我在server1上没有足够的空间将文件转储到那里,校验它,然后将它复制到server2并验证总和。我试过:

  • 从管道中转储服务器1Server2上使用nc
  • 直接写入转储文件到服务器2,其安装在文件系统server1的使用sshfs

两次转储文件似乎都已损坏。pg_restore在不同的地方打破了这样的错误:

pg_restore: [compress_io] could not uncompress data: incorrect data check

任何人都可以提出更好的方法来完成此移动和升级吗?

更新:尝试过 NFS(并再次尝试 SSHFS)。很明显,这些远程文件系统无法可靠地传输这么多数据。生成的 SQL 文件中明显缺少块,导致导入过程中出现如下语法错误:

ERROR:  invalid input syntax for integer: "8266UPDATE spatial_ref_sys o set auth_name = n.auth_name, auth_srid = n.auth_srid, srtext = n.srtext, proj4text = n.proj4text FROM _pgis_restore_spatial_ref_sys n …
Run Code Online (Sandbox Code Playgroud)

postgresql migration postgis

8
推荐指数
1
解决办法
1445
查看次数

删除具有两个或多个左连接表的重复行

像这样的查询

SELECT a.id, a.name,
       COALESCE( json_agg(b.*), '[]'::json ),
       COALESCE( json_agg(c.*), '[]'::json ),
  FROM a
  LEFT JOIN b ON a.id = b.a_id
  LEFT JOIN c ON a.id = c.a_id
 GROUP BY a.id, a.name;
Run Code Online (Sandbox Code Playgroud)

执行时,cb将彼此相乘并在 JSON 数组对象中产生重复的条目。

我尝试将查询更改为使用 2 个子查询,但出现各种错误和警告,例如“子查询必须只返回一列”等。

我也尝试使用LEFT OUTER JOIN,但我想我还没有掌握连接表的工作原理,因为它仅适用于b并且c仍然相乘并包含重复项。

编辑DISTINCTCOALESCE函数上使用带有“无法识别 json 类型的相等运算符”的错误。

如何修复此查询并仅聚合唯一行?


编辑 2

我需要指定表bc实际上都是VIEWs,而且它们都至少有一json_agg列,所以我不能只使用json_agg(DISTINCT b.*). 这太容易了。


编辑 3

这是一个重现问题的小片段:

--DROP TABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql join postgresql-9.4

8
推荐指数
1
解决办法
4476
查看次数

如何防止登录在 PostgreSQL 中“列出”表或视图定义?

有没有办法防止登录列出架构中的表和列?

我必须授予对远程登录的访问权限才能在单个视图上进行查询;但是,我还必须确保此类登录不能列出该架构上的每个对象。

DENY VIEW ANY DEFINITION TO public;PostgreSQL 上有类似 MS SQL SERVER 的东西吗?

postgresql authentication security authorization permissions

8
推荐指数
1
解决办法
6793
查看次数

为资金转移业务开发数据库,​​其中 (a) 个人和组织可以 (b) 发送和接收资金

在相关的业务背景,既成员组织需要有一个帐户资金资金可以转移

  • 会员会员
  • 会员组织
  • 组织组织,以及
  • 组织成员

注意事项

为了为这种场景构建数据库,我创建了以下三个表:

CREATE TABLE Members ( 
  memberid serial primary key, 
  name varchar(50) unique, 
  passwd varchar(32), 
  account integer 
);

CREATE TABLE Organizations (  
  organizationid serial primary key, 
  name varchar(150) unique, 
  administrator integer references Members(memberid), 
  account integer 
);

CREATE TABLE TransferHistory  
  "from" integer, -- foreign key?
  "to" integer, -- foreign …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design subtypes

8
推荐指数
1
解决办法
3045
查看次数