6.7 KiB
6.7 KiB
🔄 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:
- ✅ Mevcut veritabanınızdan yedek alın
- ✅ Yedeği indirin ve güvenli bir yerde saklayın
- ✅ Restore edeceğiniz SQL dosyasının doğru olduğundan emin olun
- ✅ 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
-
Yedek al (güvenlik için):
Admin Panel → Database backups → 🔄 Yeni Yedek Al -
Restore edilecek yedeği seç:
Checkbox ile yedeği seç -
Restore et:
Actions → "Seçili Yedeği Geri Yükle" → Go -
Onay:
⚠️ "Mevcut veriler silinecek, emin misiniz?" mesajını kabul et -
Bekle:
Restore işlemi birkaç saniye sürebilir Django'nun yeniden başlamasını bekle -
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!