Hi Simon,

You may want to send it to pgsql-gene...@postgresql.org.
This is a pgAdmin support mailing list.

--

Thanks & Regards,

Ashesh Vashi
EnterpriseDB INDIA: Enterprise PostgreSQL Company
<http://www.enterprisedb.com>


*http://www.linkedin.com/in/asheshvashi*
<http://www.linkedin.com/in/asheshvashi>

On Thu, Oct 5, 2017 at 5:53 PM, Simon Major <
simon.major+git...@simonmajor.me> wrote:

> Hi,
>
> The backstory: an alter tablespace failed due to space exhaustion in
> pg_xlog, and it would appear to have left files in the destination
> tablespace despite rolling back during recovery. After increasing disk
> space in pg_xlog the moves into the new empty were subsequently
> completed. At that point the suspected orphan files were discovered
> due to higher than expected disk space usage in the target tablespace.
>
> Mopping up orphan files does not seem to be covered well, so it was
> left until that table space was finished with, i.e. everything that
> had been altered in had been altered out, just leaving orphaned files.
> It was hoped a drop tablespace would safely mop up, but no joy. So it
> boils down to "Is checking pg_relation_filepath() a sufficient check
> before deleting files from under Postgresql?".
>
> Thanks,
>
> Simon
>
> The gory details (with changed names):
>
> hedatabase=# select pg_class.oid, relname, nspname,
> pg_relation_filepath(pg_class.oid) as primary_file_path,
> pg_size_pretty(pg_relation_size(pg_class.oid)) as primary_size,
> reltoastrelid, pg_relation_filepath(reltoastrelid) as toast_file_path
> from pg_class inner join pg_namespace on pg_class.relnamespace =
> pg_namespace.oid left join pg_tablespace on pg_class.reltablespace =
> pg_tablespace.oid where pg_tablespace.spcname not like 'pg_%' or
> relname like 'user_activity%' order by pg_class.relpages desc ;
>    oid   |            relname            | nspname  |
> primary_file_path                 | primary_size | reltoastrelid |
>             toast_file_path
> ---------+-------------------------------+----------+-------
> -------------------------------------------+--------------+-
> --------------+--------------------------------------------------
>    25899 | user_activity                 | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1317075 | 5262 MB      |
>    27087 | pg_tblspc/1309110/PG_9.5_201510051/17552/1317078
>    27087 | pg_toast_25899                | pg_toast |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1317078 | 5092 MB      |
>        0 |
>    25913 | user_activity_user_id_ts_idx  | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406888 | 365 MB       |
>        0 |
>  1025096 | user_activity_action_idx      | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406886 | 357 MB       |
>        0 |
>  1025093 | user_activity_ip_addr_idx     | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406892 | 287 MB       |
>        0 |
>    25912 | user_activity_ts_idx          | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406869 | 272 MB       |
>        0 |
>  1025110 | user_activity_api_idx         | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406882 | 268 MB       |
>        0 |
>  1025104 | user_activity_result_idx      | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406893 | 267 MB       |
>        0 |
>  1025094 | user_activity_customer_id_idx | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406877 | 255 MB       |
>        0 |
>    25910 | user_activity_pkey            | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1406890 | 231 MB       |
>        0 |
>    27089 | pg_toast_25899_index          | pg_toast |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1317080 | 107 MB       |
>        0 |
>    25897 | user_activity_id_seq          | public   | base/17552/25897
>                                 | 8192 bytes   |             0 |
> (12 rows)
>
> thedatabase=# vacuum full user_activity;
> VACUUM
>
> thedatabase=# select pg_class.oid, relname, nspname,
> pg_relation_filepath(pg_class.oid) as primary_file_path,
> pg_size_pretty(pg_relation_size(pg_class.oid)) as primary_size,
> reltoastrelid, pg_relation_filepath(reltoastrelid) as toast_file_path
> from pg_class inner join pg_namespace on pg_class.relnamespace =
> pg_namespace.oid left join pg_tablespace on pg_class.reltablespace =
> pg_tablespace.oid where pg_tablespace.spcname not like 'pg_%' or
> relname like 'user_activity%' order by pg_class.relpages desc ;
>    oid   |            relname            | nspname  |
> primary_file_path                 | primary_size | reltoastrelid |
>             toast_file_path
> ---------+-------------------------------+----------+-------
> -------------------------------------------+--------------+-
> --------------+--------------------------------------------------
>    25899 | user_activity                 | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828110 | 1559 MB      |
>    27087 | pg_tblspc/1309110/PG_9.5_201510051/17552/1828113
>  1025096 | user_activity_action_idx      | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828121 | 83 MB        |
>        0 |
>    25913 | user_activity_user_id_ts_idx  | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828118 | 81 MB        |
>        0 |
>  1025093 | user_activity_ip_addr_idx     | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828119 | 62 MB        |
>        0 |
>    25912 | user_activity_ts_idx          | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828117 | 58 MB        |
>        0 |
>  1025104 | user_activity_result_idx      | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828122 | 58 MB        |
>        0 |
>  1025110 | user_activity_api_idx         | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828123 | 58 MB        |
>        0 |
>    25910 | user_activity_pkey            | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828116 | 58 MB        |
>        0 |
>  1025094 | user_activity_customer_id_idx | public   |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828120 | 58 MB        |
>        0 |
>    25897 | user_activity_id_seq          | public   | base/17552/25897
>                                 | 8192 bytes   |             0 |
>    27089 | pg_toast_25899_index          | pg_toast |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828115 | 3208 kB      |
>        0 |
>    27087 | pg_toast_25899                | pg_toast |
> pg_tblspc/1309110/PG_9.5_201510051/17552/1828113 | 151 MB       |
>        0 |
> (12 rows)
>
> thedatabase=#
> thedatabase=# ALTER TABLE user_activity SET TABLESPACE pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_action_idx SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_user_id_ts_idx SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_ip_addr_idx SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_ts_idx SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_result_idx SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_api_idx SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_pkey SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=# ALTER TABLE user_activity_customer_id_idx SET TABLESPACE
> pg_default;
> ALTER TABLE
> thedatabase=#
> thedatabase=# select pg_class.oid, relname, nspname,
> pg_relation_filepath(pg_class.oid) as primary_file_path,
> pg_size_pretty(pg_relation_size(pg_class.oid)) as primary_size,
> reltoastrelid, pg_relation_filepath(reltoastrelid) as toast_file_path
> from pg_class inner join pg_namespace on pg_class.relnamespace =
> pg_namespace.oid left join pg_tablespace on pg_class.reltablespace =
> pg_tablespace.oid where pg_tablespace.spcname not like 'pg_%' or
> relname like 'user_activity%' order by pg_class.relpages desc ;
>    oid   |            relname            | nspname | primary_file_path
>  | primary_size | reltoastrelid |  toast_file_path
> ---------+-------------------------------+---------+--------
> ------------+--------------+---------------+--------------------
>    25899 | user_activity                 | public  |
> base/17552/1828124 | 1559 MB      |         27087 | base/17552/1828125
>  1025096 | user_activity_action_idx      | public  |
> base/17552/1828128 | 83 MB        |             0 |
>    25913 | user_activity_user_id_ts_idx  | public  |
> base/17552/1828129 | 81 MB        |             0 |
>  1025093 | user_activity_ip_addr_idx     | public  |
> base/17552/1828130 | 62 MB        |             0 |
>  1025094 | user_activity_customer_id_idx | public  |
> base/17552/1828135 | 58 MB        |             0 |
>  1025110 | user_activity_api_idx         | public  |
> base/17552/1828133 | 58 MB        |             0 |
>    25912 | user_activity_ts_idx          | public  |
> base/17552/1828131 | 58 MB        |             0 |
>    25910 | user_activity_pkey            | public  |
> base/17552/1828134 | 58 MB        |             0 |
>  1025104 | user_activity_result_idx      | public  |
> base/17552/1828132 | 58 MB        |             0 |
>    25897 | user_activity_id_seq          | public  | base/17552/25897
>  | 8192 bytes   |             0 |
> (10 rows)
>
> thedatabase=# select pg_class.oid, relname, nspname,
> pg_relation_filepath(pg_class.oid) as primary_file_path,
> pg_size_pretty(pg_relation_size(pg_class.oid)) as primary_size,
> reltoastrelid, pg_relation_filepath(reltoastrelid) as toast_file_path
> from pg_class inner join pg_namespace on pg_class.relnamespace =
> pg_namespace.oid left join pg_tablespace on pg_class.reltablespace =
> pg_tablespace.oid where pg_tablespace.spcname not like 'pg_%' and
> pg_relation_filepath(pg_class.oid) not like 'base%' order by
> pg_class.relpages desc ;
>  oid | relname | nspname | primary_file_path | primary_size |
> reltoastrelid | toast_file_path
> -----+---------+---------+-------------------+--------------
> +---------------+-----------------
> (0 rows)
>
> thedatabase=#
> thedatabase=# \db
>           List of tablespaces
>     Name    |  Owner   |   Location
> ------------+----------+---------------
>  pg_default | postgres |
>  pg_global  | postgres |
>  tmp        | postgres | /pgtblspc_tmp
> (3 rows)
>
> thedatabase=# \q
> simonm@dbserver-95-01:~$ sudo find /pgtblspc_tmp -ls
>         2      4 drwx------   4 postgres postgres     4096 Aug 31
> 18:16 /pgtblspc_tmp
>    262145      4 drwx------   3 postgres postgres     4096 Aug 31
> 18:17 /pgtblspc_tmp/PG_9.5_201510051
>    262146      4 drwx------   2 postgres postgres     4096 Oct  5
> 10:17 /pgtblspc_tmp/PG_9.5_201510051/17552
>    262149 1048580 -rw-------   1 postgres postgres 1073741824 Aug 31
> 18:18 /pgtblspc_tmp/PG_9.5_201510051/17552/1309116.2
>    262155   72464 -rw-------   1 postgres postgres   74203136 Aug 31
> 18:19 /pgtblspc_tmp/PG_9.5_201510051/17552/1309134.2
>    262151     872 -rw-------   1 postgres postgres     892928 Aug 31
> 18:18 /pgtblspc_tmp/PG_9.5_201510051/17552/1309116_fsm
>    262152      48 -rw-------   1 postgres postgres      49152 Aug 31
> 18:18 /pgtblspc_tmp/PG_9.5_201510051/17552/1309116_vm
>    262150  307048 -rw-------   1 postgres postgres  314417152 Aug 31
> 18:18 /pgtblspc_tmp/PG_9.5_201510051/17552/1309116.3
>    262154 1048580 -rw-------   1 postgres postgres 1073741824 Aug 31
> 18:19 /pgtblspc_tmp/PG_9.5_201510051/17552/1309134.1
>    262147 1048580 -rw-------   1 postgres postgres 1073741824 Aug 31
> 18:18 /pgtblspc_tmp/PG_9.5_201510051/17552/1309116
>    262153 1048580 -rw-------   1 postgres postgres 1073741824 Aug 31
> 18:19 /pgtblspc_tmp/PG_9.5_201510051/17552/1309134
>    262148 1048580 -rw-------   1 postgres postgres 1073741824 Aug 31
> 18:18 /pgtblspc_tmp/PG_9.5_201510051/17552/1309116.1
>        11      16 drwx------   2 root     root          16384 Aug 31
> 17:35 /pgtblspc_tmp/lost+found
> simonm@dbserver-95-01:~$ sudo -u postgres psql thedatabase
> psql (9.5.9)
> Type "help" for help.
>
> thedatabase=# DROP TABLESPACE tmp;
> ERROR:  tablespace "tmp" is not empty
> thedatabase=# \c postgres
> You are now connected to database "postgres" as user "postgres".
> postgres=# select pg_class.oid, relname, nspname,
> pg_relation_filepath(pg_class.oid) as primary_file_path,
> pg_size_pretty(pg_relation_size(pg_class.oid)) as primary_size,
> reltoastrelid, pg_relation_filepath(reltoastrelid) as toast_file_path
> from pg_class inner join pg_namespace on pg_class.relnamespace =
> pg_namespace.oid left join pg_tablespace on pg_class.reltablespace =
> pg_tablespace.oid where pg_tablespace.spcname not like 'pg_%' and
> pg_relation_filepath(pg_class.oid) not like 'base%' order by
> pg_class.relpages desc ;
>  oid | relname | nspname | primary_file_path | primary_size |
> reltoastrelid | toast_file_path
> -----+---------+---------+-------------------+--------------
> +---------------+-----------------
> (0 rows)
>
>
> postgres=# \c thedatabase
> You are now connected to database "thedatabase" as user "postgres".
> thedatabase=# SELECT relname, pg_relation_filepath(oid), relpages FROM
> pg_class WHERE pg_relation_filepath(oid) =
> 'pg_tblspc/1309110/PG_9.5_201510051/17552/1309134';
>  relname | pg_relation_filepath | relpages
> ---------+----------------------+----------
> (0 rows)
>
> thedatabase=# SELECT relname, pg_relation_filepath(oid), relpages FROM
> pg_class WHERE pg_relation_filepath(oid) =
> 'pg_tblspc/1309110/PG_9.5_201510051/17552/1309116';
>  relname | pg_relation_filepath | relpages
> ---------+----------------------+----------
> (0 rows)
>
> thedatabase=#
> thedatabase=# SELECT oid, spcname FROM pg_tablespace;
>    oid   |  spcname
> ---------+------------
>     1663 | pg_default
>     1664 | pg_global
>  1309110 | tmp
> (3 rows)
>
> thedatabase=#
> thedatabase=# \q
>
>

Reply via email to