【问题标题】:Postgres Query to find whether database is read-only modePostgres 查询数据库是否为只读模式
【发布时间】:2022-03-11 03:58:47
【问题描述】:

我是 postgres 的新手。在mysql中,我们可以通过触发下面的查询来检查数据库是否处于只读模式。

选择@@global.read_only

同样,任何人都可以帮助我查询在 postgres 中做同样的事情吗?我尝试了一些类似下面的东西

SELECT schemaname||'.'||tablename FROM pg_tables
WHERE
  has_table_privilege ( 'postgres', schemaname||'.'||tablename, 'select' )
  AND schemaname NOT IN ( 'pg_catalog','information_schema');

但它的列表如下所示,这是我没想到的。

         ?column?                
----------------------------------------
 public.schema_migrations
 public.credential_methods
 public.notifications
 public.site_defaults
 public.apis
 public.client_applications
 public.api_groups
 public.operations
 public.client_application_labels
 public.client_application_label_values
 public.roles
 public.users
 public.sdm_user_roles
 public.permissions_roles
 public.keys
 public.o_two_access_tokens
 public.settings
 public.sdm_users
 public.permissions
 public.audits
 public.oauth_requesttokens
 public.oauth_access_tokens
 public.oauth_verifiers
 public.logged_exceptions
 public.api_call_details
 public.api_access_roles
 public.api_access_users
 public.login_attempts
 public.system_scopes
 public.keys_system_scopes
 public.o_two_auth_codes
 public.o_two_refresh_tokens
 public.service_profiles
 public.error_traces

我也试过“\du”,但这个只能在终端中工作,而不是来自 ruby​​ 文件。

query=ActiveRecord::Base.connection.execute("\du;")

ActiveRecord::StatementInvalid: PGError: ERROR: "du" 处或附近的语法错误 第 1 行:杜;

谢谢, 拉菲乌

【问题讨论】:

  • 反斜杠命令(如 \du )不是 SQL 的一部分,而是 psql 命令行前端的终端监视器命令。对于你原来的问题:我不知道答案。只需尝试插入或更新,然后处理错误。
  • 我认为 PostgreSQL 中没有“只读”数据库概念。另外:但它列出了我没想到的东西。所以你应该向我们展示你得到了什么你所期望的。
  • 您好,感谢您的回复。当我触发查询时,我得到以下输出
  • 期待什么?输出是用户postgres 具有select 权限的所有表。由于postgres 用户通常是“超级用户”,因此这个输出并不令人惊讶。

标签: ruby-on-rails postgresql


【解决方案1】:

您可能需要has_*_privilege() 系列函数用于相关表相关权限。见here。除此之外,我不确定 postgres 是否有只读模式的概念。

好吧,在只读事务中还有show transaction_read_only,但这似乎与您所要求的不同。而且我认为只读事务不会影响用户的权限

我不确定您对查询的期望,但如果您想要一些布尔值,例如您是否可以在任何地方访问,您可以使用count(*)!=0(并且可能不是select)。

【讨论】:

  • 我的 DBA 告诉我 PostgreSQL 确实有只读模式。在我的组织中,我们的 PostgreSQL 集群配置有一个 A 服务器 (r/w) 和一个处于“hot standby”模式的只读 B 服务器。对 A 所做的更改复制到 B。B 服务器接受连接,但如果您尝试进行更改,则会出错。文档说“所有此类连接都是严格只读的;甚至不能写入临时表。”为了确定您是否不小心连接到 B 服务器,我们的 DBA 建议使用show transaction_read_only
  • @DavidCostanzo,我认为您的 DBA 是对的,虽然我在 postgres 的复制和其他方面有点落后,但我也 认为,虽然我的回答对于 2012 年的情人节来说是非常正确的 ;-) 如果我知道更多,我会更新它,但我需要先让自己跟上时代,所以希望人们阅读这些 cmets 并自己做作业 ;- )
【解决方案2】:

如果您有一个多节点实例集群,并且您有热备配置。 SELECT pg_is_in_recovery() 的输出可以告诉你集群是否处于只读模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多