我突然发现发现我的 PostgreSQL 空间不足。它是在 ram 磁盘上运行的 tmp 实例。允许的空间有限(约 800M)。数据实际上并没有存储在上面,所有的表都会在一些计算完成后被删除。
我检查了文件夹,在基本文件夹下发现了大量数据:
$ du -h 6.0M ./pgsql_tmp 706M ./16384 6.0M ./12780 6.0M ./12772 6.0M ./1 730M。
我的问题是:
我试图做到这一点,以便与数据库的本地连接不需要登录。所以我local all all trust将这一行添加到 pg_hba.conf 文件中,但是当我加载 pgAdmin 并尝试连接到服务器时,它只是说FATAL: could not load pg_hba.conf. 我究竟做错了什么?
我遇到了 Postgres autovacuum 进程干扰数据库整体性能的问题。它使我的选择、插入和更新查询比平时慢。哪些设置和优化策略可以使 autovacuum 对我的数据库性能的影响较小?
有没有办法让它不消耗尽可能多的内存/CPU,以便客户端查询可以更有效地运行?
我想使用 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 用户提供密码,所以这是不可取的。也许还有另一种方法可以获得所有数据库的名称列表?
首先,我不是 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 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 …
我创建了一个表:
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) 我正在寻找如何加速仅基于两个表的查询的想法。我添加了索引,运行真空。
表格:
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) 以下文档描述了如何查看从函数返回的 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 ×10
cursors ×1
ddl ×1
dml ×1
performance ×1
pg-hba.conf ×1
pgadmin ×1
psql ×1
replication ×1