我花了过去 8 个小时试图将 'mysqldump --compatible=postgresql' 的输出导入 PostgreSQL 8.4.9,并且我已经在这里和其他地方阅读了至少 20 个不同的线程来讨论这个特定问题,但没有发现真正有用的答案。
MySQL 5.1.52 数据转储:
mysqldump -u root -p --compatible=postgresql --no-create-info --no-create-db --default-character-set=utf8 --skip-lock-tables rt3 > foo
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 8.4.9 服务器作为目标
使用 'psql -U rt_user -f foo' 加载数据正在报告(其中许多,这是一个示例):
psql:foo:29: ERROR: invalid byte sequence for encoding "UTF8": 0x00
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
Run Code Online (Sandbox Code Playgroud)
根据以下内容,输入文件中没有 NULL (0x00) 字符。
database-dumps:rcf-temp1# sed 's/\x0/ /g' < foo > nonulls …Run Code Online (Sandbox Code Playgroud) 在运行 PostgreSQL 数据库系统时,我如何知道我的数据库作为一个整体具有 100% 的完整性?基本上我怎么知道我的数据文件和页面是否都是 100% 好,没有损坏?
在 Microsoft SQL Server 世界中,有一个命令可以执行 DBCC CHECKDB,它会告诉您是否存在问题。如果您有兴趣了解有关命令的更多信息,请访问这里的链接。DBCC CHECKDB (Transact-SQL)
我是一个偏执的数据库完整性的人(任何以 DBA 类型角色使用数据库的人都应该是),这种类型的东西让我很难在晚上睡个好觉。这样的实用程序是必须的!在 google 上搜索发现了一些类似这样的工具的尝试,在我看来,除非它是 PostgreSQL 项目官方接受的工具,否则我不会相信它来处理如此重要的事情。
这里有一些链接,指向人们提出类似问题,但我认为没有真正明确的答案。在我看来,PostgreSQL 需要有一些工具,而 Oracle 和 Microsoft SQL Server 似乎也有这些工具。
第一个链接是我在这个主题上发现的最有趣的链接。我认为对这篇文章的评论可能总结道:“在识别数据库损坏和修复它时,Postgres 非常蹩脚。检测它的唯一方法是通过转储数据库或从数据库中的每个表中选择 * .”
我相信 9.3 可能有一些损坏检查功能。如果选择,似乎有希望对页面文件进行总和检查。因此,如果您考虑使用 ZFS 和/或带有页面校验和的未来版本的 Postgres,事情看起来会很光明。 https://commitfest.postgresql.org/action/patch_view?id=759
更新:2012 年 1 月 14 日 - 似乎使用基于 ZFS 的文件系统可以通过对每个数据块进行校验和来检测损坏。我将不得不进一步研究这一点,看看这是否是一种解决方法,可以让人们在知道他们的数据库数据不会悄悄损坏的情况下晚上睡个好觉。
更新:2012 年 1 月 17 日 - 如何查找 ZFS 损坏的文件。http://docs.oracle.com/cd/E18752_01/html/819-5461/gbbwl.html#gbcuz
更新:14-APR-2014 9.3 确实获得了数据校验和。https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.3
PostgreSQL 中最快的查询是什么,我可以将其用作绑定 JNDI 资源的验证查询?
我认为这SELECT 1是最简单的,但在本文档中说在 PostgreSQL 中我们应该使用select version(). 这对我来说并不明显。
我试图进行比较EXPLAIN ANALYZE SELECT 1,EXPLAIN ANALYZE SELECT version()但仍然不明白为什么第二个(或应该)更快。
我有一个非常频繁更新的表,其中包含 2.4 亿行(并且还在增长)。每三小时插入 150 万行,删除 150 万行。当我将集群移动到 SSD 时,批量插入(使用复制)时间从 22 分钟减少到 2.3 分钟。删除时间也得到改善。我计划每两小时或每小时进行一次批量更新。
虽然现在的性能(在 SSD 之后)与更频繁的更新兼容,但我读过一些关于 SSD 死亡的恐怖故事,因为 NAND 耐久性有限加上写放大。由于 SSD 价格昂贵,我想尽可能地将它的消亡推迟到未来。因此我的问题是:在删除和随后的真空中磁盘文件到底发生了什么?我猜有两个磁盘写入,一个将行标记为已删除,另一个在清理时将其标记为可覆盖。如果不是删除和清空,而是在每次批量插入/删除时对表进行分区创建和删除表,我会尽量减少 SSD 的磨损吗?
这是一个简单的表,其中记录可以引用同一个表中的父记录:
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
parent_id INT NULL,
num INT NOT NULL,
txt TEXT NULL,
FOREIGN KEY (parent_id) REFERENCES foo(id)
);
Run Code Online (Sandbox Code Playgroud)
由于增加了其他字段值之一 ( num) 在父记录和子记录之间必须相同的要求,我认为复合外键应该可以解决问题。我将最后一行更改为
FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
Run Code Online (Sandbox Code Playgroud)
并得到错误:没有唯一约束匹配给定键的引用表 "foo"。
我可以很容易地添加这个约束,但我不明白为什么它是必要的,当引用的列 ( id) 之一已经保证是唯一的?在我看来,新的约束将是多余的。
架构:
CREATE TABLE "items" (
"id" SERIAL NOT NULL PRIMARY KEY,
"country" VARCHAR(2) NOT NULL,
"created" TIMESTAMP WITH TIME ZONE NOT NULL,
"price" NUMERIC(11, 2) NOT NULL
);
CREATE TABLE "payments" (
"id" SERIAL NOT NULL PRIMARY KEY,
"created" TIMESTAMP WITH TIME ZONE NOT NULL,
"amount" NUMERIC(11, 2) NOT NULL,
"item_id" INTEGER NULL
);
CREATE TABLE "extras" (
"id" SERIAL NOT NULL PRIMARY KEY,
"created" TIMESTAMP WITH TIME ZONE NOT NULL,
"amount" NUMERIC(11, 2) NOT NULL,
"item_id" INTEGER NULL …Run Code Online (Sandbox Code Playgroud) Postgres 新手在这里。
我想知道这个查询是否经过优化?我试图仅加入 100% 必要的值,并将所有动态条件留在 WHERE 子句中。见下文。
SELECT *
FROM
myapp_employees
JOIN myapp_users ON
myapp_users.user_id=myapp_employees.user_id
JOIN myapp_contacts_assoc ON
myapp_contacts_assoc.user_id=myapp_users.user_id
JOIN myapp_contacts ON
myapp_contacts.contact_id=myapp_contacts_assoc.contact_id
WHERE
myapp_contacts.value='test@gmail.com' AND
myapp_contacts.type=(1)::INT2 AND
myapp_contacts.is_primary=(1)::INT2 AND
myapp_contacts.expired_at IS NULL AND
myapp_employees.status=(1)::INT2 AND
myapp_users.status=(1)::INT2
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
注意:对于上下文,此过程正在检查用户是否也是员工(提升的权限/不同的用户类型)。
无论如何,这是正确的方法吗?例如,JOIN ON 是否应该包含更多语句,例如检查 expired_at IS NULL?为什么或为什么这没有意义?
假设我想在 24 小时内每 5 分钟生成一个系列。我如何在 PostgreSQL 中做到这一点?
PostgreSQL 可以generate_series()来自 a timestamp,但不能来自time.
选择任意时间戳更好,还是有另一种生成系列的方法?
我有一个我认为可以使用窗口函数解决的情况,但我不确定。
想象一下下表
CREATE TABLE tmp
( date timestamp,
id_type integer
) ;
INSERT INTO tmp
( date, id_type )
VALUES
( '2017-01-10 07:19:21.0', 3 ),
( '2017-01-10 07:19:22.0', 3 ),
( '2017-01-10 07:19:23.1', 3 ),
( '2017-01-10 07:19:24.1', 3 ),
( '2017-01-10 07:19:25.0', 3 ),
( '2017-01-10 07:19:26.0', 5 ),
( '2017-01-10 07:19:27.1', 3 ),
( '2017-01-10 07:19:28.0', 5 ),
( '2017-01-10 07:19:29.0', 5 ),
( '2017-01-10 07:19:30.1', 3 ),
( '2017-01-10 07:19:31.0', 5 ),
( '2017-01-10 07:19:32.0', 3 ), …Run Code Online (Sandbox Code Playgroud) postgresql window-functions group-by gaps-and-islands postgresql-8.4
我正在寻找一个选项来为允许设置 search_path 的 psql 控制台连接创建别名命令,但我没有在 psql util 上找到任何选项,也没有在不退出的情况下执行命令的选项。任何的想法?
我想避免设置环境选项的先决条件,如果可能的话,有一个oneliner
postgresql ×10
join ×2
optimization ×2
aggregate ×1
constraint ×1
corruption ×1
delete ×1
foreign-key ×1
group-by ×1
maintenance ×1
mysql ×1
mysqldump ×1
partitioning ×1
psql ×1
storage ×1
time ×1
vacuum ×1