Files
dj52/RESTORE_DUZELTME.md
Beyhan Oğur ec28a2024d first commit
2026-04-26 22:22:29 +03:00

6.7 KiB
Raw Permalink Blame History

🔄 Restore İşlemi Düzeltildi - UYARI! ⚠️

Eski Sorun

Restore işlemi mevcut veritabanına eklemeye çalışıyordu, bu yüzden:

  • "relation already exists" hataları
  • "duplicate key value" hataları
  • "syntax error at or near order" hatası
  • Veriler restore olmuyordu

Yeni Çözüm

Restore işlemi şimdi şu şekilde çalışıyor:

1. Veritabanını Tamamen Siler

DROP DATABASE IF EXISTS "your_db";
CREATE DATABASE "your_db";

2. Temiz Veritabanına Restore Eder

  • Tüm tablolar yeniden oluşturulur
  • Tüm veriler temiz şekilde eklenir
  • Hiçbir "already exists" hatası olmaz

3. Syntax Hatalarını Düzeltir

# "order" reserved keyword hatası düzeltilir
order INTEGER NOT NULL    "order" INTEGER NOT NULL

⚠️ ÖNEMLİ UYARILAR

🚨 RESTORE İŞLEMİ MEVCUTVERİLERİ SİLER!

Restore yapmadan önce:

  1. Mevcut veritabanınızdan yedek alın
  2. Yedeği indirin ve güvenli bir yerde saklayın
  3. Restore edeceğiniz SQL dosyasının doğru olduğundan emin olun
  4. Test ortamında deneyip sonra production'da yapın

📋 Restore İşlemi Nasıl Çalışır?

1. PostgreSQL'e 'postgres' veritabanı ile bağlan
2. Hedef veritabanındaki tüm bağlantıları kes
3. Hedef veritabanını sil (DROP DATABASE)
4. Yeni boş veritabanı oluştur (CREATE DATABASE)
5. Yeni veritabanına bağlan
6. SQL dosyasını çalıştır
7. Tüm tabloları ve verileri oluştur

🚀 Kullanım

Admin Panelden Restore

  1. Yedek al (güvenlik için):

    Admin Panel → Database backups → 🔄 Yeni Yedek Al
    
  2. Restore edilecek yedeği seç:

    Checkbox ile yedeği seç
    
  3. Restore et:

    Actions → "Seçili Yedeği Geri Yükle" → Go
    
  4. Onay:

    ⚠️ "Mevcut veriler silinecek, emin misiniz?" mesajını kabul et
    
  5. Bekle:

    Restore işlemi birkaç saniye sürebilir
    Django'nun yeniden başlamasını bekle
    
  6. Test et:

    Admin panelde verileri kontrol et
    

🐛 Düzeltilen Hatalar

1. "relation already exists" Hatası

Eski: Mevcut tablolar üzerine CREATE TABLE çalıştırılıyordu Yeni: Veritabanı tamamen silinip yeniden oluşturuluyor

2. "duplicate key value" Hatası

Eski: Mevcut kayıtlar üzerine INSERT yapılıyordu Yeni: Temiz veritabanına kayıtlar ekleniyor

3. "syntax error at or near order" Hatası

Eski: order reserved keyword olarak kullanılıyordu Yeni: Otomatik olarak "order" şeklinde escape ediliyor

sql_content = sql_content.replace(
    '    order INTEGER NOT NULL,',
    '    "order" INTEGER NOT NULL,'
)

📊 Restore Süreci

┌─────────────────────────────────────────┐
│ 1. Yedek dosyası okunuyor...           │
├─────────────────────────────────────────┤
│ 2. PostgreSQL'e bağlanılıyor...        │
├─────────────────────────────────────────┤
│ 3. Mevcut bağlantılar kesiliyor...     │
│    pg_terminate_backend()               │
├─────────────────────────────────────────┤
│ 4. Veritabanı siliniyor...             │
│    DROP DATABASE                        │
├─────────────────────────────────────────┤
│ 5. Yeni veritabanı oluşturuluyor...    │
│    CREATE DATABASE                      │
├─────────────────────────────────────────┤
│ 6. SQL dosyası çalıştırılıyor...       │
│    - Tablolar oluşturuluyor             │
│    - Veriler ekleniyor                  │
│    - Sequence'ler ayarlanıyor           │
├─────────────────────────────────────────┤
│ 7. Tamamlandı! ✅                       │
└─────────────────────────────────────────┘

🔒 Güvenlik Önlemleri

Otomatik Önlemler

  • Mevcut bağlantılar otomatik kapatılır
  • SQL injection koruması var
  • Sadece admin/staff kullanıcıları restore yapabilir
  • Hata durumunda işlem geri alınır

Manuel Önlemler

  • ⚠️ ÖNEMLİ: Production'da restore yapmadan önce yedek alın!
  • ⚠️ Restore işlemi sırasında kimse veritabanını kullanmamalı
  • ⚠️ Test ortamında deneyin
  • ⚠️ Yedek dosyasının doğru olduğundan emin olun

📝 Test Senaryosu

Senaryo: Production'dan Test'e Restore

# 1. Production'da yedek al
Admin Panel → Yeni Yedek Al → İndir

# 2. Test sunucusuna yükle
Admin Panel → Yedek Yükle → dosya seç → Yükle

# 3. Test sunucusunda restore et
Yedeği seç → Actions → Geri Yükle

# 4. Kontrol et
Verileri kontrol et
Test et

# 5. Başarılıysa production'da kullan

🆘 Sorun Giderme

Restore başarısız oluyor

# Hata logunu kontrol et
Terminal'de Django çıktısına bak

# PostgreSQL logunu kontrol et
sudo tail -f /var/log/postgresql/postgresql-*.log

"Cannot drop database because it is being accessed" Hatası

# Çözüm: Kod zaten mevcut bağlantıları kesiyor
# Eğer yine hata alıyorsanız, manuel kes:
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'your_db';

Restore sonrası Django çalışmıyor

# Django'yu yeniden başlat
Ctrl+C (sunucuyu durdur)
python manage.py runserver

# Migration'ları kontrol et
python manage.py showmigrations

Veriler restore olmadı

# SQL dosyasını kontrol et
head -50 backups/your_backup.sql

# Dosya boyutunu kontrol et
ls -lh backups/your_backup.sql

# Manuel restore dene (PostgreSQL)
psql -U user -d dbname -f backups/your_backup.sql

Başarı Kontrol Listesi

Restore işleminden sonra kontrol edin:

  • Tüm tablolar oluşturuldu mu?
  • Kullanıcılar mevcut mu?
  • Admin panele giriş yapabilir misiniz?
  • Veriler doğru mu?
  • İlişkiler (foreign keys) çalışıyor mu?
  • Sequence'ler doğru mu? (yeni kayıt ekleyebiliyor musunuz?)

🎯 Sonuç

Artık restore işlemi düzgün çalışıyor:

  • Mevcut veritabanı temizleniyor
  • Yedek dosyası restore ediliyor
  • Syntax hataları düzeltiliyor
  • Hiçbir "already exists" hatası yok

Ancak dikkatli olun: Restore işlemi mevcut tüm verileri siler!