pg入门3—详解tablespaces2
pg默认的tablespace的location为空,那么如果表设置了默认的tablespace,数据实际上是存哪个目录的呢?
在 PostgreSQL 中,如果你创建了一个表并且没有显式指定表空间(tablespace),或者表空间的 location
为空,数据将存储在数据库集群的默认数据目录中。这是 PostgreSQL 的数据存储默认行为。
1. 默认表空间和默认位置
PostgreSQL 有一个默认的表空间,叫 pg_default
,它并没有设置显式的物理位置。当你没有指定表空间时,数据会被存储在 pg_default
表空间下。pg_default
表空间的位置实际上指向 PostgreSQL 数据目录下的 base
目录。
- PostgreSQL 的数据目录通常是在初始化数据库集群时通过
initdb
指定的,或者在 PostgreSQL 的配置文件postgresql.conf
中通过data_directory
参数设置。 pg_default
表空间默认情况下会指向这个数据目录的base
目录。
2. 数据存储位置
数据的存储位置具体在数据目录下的 base
目录中。每个数据库都有一个对应的 OID(对象标识符),在 base
目录中会有一个与数据库 OID 对应的子目录。表的数据最终会存储在该子目录中。
例如:
- 假设你的 PostgreSQL 数据目录是
/var/lib/postgresql/data/
,那么:- 默认表空间
pg_default
指向的路径将是/var/lib/postgresql/data/base/
。 - 每个数据库会在
base
目录下有一个子目录,该子目录的名字是该数据库的 OID。
- 默认表空间
3. 如何查看数据库的 OID
你可以通过以下 SQL 查询来查看数据库的 OID:
SELECT oid, datname FROM pg_database;
每个数据库在 base
目录下的子目录名就是这个 OID。
4. 举例说明
假设 PostgreSQL 的数据目录位于 /var/lib/postgresql/data/
,且你在名为 mydb
的数据库中创建了一张表,而没有指定表空间。那么:
- PostgreSQL 会在
/var/lib/postgresql/data/base/
中创建一个名为mydb
数据库 OID 对应的子目录。 - 该表的数据文件会保存在这个 OID 子目录下。
因此,即便你没有设置表空间或者 location
为空,数据仍然会被存储在 PostgreSQL 数据目录下的相应位置中。