På søndag 31. desember 2017 kl. 00:49:31, skrev Stephen Frost <
sfr...@snowman.net <mailto:sfr...@snowman.net>>:
* Andreas Joseph Krogh (andr...@visena.com) wrote:
 >  SELECT
 >    quote_ident(nsp.nspname) || '.' || quote_ident(c.relname),
 >    s.setting || '/base/' || db.oid || '/' || c.relfilenode,
 >    (pg_stat_file(s.setting || '/base/' || db.oid || '/' ||
 > c.relfilenode)).size as size
 >  FROM
 >    pg_settings s
 >    JOIN pg_database db on (s.name = 'data_directory')
 >    JOIN pg_class c on (datname = current_database())
 >    JOIN pg_namespace nsp on (c.relnamespace = nsp.oid)
 >  WHERE
 >    relfilenode <> 0
 >    AND nsp.nspname !~ '^pg_'
 >    AND nsp.nspname <> 'information_schema';
 >
 >  Technically speaking, while these queries are correct for PG10, in prior
 >  versions of PostgreSQL it's possible to have user schemas that begin
 >  with 'pg_' and therefore the filtering in the WHERE clause would have to
 >  be more specific.
 >
 >  Note that both of these need to be run as a superuser in older versions
 >  of PG.  In PostgreSQL 10, a user could be GRANT'd 'pg_read_all_settings'
 >  and be able to run the first query.  We don't currently support being
 >  able to GRANT a non-superuser the ability to run pg_stat_file(), but
 >  that will likely be coming in PG 11.
 >
 >  Thanks!
 >  
 > That doesn't seem to work with custom types:

 Nothing in this query referred to types, so I'm not sure what custom
 types would have to do with it..?

 > andreak@[local]:5433 10.1 andreak=# SELECT                         
 >   quote_ident(nsp.nspname) || '.' || quote_ident(c.relname),
 >   s.setting || '/base/' || db.oid || '/' || c.relfilenode,
 >   (pg_stat_file(s.setting || '/base/' || db.oid || '/' || 
c.relfilenode)).size
 > as size
 >  FROM  
 >   pg_settings s  
 >   JOIN pg_database db on (s.name = 'data_directory')  
 >   JOIN pg_class c on (datname = current_database())  
 >   JOIN pg_namespace nsp on (c.relnamespace = nsp.oid)  
 >  WHERE
 >   relfilenode <> 0  
 >   AND nsp.nspname !~ '^pg_'
 >   AND nsp.nspname <> 'information_schema';
 >  ERROR:  could not stat file
 > "/home/andreak/programs/postgresql-10/data/base/22039391/22039392": No such
 > file or directory
 >   
 > │ public.biginttuple2 │
 > /home/andreak/programs/postgresql-10/data/base/22039391/22039392 │

 Considering this is saaying 'no such file or directory', I'm guessing
 that somehow your data directory isn't what is listed in pg_settings..?

 Alternatively, perhaps that table was concurrently dropped?

 Are you able to provide any specifics about your system?  Does the
 database directory exist?  Does that path look reasonable?  I find it
 kind of interesting that the OID of the database and the relfilenode are
 so close together- exactly what did you do to test this query?
 
 
Here's a simple test-case:
 
createdb test
test=# create table foo(id serial primary key, name varchar not null);
test=# CREATE TYPE BigIntTuple2 AS (f1 bigint, f2 bigint);
  
SELECT
  quote_ident(nsp.nspname) || '.' || quote_ident(c.relname),
  s.setting || '/base/' || db.oid || '/' || c.relfilenode
FROM
  pg_settings s
  JOIN pg_database db on (s.name <http://s.name/> = 'data_directory')
  JOIN pg_class c on (datname = current_database())
  JOIN pg_namespace nsp on (c.relnamespace = nsp.oid)
WHERE
  relfilenode <> 0
  AND nsp.nspname !~ '^pg_'
  AND nsp.nspname <> 'information_schema';
  

┌─────────────────────┬──────────────────────────────────────────────────────────────────┐
 │      ?column?       │                             ?column? 
                            │
 
├─────────────────────┼──────────────────────────────────────────────────────────────────┤
 │ public.foo_id_seq   │ 
/home/andreak/programs/postgresql-10/data/base/22058766/22058767 │
 │ public.foo          │ 
/home/andreak/programs/postgresql-10/data/base/22058766/22058769 │
 │ public.foo_pkey     │ 
/home/andreak/programs/postgresql-10/data/base/22058766/22058776 │
 │ public.biginttuple2 │ 
/home/andreak/programs/postgresql-10/data/base/22058766/22058778 │
 
└─────────────────────┴──────────────────────────────────────────────────────────────────┘
  
 
SELECT
  quote_ident(nsp.nspname) || '.' || quote_ident(c.relname),
  s.setting || '/base/' || db.oid || '/' || c.relfilenode,
  (pg_stat_file(s.setting || '/base/' || db.oid || '/' || c.relfilenode)).size 
as size
FROM
  pg_settings s
  JOIN pg_database db on (s.name <http://s.name/> = 'data_directory')
  JOIN pg_class c on (datname = current_database())
  JOIN pg_namespace nsp on (c.relnamespace = nsp.oid)
WHERE
  relfilenode <> 0
  AND nsp.nspname !~ '^pg_'
  AND nsp.nspname <> 'information_schema';
  
ERROR:  could not stat file 
"/home/andreak/programs/postgresql-10/data/base/22058766/22058778": No such 
file or directory
  
$ file /home/andreak/programs/postgresql-10/data/base/22058766/22058776 
 /home/andreak/programs/postgresql-10/data/base/22058766/22058776: lif file
  
 
-- Andreas Joseph Krogh
CTO / Partner - Visena AS
Mobile: +47 909 56 963
andr...@visena.com <mailto:andr...@visena.com>
www.visena.com <https://www.visena.com>
 <https://www.visena.com>


 

Reply via email to