Postgresql Tablespace Nedir

Veritabanları ve veritabanı objeleri tablespace’lerde barındırılır.
Tablespace’ler sayesinde objeleri istediğimiz diskte ya da istediğimiz dizinlerde
konumlandırabiliriz.
Tablespace oluşturulduktan sonra objeleri oluştururken sadece tablespace ismini
vermemiz yeterlidir.
Bir veritabanını ve tüm oblerini bir tablespace’te tutmak mümkünken sadece istenilen
objeleri farklı tablespace’lerde barındırmak da mümkündür.

Tablespace Kullanımı

postgres@srv1:~$ sudo mkdir /erp
postgres@srv1:~$ sudo chown postgres:postgres /erp
postgres=# CREATE TABLESPACE erp_tbs LOCATION '/erp' ;
postgres-# \db
Name | Owner | Location
------------+----------+----------
erp_tbs | postgres | /erp
pg_default | postgres |
pg_global | postgres |

postgres=# \! ls -l /erp
drwx------ 2 postgres postgres 6 Jul 2 14:43 PG_13_202007201
postgres-# \! ls -l /pg/data/13.6/pg_tblspc/
lrwxrwxrwx 1 postgres postgres 4 Jul 2 14:43 33016 -> /erp

/erp” klasörü “/pg/data/13.6/pg_tblsc/33016” klasörüne
otomatik olarak linklenmiş. Hakları gösteren rwx karakterlerinin en solunda “l” link
anlamına gelir.

Tablspace’ler cluster dizini dışında barındırılmış olsa da gene cluster’ın bir parçasıdır
(pg_tblspc dizininde sembolik linklerle adreslenir). Başka bir database cluster’a
eklenemezler.

Tablespace’in veri dosyaları silinirse veya disk arızası olursa database cluster erişilemez
olur ve başlatılamaz. Yedekten geri dönmek gerekir.

Sistem katalog ve objeler, veritabanı ile ilişkilendirilen tablespace’de barındırılır. Obje
oluşturulurken tablespace belirtilerek farklı bir tablespace’te oluşturmak mümkündür.
Örneğin fazla DML işlemi alan tablolar SSD vb. IOPS kapasitesi yüksek diskler üzerinde
konumlandırılabilir.

Yönetimi kolaylaştırmak ve/veya performansı artırmak için farklı diskler üzerinde
tablespaceleri oluşturup veritabanı ve objeleri bu tablespace’ler üzerinde yayabilirsiniz.
Fiziksel yapı ile mantıksal yapı bir birinden ayrı olduğu için yönetim kolaylığı sağlar.
Tablespace kavramı mantıksal, tablespace’lerin disk üzerindeki veri dosyaları ise fiziksel
karşılığıdır.

#Üzerindeki tüm objeler/veritabanları silindikten veya
taşındıktan sonra tablespace silinebilir.
drop tablespace tablespace_ismi ;

# tablespace isminin değiştirilmesi
ALTER TABLESPACE erp_tbs RENAME TO yeni_isim;

# tablespace sahipliğinin değiştirilmesi
ALTER TABLESPACE erp_tbs OWNER TO yeni_sahip;

Default‘ ta pg_global ve pg_default olmak üzere iki adet tablespace gelir.
pg_global’de paylaşımlı sistem katalog objeleri içindir.
pg_default’ta ise template0/1 vertibanlarının ve yeni oluşturulacak
veritabanlarının default tablespace’idir (tablespace parametresi ile farklı bir tablespace
belirtilmezse).
Owner tablespace oluşturulurken bu parametre ile tablespace’in sahibi olacak kullanıcı
belirtilebilir.

Temp Tablespace

postgres@srv1:~$ sudo mkdir /tmp_tbs
postgres@srv1:~$ sudo chown postgres:postgres /tmp_tbs
postgres@srv1:~$ psql
postgres=# alter system set temp_tablespaces='/tmp_tbs' ;
postgres=# CREATE temp TABLE tmp_ekip (id integer PRIMARY KEY ,
Ad varchar(40))
tablespace tmp_tbs1;
postgres=# INSERT INTO tmp_ekip VALUES(1, 'Ahmed Kul');
postgres=# INSERT INTO tmp_ekip VALUES(2, 'Ömer Muhacir');
postgres=# SELECT * FROM public.tmp_ekip order by 1 desc;

temp objelerin (tablo index) ve büyük sıralama işlemlerinin dosyalarının tutulacağı dizin
temp_tablespaces parametresi ile belirlenir.
Sıralama işlemlerinin çok olduğu raporlama vb. sunucularında bu dizin SSD/Flash/
RamDisk vb. hızlı disklerde konumlandırılırsa performansı artıracaktır.

postgres=# CREATE DATABASE erp_db WITH TABLESPACE = erp_tbs ;
CREATE DATABASE
postgres=# \c erp_db
postgres=# CREATE TABLE ekip (id integer PRIMARY KEY , Ad varchar(40));

#tablespace belirtilmediği için erp_tbs tablespace’ inde
oluşturulur.
postgres=# INSERT INTO ekip VALUES (1, ‘Ahmed Ensar’);
postgres=# INSERT INTO ekip VALUES(2, ‘Ömer Muhacir’);
postgres=# CREATE INDEX emp_idx on ekip(Ad);

# default tablespace’ in değiştirilmesi.
ALTER DATABASE erp_db SET default_tablespace=’yeni_tbs’;

#veya session bazında
SET default_tablespace = ik_tbs;

# Veritabanındaki tüm objeleri başka bir tablespace taşıma,
kesinti alınarak yapılmalı.
ALTER DATABASE erp_db SET TABLESPACE yeni_tablespace;

Tablespace & Database : Veritabanı oluşturulurken tablespace belirtilerek katalog
scheması bu tablespace’e yazdırılır. Aynı şekilde objeler de oluşturulurken tablespace
belirtilmez ise aynı tablespace içerisinde oluşturulur.