这已经在 Stack Overflow 上问过了,但仅限于 MySQL。我正在使用 PostgreSQL。不幸的是(而且令人惊讶的是)PostgreSQL 似乎没有像CHECKSUM table.
PostgreSQL 解决方案会很好,但通用的解决方案会更好。我找到了http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data,但我不明白使用的逻辑。
背景:我重新编写了一些数据库生成代码,所以我需要检查新旧代码是否产生相同的结果。
这是一个纯理论问题。假设我在多台服务器上部署了一个应用程序。
在前两个部分,我知道要寻找什么。但是数据库服务器呢?我应该寻找什么样的硬件?
PS:假设选择的数据库是 MySQL 或 PostgreSQL。
我将用户添加myuser到 Postgres。
然后我mydatabase在 pgAdmin III GUI 中添加了数据库并从备份文件中恢复。所以拥有者mydatabase是超级用户postgres。
然后我试图给所有的访问权和修改mydatabase来myuser。我psql以用户身份登录postgres:
psql -d template1 -U postgres
Run Code Online (Sandbox Code Playgroud)
然后我运行了这个查询:
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser
Run Code Online (Sandbox Code Playgroud)
现在我可以myuser用来记录,但如果我尝试一个简单的查询,我会得到这个错误:
Run Code Online (Sandbox Code Playgroud)ERROR: permission denied for relation table_name
我错过了什么吗?你能帮我解决吗?
所以,我有几个带有 PostgreSQL 的 Debian 服务器。从历史上看,这些服务器和 PostgreSQL 使用拉丁文 9 字符集进行了本地化,当时还可以。现在我们必须处理波兰语、希腊语或中文等问题,因此改变它成为一个日益严重的问题。
当我尝试创建 UTF8 数据库时,收到消息:
错误:编码 UTF8 与语言环境 fr_FR 不匹配 详细信息:所选的 LC_CTYPE 设置需要编码 LATIN9。
有几次我和我的老朋友 Google 对这个主题进行了一些研究,我能找到的只是一些过于复杂的过程,比如更新 Debian LANG、使用正确的字符集重新编译 PostgreSQL、编辑所有LC_系统变量和其他晦涩的解决方案。所以暂时,我们把这个问题放在一边。
最近,它又回来了,希腊人想要这些东西,而拉丁语 9 不想。当我再次研究这个问题时,一位同事冲我说:“不,这很容易,你看。”
他什么也没编辑,也没有做魔术,他只是做这个 SQL 查询:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
Run Code Online (Sandbox Code Playgroud)
它工作得很好。
我实际上并不知道,LC_CTYPE='C'而且我很惊讶在 Google 甚至 Stack Overflow 上的第一个解决方案中都没有使用它。我环顾四周,只在 PostgreSQL 文档中找到了一个提及。
当 LC_CTYPE 为 C 或 POSIX 时,允许使用任何字符集,但对于 LC_CTYPE 的其他设置,只有一种字符集可以正常工作。由于 LC_CTYPE 设置被 initdb 冻结,因此在集群的不同数据库中使用不同编码的明显灵活性比实际更具理论性,除非您选择 C 或 POSIX 语言环境(从而禁用任何真正的语言环境感知)。
所以这让我想知道,这太容易了,太完美了,有什么缺点?而且我还很难找到答案。所以我来这里发帖:
tl; dr:使用 …
最近将我的机器从 Mac OS X Lion (10.7.4) 更新到 Mountain Lion (10.8),我认为它破坏了我的 PostgreSQL 安装。它最初是通过 Homebrew 安装的。我不是 DBA,但希望有人能告诉我如何解决这个问题。
我无法连接(但在前 Mountain Lion 之前能够连接):
$ psql -U rails -d myapp_development
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?
Run Code Online (Sandbox Code Playgroud)
但是 Postgres 显然还在运行:
$ ps aux | grep postgres
meltemi 2010 0.0 0.0 2444124 5292 ?? Ss Wed01PM 0:00.02 postgres: rails myapp_development [local] idle
meltemi 562 0.0 0.0 2439312 592 ?? …Run Code Online (Sandbox Code Playgroud) 根据我对 PostgreSQL 9.2 中的空闲连接问题的评论,一些未提交的事务(可能与其中一些空闲连接有关)可能会导致一些性能问题。
确定是否存在未提交的事务的好方法是什么(如果有办法知道它们所在的连接是否空闲,则加分)?
非常感谢!
我目前正在学习 PostgreSQL 和 MySQL 之间的差异,因为我有一个新项目,而且我还打算将我现有的软件从 MySQL 迁移到 PostgreSQL。我实际上已经开始创建一个 HTML 表,比较两者之间的命令(用于用户/数据库/命令提示符等)。在阅读了这里的答案后,我注意到它role似乎被用作一个组。与MySQL我有两个用户,基本公共(DELETE,INSERT,SELECT和UPDATE权限),并与一对夫妇的额外权限的管理员用户。
所以基本上在 Windows 7 命令提示符下(仅限本地开发)...
GRANT或REVOKE获得用户权限时,角色与用户相比如何(如果有的话)?我正在使用 pg_dump / pg_restore 来备份和恢复 PostgreSQL 数据库,但是从 pg_restore 收到一些错误消息(和非零退出状态)。我尝试了一个超级简单的基本案例(如下所述),但仍然出现以下错误:
pg_restore: [archiver (db)] 处理 TOC 时出错:
pg_restore: [archiver (db)] 目录条目 5 中的错误;2615 2200 SCHEMA公共postgres
pg_restore: [archiver (db)] 无法执行查询:错误:架构“public”已经存在
命令是:CREATE SCHEMA public;
重现步骤:
创建一个测试数据库。我只是在做:
vagrant@vagrant-ubuntu-trusty-64:~$ psql --username=postgres postgres psql (9.3.5) 输入“帮助”以获得帮助。 postgres=# 创建数据库 mydb; 创建数据库 postgres=# \q vagrant@vagrant-ubuntu-trusty-64:~$ psql --username=postgres mydb psql (9.3.5) 输入“帮助”以获得帮助。 mydb=# 创建表数据(条目 bigint); 创建表 mydb=# 插入数据值(1); 插入 0 1 mydb=# …
我正在运行 postgresql 9.3.4。我有一个包含 3 个字段的表:
id name addr
--- ---- ----
1 n1 ad1
2 n2 ad2
...
Run Code Online (Sandbox Code Playgroud)
我需要将数据移动到包含以下字段的新表:
id data
--- ----
1 {'name': 'n1', 'addr': 'ad1'}
2 {'name': 'n2', 'addr': 'ad2'}
...
Run Code Online (Sandbox Code Playgroud)
row_to_json对我来说不是解决方案,因为它也SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) t增加id了结果。有没有办法在我的数据字段中选择我需要的字段(名称和地址)?
假设我有以下架构和数据:
create table images(
id int not null
);
insert into images values(1), (2), (3), (4), (6), (8);
Run Code Online (Sandbox Code Playgroud)
我想执行如下查询:
select id from images where id not exists in(4, 5, 6);
Run Code Online (Sandbox Code Playgroud)
但这不起作用。上面的情况应该返回5,因为它不存在于表记录中。
postgresql ×10
performance ×2
backup ×1
collation ×1
duplication ×1
json ×1
mac-os-x ×1
mysql ×1
permissions ×1
psql ×1
restore ×1
row ×1
users ×1