PostgreSQL-表空間


表空間

基本概念

不同的數據庫表空間有不同的定義。

在 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM