233 lines
6.7 KiB
Markdown
233 lines
6.7 KiB
Markdown
# 🔄 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
|
||
```sql
|
||
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
|
||
```python
|
||
# "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
|
||
|
||
```python
|
||
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
|
||
|
||
```bash
|
||
# 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
|
||
```bash
|
||
# 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ı
|
||
```bash
|
||
# Çö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
|
||
```bash
|
||
# Django'yu yeniden başlat
|
||
Ctrl+C (sunucuyu durdur)
|
||
python manage.py runserver
|
||
|
||
# Migration'ları kontrol et
|
||
python manage.py showmigrations
|
||
```
|
||
|
||
### Veriler restore olmadı
|
||
```bash
|
||
# 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!
|
||
|