first commit
This commit is contained in:
232
RESTORE_DUZELTME.md
Normal file
232
RESTORE_DUZELTME.md
Normal file
@@ -0,0 +1,232 @@
|
||||
# 🔄 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!
|
||||
|
||||
Reference in New Issue
Block a user