基本上我们的 Postgresql 表的一部分用于保存服务器访问日志,因此有时在生产过程中它会变得非常大。有什么方法可以在 postgresql 中设置一个表可以拥有的最大记录数并推出最旧的记录?
PostgreSQL在EC2机器上,现在我想更改用户的密码postgresRun Code Online (Sandbox Code Playgroud)$ sudo -u postgres psql psql (9.1.5) Type "help" for help. postgres=# ALTER USER postgres WITH PASSWORD 'newpasswd'; ALTER ROLE
Run Code Online (Sandbox Code Playgroud)$ psql -U postgres -W Password for user postgres: psql: FATAL: Peer authentication failed for user "postgres"
我的PostgreSQL版本是
$ psql --version
psql (PostgreSQL) 9.1.5
contains support for command-line editing
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
谢谢
更新
我进行了更改pg_hba.conf,这就是现在的样子
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE …Run Code Online (Sandbox Code Playgroud) 我需要将数据从旧数据库导入新数据库,但结构略有不同。例如,在旧数据库中,有一个表记录了员工及其主管:
CREATE TABLE employee (ident TEXT PRIMARY KEY, name TEXT, supervisor_name TEXT)
Run Code Online (Sandbox Code Playgroud)
现在,新的数据库如下:
CREATE TABLE person (id BIGSERIAL PRIMARY KEY, name TEXT, old_ident TEXT);
CREATE TABLE team (id BIGSERIAL PRIMARY KEY);
CREATE TABLE teammember (person_id BIGINT, team_id BIGINT, role CHAR(1));
Run Code Online (Sandbox Code Playgroud)
也就是说,新的(更通用的)数据库可以创建人员团队,而不是带有主管姓名的普通员工表。员工是有角色的成员,有角色的'e'主管's'。
问题是如何轻松地将数据employee从新结构迁移到新结构,每个员工-主管对一个团队。例如,员工
employee: ('abc01', 'John', 'Dave'), ('abc02', 'Kyle', 'Emily')
Run Code Online (Sandbox Code Playgroud)
将被迁移为
person: (1, 'John', 'abc01'), (2, 'Dave', NULL), (3, 'Kyle', 'abc02'), (4, 'Emily', NULL)
team: (1), (2)
teammember: (1, 1, 'e'), (2, 1, 's'), (3, …Run Code Online (Sandbox Code Playgroud) 考虑 Postgres 9.4 中的下表:
CREATE TABLE t
(
a1 bigserial,
a2 bigint NOT NULL,
a3 bigint NOT NULL,
a4 integer,
a5 timestamp with time zone NOT NULL,
a6 timestamp with time zone NOT NULL DEFAULT now(),
a7 bigint NOT NULL,
a8 bigint NOT NULL,
a9 real,
a10 integer,
CONSTRAINT kkkey PRIMARY KEY (a1)
)
Run Code Online (Sandbox Code Playgroud)
保存这张表的估计成本是多少?
创纪录的成本:
size(bigserial)
+ size(bigint)
+ size(bigint)
+ size(integer)
+ size(timestamp)
+ size(timestamp)
+ size(bigint)
+ size(bigint)
+ size(real)
+ size(integer)
= 8 + 8 + …Run Code Online (Sandbox Code Playgroud) 这很好地说明了这个问题:
当 b 列是文本类型而不是数组时,以下工作:
select *
from json_to_record('{"a":1,"b":["hello", "There"],"c":"bar"}')
as x(a int, b text, d text);
a | b | d
---+--------------------+---
1 | ["hello", "There"] |
Run Code Online (Sandbox Code Playgroud)
但是,如果我将该b列定义为数组,则会出现此错误:
select *
from json_to_record('{"a":1,"b":["hello", "There"],"c":"bar"}')
as x(a int, b text[], d text)
ERROR: malformed array literal: "["hello", "There"]"
DETAIL: "[" must introduce explicitly-specified array dimensions.
Run Code Online (Sandbox Code Playgroud)
如何说服/强制json_to_record(或json_populate_record)将 JSON 数组转换为目标列类型的 Postgres 数组?
所述的PostgreSQL 9.4文档指出添加NOWAIT选项将SELECT FOR UPDATE当行不能被锁定时产生一个错误的装置:
要防止操作等待其他事务提交,请使用 NOWAIT 选项。使用 NOWAIT,如果无法立即锁定所选行,该语句将报告错误,而不是等待。
那究竟是什么错误?
由于这是一个可接受的条件,我希望我的 Java 代码检查此类预期错误,然后解决它。
我正在尝试在 Postgres 9.4 中编写一个触发器函数。像这样的东西(还没有工作):
CREATE FUNCTION set_point_from_coords(source _regclass, target _regclass)
RETURNS trigger AS $func$
BEGIN
NEW.target := ST_SetSRID(ST_Point(NEW.source[1], NEW.source[2]), 4326);
RETURN NEW;
END;
$func$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
在这种情况下,target是一个类型的列geometry并且source是一个小数数组。
当一行插入coords数组时,我想将其转换为point. 如果我只是对列名进行硬编码,则上述方法会起作用,但我想使用相同的函数为不同的表和不同的列对执行此操作。而且我对它INSERT本身没有直接控制权。
这是我的一些实验:http : //sqlfiddle.com/#!15/ddddcd/1
找到了这篇相关的博客文章,我很难解析它。
如果这样更容易编码,我可以在插入/更新之后而不是之前运行它。
我有一个表,需要添加一个没有默认值的新列:
ALTER TABLE integrations.billables
DROP CONSTRAINT IF EXISTS cc_at_least_one_mapping_needed_billables,
ADD CONSTRAINT cc_at_least_one_mapping_needed_billables
CHECK ((("qb_id" IS NOT NULL) :: INTEGER +
("xero_id" IS NOT NULL) :: INTEGER +
("freshbooks_id" IS NOT NULL) :: INTEGER +
("unleashed_id" IS NOT NULL) :: INTEGER +
("csv_data" IS NOT NULL) :: INTEGER +
("myob_id" IS NOT NULL) :: INTEGER) > 0);
Run Code Online (Sandbox Code Playgroud)
ALTER TABLE integrations.billables
DROP COLUMN IF EXISTS myob_id,
ADD COLUMN myob_id varchar(255);
Run Code Online (Sandbox Code Playgroud)
如何为下一个值添加约束,而不是为那些已经存在的值添加约束?(否则我会得到某些行违反了错误检查约束“”)。
这与我之前的问题有关:错误:某些行违反了检查约束
postgresql null database-design postgresql-9.2 check-constraints
我有一个由 Postgres 数据库支持的 Web API,性能通常非常好。我监控整个数据库和应用程序的性能。我的大部分查询(以及与此相关的 API 调用)都在不到 100 毫秒内完成,但偶尔会出现异常值。
就在今天,我收到一条警报,指出 API 调用耗时超过 5,000 毫秒,因此被看门狗终止。从挖掘日志开始,底层的 Postgres 查询花费了 13秒的时间来完成(一切都是异步的,所以即使 API 请求被终止,SQL 查询仍在继续)。
这是非常不典型的,即使当我手动运行有问题的查询时,我也无法重现这种糟糕的时间安排。它对我来说在 985 毫秒内完成(根据解释分析)。
我不知道接下来还要看什么来尝试制定关于为什么会发生这种情况的理论。这种情况并不经常发生,每天只有成千上万次类似事件发生一次或两次,但它确实经常发生,令人讨厌。我错过了什么?我应该下一步做什么来调试它?我不是来自 DBA 背景,所以这可能是一个愚蠢的问题。
这一切都托管在 Amazon 的 RDS 上,在 m3.xlarge 上运行 Postgres 9.4,预配置 IOPS (2,000)。
我的一个表,我们称之为“详细信息”相当大,包含近 500 万行,并且以每天 25,000 条记录的速度增长。这个表永远不会更新或删除,只是插入和选择,但代表了我的应用程序的“核心”——几乎所有感兴趣的东西都是从这个表中读取的。
在这个特定情况下,我知道这个查询有一些参数(例如底部的日期和 id),因此它正在查看一个相当大的数据集。我已经开发了这个查询的一个大大改进的版本,它将这个特定场景从 985 毫秒减少到 20 毫秒。但是,我担心这里还有其他“在起作用”的东西,一个查询需要不到一秒的时间来运行我,在生产中时不时需要超过 13 秒。
嗯,有点……它包含更多的列,但我删除了任何不在查询中或没有索引的列。以下查询中使用的所有列或附加索引的所有列都已保留;
CREATE TABLE "public"."details" (
"value" numeric,
"created_at" timestamp(6) WITH TIME ZONE NOT NULL,
"updated_at" timestamp(6) WITH TIME ZONE NOT NULL,
"effective_date" timestamp(6) …Run Code Online (Sandbox Code Playgroud) postgresql performance autovacuum amazon-rds postgresql-performance
我似乎无法写一个 SQL查询来计算表列和一组给定输入值之间的叉积。
类似的东西:
WITH {1,2} as Input
Select *
From mTable.column, Input
Run Code Online (Sandbox Code Playgroud)
随着mTable.column包含值3和4,它应该返回:
1,3
1,4
2,3
2,4
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这一目标?
postgresql ×10
amazon-rds ×1
autovacuum ×1
dynamic-sql ×1
join ×1
json ×1
locking ×1
migration ×1
null ×1
performance ×1
plpgsql ×1
select ×1
size ×1
trigger ×1