- pg_global :用於共享系統目錄。
- pg_default :是 template1 和 template0 資料庫的預設表空間,如果沒有給出 TABLESPACE 子句,則用於在資料庫內建立的表、索引和臨時檔案的預設表空間。每當您在建立表/資料庫而未在建立表語句中指定表空間時,它將轉到 pg_default 表空間。
表空間建立的語法:
CREATE TABLESPACE tablespace_name [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ] LOCATION 'directory' [ WITH ( tablespace_option = value [, ... ] ) ]
在建立表空間之前,您必須建立作業系統級目錄,並且必須將目錄所有者許可權更改為 postgres 使用者
1.creating tbs1 directory: cd /tab1/ mkdir tbs1 2.changing tbs1 permission to postgres user: chown -R postgres:postgres tbs1 3.creating tablespace with name of tbs1 ,tbs1 is a logical name you can change whatever you want: CREATE TABLESPACE tbs1 LOCATION '/tab1/tbs1'; #建立表空間 4.Listing postgresql tablespace: postgres=# \db+ #列出表空間 List of tablespaces Name | Owner | Location | Access privileges | Options | Size | Description ------------+----------+------------+-------------------+---------+---------+------------- pg_default | postgres | | | | 23 MB | pg_global | postgres | | | | 573 kB | tbs1 | postgres | /tab1/tbs1 | | | 0 bytes | (3 rows)
建立有/無表空間的表:
大多數“CREATE”SQL 命令都帶有“TABLESPACE”選項,您可以使用該選項指定要在其中建立該 SQL 物件的表空間。讓我們嘗試幾個:
postgres=# create database dbname2 tablespace tbs1; #建立資料庫dbname2,指定預設表空間 CREATE DATABASE postgres=# \c dbname2 You are now connected to database "dbname2" as user "nijam". dbname2=# create table t1 (a int); CREATE TABLE dbname2=# create table t2 (a int) tablespace tbs1; CREATE TABLE dbname2=# create table t3 (a int) tablespace tbs2; CREATE TABLE
如果您想知道組成表的檔案的確切位置,可以使用 oid2name:
oid2name是一個實用程式,可幫助管理員檢查 PostgreSQL 使用的檔案結構。
$ oid2name -t t4 From database "postgres": Filenode Table Name ---------------------- 24592 t4 $ find $PGDATA -name 2459* /u02/pgdata/PG961/base/13322/24592
此外,oid2name 還會告訴您有關資料庫及其關聯的預設表空間的更多資訊:
$ oid2name All databases: Oid Database Name Tablespace ---------------------------------- 13322 postgres pg_default 13321 template0 pg_default 1 template1 pg_default
There are three main patterns paths in Tablespace:
- 1.For files in the default tablespace: base/database_oid/table_and_index_files_oid
- 2.For files in Non-default tablespace:The directory $PGDATA/pg_tblspc contains symbolic links that point to each of the non-built-in tablespaces defined in the cluster. pg_tblspc / tablespace_oid / tablespace_version_subdir / database_oid /table_and_index_files_oid
- 3.For shared relations (see below): global/table_and_index_files_oid
postgres=#\! ls -l /u02/tbs1/ total 0 drwx------. 2 postgres postgres 6 Nov 25 11:03 PG_9.6_201608131
表空間的基本命令:
確定現有表空間的集合:
select oid,spcname from pg_tablespace;
下面的元命令對於列出現有表空間也很有用:
\db+
表空間重新命名:
alter tablespace tbs1 rename to tbs3;
更改表空間所有權:
alter tablespace tbs1 Owner to scott;
表空間重置:
alter tablepace tbs1 reset default_tablespace;
表空間刪除:
drop tablespace tbs1;
注意:直到所有使用表空間的資料庫中的所有物件都被刪除後,才能刪除表空間。
確定現有表空間的集合:
select oid,spcname from pg_tablespace;
下面的元命令對於列出現有表空間也很有用:
\db+
表空間重新命名:
alter tablespace tbs1 rename to tbs3;
更改表空間所有權:
alter tablespace tbs1 Owner to scott;
表空間重置:
alter tablepace tbs1 reset default_tablespace;
表空間刪除:
drop tablespace tbs1;
注意:直到所有使用表空間的資料庫中的所有物件都被刪除後,才能刪除表空間。
為特定使用者分配預設表空間:
ALTER ROLE someuser SET default_tablespace = tbs1;
表空間佔用的磁碟空間:
select pg_size_pretty(pg_tablespace_size('tbs1'));
(或)
/u02/tbs1/du -c -h
在使用建立一批表時暫時用於當前會話
SET default_tablespace = tbs2;
更改整個例項的預設表空間:
所有新建立的物件都進入新的表空間。
所有新建立的物件都進入新的表空間。
postgres=# alter system set default_tablespace='tbs3'; ALTER SYSTEM postgres=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 row) postgres=# show default_tablespace ; default_tablespace -------------------- tbs3 (1 row)
How to find what tablespace a table/index is in on PostgreSQL?
For table:
SELECT tablespace FROM pg_tables WHERE tablename = 't1' AND schemaname = 'schema1';