首页 > 解决方案 > 关于在自定义位置创建数据文件的困惑

问题描述

在 PostgreSQL 12 中,我在非默认目录(不在 $PGDATA 中)中创建了一个新表空间,但我发现在默认文件夹($PGDATA)中自动创建了相同大小的文件。

我记得在 9 版本中,在默认位置自动创建了一个软链接,指向自定义表空间文件夹。

[root@freelab PG_12_201909212]# du -sh /postgres/pg_tblspc/16385/PG_12_201909212; du -sh /pgdata/music/PG_12_201909212
4.3G    /postgres/pg_tblspc/16385/PG_12_201909212    ---default tablespace
4.3G    /pgdata/music/PG_12_201909212   ---new directory

这种情况会导致默认空间随着自定义空间的增长而消耗空间。

您想问一下,这是操作问题还是新功能?

详细操作流程如下:</p>

postgres=#  create tablespace tbs_music location '/pgdata/music';
CREATE TABLESPACE
postgres=# \db++
                                     List of tablespaces
    Name    |  Owner   |   Location    | Access privileges | Options |  Size   | Description
------------+----------+---------------+-------------------+---------+---------+-------------
 pg_default | postgres |               |                   |         | 24 MB   |
 pg_global  | postgres |               |                   |         | 623 kB  |
 tbs_music  | postgres | /pgdata/music |                   |         | 0 bytes |
(3 rows)

postgres=#  create database music tablespace  tbs_music;
CREATE DATABASE

postgres=# \db++
                                     List of tablespaces
    Name    |  Owner   |   Location    | Access privileges | Options |  Size   | Description
------------+----------+---------------+-------------------+---------+---------+-------------
 pg_default | postgres |               |                   |         | 24 MB   |
 pg_global  | postgres |               |                   |         | 623 kB  |
 tbs_music  | postgres | /pgdata/music |                   |         | 8057 kB |
(3 rows)


[root@freelab 16401]# pwd
/pgdata/music/PG_12_201909212/16401
[root@freelab 16401]# ls
112        14029      14052     2603      2611      2651  2675  2704      2840_vm   3394_fsm  3541_vm   3605      4153  5002
113        14031      14054     2603_fsm  2612      2652  2678  2753      2841      3394_vm   3542      3606      4154  548
1247       14032      14056     2603_vm   2612_fsm  2653  2679  2753_fsm  2995      3395      3574      3607      4155  549
1247_fsm   14032_fsm  1417      2604      2612_vm   2654  2680  2753_vm   2996      3429      3575      3608      4156  6102
1247_vm    14032_vm   1418      2605      2613      2655  2681  2754      3079      3430      3576      3609      4157  6104
1249       14034      174       2605_fsm  2615      2656  2682  2755      3079_fsm  3431      3596      3712      4158  6106
1249_fsm   14036      175       2605_vm   2615_fsm  2657  2683  2756      3079_vm   3433      3597      3764      4159  6110
1249_vm    14037      2187      2606      2615_vm   2658  2684  2757      3080      3439      3598      3764_fsm  4160  6111
1255       14037_fsm  2224      2606_fsm  2616      2659  2685  2830      3081      3440      3599      3764_vm   4161  6112
1255_fsm   14037_vm   2328      2606_vm   2616_fsm  2660  2686  2831      3085      3455      3600      3766      4162  6113
1255_vm    14039      2336      2607      2616_vm   2661  2687  2832      3118      3456      3600_fsm  3767      4163  6117
1259       14041      2337      2607_fsm  2617      2662  2688  2833      3119      3456_fsm  3600_vm   3997      4164  826
1259_fsm   14042      2579      2607_vm   2617_fsm  2663  2689  2834      3164      3456_vm   3601      4143      4165  827
1259_vm    14042_fsm  2600      2608      2617_vm   2664  2690  2835      3256      3466      3601_fsm  4144      4166  828
14022      14042_vm   2600_fsm  2608_fsm  2618      2665  2691  2836      3257      3467      3601_vm   4145      4167  pg_filenode.map
14022_fsm  14044      2600_vm   2608_vm   2618_fsm  2666  2692  2837      3258      3468      3602      4146      4168  PG_VERSION
14022_vm   14046      2601      2609      2618_vm   2667  2693  2838      3350      3501      3602_fsm  4147      4169
14024      14047      2601_fsm  2609_fsm  2619      2668  2696  2838_fsm  3351      3502      3602_vm   4148      4170
14026      14047_fsm  2601_vm   2609_vm   2619_fsm  2669  2699  2838_vm   3379      3503      3603      4149      4171
14027      14047_vm   2602      2610      2619_vm   2670  2701  2839      3380      3534      3603_fsm  4150      4172
14027_fsm  14049      2602_fsm  2610_fsm  2620      2673  2702  2840      3381      3541      3603_vm   4151      4173
14027_vm   14051      2602_vm   2610_vm   2650      2674  2703  2840_fsm  3394      3541_fsm  3604      4152      4174


postgres=# ALTER DATABASE music SET TABLESPACE tbs_music;
ALTER DATABASE

postgres=# \c music
You are now connected to database "music" as user "postgres".
music=#   CREATE TABLE test1
music-# (
music(#   id integer,
music(#   test integer
music(# )
music-# tablespace tbs_music;
CREATE TABLE


music=# select pg_relation_filepath('test1');
            pg_relation_filepath
---------------------------------------------
 pg_tblspc/16385/PG_12_201909212/16401/16402
(1 row)


music=# insert into test1 SELECT generate_series(1,1000000) as key, (random()*(10^3))::integer;
INSERT 0 1000000


[root@freelab 16401]# du -sh /postgres/pg_tblspc/16385/PG_12_201909212/16401/16402
35M     /postgres/pg_tblspc/16385/PG_12_201909212/16401/16402

[root@freelab 16401]# du -sh /pgdata/music/PG_12_201909212/16401/16402
35M     /pgdata/music/PG_12_201909212/16401/16402


music=# \db+
                                    List of tablespaces
    Name    |  Owner   |   Location    | Access privileges | Options |  Size  | Description
------------+----------+---------------+-------------------+---------+--------+-------------
 pg_default | postgres |               |                   |         | 24 MB  |
 pg_global  | postgres |               |                   |         | 623 kB |
 tbs_music  | postgres | /pgdata/music |                   |         | 43 MB  |
(3 rows)

参考Raj Verma的思路,重新测试,发现在pg_tblspc的目录级别有一个指向自定义位置的软链接,而且生成新数据后只有自定义目录空间在增长。

[root@freelab pg_tblspc]# ls -lrt
total 0
lrwxrwxrwx. 1 postgres postgres 13 Jan 31 02:53 16385 -> /pgdata/music
[root@freelab pg_tblspc]# pwd
/postgres/pg_tblspc

[root@freelab ~]#  du -sh /postgres;du -sh /pgdata/
921M    /postgres
43M     /pgdata/

A new table was created.


[root@freelab ~]#  du -sh /postgres;du -sh /pgdata/
921M    /postgres
107M    /pgdata/

标签: postgresql

解决方案


它确实为在 PG 中创建的非默认表空间创建了一个符号链接。

postgres=# \db++
                                 List of tablespaces
Name    |  Owner  |    Location     | Access privileges | Options |  Size   | 
Description
------------+---------+-----------------+-------------------+---------+------- 
--+-------------
newspace   | raj | /tmp/pgtblspace |                   |         | 7650 kB |
pg_default | raj |                 |                   |         | 4085 MB |
pg_global  | raj |                 |                   |         | 574 kB  |
(3 rows)

并且空间位置是“/tmp/pgtblespace”,它在 pg_tablespace 目录中创建了一个符号链接。

lrwx------  1 raj  admin    15B Feb  4 09:50 41852 -> /tmp/pgtblspace

现在,在您的情况下,您可以登录到 pg 服务器并通过执行“\db++”检查表空间的空间位置详细信息吗?

这将澄清 tblspace 的真正位置。

新添加/编辑

好吧,所以我确实尝试复制您的情况,但不幸的是它没有复制。虽然我确实浏览了一些源代码,但看起来你在这里遇到了一个错误。您可能想要删除表空间并创建一个新表空间。我为 pg12 创建了多个表空间,但没有看到这个问题。删除当前的 tblspace 并清除 pg_tblspace 文件夹和自定义 tblspace 文件夹。使用自定义文件夹位置创建新表空间,应该可以使用。见下文:

test=# \db++
                                    List of tablespaces
    Name     |  Owner   |            Location             | Access privileges | Description
-------------+----------+---------------------------------+-------------------+-------------
 pg_default  | postgres |                                 |                   |
 pg_global   | postgres |                                 |                   |
 tblspc_raj  | postgres | /var/lib/pgsql/12/tblspace_new  |                   |
 tblspc_raj1 | postgres | /var/lib/pgsql/12/tblspace_new1 |                   |
 tblspc_raj2 | postgres | /var/lib/pgsql/12               |                   |
 tblspc_raj3 | postgres | /var/lib/pgsql/12/tblspace_new2 |                   |
 tbs_music   | postgres | /var/lib/pgsql/music            |                   |
(7 rows)

自定义位置的文件夹结构也如下所示:

bash-4.2$ ls -l
total 8
drwx------.  2 postgres postgres    6 Nov 30 05:31 backups
drwx------. 20 postgres postgres 4096 Feb  4 00:00 data
-rw-------.  1 postgres postgres  927 Dec  4 04:49 initdb.log
drwx------.  2 postgres postgres    6 Feb  3 23:49 PG_12_201909212
drwx------.  3 postgres postgres   28 Feb  3 23:44 tblspace_new
drwx------.  3 postgres postgres   28 Feb  3 23:48 tblspace_new1
drwx------.  3 postgres postgres   28 Feb  3 23:52 tblspace_new2
bash-4.2$ pwd
/var/lib/pgsql/12

pg_tblspace 里面的那个看起来像这样:

-bash-4.2$ ll
total 0
lrwxrwxrwx. 1 postgres postgres 30 Feb  3 23:44 16391 -> /var/lib/pgsql/12/tblspace_new
lrwxrwxrwx. 1 postgres postgres 31 Feb  3 23:48 16395 -> /var/lib/pgsql/12/tblspace_new1
lrwxrwxrwx. 1 postgres postgres 17 Feb  3 23:49 16396 -> /var/lib/pgsql/12
lrwxrwxrwx. 1 postgres postgres 31 Feb  3 23:52 16397 -> /var/lib/pgsql/12/tblspace_new2
lrwxrwxrwx. 1 postgres postgres 20 Feb  3 23:55 16400 -> /var/lib/pgsql/music
lrwxrwxrwx. 1 postgres postgres 14 Feb  4 00:01 16402 -> /var/lib/pgsql
-bash-4.2$ pwd
/var/lib/pgsql/12/data/pg_tblspc

推荐阅读