Düzeltme Öner

Tablespace Kavramı ve Kullanımı

PostgreSQL’de tablespace’ ler, veritabanı yöneticilerinin veritabanı nesneleri için farklı saklama yerleri belirtmelerine olanak sağlar.

Tablespace kullanıldığında, veritabanı yöneticisi PostgreSQL kurulumunun disk üzerindeki yapısını kontrol edebilir. Bunun birçok yararı bulunmaktadır. Bunlardan ilki, eğer PostgreSQL kurulumunu gerçekleştirdiğiniz disk bölümünde yer kalmadıysa ve mantıksal ya da diğer yollarla bu alan büyütülemiyorsa, farklı ve uygun büyüklükte bir disk bölümü üzerinde bir tablespace yaratılır ve sistem yeniden yapılandırılana kadar bu tablespace üzerinde işlemler devam ettirilir. Diğer bir konu da şudur: Tablespace’ler veritabanı yöneticisine veritabanı nesnelerinin kullanım durumlarına göre veri yerleşimlerini düzenleme imkanı verir. Örneğin, çok sık kullanılan bir indeks çok hızlı ve sorunsuz çalışan bir diske yerleştirilebilir. Benzer şekilde, arşivlenmiş bilgi saklayan, çok seyrek kullanılan ve başarımın pek önemli olmadığı tablolar da daha yavaş bir diske yerleştirilebilir.

Veritabanları, şemalar, tablolar, indeksler ve sequence’ler tablespace’ler içine yerleştirilebilirler. Bir tablespace sadece superuser tarafından yaratılabilir. Diğer kullanıcılar tablespaceleri sadece kullanabilirler. Yapılması gereken şey, ilgili kullanıcılara o tablespace için CREATE izninin verilmesidir. CREATE izni olan kullanıcı ilgili komuta tablespace adını bir parametre olarak vermelidir.

Bir tablespace’in nasıl yaratılacağını aşağıdaki örnekle de açıklayabiliriz. Öncelikle, yeni tablespace’in yer alacağı dizini yaratalım. Bu dizinler postgres kullanıcısına ait olmalıdır:

mkdir /var/lib/pgsql/13/mgmtblspc

Şimdi veritabanına bağlanalım:

CREATE TABLESPACE yte LOCATION ' /pgsql2/mgm_tblspace' ;
\db

        List of tablespaces     
    Name    |  Owner   |        Location         
------------+----------+-------------------------  
    yte     | postgres | /var/lib/pgsql/13/mgmtblspc 
 pg_default | postgres |  
 pg_global  | postgres | 

(3 rows)

Artık tablomuzu yeni tablespace içinde yaratabiliriz:

CREATE TABLE t1 (c1 int) TABLESPACE yte; 

SELECT   schemaname,tablename,tablespace   FROM   pg_tablesWHERE tablename='t1' ;
 schemaname | tablename | tablespace
------------+-----------+------------
 public     | t1        | yte 

Benzer şekilde bir index de yaratalım:

CREATE INDEX c1_idx ON t1 USING btree (c1) TABLESPACE yte;

Kullanıcıların yarattığı tüm tablespace’lerin sembolik linkleri $PGDATA/pg_tblspace dizininde tutulur.

ls -l /var/lib/pgsql/13/data/pg_tblspc/
total 0 
lrwxrwxrwx  1  postgres  postgres  31  Jun  2  23:25  20955->/var/lib/pgsql/13/mgmtblspc

Tablespace üzerinde işlem yapmak:

  • Bir tablespace’ in adını ve sahibini değiştirebilirsiniz.
ALTER TABLESPACE tblspcad RENAME TO yeni_adı;
ALTER TABLESPACE tblspcad OWNER TO yeni_sahibi;
  • Bir tablonun ya da bir index’in üzerinde olduğu tablespace’i değiştirmek için yine ALTER kullanılır.
ALTER TABLE tablo_adı SET TABLESPACE yeni_tablespace_adı;
ALTER INDEX index_adı SET TABLESPACE yeni_tablespace_adı;

Geçici Nesneler için Tablespace Yaratma

PostgreSQL’de temp_tablespaces parametresi bulunmaktadır. Bu parametre, geçici tabloların, indexlerin ve de dosyaların yaratılabileceği tablespace için dizin belirtir. Geçici dosyalar büyük sıralama işlemleri için kullanılırlar. Bu parametrenin önemli bir özelliği, birden fazla tablespace belirtilebilmesidir. Her gereksinimde bu tablespacelerden rasgele birisi kullanılır. Bu, yük dengeleme için idealdir.

Geçici nesneleri Linux’da ramdiskte tutmak başarımı arttıracaktır. Linux’da öntanımlı olarak 16 tane ramdisk yaratılır:

$ ls -l /dev/ram* lrwxrwxrwx 1 root root   4 Jan   8 22:09 /dev/ram->ram1
brw-r----- 1 root disk 1,  0 Jan  8 22:09 /dev/ram0 
brw-r----- 1 root disk 1,  1 Jan  8 22:09 /dev/ram1 
brw-r----- 1 root disk 1, 10 Jan  8 22:09 /dev/ram10 
brw-r----- 1 root disk 1, 11 Jan  8 22:09 /dev/ram11 
brw-r----- 1 root disk 1, 12 Jan  8 22:09 /dev/ram12 
brw-r----- 1 root disk 1, 13 Jan  8 22:09 /dev/ram13 
brw-r----- 1 root disk 1, 14 Jan  8 22:09 /dev/ram14 
brw-r----- 1 root disk 1, 15 Jan  8 22:09 /dev/ram15 
brw-r----- 1 root disk 1,  2 Jan  8 22:09 /dev/ram2 
brw-r----- 1 root disk 1,  3 Jan  8 22:09 /dev/ram3 
brw-r----- 1 root disk 1,  4 Jan  8 22:09 /dev/ram4 
brw-r----- 1 root disk 1,  5 Jan  8 22:09 /dev/ram5 
brw-r----- 1 root disk 1,  6 Jan  8 22:09 /dev/ram6 
brw-r----- 1 root disk 1,  7 Jan  8 22:09 /dev/ram7 
brw-r----- 1 root disk 1,  8 Jan  8 22:09 /dev/ram8 
brw-r----- 1 root disk 1,  9 Jan  8 22:09 /dev/ram9 lrwxrwxrwx 1 root root   4 Jan  8 22:09 /dev/ramdisk->ram0

ram0 dışındaki herhangi birisini kullanabilirsiniz; ya da kendiniz yeni bir ramdisk yaratabilirsiniz:

mknod -m 0 /dev/pgramdisk b 1 1

Bu bölümü formatlayalım:

mkfs.exfs /dev/pgramdisk

Mount edeceğimiz dizini yaratalım:

mkdir /media/pgramdiskmount

…ve mount edelim:

mount /dev/pgramdisk /media/pgramdiskmount
Bu ramdisk’in açılışta sürekli olarak mount edilmesi için /etc/fstab içine gerekli satırları eklemeyi unutmayın.

PostgreSQL’de tablespace’lerin sadece sembolik link destekleyen işletim sistemlerinde kullanılabilir. NTFS sembolik linkleri Junction ile destekler. Ayrıntılı bilgiyi ve Junction eklentisini Microsoft’un web sitesinden edinebilirsiniz.

Initdb aşamasında yaratılan tablespaceler $PGDATA altında yaratılır.

PostgreSQL’deki default_tablespace parametresi, CREATE TABLE aşamasında kullanılacak öntanımlı değeri belirtir. Kurulum aşamasında bu değer atanmamıştır:

SHOW default_tablespace ;
 default_tablespace
--------------------
(1 row)

Bu değer SET default_tablespace TO <tblspaceadı> ile değiştirilebilir. Eğer yaratma işleminde TABLESPACE parametresi verilmezse, nesnenin yaratıldığı şablon (template) veritabanının bulunduğu tablespace değeri kullanılır.

Bir tablespace’i kaldırmak için DROP TABLESPACE komutu kullanılır.

PostgreSQL’ de initdb aşamasında iki tablespace oluşturulur:

  • pg_default: template1 ve template0 veritabanlarının öntanımlı tablespace’idir.
  • pg_global: Sistem katalog tablolarının (paylaşılmış olanlar) tutulduğu tablespace’dir.

Tüm tablespace’ler pg_tablespace sistem katalog tablosunda tutulur:

# select * from pg_tablespace ;
spcname   | spcowner | spcacl | spcoptions
-----------+----------+--------+------------
pg_default |       10 |        |
pg_global  |       10 |        |
mgm        |       10 |        |

Bu bilgi, psql’de \db ile de alınabilir.