这是场景:
有两台机器运行 CentOS 6.2 - machine0 和 machine1
两者都安装了 PostgreSQL 9.1。
其中一个应该是活动的,作为主系统,并通过异步流复制另一台机器,备用系统应该将更改从主系统复制到数据库。
假设开始时machine0是master,machine1是standby。
如果 master(比如 machine0)失败(这里的失败意味着 postgresql 服务器崩溃),standby 应该从 master 接管并成为新的 master。
machine1,新的 master 处理所有数据库操作,当 machine0 中的 postgresql 服务器重新联机时,它应该成为备用服务器,从与 machine1 失去联系的点开始同步,并将所有更改复制到数据库并保持备用模式。
当机器 1 失败时,整个循环重复。
当备用服务器出现故障并重新上线时,它应该开始从主服务器读取数据并同步数据。
我很困惑我需要使用什么工具来设置它,因为我知道 PostgreSQL 默认不带有故障转移。
如果有人可以将我链接到描述如何做我正在尝试的主题/页面,我将非常感激。
我们有一个带有相当大表(约 5000 万行)的 PostgreSQL 数据库。该表具有跨多个列的唯一约束,每一列都有索引。对于上下文,我最近删除了表中大约一半的行——旧数据。现在我想简单地删除多列唯一约束,所以我执行了这个 SQL:
alter table my_big_table drop constraint my_constraint_name
Run Code Online (Sandbox Code Playgroud)
但是,我在 10 多个小时前启动了该命令,它仍在运行,没有减弱的迹象。为什么删除约束需要这么长时间?有什么我遗漏的,或者有什么方法可以通过某种进度或状态指示来执行这样的操作?
(我在 Windows 64 位系统上使用 PostgreSQL 9.0,我通常使用 pgAdmin 连接到它,但我也可以使用命令行客户端或以编程方式连接。)
我的应用程序需要一个可靠的 SQL DB,并且一直在研究 Postgresql 的流复制支持。设置主/从复制似乎并不难,您可以使用从作为只读查询的热备用。到目前为止一切都很好。但是,当主站失败(或从站认为主站失败)时,我如何自动将一个从站提升为主站?我知道我可以在从服务器上编写一个文件以使其成为主服务器,但我正在寻找脚本等来做到这一点(并确保主服务器保持关闭等)。
任何人都知道如何在 Ubuntu 12.04 上执行此操作的不错教程?在 Hetzner 举办(获得奖励积分)?厨师食谱什么的?
我用谷歌搜索并找到了这个旧网页,上面写着只是要更改目录的名称。我试过了,但没有用:
$ pg_lsclusters
Version Cluster Port Status Owner Data directory Log file
8.4 main 5432 down postgres /var/lib/postgresql/8.4/main /var/log/postgresql/postgresql-8.4-main.log
9.1 main 50420 online postgres /var/lib/postgresql/9.1/main /var/log/postgresql/postgresql-9.1-main.log$ pg_ctlcluster 9.1 main stop
$ pwd
/var/lib/postgresql/9.1
$ ls
main
$ mv main oldmain
$ pg_ctlcluster 9.1 oldmain start
Error: specified cluster does not exist
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 9.1.4,Ubuntu 11.10
我有一个带有一堆帐户的旧数据库。其中一个是肯定使用的,但其中 5 个左右没有信息。
Postgresql 的系统表中是否有用户上次登录或执行命令的时间?或者可能是谁以及何时创建了用户。
我想在我的 postgresql 数据库中有 python3 来编写存储过程。
在psql客户端中,当我输入命令时create extension plpython3u,出现错误:
couldn't open extension control file /usr/share/postgresql/9.1/extension/plpython3u.control : No such file or directory
Run Code Online (Sandbox Code Playgroud)
我已经检查过,目录中有 plpythonu.control 和 plpython2u.control ,但不是版本 3 的那个。
但是,我已经从 depot安装了软件包python3和python3-postgresql(除其他外)。我使用的是 Ubuntu 12.04,内核 3.2.0.38,安装了 postgresql 9.1。
我应该安装(或做什么)才能在我的机器上安装 plpython3u.control 文件并在我的数据库中使用 python3?
我正在使用 Postgres 9.1 并希望得到一些没有数据的空白结果。我的查询如下所示:
SELECT institution_id FROM ... WHERE institution_id IN (1, 3, 4, 5, 7, 9)
Run Code Online (Sandbox Code Playgroud)
... 对这个问题并不重要,重要的是它返回一个包含数组中机构 ID 的结果 (1, 3, 4, 5, 7, 9) 并且它包括那些没有数据的机构。以下是当前输出的示例:
days treatments institution_id
266 6996 4
265 5310 1
267 3361 5
260 2809 3
264 5249 7
Run Code Online (Sandbox Code Playgroud)
我想要的输出示例是:
days treatments institution_id
266 6996 4
265 5310 1
267 3361 5
260 2809 3
264 5249 7
9
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过使用以下查询来实现这一点:
SELECT *
FROM (
SELECT institution_id
FROM ...
WHERE institution_id IN (1, 3, …Run Code Online (Sandbox Code Playgroud) 复式记账是
一组用于在财务会计系统中记录财务信息的规则,其中每个交易或事件至少更改两个不同的名义分类账帐户。
一个账户可以“借”也可以“贷”,所有贷记的总和必须等于所有借记的总和。
你将如何在 Postgres 数据库中实现它?指定以下 DDL:
CREATE TABLE accounts(
account_id serial NOT NULL PRIMARY KEY,
account_name varchar(64) NOT NULL
);
CREATE TABLE transactions(
transaction_id serial NOT NULL PRIMARY KEY,
transaction_date date NOT NULL
);
CREATE TABLE transactions_details(
id serial8 NOT NULL PRIMARY KEY,
transaction_id integer NOT NULL
REFERENCES transactions (transaction_id)
ON UPDATE CASCADE
ON DELETE CASCADE
DEFERRABLE INITIALLY DEFERRED,
account_id integer NOT NULL
REFERENCES accounts (account_id)
ON UPDATE CASCADE
ON DELETE RESTRICT
NOT DEFERRABLE INITIALLY IMMEDIATE,
amount decimal(19,6) NOT …Run Code Online (Sandbox Code Playgroud) 我知道我必须写SUM两次,如果我想在HAVING子句中使用它(否则使用派生表):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,这是否是次优的。作为程序员,这个查询看起来 DB 会计算两次总和。是这样,还是我应该依赖数据库引擎将为我做的优化?
更新:可比查询的解释:
postgres=> explain select sum(counttodo) from orderline group by orderlineid having sum(counttodo) > 100;
QUERY PLAN
--------------------------------------------------------------------
HashAggregate (cost=1.31..1.54 rows=18 width=8)
Filter: (sum(counttodo) > 100)
-> Seq Scan on orderline (cost=0.00..1.18 rows=18 width=8)
(3 rows)
Run Code Online (Sandbox Code Playgroud) 在 Derby(一种用 Java 编写的嵌入式数据库,主要用于测试或原型设计)中,有“freeze”和“unfreeze”命令可以在在线备份期间使用。“冻结”只会阻止所有数据库访问,直到调用“解冻”。这对于使用外部程序进行备份非常有用,如果外部程序比使用 Derby 的内部备份解决方案快得多,您可能会这样做。对于我的用例,我可以使用一些内置的文件系统实用程序几乎立即拍摄快照,因此它是一个恒定时间操作(不是O(length of DB files))。
我正在将一个已经超过 Derby 的应用程序迁移到 PostgreSQL,我想知道那里是否有任何类似的东西可以用来停顿所有连接。另外,我更想知道我的应用程序内部的序列化点是什么,这样我就不会陷入某种尴尬的状态,因此能够暂停/恢复所有其他访问对我来说真的很不错。
由于 PostgreSQL 有一个事务日志,我可以不“冻结”就创建快照,但是快照需要通过 PostgreSQL 的恢复机制运行才能使用它,否则存储在磁盘上的内容将与我拉取的内容相同普通文件系统上的插件。这种解决方案并不理想。
编辑我了解到这pg_start_backup()是关闭的,但它不会导致传入事务阻塞,直到匹配调用pg_stop_backup(),迫使我进行时间点恢复,以pg_start_backup()返回从文件系统快照返回的事务 ID 。不必实际关闭 PostgreSQL 来获得它会很好(也许有一个伪关闭命令可以保持连接打开?)。
postgresql ×10
replication ×2
aggregate ×1
alias ×1
constraint ×1
derby ×1
failover ×1
join ×1
linux ×1
maintenance ×1
python ×1
transaction ×1