我已经开始学习 pgAdmin III 来管理 PostgreSQL 数据库。但这不是一个易于使用的应用程序。
如果我使用 pgAdmin III 创建或已经创建了一个表,如何在具有整数类型的列 id 上添加“自动增量”功能?
什么查询会返回所有行都为 NULL 的表的列名?
如何在 PostgreSQL 9.1 中设置两台相同的服务器以进行自动故障转移。
操作系统
Centos 5
PostgreSQL 9.1 源码编译
postgres 用户账号存在于两台机器上,并且有一个 ssh 无密码密钥,可以连接两台机器。
我当前的设置:
主服务器配置:
postgresql.conf:
listen_address = '*'
wal_level = hot_standby
max_wal_senders = 3
checkpoint_segments = 16
wal_keep_segments = 8
archive_mode = on
archive_command = 'cp "%p" /opt/pgsql91/archive/"%f"'
Run Code Online (Sandbox Code Playgroud)
pg_hba.conf:
host replication all 10.0.66.1/32 trust
host replication all 10.0.66.2/32 trust
Run Code Online (Sandbox Code Playgroud)
备用服务器
postgresql.conf 和 pg_hba.conf 与主服务器上配置的相同。
恢复.conf:
standby_mode = 'on'
primary_conninfo = 'host=10.0.66.1'
trigger_file = '/opt/pgsql91/data/trigger.txt'
Run Code Online (Sandbox Code Playgroud)
感谢 hzRoot,我现在明白了如何将服务器从备用服务器切换到主服务器。
使用以下命令,我可以将新从站与新主站同步,然后获取复制备份并运行。
在新主 (10.0.66.2) 上
表t有两个索引:
create table t (a int, b int);
create type int_pair as (a int, b int);
create index t_row_idx on t (((a,b)::int_pair));
create index t_a_b_idx on t (a,b);
insert into t (a,b)
select i, i
from generate_series(1, 100000) g(i)
;
Run Code Online (Sandbox Code Playgroud)
ANY运算符不使用索引:
explain analyze
select *
from t
where (a,b) = any(array[(1,1),(1,2)])
;
QUERY PLAN
---------------------------------------------------------------------------------------------------
Seq Scan on t (cost=0.00..1693.00 rows=1000 width=8) (actual time=0.042..126.789 rows=1 loops=1)
Filter: (ROW(a, b) = ANY (ARRAY[ROW(1, 1), ROW(1, 2)]))
Rows Removed …Run Code Online (Sandbox Code Playgroud) 我有一个 PostgreSQL 服务器,上面运行着多个数据库。其中一个数据库名为postgres,它从一开始就存在。我看不到里面的任何表,我从来没有明确使用过它,但我注意到,任何用户都可以在数据库中创建表(这不是我想要的 - 我不希望除管理员之外的任何用户创建任何地方的任何桌子)。
我有一种感觉,它是服务器正常运行所需的某种特殊数据库,但它的目的究竟是什么?什么样的数据(或可能)存储在里面?它是否保存有关其他数据库的元数据(例如information_schema?)。如果我connect从公众那里撤销对该数据库的特权,会发生什么令人讨厌的事情吗?或者,如果我什至放弃它?
我用谷歌搜索了半个小时,但总是得到完全不相关的东西,因为这个词postgres也用于用户postgres和 DBMS 本身。
我正在设计一个数据库(在 PostgreSQL 9.6 上),它将存储来自分布式应用程序的数据。由于应用程序的分布式特性,SERIAL由于潜在的竞争条件,我不能使用自动递增整数 ( ) 作为我的主键。
自然的解决方案是使用 UUID,或全局唯一标识符。Postgres 带有一个内置的UUIDtype,非常适合。
我对 UUID 的问题与调试有关:它是一个非人类友好的字符串。标识符ff53e96d-5fd7-4450-bc99-111b91875ec5什么也没告诉我,而ACC-f8kJd9xKCd,虽然不能保证是唯一的,但告诉我我正在处理一个ACC对象。
从编程的角度来看,调试与几个不同对象相关的应用程序查询是很常见的。假设程序员错误地ACC在ORD(订单)表中搜索(帐户)对象。使用人类可读的标识符,程序员可以立即识别问题,而在使用 UUID 时,他会花一些时间找出问题所在。
我不需要 UUID 的“保证”唯一性;我确实需要一些空间来生成没有冲突的密钥,但 UUID 有点矫枉过正。此外,最坏的情况是,如果发生冲突(数据库拒绝它并且应用程序可以恢复),也不会是世界末日。因此,权衡考虑,一个更小但对人友好的标识符将是我的用例的理想解决方案。
我想出的标识符具有以下格式:{domain}-{string},其中{domain}替换为对象域(帐户,订单,产品)并且{string}是随机生成的字符串。在某些情况下,{sub-domain}在随机字符串之前插入一个甚至可能是有意义的。让我们忽略的长度{domain},并{string}为保证唯一性的目的。
如果有助于索引/查询性能,格式可以具有固定大小。
知道:
ACC-f8kJd9xKCd.关于性能,存储此密钥的最佳方法是什么?
以下是四种可能的解决方案,但由于我对数据库的经验很少,我不确定哪个(如果有)是最好的。
VARCHAR)(Postgres 在CHAR(n) …
我正在尝试在没有接收数据库上的适当角色的情况下恢复转储。
如前所述这里也是在这里,你需要有--no-owner作为一个选项,无论是在pg_dump或pg_restore或两者兼而有之。
我使用以下命令行来创建我的转储:
"C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe" --no-owner -Ft --dbname=postgresql://avo******:AV0******?@127.0.0.1:5432/BI_DB > K:\BI\backup\sort\bck_%timestamp%.tar
Run Code Online (Sandbox Code Playgroud)
恢复线如下:
"C:\Program Files\PostgreSQL\9.3\bin\pg_restore.exe" --host localhost --port 5432 --username "postgres" --dbname "BI_TEST2" --no-password --no-owner --role=postgres --exit-on-error --verbose "D:\D\avo\backup\bck_04042017_1410.tar"
Run Code Online (Sandbox Code Playgroud)
如您所见,两者都有--no-owner选择,但最终出现以下错误:
最让我烦恼的是下面的日志:
pg_restore: [programme d'archivage (db)] Erreur pendant le traitement de la TOC (« PROCESSING TOC ») :
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 2633 ; 0 0 ACL adm avo******
pg_restore: [programme d'archivage (db)] could not …Run Code Online (Sandbox Code Playgroud) 我正在运行 Ubuntu 16。我已经安装了 Postgresql。Postgresql 曾经可以工作,但后来我重新启动了。
nmap 命令显示端口 5432 已打开。Postgres 似乎工作正常:
service postgresql status
Run Code Online (Sandbox Code Playgroud)
postgresql.service - PostgreSQL RDBMS 已加载:已加载(/lib/systemd/system/postgresql.service;已启用;供应商预设:已启用)活动:自美国东部时间周六 2017-07-29 18:42:59 起处于活动状态(退出);1min 4s ago Process: 201 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 201 (code=exited, status=0/SUCCESS)
Memory: 0B CGroup: /system.slice/postgresql.服务
我跑了这个: psql
但我得到了这个:
psql:无法连接到服务器:没有这样的文件或目录 服务器是否在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?
上面列出的文件似乎不存在。
我如何进入 Postgresql?通常我会跑psql或sudo -i -u postgres然后psql。但是这些命令不起作用。我不断收到有关“无法连接到服务器”的错误消息。几次重新启动都没有帮助。
更新:
我运行了这个命令: dpkg -l | grep postgres
rc postgresql-9.5 9.5.6-0ubuntu0.16.04 amd64 对象关系 SQL 数据库,版本 9.5 服务器 ii postgresql-client 9.5+173 PostgreSQL 的所有前端程序(支持版本) ii postgresql-client-9.5 9.5.7-0ubuntu0.16.04 …
我使用 pg_restore 用转储文件加载我的 postgres 数据库。我与我的用户连接到我的数据库:
sudo -u arajguru psql dump
select current_user;
current_user
--------------
arajguru
Run Code Online (Sandbox Code Playgroud)
现在我能够看到所有新创建的表:
dump=> \dt
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+----------
public | Approvals | table | arajguru
public | Approvers | table | arajguru
public | Conditions | table | arajguru
public | Entities | table | arajguru
public | EntityDefinitions | table | arajguru
public | Projects | table | arajguru
public | Rules | table | arajguru
public | …Run Code Online (Sandbox Code Playgroud) 我在试图找出数据库中的一些性能问题时遇到了困难。我正在使用大量在线资源来了解要监控的内容以及如何解释该信息。
从上面的,我无法找到的之间有什么区别一个明确的解释pg_stat_database.tup_returned和pg_stat_database.tup_fetched。
在 pgAdmin4 中,有一个漂亮的图表叫做“Tuples out”,其中对比了这两个概念,但我不知道如何解释这些信息。在官方文档中只说:
tup_returned: 此数据库中查询返回的行数tup_fetched: 此数据库中查询获取的行数“获取”和“返回”究竟是什么意思?
我正在使用 postgresql 10。
postgresql ×10
failover ×1
index ×1
linux ×1
monitoring ×1
null ×1
optimization ×1
performance ×1
pg-dump ×1
pg-restore ×1
pgadmin ×1
restore ×1
schema ×1
ubuntu ×1