postgresql - 关于在自定义位置创建数据文件的困惑
问题描述
在 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/
解决方案
它确实为在 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
推荐阅读
- c++ - 如何在共享库(Linux)中嵌入静态库?
- azure - 如何使用具有变更数据捕获功能的 SSIS 将数据集从 Azure 托管实例移动到 Azure SQL
- javascript - 用数学方法将一个矩形分成四个三角形并确定指针位置
- sqlclr - SQL CLR 调用 Web 服务的第一次问题
- android - 无法保存 Android APNSetting
- html - 使用书写模式垂直显示按钮:vertical-rl;并使按钮宽度适合内容
- ruby-on-rails - 将正文部分链接到使用显示操作生成且不仅包含文本的视图
- php - 我们需要配置什么,才能使用 Laravel 发送电子邮件?
- palantir-foundry - 我如何获得带有留声机 id 的支持数据集名称?
- python - 如何在熊猫数据框中将纪元时间转换为 GMT + 7 时间?