# PostgreSQL uyumlu veritabanları

> QueryProxy'nin hedef veritabanı olarak test edildiği PostgreSQL uyumlu sistemler (CockroachDB, YugabyteDB) ve her birinin PostgreSQL'den ayrıldığı yerler.

- Dokümantasyon: Referans
- Kaynak: https://queryproxy.com/tr/docs/uyumluluk/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
QueryProxy PostgreSQL ile `pgsql` sürücüsü üzerinden konuşur. PostgreSQL
protokolünü konuşan bir sistem **PostgreSQL** sürücüsüyle bağlantı olarak
eklenebilir; ama her biri uygulamanın dayandığı noktalarda PostgreSQL'den ayrılır:
çalışan bir ifadenin nasıl durdurulduğu, salt okunur kipin nasıl çalıştığı, kilit
bekleyişlerinin nasıl zaman aşımına uğradığı. Bu sayfa nelerin test edildiğini ve
nelerin farklı olduğunun bilindiğini listeler.

"CI'da test edildi", entegrasyon testlerinin o sistemin gerçek bir sunucusuna
karşı her pull request'te çalıştığı anlamına gelir. "Test edilmedi", ona karşı
hiçbir şey çalıştırılmadığı demektir: çalışabilir, ama burada hiçbir söz yoktur.

## Durum

| Sistem | Test edilen sürüm | Durum |
| :-- | :-- | :-- |
| CockroachDB | v25.4.19 | CI'da test edildi, bilinen farklarla |
| YugabyteDB | 2025.2.8.0-b60 (PostgreSQL 15.12-YB) | CI'da test edildi, bilinen farklarla |
| Aurora PostgreSQL | yok | Test edilmedi |
| Neon | yok | Test edilmedi |
| Supabase | yok | Test edilmedi |

Bunlar yalnızca **hedef veritabanlarıdır**. Uygulamanın kendi veritabanı SQLite,
MySQL, MariaDB, PostgreSQL ya da SQL Server olarak kalır; CockroachDB ve
YugabyteDB uygulama veritabanı olarak desteklenmez.

Testler salt okunur zorlamayı, ifade ve kilit zaman aşımlarını, çalışan bir
ifadenin durdurulmasını, büyük sonuçların akıtılmasını ve zorunlu TLS'i kapsar.
Her sistemin durumu:

| Davranış | CockroachDB | YugabyteDB |
| :-- | :-- | :-- |
| Veritabanı okuma taleplerinde yazmayı ve DDL'i reddeder | Evet ([salt okunur kip](#cockroachdb)) | Evet |
| SQL koruması sistemin kendi ifadelerini tanır | **Hayır**, yalnızca PostgreSQL lehçesi ([SQL koruması](#cockroachdb)) | PostgreSQL lehçesi; YugabyteDB'ye özgü ifadeler gözden geçirilmedi |
| İfade zaman aşımı uzun bir okumayı ya da yazmayı keser | Evet | Evet |
| Kilit zaman aşımı satır kilidi beklemesini keser | Evet | **Hayır** ([kilit bekleyişleri](#yugabytedb)) |
| Durdurma çalışan bir yazmayı bitirir | Evet | Evet |
| Durdurma çalışan bir okumayı bitirir | **Hayır**, ifade zaman aşımı bitirir | Evet |
| Büyük sonuçlar akıtılır (sunucu tarafı imleç) | Evet | Evet |
| Zorunlu TLS TLS'siz sunucuyu reddeder; CA doğrulaması | Evet | Test edilmedi |
| Bağlantı testi oturumu şifreli olarak bildirir | "Bilinmiyor" bildirir | Test edilmedi |

## CockroachDB

Bağlantıyı **PostgreSQL** sürücüsüyle, `26257` portuyla (SQL portu) ve veritabanı
adıyla ekleyin. TLS ve parola girişleri olan güvenli bir küme kullanın. Güvensiz
bir düğüm (`--insecure`) parola kabul etmez ve TLS sunmaz; bu yüzden yeni
bağlantıların TLS gereksinimini karşılayamaz ve salt okunur bir giriş taşıyamaz.

Bilinen farklar:

- **İfadeyi durdurma.** CockroachDB'de `pg_cancel_backend` yoktur. QueryProxy
  süreç numarasının yanına oturum kimliğini (`SHOW session_id`) kaydeder ve ifadeyi
  `CANCEL QUERIES SELECT query_id FROM [SHOW CLUSTER STATEMENTS] WHERE session_id = ...`
  ile durdurur. Oturum, PostgreSQL'deki gibi kalır. Girişin kendi ifadelerini
  görebilmesi gerekir (her giriş görebilir) ve düğümler birbirine duyurdukları
  adresten ulaşabilmelidir: `0.0.0.0` duyuran bir düğüm `SHOW CLUSTER STATEMENTS`
  çıktısını boş döndürür ve durdurma iletilmez.
- **Okumayı durdurma.** Okuma talebi sunucu tarafı bir imleçle
  (`DECLARE ... CURSOR`) çalışır. CockroachDB imlecin sorgusunu tanımlandığında
  değerlendirir ve bu bitene kadar `CANCEL QUERIES` ile `CANCEL SESSION`'ı yok
  sayar. *Stop* talebi hemen iptal edilmiş olarak işaretler; ama ifade, bitene ya
  da veritabanı tarafındaki ifade zaman aşımı kesene kadar çalışmaya devam eder.
  QueryProxy her zaman bir tane ayarlar: yürütme zaman aşımı eksi 5 saniye.
  Durdurulan bir yazma hemen kesilir.
- **Salt okunur kip.** CockroachDB bir DDL ifadesinden önce açık işlemi commit
  eder (`autocommit_before_ddl` ayarı), MySQL gibi; bu yüzden tek başına
  `READ ONLY` bir işlem DDL'e geçit verirdi. QueryProxy bu yüzden CockroachDB'de
  `default_transaction_read_only`'yi tüm oturum için de ayarlar; sunucu bir okuma
  talebinde DDL'i ve veri değişikliğini reddeder. PostgreSQL'den farklı olarak
  CockroachDB, bir ifadenin kendi işlemini yeniden okuma-yazmaya çevirmesine izin
  verir (`SELECT set_config('transaction_read_only', 'off', false)` ya da
  `SET transaction_read_only = off`). SQL koruması bu ifadeleri okuma
  taleplerinde reddeder, ama veritabanı reddetmezdi. Veritabanı tarafında garanti
  için bağlantıya salt okunur bir giriş tanımlayın.
- **SQL koruması.** Korumanın yasak listeleri PostgreSQL lehçesi için yazılmıştır
  ve yalnızca CockroachDB'de var olan ifadeleri tanımaz. Şunlar korumadan sıradan
  yazma olarak, `crdb_internal.force_panic` gibi `crdb_internal.*` fonksiyonları
  ise okuma olarak geçer: `CANCEL QUERY` ve `CANCEL SESSION` (ve çoğul biçimleri),
  `SET CLUSTER SETTING`, `EXPORT`, `IMPORT`, `BACKUP` ve `RESTORE`. PostgreSQL'deki
  karşılıkları, örneğin `pg_cancel_backend` ve `ALTER SYSTEM`, reddedilir.
  CockroachDB'de bunlara karşı güvence SQL koruması değil, girişin kendisidir: işi
  gören en az yetkili girişle bağlanın; `admin` rolünün **üyesi olmasın**,
  `CANCELQUERY` ve `MODIFYCLUSTERSETTING` rol seçeneklerine ya da
  `EXTERNALIOIMPLICITACCESS` ayrıcalığına sahip olmasın; okuma talepleri için
  ayrıca salt okunur bir giriş ekleyin. Korumayı CockroachDB lehçesine
  genişletmek 0.4.1'in kapsamında değildir.
- **TLS durumu.** CockroachDB'de `pg_stat_ssl` boştur; bu yüzden bağlantı testi
  oturumun şifrelemesini evet ya da hayır yerine bilinmiyor olarak bildirir. TLS
  gereksinimi kendisi çalışır: TLS'siz bir düğüme `require` bağlantı başarısız
  olur ve sertifika doğrulaması (CA ile `verify-full`) çalışır.
- **Yalıtım.** CockroachDB işlemleri `SERIALIZABLE` düzeyinde çalıştırır. Bir ifade
  yeniden denenebilir bir hatayla (SQLSTATE `40001`) başarısız olabilir.
  QueryProxy bunu talebin hatası olarak bildirir ve yeniden denemez.

## YugabyteDB

Bağlantıyı **PostgreSQL** sürücüsüyle, `5433` portuyla (YSQL) ve veritabanı
adıyla ekleyin. Oturum kimlikleri, `pg_cancel_backend`, `pg_stat_activity`,
`pg_stat_ssl`, salt okunur işlemler ve sunucu tarafı imleçler PostgreSQL'deki gibi
davranır; bu yüzden ifadeyi durdurma, salt okunur kip, ifade zaman aşımı ve
akıtma özel bir işlem gerektirmez.

Bilinen farklar:

- **Kilit bekleyişleri.** Bir ifade başka bir işlemin tuttuğu satır kilidini
  beklerken `lock_timeout` uygulanmaz (2025.2.8.0'da, varsayılan olan bekleme
  kuyruklarıyla gözlendi). Bekleyiş bunun yerine ifade zaman aşımında biter. Bir
  işlem dışında çalışan ve bu bekleyiş sırasında ifade zaman aşımınca kesilen tek
  bir `UPDATE`, diğer işlem bıraktığında **yine de uygulanabilir**; oysa talep
  başarısız bildirilir. İşlem içinde geri alınır. Başka oturumların kilitlediği
  satırlar için kilit zaman aşımına ya da başarısız bir yazmanın "hiçbir şey
  değişmedi" anlamına geldiğine güvenmeyin.
- **TLS.** Test edilmedi: test sunucusu istemci-sunucu şifrelemesi olmadan çalışır.

## Test edilmeyenler

Aurora PostgreSQL, Neon ve Supabase PostgreSQL protokolünü konuşur ve yukarıdaki
özelliklerde PostgreSQL gibi davranmaları beklenir; ama hiçbirine karşı bir şey
çalıştırılmamıştır. Neon'un havuzlu uç noktası ve Supabase'in havuzlayıcısı gibi,
işlem kipindeki bağlantı havuzlayıcıları; işlem dışındaki ifade zaman aşımı gibi
oturum düzeyi ayarlar ve ifadeyi durdurmak için kullanılan süreç numarası için
bilinen bir risktir.

## Sonraki adımlar

- Korumanın neyi neden reddettiği için [SQL korumaları](/tr/docs/sql-korumalari/).
- Zaman aşımları, hedef veritabanlarına TLS ve okuma kimlik bilgileri için [Yapılandırma](/tr/docs/yapilandirma/).
- Veritabanı tarafı ayarların neyi tutmayı amaçladığı için [Tehdit modeli](/tr/docs/tehdit-modeli/).
