Dockerize edilmiş PostgreSQL veritabanını yedekleme
Tags: postgres, linux, devops
Published: 2022-11-17 08:22:42

_**PostgreSQL**_
Bir PostgreSQL veritabanını yedeklemek ve geri yüklemek, herhangi bir sistem yöneticisi için önemli bir görevdir. Bu görevi kolaylaştıran psql yardımcı programları pg_dump ve pg_restore sayesinde bu işlem çok kısa bir sürede hallolabiliyor.


Bu yardımcı programları kullanarak sistem yöneticileri, yerel olarak veya uzaktan sürekli bir yedekleme oluşturabilir.

PostgreSQL, yaygın olarak kullanılan ilişkisel bir veritabanı sistemidir. Açık kaynaklıdır ve görevleri hızlı bir şekilde gerçekleştirmek için çok çeşitli araçlar sunar.

**pg_dump**
pg_dumpbir PostgreSQL veritabanını komutudur. Veritabanını bir komut dosyasına veya başka bir arşiv dosyasına çıkarır. Bu yardımcı program veritabanlarını yedeklemek içindir. Yardımcı program, veritabanı aynı anda kullanılıyor olsa bile tutarlı yedeklemeler yapar. Okuyucular, yazarlar ve diğer kullanıcılar veritabanını kullanırken engellenmeyecektir pg_dump.

**pg_restore**
pg_restore — pg_dump tarafından oluşturulan bir arşiv dosyasından bir PostgreSQL veritabanını geri yüklemeye yarayan psql yardımcı programıdır. İki kodunda detaylı kullanımı aşağıdaki kodlarda gösterilmiştir.

NOT: Aşağıdaki kodlar docker container ile yedekleme işlemi için değildir.

`pg_dump [connection-option…] [option…] [dbname]`

_pg_dump örnekleri:_

```
# testdb veritabanını sql biçiminde kaydetmek
pg_dump testdb > db.sql

# testdb veri tabanını tar biçiminde yedeklemek
pg_dump -U postgres -F c testdb > testdb.tar

# testdb veri tabanını bir dizin biçiminde yedeklemek
pg_dump -U postgres -F d testdb > db1_backup
```

_pg_restore örnekleri_

`pg_restore -U postgres -Ft -d db < db.tar`


_pg_dumpall örnekleri:_

```
# dumpall tüm veritabanını yedekliyecektir.
pg_dumpall -f dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

#dump_date kullanımında cihazın tarih ve saat bilgilerini alarak dosya ismi olarak atar bu sayede karışıklılık olmadan yedekleme işlemini gerçekleştirebilirsiniz
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7orhg8yjv4xojdwl4z7i.png)

PostgreSQL veritabanını Docker tarafında yedeğini almanın bir çok yolu vardır. Bu yazıda en az uğraştırıcı olan ve ilerde otomatik bir şekilde günlük yedek almak istersenin kullanabileceğiz kodları paylaşacağım. Otomatik günlük veritabanı yedeği içinde bir çok yol bulunmaktadır. Yine en basit yöntem olarak yazacağınız script için cron job oluşturabilirsiniz. Bu yazıda Backup almak için bir bash dosyasıda kullanacağız.

_Docker ile psql yedeği alma ve yedeği yükleme:_

```
# pg_dumpall (yedeği alma)
# container name postgreSQL container ismidir. container ismini öğrenmek için:
# docker images komutunu kullanabilirsiniz.
docker exec -t container_Name pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

# pg_restore (veri tabanı yedeği yükleme)
cat dump.sql | docker exec -i container_Name psql -U postgres
```
Restore işlemi CLI tarafında yazdığımız kodlardan biraz farklı bununsebebi Docker.

_Bash dosyası:_

```
#! /usr/bin/env bash
CONTAINER_NAME=PostgreSQLContainerName
# pg_dumpall için database ismi gerekmiyor 
DATABASE_NAME=Your_db

if [ -z $CONTAINER_NAME ]
then
echo "Usage: $0 [container name] [database name]"
exit 1
fi

if [ -z $DATABASE_NAME ]
then
echo "Usage: $0 [container name] [database name]"
exit 1
fi

set -e
set -o pipefail

# backups yedek klasörünü oluşturma 
mkdir -p "./backups"

cd backups

# PostgreSQL veri tabanı yedeği oluşturma 
# bu satırda pg_dump kullanıp istediğiniz veri tabanın yedekleyebilirsiniz
docker exec -t "$CONTAINER_NAME" pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

echo ""
echo "Exporting file from container..."
echo "Done!"
```