标签: postgresql

如何在 Amazon RDS PostgreSQL 上创建 INOUT 分配转换?如果不可能,那为什么?

我正在将现有应用程序迁移到 Amazon RDS PostgreSQL。该应用程序具有跨数据库支持,出于兼容性原因,它包含以下 SQL:

CREATE CAST (varchar AS numeric) WITH INOUT AS ASSIGNMENT
Run Code Online (Sandbox Code Playgroud)

在普通 PostgreSQL 上,这需要超级用户。在 Amazon RDS PostgreSQL 上这失败了

错误:必须是类型字符变化或数字类型的所有者

  • 有没有办法在 Amazon RDS 中创建这样的演员表(也许通过管理 Web 界面)?
  • 如果这是不可能的,那为什么?这是故意限制(例如演员是危险的)还是只是一个缺失的功能?

注意:我猜这是否是赋值或隐式转换无关紧要,但为了完整性而包含此信息。

postgresql cast amazon-rds

7
推荐指数
1
解决办法
1684
查看次数

PostgreSQL 不记录

我正在使用ArchLinuxPostgreSQL9.4.4 并在配置文件中启用了日志记录:

$ sudo egrep -v "^[[:blank:]]*($|#|//|/\*| \*|\*/)" /var/lib/postgres/data/postgresql.conf

max_connections = 1024          # (change requires restart)
shared_buffers = 128MB          # min 128kB
dynamic_shared_memory_type = posix  # the default is the first option
logging_collector = on      # Enable capturing of stderr and csvlog
log_directory = '/tmp'      # directory where log files are written,
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
log_file_mode = 0644            # creation mode for log files,
log_error_verbosity = verbose       # terse, default, or …
Run Code Online (Sandbox Code Playgroud)

postgresql log postgresql-9.4

7
推荐指数
1
解决办法
7311
查看次数

如何在 SQL 中打印到控制台?

我正在使用PostgreSQL并且我想向控制台打印一条消息。

如果我用plpythonu我用plpy.notice 如果我用plpgsql我用raise notice

但是当函数是纯函数时如何打印SQL?using 对SELECT 'string'我没有帮助,因为它将字符串打印在一列中,如果消息位于代码中间,则不会显示它。我想要类似raise notice/ plpy.noticefor 的东西SQL

CREATE OR REPLACE FUNCTION A()
  RETURNS VOID AS
$BODY$ 
                how do i print 'hello world' here?
 $BODY$
  LANGUAGE sql VOLATILE
Run Code Online (Sandbox Code Playgroud)

如果是 plpgsql 我会这样做:

CREATE OR REPLACE FUNCTION A()
  RETURNS VOID AS
$BODY$ 
        Raise Notice 'hello world'
 $BODY$
  LANGUAGE plpgsql VOLATILE
Run Code Online (Sandbox Code Playgroud)

我正在寻找等效的 LANGUAGE SQL

postgresql

7
推荐指数
3
解决办法
6万
查看次数

你如何防止死行在 postgresql 中徘徊?

我在亚马逊上有生产和暂存 RDS 实例,暂存数据是生产的直接副本,因此两个实例都有重复的数据。

做一个EXPLAIN ANALYZE SELECT * from my_table WHERE my_col=true;结果是:

Seq Scan on my_table (cost=0.00..142,775.73 rows=1 width=1,436) (actual time=18,170.294..18,170.294 rows=0 loops=1) Filter: my_col Rows Removed by Filter: 360275
Run Code Online (Sandbox Code Playgroud)

在生产中,它是:

Seq Scan on my_table (cost=0.00..62,145.88 rows=1 width=1,450) (actual time=282.487..282.487 rows=0 loops=1) Filter: my_col Rows Removed by Filter: 366442
Run Code Online (Sandbox Code Playgroud)

跑步时 select pg_total_relation_size('my_table'::regclass);

我发现舞台的大小几乎是制作的两倍。从我读过的内容来看,我看到 postgresql 的 MVCC 对此负责,因为它保留了多个版本的行。我手动运行VACUUM FULL,然后看到 staging 的大小已经减少了 2/3。现在运行相同的解释分析显示:

Seq Scan on my_table  (cost=0.00..56094.75 rows=1 width=1436) (actual time=1987.340..1987.340 rows=0 loops=1) Filter: my_col Rows Removed by …
Run Code Online (Sandbox Code Playgroud)

postgresql

7
推荐指数
1
解决办法
7051
查看次数

如何从 PostgreSQL 事务内部记录自定义消息?

我有一个生成交易并执行它们的软件。我想根据执行的查询占查询总数的简单比例异步检查事务进度。我能够读取stdoutstderr生成的psql,所以我想一个解决方案可以打印到stdout一些自定义消息,如“进度:3/8”(或另一个自定义文本字符串)。

我曾考虑过执行“日志查询”,该查询将有关查询进度的信息存储在适当的表中,但该表在事务完成之前不可用,这使我无法检查事务进度。

目前我尝试了以下操作(假设在交易中有 3 个查询来做一些事情):

BEGIN;
CREATE OR REPLACE FUNCTION progress(curr int, total int) RETURNS float AS $$
BEGIN
  RAISE NOTICE '___PROGRESS___%', curr/total::float;
  RETURN curr/total::float;
END;

-- First query
SELECT ... FROM ...;
-- Log the progress
SELECT * FROM progress(1,3);

-- Second query
SELECT ... FROM ...;
-- Log progress
SELECT * FROM progress(2,3);

-- Third query
SELECT ... FROM ...;
-- Log progress
SELECT * FROM progress(3,3);

COMMIT;
Run Code Online (Sandbox Code Playgroud)

我使用以下语法从 bash …

postgresql log

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

PostgreSQL 9.4:服务器意外关闭连接

我有一个低流量(10-20 rpm)的网站。应用服务器与数据库运行在同一个机器上,通过本地主机连接到数据库

几个月来,一切都运行良好。

大约 5 天前 Postgres 开始随机返回这个错误,每 100 个请求大约 1 个错误:

服务器意外关闭连接
这可能意味着服务器在处理请求之前或处理请求时异常终止。

没有对应用程序、数据库或系统设置进行重大修改。

如果我正确理解错误消息,则表示数据库进程已被杀死?

我试图了解什么会导致此错误:

  • Postgres 日志不显示任何内容(错误时间附近没有日志)
  • 内核日志也不显示任何内容(错误时间附近没有日志)
  • Syslog 仅显示 cron 作业启动了因此错误而失败的请求

服务器上的内存使用情况似乎没问题 (70%),我有足够的可用磁盘空间。

当我通过 psql 或 ruby​​ PG 客户端手动连接到 Postgres 时,我可以执行选择和更新查询。

我已经看过这个问题: PostgreSQL 错误:服务器意外关闭了连接

我试图重新索引表。我还执行了一个运行良好的 pgdump(我没有恢复数据)

环境 :

  • Ubuntu 14.04
  • Postgres 9.4
  • 数据库大小约为 6.5GB

应用程序连接到数据库:

  • Ruby on Rails 4.2
  • PG 宝石 0.18.2

postgresql

7
推荐指数
0
解决办法
4934
查看次数

jsonb 可以按*值* 甚至部分值进行快速搜索吗?其他类型?

我有一个person必须插入任意数据的表。由于我使用的是 Postgres 9.4,因此jsonb似乎是正确的选择。

示例数据:

id: 1, name: "Joe Doe", preferences: { color: "red" , toy: "car"}
id: 2, name: "Jane Doe", preferences: { color: "blue", food: "hamburguer" }
Run Code Online (Sandbox Code Playgroud)

问题是我需要通过变量值来查询它,例如:

所有在偏好上有“汉堡包”的人,部分查询也必须是可能的,所以搜索“b​​urg”必须给我带来记录2。

使用json函数,我可以搜索值,只要我知道key,对吗?或者有一种快速搜索值的方法?

我想做的是创建一个 tsvector 列并转储 json 以使用全文搜索来执行部分查询。

postgresql database-design full-text-search json

7
推荐指数
1
解决办法
4600
查看次数

各种类型的索引扫描的共享缓冲区指标代表什么?

TL;DR:当“EXPLAIN (BUFFERS)”显示“索引扫描”时,它不会显示需要从索引中读取的页数。它只是省略了那个数字,还是它实际上不读取页面(我误解了索引的工作原理)?

我们有一个大的只读表,看起来像这样:

database=> \d my_table
    Table "my_table"
        Column         |       Type       | Modifiers
-----------------------+------------------+-----------
 id                    | integer          |
 date                  | date             |
 country_id            | smallint         |
 ...other columns...
Indexes:
    "my_table_id_date_idx" btree (id, date)
Run Code Online (Sandbox Code Playgroud)

并且对该表的典型查询具有这样的 EXPLAIN...

database=> EXPLAIN (BUFFERS, ANALYZE) SELECT id, date, country_id FROM my_table WHERE id = 50 AND date BETWEEN '2015-04-01' AND '2015-04-07';
                                                                                    QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on my_table  (cost=448.40..70400.85 rows=18810 width=10) (actual time=9.011..1447.817 rows=10224 loops=1)
   Recheck Cond: ((id = 50) AND (date >= '2015-04-01'::date) AND …
Run Code Online (Sandbox Code Playgroud)

postgresql index explain postgresql-9.3

7
推荐指数
1
解决办法
580
查看次数

为什么 Postgres 在 GROUP BY 之前在多行上运行 SORT?

我正在使用 Postgres 9.4,以及最近分析过的数据库。这些是我的表:

Materialized view "public.vw_chemical_summary_by_ccg"
     Column      |         Type         | Modifiers
-----------------+----------------------+-----------
 processing_date | date                 |
 pct_id          | character varying(3) |
 chemical_id     | character varying(9) |
 items           | bigint               |
 cost            | double precision     |
Indexes:
    "vw_idx_chem_by_ccg_chem_id" btree (chemical_id)
    "vw_idx_chem_by_ccg_chem_id_vc" btree (chemical_id varchar_pattern_ops)
    "vw_idx_chem_by_ccg_joint_id" btree (pct_id, chemical_id)

               Table "public.frontend_pct"
      Column       |          Type           | Modifiers
-------------------+-------------------------+-----------
 code              | character varying(3)    | not null
 name              | character varying(200)  |
 org_type          | character varying(9)    | not null
Indexes:
    "frontend_pct_pkey" PRIMARY KEY, btree (code) …
Run Code Online (Sandbox Code Playgroud)

postgresql

7
推荐指数
1
解决办法
1918
查看次数

从别名创建较小的行并保留列名

使用 Postgres:

SELECT users."name" AS "name"
    , array_to_json(array_agg(sites)) as sites
FROM remodel.users AS users
JOIN remodel.user_sites AS user_sites
    ON users.id=user_sites.user
JOIN remodel.sites AS sites
    ON sites.id=user_sites.site
GROUP BY "users".id
;
Run Code Online (Sandbox Code Playgroud)

目前生产

SELECT users."name" AS "name"
    , array_to_json(array_agg(sites)) as sites
FROM remodel.users AS users
JOIN remodel.user_sites AS user_sites
    ON users.id=user_sites.user
JOIN remodel.sites AS sites
    ON sites.id=user_sites.site
GROUP BY "users".id
;
Run Code Online (Sandbox Code Playgroud)

但是我不想在 JSON 输出中有“id”字段。

将站点选择更改为

array_to_json(array_agg(row(sites."name", sites.created))) as sites
Run Code Online (Sandbox Code Playgroud)

导致字段失去名称

"Toby";"[{"id":1,"name":"Village","created":"2015-08-10T15:22:36.622298"},
         {"id":2,"name":"Manor","created":"2015-08-10T15:22:43.614551"}]"
"Amy";"[{"id":3,"name":"Park","created":"2015-08-10T15:22:48.810872"}]"
"Anne";"[{"id":2,"name":"Manor","created":"2015-08-10T15:22:43.614551"},
         {"id":1,"name":"Village","created":"2015-08-10T15:22:36.622298"},
         {"id":3,"name":"Park","created":"2015-08-10T15:22:48.810872"}]"
Run Code Online (Sandbox Code Playgroud)

并尝试(这将是一个可怕的)子选择

, array_to_json(array_agg((SELECT "name", created FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate row

7
推荐指数
2
解决办法
363
查看次数