【问题标题】:How to list all databases and their schemas in postgresql?如何在 postgresql 中列出所有数据库及其模式?
【发布时间】:2016-11-22 03:58:15
【问题描述】:

我正在寻找一种方法来列出 OpenSuse postgresql 服务器上的所有数据库和所有模式。我知道我可以使用诸如\l+ 之类的元命令来列出所有数据库,但是有没有办法列出所有数据库的所有信息,包括数据库、模式和大小信息?

我想要一个整体来看待一切的方法。

谢谢!

【问题讨论】:

  • 你在 SO 上搜索过吗?
  • 是的。我已经搜索了互联网。也许我没有使用正确的术语?我知道元命令可以列出每个数据库,但我不确定如何一次为所有数据库执行此操作。我需要对几台服务器运行它,这对每个数据库都非常乏味。每台服务器上的一个命令会更易于管理。
  • psql -E 将向您展示用于在psql 中执行反斜杠命令的 SQL,因此您可以使用它来弄清楚如何编写自己的查询。

标签: database postgresql


【解决方案1】:

从 PostgreSQL 9.4.1 开始,以下查询将提供与 psql 中的 \l+ 相同的输出:

SELECT
  d.datname as "Name",
  pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
  pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
  d.datcollate as "Collate",
  d.datctype as "Ctype",
  pg_catalog.array_to_string(d.datacl, E'\n') as "Access privileges",
  CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
    THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
    ELSE 'No Access'
  END as "Size",
  t.spcname as "Tablespace",
  pg_catalog.shobj_description(d.oid, 'pg_database') as "Description"
FROM
  pg_catalog.pg_database d
JOIN
  pg_catalog.pg_tablespace t on d.dattablespace = t.oid
ORDER BY 1;

这里是来源:src/bin/psql/describe.c

【讨论】:

    【解决方案2】:

    如果不先连接到它,我看不到获取数据库模式列表的方法。基于this,我认为您可以使用db_link 获得它,例如:

    CREATE OR replace FUNCTION databases_schemas_size 
      () returns setof RECORD 
    AS 
      $body$ 
    
      DECLARE 
    
        connection_info CHARACTER varying; 
        i RECORD; 
        r RECORD; 
    
      BEGIN 
    
        FOR r IN SELECT cast(datname AS CHARACTER varying) FROM  pg_database  WHERE  datistemplate = FALSE LOOP 
    
        SELECT format ('dbname=%s user=%s password=%s', r.datname, 'YOUR_ALLOWED_USERNAME', 'PASSWORD') INTO   connection_info; 
    
        perform dblink_connect(connection_info); 
        FOR i IN SELECT r.datname, * 
        FROM   dblink('SELECT nspname , pg_size_pretty(sum(pg_relation_size(C.oid))) AS size FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN (''pg_catalog'', ''information_schema'') group by nspname') 
        AS t(schema_name CHARACTER varying, schema_size text) 
    
        LOOP 
        RETURN NEXT i; 
        END LOOP; 
    
      perform dblink_disconnect(); 
    END LOOP; 
    
    RETURN; 
    
    END; 
    $body$ LANGUAGE plpgsql volatile cost 100; 
    
    
    SELECT * FROM  databases_schemas_size() 
    AS (datname CHARACTER varying, schema_name CHARACTER varying, schema_size text);
    

    您可以使用FOREIGN DATA WRAPPER functionality 改进它以不对登录名/密码进行硬编码

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多