我无法理解 PostgreSQL 中模式的概念和用法。我不知道它如何影响我的数据库设计。我为什么要使用它?
如果我决定现在不考虑它们,以后再担心它们,这会影响我将来吗?
用一个例子解释会很好。
我一直在努力让我们的数据库客户端主动避免填满他们正在使用的数据库所在的分区。
由于我们所有的客户端都与数据库管理器在同一台主机上,因此对于用户创建的表空间来说应该很容易;客户端可以查找表空间的文件系统路径(在 spclocation 中),并使用操作系统调用来检查有多少可用空间:
adb=> select * from pg_tablespace;
spcname | spcowner | spclocation | spcacl
------------+----------+-------------------+---------------------
pg_default | 10 | |
pg_global | 10 | |
adb | 2033793 | /database/adb | {adb=C/adb}
Run Code Online (Sandbox Code Playgroud)
我无法从客户端看到如何获取全局表空间存储位置的路径;在上面的查询中为它返回一个空字符串。
不幸的是,我们在该领域有许多遗留系统使用在全局表空间中创建的特定数据库,将它移到用户创建的表空间中将是一项巨大的努力。
希望我只是错过了一些非常简单的东西。
我试图找出是否有办法从已设置服务器复制的从属 PostgreSQL 服务器查询主服务器。
从奴隶,我可以:
SELECT pg_is_in_recovery()
Run Code Online (Sandbox Code Playgroud)
如果我在从站上,这会给我一个“t”结果,而在主站上给我一个“f”结果,这是第一步。
接下来,我想运行一个查询,该查询为我提供有关它正在复制的主节点的一些信息。最好是 IP 地址或主机名。
作为记录,我可以使用以下命令查询 master:
SELECT * from pg_stat_replication
Run Code Online (Sandbox Code Playgroud)
这会给我关于奴隶的信息。我希望有一种查询奴隶的互惠方法。
这可能吗?如果是这样,如何?
我有几个表,每个表有 100-300 列整数类型,它们保存高度易变的数据。数据集由一两个主键作为键,刷新时删除整个数据集,并在一个事务中插入新数据。数据集大小通常是几百行,但在极端情况下可以达到几千行。每秒刷新一次,不同键的数据集更新通常是脱节的,因此删除和重新创建表是不可行的。
我如何调整 Postgres 来处理这样的负载?如果这有什么不同,我可以使用最新和最好的版本。
我已经使用 pgadmin3 工具从 system1 备份了 postgresql 数据库。创建的备份文件的扩展名为“.backup”
我试图在安装了 postgresql 9.0 和 pgadmin3 1.8 的另一个系统 2 上恢复它,但我收到错误
无法执行查询:错误:无法识别的配置参数“lock_timeout” 命令为:SET lock_timeout = 0;
两个系统的配置
system1 win7-64 位 postgresql 9.0.13-1 - 64 位 pgadmin 1.8
system2 win7-32bit postgresql 9.0.13-1 - 32bit pgadmin 1.8
我想知道自定义 pg_dump 格式在 Postgres 版本之间有多稳定。例如,我可以在 postgres 9.x 中恢复使用 Postgres 8.x 创建的自定义格式转储吗?
背景:
我正在构建一个虚拟设备,其中包含 PostgreSQL 数据库中的所有配置。我必须决定是使用 SQL 格式还是自定义格式进行备份。随着设备随着时间的推移(几年)不断发展,我将使用更新的 PostgreSQL 版本,并且仍然需要能够轻松恢复旧备份。
假设我有一个 Windows 用户环境变量 SOME_STRING。
是否可以在 PL/pgSQL 函数中使用它的值?
如果没有,我是否需要使用不受信任的语言(如 PL/pythonu),或者我可以使用受信任的语言吗?
我在 PG 9.2
假设表“entity.eid”是自动递增的,我希望能够引用稍后在同一事务中分配的自动递增值。我一直这样做的方式是进行我认为不是最佳的多个交易。
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (?NEW EID REF HERE?, ...), (...), (...);
COMMIT;
Run Code Online (Sandbox Code Playgroud) 专有代码(我们无法更改)有一堆用户定义的函数类型:
create or replace function f() returns record as $$ ... $$
Run Code Online (Sandbox Code Playgroud)
我们通过以下方式调用它(例如):
SELECT status, log FROM f() as (status boolean, log text);
Run Code Online (Sandbox Code Playgroud)
(status boolean, log text)是 table 的行类型T。是否可以在不列出属性的情况下自动将record(或setof record返回类型)转换为T行类型?我正在寻找的是那种:
SELECT * FROM f() as T%rowtype
Run Code Online (Sandbox Code Playgroud) postgresql type-conversion plpgsql functions composite-types
我运行PostgreSQL-9.2.4
是否可以从触发器调用 2 个函数?
假设以下触发器触发时,我有两个函数可以执行两个不同的表:
扳机:
CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()
Run Code Online (Sandbox Code Playgroud)
功能 1:( 当任务开始时 => 删除任何先前为此系统分配的下一个任务)
CREATE FUNCTION void_next_task() RETURNS trigger AS $$
BEGIN
DELETE FROM tasks_status ts
WHERE ts.system = NEW.system
AND ts.event = 'next_task';
RETURN NEW;
END;
$$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
功能 2:(
如果插入的组合task和system已经出现在表中=> 将此组合标记为任何较早的记录deleted)
CREATE FUNCTION void_dup_task() RETURNS trigger AS $$
BEGIN
UPDATE system_status ss
SET deleted = 'TRUE'
WHERE ss.system …Run Code Online (Sandbox Code Playgroud) postgresql ×10
plpgsql ×3
functions ×2
backup ×1
disk-space ×1
optimization ×1
pgadmin ×1
restore ×1
schema ×1
trigger ×1