表空間
基本概念
不同的數據庫表空間有不同的定義。
在 postgres 中,表空間 允許在文件系統中定義數據庫對象存儲的位置,實質上就是指定了一個目錄。
與數據庫的關系
在 postgres 中,一個表空間可以讓多個數據庫使用,而一個數據庫也可以使用多個表空間,屬於“多對多”的關系
在 oracle 中,一個表空間只屬於一個數據庫,而一個數據庫可以使用多個表空間,屬於“一對多”的關系
應用場景
1. 存儲磁盤沒有空間時,可以使用表空間把數據存到其他地方;
如數據庫一般裝在root下,root相當於是一個磁盤分區,當root滿時,可以使用表空間把數據存到 home 分區。
2. 利用表空間對數據庫進行性能優化
如頻繁使用的數據表或者索引放在高性能的硬盤上,而較少使用的放在普通硬盤上。
初始表空間
postgres 自帶了兩個表空間,pg_default, pg_global
表空間pg_default是用來存儲系統目錄對象、用戶表、用戶表index、和臨時表、臨時表index、內部臨時表的默認空間。對應存儲目錄$PADATA/base/
表空間pg_global用來存放系統字典表;對應存儲目錄$PADATA/global/
pg_tblspc 就是表空間,初始是空的,當手動增加表空間時,該目錄下會自動生成一個軟連接,指向表空間設定的路徑。
設定表空間的一系列命令
Postgres環境
首先,設定表空間需要在 postgres 操作環境中進行,所以第一步,進入 postgres 操作環境
首先切換到postgres用戶,然后輸入psql,最終出現 postgres=#,表示是一個正確的環境
[root@localhost ~]# su postgres bash-4.2$ psql could not change directory to "/root" psql (9.2.24) Type "help" for help. postgres=#
注意,在此環境中執行的是sql命令,而非linux命令。而且 sql語句后面必須帶 ;
如果在后續操作過程中,postgres=#的=變成其他,代表輸入命令沒有被執行,可能命令有誤,如下
postgres-# create tablespace tbs_test owner postgres location '/var/www/test/ postgres'# CREATE TABLESPACE zns_road LOCATION '/var/www/test/'
ctrl+c 結束即可。
查看表空間
postgres=# \db List of tablespaces Name | Owner | Location ------------+----------+---------------- pg_default | postgres | pg_global | postgres | tbs_test | postgres | /var/www/test zns_road | postgres | /home/postgres (4 rows)
這里我已經添加了幾個表空間,所以除了初始的2個外,還有其他的。
也可以使用 sql 查看
postgres=# select oid,* from pg_tablespace; oid | spcname | spcowner | spcacl | spcoptions -------+------------+----------+--------+------------ 1663 | pg_default | 10 | | 1664 | pg_global | 10 | | 24692 | tbs_test | 10 | | 24697 | zns_road | 10 | | (4 rows)
創建表空間
學習記錄
開始我在 root 下,創建一個文件夾,然后 link 到 home 下的一個文件夾,沒想到 root 下的軟連接 無法修改所有者和屬組成postgres,這樣操作直接修改的是被 link 的文件夾的所有者和屬組,這樣,表空間就沒有權限使用這個目錄,777也不行,當時折騰半天。
[root@localhost ~]# mkdir /var/www/psgl [root@localhost ~]# chown postgres:postgres /var/www/psgl [root@localhost ~]# chmod 777 /var/www/psgl/ [root@localhost ~]# ln -sfn /home/yanshuangwu/db/ /var/www/psgl
各種情況都試了,最后還是不行,沒有權限。
postgres=# create tablespace test10 location '/var/www/psgl'; ERROR: could not set permissions on directory "/var/www/psgl": Permission denied
【后來我發現可以,下面會說到】
最后我直接在 home 下建立目錄,沒想到竟然可以,詳細過程如下:
1. 首先建立目錄,然后修改所有者和屬組;
// 首先這個目錄是要被 postgres 使用的,所以要修改所有者和屬組為 postgres,當然修改成777或許可以,我沒試;
// 我在操作時,犯了一個錯誤,我當時在個人賬戶下建了一個目錄,修改所有者和屬組,然后不行,我改成777,還是不行,后來我意識到上層目錄 /home/myname 權限有問題,這很容易理解,但當時沒想到,折騰半天
// 由於修改上層目錄權限不是很好,我直接在 home 下建了一個目錄,然后修改所有者和屬組,相當於是給 postgres 開了賬戶
$ mkdir path
$ chown postgres:postgres path
【在寫博客時,我重新理了下思路,發現我在root下link到home時,home下的文件夾是放在我個人賬戶下的,雖然該目錄全權限,但是上層目錄權限不對,這才導致創建表空間時沒有權限,所以我修改后重新試了下,可以,完美收場。】
2. 創建表空間
CREATE TABLESPACE tablespace_name [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ] LOCATION 'directory' ### 創建命令 postgres=# create tablespace zns_road owner postgres location '/home/postgres'; CREATE TABLESPACE
一個表空間對應一個目錄;
一個表空間目錄下,每個庫對應一個目錄;
一個表對應多個文件,以每個文件1G的形式存儲,單表最大支持32T;
查看表存儲路徑
postgres=# select pg_relation_filepath('test'); pg_relation_filepath ---------------------------------------------- pg_tblspc/24697/PG_9.2_201204301/12926/24698 (1 row)
3. 創建數據庫或者表時指定表空間
CREATE DATABASE myDB TABLESPACE tbs;
以后在該數據庫中創建表、索引時,會自動存儲到這個表空間下。
可以直接創建表
postgres=# create table test(a int) tablespace zns_road; CREATE TABLE
在客戶端查看該數據庫即可看到表空間
4. 修改已有數據庫或表的表空間
ALTER DATABASE myDB set TABLESPACE tbs;
postgres=# alter table road_point set tablespace zns_road; ALTER TABLE
注意,修改表空間時,必須斷開所有連接。
如果不斷開,所有操作被鎖死。
操作記錄
上述操作只是把現有表的表空間改變了,沒有改變現有表中已存在數據的存儲位置,仍然存在以前的表空間中,相當於是復制了一份到新的表空間中
要想把已存在的數據移動(剪切)到新的表空間,操作如下
alter table table_name move tablespace tablespace_name;
很奇怪,后面我重新試驗了下,切換表空間之后,數據自動遷移到新的表空間,原空間沒有了,相當於直接剪切了。
我又查了下,上句 move 是 orcle 的用法,有待核實。
5. 創建索引時指定表空間
CREATE INDEX idx_teacher on Teacher(ID) TABLESPACE tbs;
其他操作類似,詳情百度。
參考資料:
https://www.cnblogs.com/lottu/p/9239535.html 更多詳細教程
https://blog.csdn.net/liyazhen2011/article/details/82746061
https://www.cnblogs.com/alianbog/p/4771084.html