标签: postgresql

postgresql 的 data_dir/base 中存储了什么

我突然发现发现我的 PostgreSQL 空间不足。它是在 ram 磁盘上运行的 tmp 实例。允许的空间有限(约 800M)。数据实际上并没有存储在上面,所有的表都会在一些计算完成后被删除。

我检查了文件夹,在基本文件夹下发现了大量数据:

$ du -h
6.0M ./pgsql_tmp
706M ./16384
6.0M ./12780
6.0M ./12772
6.0M ./1
730M。

我的问题是:

  • 那个文件夹里面是什么?
  • 我有机会清理它吗?

postgresql

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

我在 pg_hba.conf 上做错了什么?

我试图做到这一点,以便与数据库的本地连接不需要登录。所以我local all all trust将这一行添加到 pg_hba.conf 文件中,但是当我加载 pgAdmin 并尝试连接到服务器时,它只是说FATAL: could not load pg_hba.conf. 我究竟做错了什么?

postgresql access-control pg-hba.conf

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

Postgres DDL 和 DML 最佳实践和编码标准

是否有您可以共享和推荐的 Postgres DDL 和 DML/SQL 的最佳实践或编码/设计约定。

我正在寻找类似于谷歌编程的东西

先感谢您。

postgresql best-practices dml ddl

5
推荐指数
2
解决办法
3391
查看次数

如何使 Postgres autovacuum 不影响性能?

我遇到了 Postgres autovacuum 进程干扰数据库整体性能的问题。它使我的选择、插入和更新查询比平时慢。哪些设置和优化策略可以使 autovacuum 对我的数据库性能的影响较小?

有没有办法让它不消耗尽可能多的内存/CPU,以便客户端查询可以更有效地运行?

postgresql

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

psql,获取要由脚本解析的数据库列表

我想使用 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 用户提供密码,所以这是不可取的。也许还有另一种方法可以获得所有数据库的名称列表?

postgresql psql

5
推荐指数
2
解决办法
2013
查看次数

使用哪种 Postgresql 复制解决方案?(异步多主/布卡多?)

首先,我不是 DBA,所以如果这个问题中的任何一个看起来“离题”,请原谅我。

我编写了一个点对点多人游戏(客户端),它连接到多个服务器之一进行匹配。

目前,只有一台服务器(一个 linode,我们称之为服务器 1)运行游戏的自定义匹配流程和 PostgreSQL 8.4(如有必要,我会将其升级到 9.1、9.2 或 9.3)。

匹配过程对所有 SQL 语句异步使用 libpq。语句不太复杂,因此负载平衡不是问题。

我计划添加更多 linode(称为服务器 2、3、4 等),以根据需要运行匹配过程和 PostreSQL。挑战在于我希望为所有客户提供高可用性。如果服务器 1 无法访问,则可以使用服务器 2 代替,访问所有相同的数据。

最初的计划是让所有服务器连接到服务器 1 的数据库并通过 libpq 异步发送 SQL 语句。问题在于,如果服务器 1 暂时离线或无法访问,那么其他所有服务器都将失败。

我能想象的“最简单”的解决方案是让每个服务器完全镜像数据库。如果服务器 1 关闭,客户端可以连接到服务器 2,后者读取和写入其自己的数据库,立即将任何更改复制到服务器 3 和 4,并在服务器 1 重新联机后复制。

以这种方式,每台服务器都将保存数据库的完整“镜像”副本。

在阅读了PostgreSQL 9.3 关于复制的文档的介绍部分后,似乎实现这个解决方案的方法是异步多主复制。(Bucardo 是这里唯一的选择吗?)

我担心异步复制是 SQL 插入。当新客户端第一次玩游戏时,会创建一个玩家数据库条目。如果服务器 2、3、4 在线而服务器 1 离线,如果 2 插入新的玩家行,1、3 或 4 会不会有任何问题?(想象一下 1 重新上线并立即尝试插入另一个玩家行。)

对于上述场景,异步多主节点是正确的方法吗?

或者,是否有我忽略的更简单或更容易的解决方案?也许不需要中间件,而只使用 PostgreSQL 9.3 的内置复制?

postgresql replication

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

postgresql 复制 - pg_stat_replication 显示空列

我有一个 postgresql 9.2 流复制设置。看来从站正在从主站获取更新并且是同步的。我已经通过查看 pg_xlog 目录和进程列表来验证它。

$ ps 辅助 | grep 'postgres.*rec'
postgres 26349 2.3 42.9 38814656 18604176 ? Ss Sep20 24:06 postgres:启动过程恢复 000000010000026E00000073
postgres 26372 4.9 0.1 38959108 78880?Ss Sep20 51:27 postgres:wal 接收器进程流 26E/731E05F0

从机上的启动日志看起来也不错。

2013-09-21 03:02:38 UTC 日志:数据库系统在 2013-09-21 03:02:32 UTC 关闭恢复
2013-09-21 03:02:38 UTC 日志:不完整的启动包
2013-09-21 03:02:38 UTC 致命:数据库系统正在启动
2013-09-21 03:02:38 UTC 日志:进入待机模式
2013-09-21 03:02:38 UTC 日志:重做开始于 26E/71723BB8
2013-09-21 03:02:39 UTC 致命:数据库系统正在启动
2013-09-21 03:02:39 UTC 日志:在 26E/75059C90 达到一致恢复状态
2013-09-21 03:02:39 UTC 日志:26E/75059E98 处的无效 xlog 切换记录
2013-09-21 03:02:39 …

postgresql postgresql-9.2

5
推荐指数
1
解决办法
9012
查看次数

PostgreSQL 中的 TPS 太高

我创建了一个表:

CREATE TABLE foo (
    id integer primary key,
    bar integer NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

并插入一行:

INSERT INTO foo (id, bar) VALUES (1, 1);
Run Code Online (Sandbox Code Playgroud)

并运行以下简单更新语句的 pgbench。

脚本.txt:

update foo set bar=bar+1 where id=1
Run Code Online (Sandbox Code Playgroud)

pgbench 结果:

C:\my-temp>"c:\Program Files\PostgreSQL\9.3\bin\pgbench.exe" -U postgres -c 1 -t 10000 -n -f script.txt testdb
Password:
transaction type: Custom query
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 10000
number of transactions actually processed: 10000/10000
tps = 2052.384567 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance

5
推荐指数
1
解决办法
3082
查看次数

改进 SQL 查询

我正在寻找如何加速仅基于两个表的查询的想法。我添加了索引,运行真空。

表格:

CREATE TABLE vintage_unit
(
  id integer NOT NULL,
  vintage_unit_date date,
  origination_month timestamp with time zone,
  product character varying,
  customer_type character varying,
  balance numeric,
  CONSTRAINT pk_id_loan PRIMARY KEY (id)
);

CREATE INDEX id_vintage_unit_date  ON vintage_unit USING btree (vintage_unit_date);   
CREATE INDEX ind_customer_type ON vintage_unit USING btree (customer_type COLLATE pg_catalog."default");
CREATE INDEX ind_origination_month ON vintage_unit USING btree  (origination_month);    
CREATE INDEX ind_product ON vintage_unit USING btree (product COLLATE pg_catalog."default");


CREATE TABLE performance_event
(
  id integer,
  event_date date
);

CREATE INDEX ind_event_date ON …
Run Code Online (Sandbox Code Playgroud)

postgresql

5
推荐指数
1
解决办法
420
查看次数

如何在不保持事务打开的情况下保持结果集?

以下文档描述了如何查看从函数返回的 refcursor,这里,如下所示:

    CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
BEGIN
    OPEN $1 FOR SELECT col FROM test;
    RETURN $1;
END;
' LANGUAGE plpgsql;

BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN funccursor;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

这对我有用。但是,如果我想将结果保留在我的屏幕上,我必须保持事务处于打开状态。当我执行 COMMIT 时,我的结果集被丢弃。当我同时执行 FETCH 和 COMMIT 时,第一个结果集被丢弃。

有没有办法提交事务但保留结果集?PgAdmin 的版本是 1.18.1。

postgresql pgadmin cursors postgresql-9.3

5
推荐指数
1
解决办法
7544
查看次数