Hazırlayan: [kazakherif]
Tarih: 2026-10-15
Amaç: İlişkisel ve NoSQL veritabanı sistemlerinin yönetimi, performans optimizasyonu, yedekleme stratejileri ve sorun giderme adımları.
Verilerin elektronik ortamda düzenli bir şekilde depolanmasını, yönetilmesini ve hızlıca erişilmesini sağlayan sistemlerdir.
Verileri tablolar halinde (satır ve sütunlar) tutan ve tablolar arasında mantıksal ilişkiler kuran sistemlerdir (MySQL, PostgreSQL, Oracle).
Esnek veri modelleri kullanan, doküman (MongoDB), anahtar-değer (Redis) veya grafik tabanlı çalışabilen yüksek performanslı veritabanlarıdır.
İlişkisel veritabanlarında veri bütünlüğünü garanti eden 4 temel özelliktir: Atomicity (Bölünemezlik), Consistency (Tutarlılık), Isolation (İzolasyon), Durability (Kalıcılık).
Kitaplardaki içindekiler bölümü gibi çalışarak, veritabanında aranan kaydın tüm tabloyu taramadan (Table Scan) çok hızlı bulunmasını sağlayan veri yapısıdır.
Bir tablodaki her bir kaydı benzersiz (unique) olarak tanımlayan sütundur. (Örn: TC Kimlik No, Kullanıcı ID).
İki tablo arasında ilişki kurmak için kullanılan ve başka bir tablonun Primary Key'ine referans veren sütundur.
Veri tekrarını (redundancy) önlemek ve veri bütünlüğünü artırmak için veritabanı tablolarının belirli kurallara (1NF, 2NF, 3NF) göre tasarlanması işlemidir.
Karmaşık SQL sorgularının sonucunu, sanki fiziksel bir tabloymuş gibi saklayan ve çağırmayı kolaylaştıran sanal tablolardır.
Veritabanı sunucusunda derlenip saklanan ve dışarıdan parametre alarak karmaşık işlemleri (iş mantığını) hızlıca gerçekleştiren SQL kod bloklarıdır.
Linux sistemlerde MySQL/MariaDB servisinin çalışıp çalışmadığını kontrol eder.
sudo systemctl status mysql
MySQL sunucusuna terminal üzerinden root kullanıcısı ile bağlanmayı sağlar.
mysql -u root -p
Sunucu üzerindeki mevcut tüm veritabanı isimlerini gösterir.
SHOW DATABASES;
İşlem yapılacak veritabanını seçer ve içindeki tabloları listeler.
USE sirket_db;
SHOW TABLES;
Türkçe karakter desteği (utf8mb4) ile düzgün bir şekilde yeni veritabanı yaratır.
CREATE DATABASE sirket_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Sadece belirli bir IP'den veya localhost'tan bağlanabilecek yeni bir kullanıcı hesabı açar.
CREATE USER 'yeni_kullanici'@'localhost' IDENTIFIED BY 'GucluSifre123!';
Oluşturulan kullanıcıya belirli bir veritabanı üzerinde tam yetki (ALL PRIVILEGES) atar.
GRANT ALL PRIVILEGES ON sirket_db.* TO 'yeni_kullanici'@'localhost';
FLUSH PRIVILEGES;
Bir tablodaki sütunları, veri tiplerini ve index durumlarını listeler.
DESCRIBE kullanicilar;
O an veritabanını yoran, kilitlenen veya uzun süren sorguları ve PID'lerini gösterir.
SHOW FULL PROCESSLIST;
Processlist'ten alınan ID numarası ile sistemi yoran bir sorguyu zorla iptal eder.
KILL 12345;
PostgreSQL veritabanı servisinin çalışma durumunu Linux üzerinde sorgular.
sudo systemctl status postgresql
Varsayılan postgres kullanıcısı ile komut satırı arayüzüne giriş yapar.
sudo -u postgres psql
psql arayüzünde veritabanlarını listelemek (\l) ve tabloları görmek (\dt) için kullanılan kısayollardır.
\l
\c veritabani_adi
\dt
Terminal arayüzünden hızlıca kullanıcı (rol) ve ona ait bir veritabanı oluşturur.
CREATE ROLE ahmet WITH LOGIN PASSWORD 'sifre123';
CREATE DATABASE proje_db OWNER ahmet;
Sisteme bağlı kullanıcıları, sorgu sürelerini ve durumlarını (active/idle) görüntüler.
SELECT pid, usename, state, query FROM pg_stat_activity;
Mevcut bir .sql yedek dosyasını MySQL veritabanına geri yükler.
mysql -u root -p sirket_db < yedek.sql
MySQL veritabanının tam yapısını ve verilerini bir dosyaya yedekler.
mysqldump -u root -p sirket_db > yedek.sql
PostgreSQL veritabanını sıkıştırılmış (custom format) olarak yedekler.
pg_dump -U postgres -Fc proje_db > proje_yedek.dump
Custom formatta alınmış PostgreSQL yedeğini sunucuya geri yükler.
pg_restore -U postgres -d proje_db -1 proje_yedek.dump
Sistemi yavaşlatan sorguların tespit edilmesi için (Örn: 2 saniyeden uzun sürenler) MySQL/PostgreSQL ayarlarından yavaş sorgu loglamanın açılmasıdır.
Bir SQL sorgusunun veritabanı motoru tarafından nasıl çalıştırılacağını (Hangi indexleri kullanıp kullanmadığını) analiz eder. Performans ayarlarının temelidir.
EXPLAIN SELECT * FROM kullanicilar WHERE email = 'test@test.com';
Sorguyu sadece planlamakla kalmaz, gerçekten çalıştırıp milisaniye cinsinden gerçek çalışma sürelerini ekrana basar.
EXPLAIN ANALYZE SELECT * FROM siparisler WHERE durum = 'Bekliyor';
Sorgulanan veriyi bulmak için veritabanının index kullanmadan tablodaki milyonlarca satırı tek tek okumasıdır. Sistemin en büyük düşmanıdır.
Aramaları (WHERE koşulları) hızlandırmak için en yaygın kullanılan dizin (index) türüdür.
CREATE INDEX idx_kullanici_email ON kullanicilar (email);
Birden fazla sütunu birlikte arayan (Örn: Ad ve Soyad) sorguları hızlandırmak için iki sütuna birden tek bir index atılmasıdır.
CREATE INDEX idx_ad_soyad ON personel (ad, soyad);
Yazılımların (ORM araçlarının) 1 ana sorgu atıp, çıkan 100 sonuç için veritabanına 100 ayrı sorgu daha atmasıdır. JOIN (Birleştirme) ile çözülmelidir.
Sadece 2 sütuna ihtiyaç varken SELECT * ile tablodaki 50 sütunun birden çekilmesi ağ bant genişliğini ve RAM'i felç eder. İhtiyaç olan sütunlar belirtilmelidir.
Milyonlarca veriyi tek seferde çekmek yerine (Örn: Web arayüzünde), verileri 50'şer 50'şer sayfalayarak getirme kuralıdır.
SELECT ad, soyad FROM musteriler ORDER BY id LIMIT 50 OFFSET 100;
Her istekte yeni bir veritabanı bağlantısı açıp kapatmak çok maliyetlidir. Havuz, hazırda açık bağlantılar tutarak gelen isteklere bunları tahsis eder (Örn: PgBouncer, HikariCP).
PostgreSQL için geliştirilmiş, on binlerce isteği küçük bir bağlantı havuzunda eriterek veritabanının çökmesini engelleyen hafif middleware aracıdır.
Çok sık sorgulanan ancak nadir değişen verilerin (Örn: Ülke listesi) veritabanı yerine RAM üzerinde (Redis, Memcached) tutularak veritabanı yükünün sıfırlanmasıdır.
Anahtar-değer (Key-Value) yapısıyla tüm veriyi RAM'de tuttuğu için milisaniyenin altında cevap veren, önbellek ve session yönetimi için kullanılan sistemdir.
Redis sunucusunun çalışıp çalışmadığını test eder.
redis-cli ping
# Çıktı: PONG
Yazma işlemlerinin ana (Master) sunucuya yapılıp, okuma işlemlerinin anında kopyalanan (Slave/Replica) sunuculardan yapılarak yükün dağıtılması mimarisidir.
Tablo milyarlarca satıra ulaştığında, verilerin (Örn: A-M harfi arası 1. sunucuda, N-Z arası 2. sunucuda) birden fazla fiziksel sunucuya paylaştırılmasıdır.
Yüksek erişilebilirlik (HA) için birden fazla veritabanı sunucusunun tek bir sistemmiş gibi çalışarak arıza durumunda kesintisiz devam etmesidir (Örn: Galera Cluster).
Postgres'te güncellenen veya silinen satırlar fiziksel olarak hemen silinmez ("Dead Tuples"). Vacuum, bu ölü alanları temizleyerek disk alanını geri kazandırır.
VACUUM ANALYZE tablo_adi;
Dead tuple'ların sistemi yavaşlatmasını engellemek için arka planda çalışan Autovacuum servisini sürekli açık tutmak hayati önem taşır.
Çok fazla kayıt silindiğinde oluşan disk parçalanmalarını (Defragmentation) gidererek MySQL tablosunu sıkıştırır ve hızlandırır.
OPTIMIZE TABLE siparisler;
Uygulamaların, kullanıcıdan gelen veriyi doğrudan SQL sorgusuna eklemesi sonucu oluşan zafiyettir. ORM kullanımı ve "Prepared Statements" ile çözülür.
Veritabanı sunucusunun tüm internete açık olmasını engellemek için sadece yerel ağdan (veya localhost'tan) bağlantı kabul edecek şekilde ayarlanmasıdır.
bind-address = 127.0.0.1
Postgresql'e kimin, hangi IP adresinden ve hangi doğrulama yöntemiyle (MD5, SCRAM, Trust) bağlanabileceğini belirten güvenlik ayar dosyasıdır.
Veritabanının sadece günlük yedeğini almakla kalmayıp, işlem loglarını (WAL/Binlog) saklayarak sistemin geçmişteki saniyesine geri döndürülebilmesini sağlar.
MySQL'de veritabanında yapılan tüm değişiklikleri sırasıyla kaydeden, hem replikasyon hem de PITR (Geriye dönük kurtarma) için şart olan kayıt sistemidir.
Postgresql'de veriler diske yazılmadan önce, olası bir elektrik kesintisine karşı tüm işlemlerin güvenli şekilde işlendiği log dosyalarıdır.
Veritabanı motorunun (Query Planner) en iyi yolu (index'i) seçebilmesi için tablolardaki mevcut verilerin dağılım istatistiklerini günceller.
ANALYZE musteriler;
Eski motorlarda (MyISAM) bir kayıt güncellenirken tüm tablo kilitlenirdi. Modern motorlarda (InnoDB) sadece ilgili satır kilitlenerek eşzamanlı çalışma performansı artırılır.
MySQL'in varsayılan, ACID uyumlu, Foreign Key ve satır kilitleme (Row-level locking) destekleyen modern depolama motorudur.
İki farklı sorgunun, birbirlerinin kilitlediği kaynakları (satırları) karşılıklı beklemesi sonucu sonsuz döngüye girip çakışması durumudur.
Milyonlarca satır veri yüklerken işlemi hızlandırmak için geçici olarak Foreign Key kontrollerini ve Indexlemeyi kapatma yöntemidir.
İlişkisel bir veritabanı olan Postgresql içinde NoSQL gibi esnek çalışmayı, JSON verilerini saklamayı ve indekslemeyi (JSONB) sağlayan mükemmel veri tipidir.
Sunucunun RAM'i bittiğinde Linux işletim sisteminin MySQL servisini zorla öldürmesidir. Genellikle innodb_buffer_pool_size yanlış ayarlandığında yaşanır.
dmesg | grep -i 'killed process'
MySQL'in tabloları ve indexleri RAM'de önbelleğe alması için ayrılan alandır. Genellikle sunucudaki toplam fiziksel RAM'in %60-70'i olarak ayarlanmalıdır.
PostgreSQL'in kendi önbelleği için ayırdığı RAM miktarıdır. Genellikle toplam RAM'in %25'i olarak ayarlanması tavsiye edilir (Çünkü Postgres OS cache'i de kullanır).
Sıralama (ORDER BY) ve karma işlemleri (Hash joins) için her bağlantıya atanan bellek miktarıdır. Düşükse sorgular yavaşlar, yüksekse RAM biter (OOM).
Uygulamanın versiyonu değiştikçe veritabanındaki tabloların, sütunların kontrollü ve kod üzerinden güncellenmesi sürecidir (Flyway, Liquibase, Prisma).
Tablo yerine Koleksiyon (Collection), satır yerine JSON formatında Doküman (Document) kullanan, yatay ölçeklemeye çok uygun bir NoSQL veritabanıdır.
BSON formatında MongoDB verilerinin hızlıca yedeğini alır.
mongodump --db=proje_db --out=/yedekler/
Alınan BSON yedeklerini tekrar sunucuya yükler.
mongorestore --db=proje_db /yedekler/proje_db/
Bir uygulamaya veritabanında sadece ihtiyacı olan yetkilerin verilmesidir (Örn: Raporlama aracına sadece SELECT izni verilmeli, UPDATE izni verilmemelidir).
IoT sensör verileri veya sunucu logları gibi saniyede binlerce kez zaman damgasıyla (timestamp) gelen verileri işlemek için optimize edilmiş sistemlerdir (InfluxDB, TimescaleDB).
Yazılımcıların doğrudan SQL yazmak yerine, veritabanı tablolarını kod tarafında Nesneler (Class) olarak yönetmesini sağlayan araçlardır (Hibernate, Entity Framework, Prisma).
Bir tabloda INSERT, UPDATE veya DELETE işlemi gerçekleştiğinde otomatik olarak başka bir işlemi (Örn: Loglama) tetikleyen veritabanı kodlarıdır.
Veritabanında değişen her veriyi anlık olarak yakalayıp (Binlog/WAL üzerinden) farklı sistemlere (Elasticsearch, Kafka) senkronize eden araçlardır (Örn: Debezium).
Uygulama ile veritabanı arasındaki bağlantının ne kadar süre cevap gelmezse koparılacağını belirterek zombi bağlantıların sistemi kilitlemesini önler.
Veritabanında "ş, ğ, ç" gibi karakterlerin "?" olarak görünmesini engellemek için tablo, kolon ve bağlantı karakter setinin (utf8mb4) eşleşmesi işlemidir.
DELETE satırları tek tek siler ve işlemi loglar (yavaştır). TRUNCATE tablonun içini tamamen sıfırlar ve çok daha hızlıdır (Geri alınamaz).
Yüz milyonlarca satırlık büyük bir tabloyu fiziksel olarak aylara veya yıllara bölerek sorgu sürelerini kısaltma mimarisidir.
Veritabanları rastgele (random) I/O işlemlerini çok kullandığı için mekanik diskler (HDD) veritabanlarında kesinlikle dar boğaz yaratır, SSD/NVMe kullanılmalıdır.
Veritabanının anlık RAM kullanımı, sorgu gecikmeleri ve saniyedeki okuma/yazma hızlarının (QPS) postgres_exporter veya mysqld_exporter ile izlenmesidir.
Dağıtık bir veritabanının aynı anda Tutarlılık (Consistency), Erişilebilirlik (Availability) ve Bölünme Toleransı (Partition Tolerance) özelliklerinin en fazla ikisini garanti edebileceğini belirten kuraldır.
Veriyi tablodan DELETE ile fiziksel olarak silmek yerine, bir is_deleted = 1 veya deleted_at = tarih kolonu ekleyerek veri kaybını önleme stratejisidir.
Veritabanının maksimum kaç kullanıcıyı kaldırabileceğini görmek için (Örn: pgbench veya sysbench) sentetik sorgularla stress testi yapılmasıdır.
Ekip içinde yazılan SQL sorgularının okunabilir olması için komutların büyük harfle (SELECT, WHERE), sütunların küçük harfle yazılması kuralıdır.
Otomatik artan Integer anahtarlar hızlıdır ve az yer kaplar. UUID'ler (Rastgele stringler) ise güvenlidir, tahmin edilemez (IDOR koruması) ve dağınık sistemlerde çakışmayı önler.
Kategori-Alt Kategori gibi ağaç (Tree) yapılarını veritabanında saklarken Parent_ID yöntemi veya Ltree (PostgreSQL) uzantısının kullanılmasıdır.
"LIKE '%kelime%'" sorgusunun yavaşlığını aşmak için, uzun metin makaleleri içinde geçen kelimelerin Google mantığıyla kelime dizinlerine ayrılarak hızlı aranmasıdır.
Üretim (Production) veritabanı yedeğinin test ortamlarına alınırken şifre, email, kredi kartı gibi gerçek verilerin anlamsız verilerle değiştirilerek anonimleştirilmesidir.
Sunucunun diski fiziksel olarak çalınsa bile veritabanı dosyalarının okunamaması için disk seviyesinde şifreleme uygulanmasıdır.
Kodun sadece Oracle veya sadece MSSQL'e özgü komutlarla yazılması yerine, standart ANSI SQL kurallarına uygun yazılarak gelecekte veritabanı taşıma işlemlerinin kolaylaştırılmasıdır.
Sadece o anki bağlantı oturumu (Session) boyunca yaşayan, oturum kapandığında veritabanından otomatik silinen geçici hesaplama tablolarıdır.
Veritabanındaki işlem geçmişlerinin ve eski versiyonların sistemin performansını düşürmeden düzenli olarak temizlenmesidir.
Performans ve güvenlik ayarıdır. "1" değeri tam güvenlik (her an diske yazar), "2" değeri yüksek hız (saniyede bir diske yazar, elektrik kesintisinde 1 sn kayıp olabilir) sağlar.
Hangi sorgunun kaç kez çalıştığını, toplamda ve ortalamada ne kadar CPU süresi harcadığını listeleyen muazzam bir performans izleme uzantısıdır.
Web kullanıcısının veritabanını beklememesi için ağır rapor çekme veya toplu mail atma işlemlerinin veritabanına direkt değil, kuyruk sistemlerine (RabbitMQ/Celery) aktarılmasıdır.
Geliştiricilerin doğrudan canlı (Production) veritabanında test yapmasını engellemek için veritabanlarının fiziksel ve ağ olarak ayrılması mimarisidir.
İki veritabanının da aynı anda yazma işlemi kabul ettiği mimarilerde, aralarındaki bağlantı koparsa ikisinin de kendini "Patron" sanıp farklı veriler kaydetmesi ve verinin çürümesi (Split-Brain) sorunudur.
Yeni veritabanı versiyonuna geçerken canlı sistemi kapatmak yerine, yanında yeni bir kopya oluşturup (Green) veriyi senkronize ettikten sonra trafiği kesintisiz yenisine yönlendirme işlemidir.
Yedekleme, güncelleme, disk yönetimi gibi sistem süreçlerinin AWS (RDS), Supabase veya PlanetScale gibi bulut sağlayıcıları tarafından yönetildiği zahmetsiz veritabanı hizmetleridir.
Veritabanı yöneticisinin en önemli altın kuralı: "Alındığını sandığınız ama geri yüklenemeyen (Restore edilemeyen) yedek, yedek değildir." Düzenli olarak boş bir sunucuya restore testleri yapılmalıdır.