Merhaba,
Üzerinde 200 bin kadar dosya bulunan bir sunucum var ve bu dosyaların
değişenlerinin/eklenenlerinin günlük olarak yedeğini BAŞKA BİR SUNUCUYA
almak istiyorum. İkinci sunucu internet üzerinde, aynı network'de değil.
Bunun için gece yarısı çalışan bir cron yazdım; tüm dosyaların path,
filename, file size ve modified date bilgilerini alıp MySQL veritabanımda
bir tabloya yazıyor. Ayrıca, her ayın birinci günü TÜM dosyalar
veritabanına yazılıyor ve "master" adlı sahanın değeri 1 oluyor. Diğer
günlerde ise sadece yeni eklenmiş veya değiştirilmiş dosyaları veritabanına
kaydediyorum ve bu kayıtların master değerini 0 yapıyorum.
Diğer sunucu üzerinde ise değişen bu dosyaları indirmek için yazdığım bir
program ile veritabanına bakıyor, sadece değişen/eklenen dosyaları o güne
ait bir klasör (örnek: 2013-09-30) altına indiriyorum (FTP yapıyorum).
Günlük olarak sistemin çalışmasında her şey normal ve istediğim gibi
gidiyor.
Fakat, herhangi bir sebeple indirme programının çalışmadığı bir durum
olabilir ihtimaline karşı birinci sunucumdaki tüm dosyaları indirmek için
bir şeyler deniyorum (File modified date ve file size değişmediyse dosyayı
indirmiyorum tabi).
Bu amaçla, aşağıdaki SQL ile veritabanından son master tarihindeki tüm
dosyaları ve sonrasındakileri kayıtları alıp indirdiğimde sunucumun tam bir
yedeğini almış olabileceğim.
SELECT file_list.* FROM file_list WHERE file_list.list_date >= (select
max(file_list.list_date) from file_list where file_list.list_master=1)
Sorun da tam bu noktada çıkıyor: Bir dosya farklı günlerde modified edilmiş
olabiliyor, bunun için de veritabanına her gün kaydı düşüyor.
Örnek:
filename, flesize, filedate
a.jpg, 3654 byte, 2013-01-01 --> Master Kayıt
a.jpg, 1234 byte, 2013-01-02
a.jpg, 7591 byte, 2013-01-04
a.jpg, 3237 byte, 2013-01-05
Yukarıdaki SQL ile indirilecek dosyaların listesini aldığımda a.jpg için 4
satır geliyor ve ben aynı dosyayı 4 defa indirmek zorunda kalıyorum.
Halbuki, sadece en son satırdaki dosyayı almalıyım.
Şu SQL işimi görüyor aslında: (Yaklaşık 200 bin kayıt gelmesini bekliyorum)
SELECT *
FROM file_list
WHERE list_date >= (select max(list_date) from file_list where
list_master=1)
AND file_id IN (
SELECT max(file_id) AS file_id
FROM file_list
WHERE list_date >= (select max(list_date) from file_list where
file_list.list_master=1)
GROUP BY file_path, file_name
)
ANCAK, file_list tablomda (şu an için) 1 milyon civarında kayıt var ve bu
sorgum ne yazık ki onlarca dakika sürüyor.
Ne denediysem optimize edemedim ve alternatif bir yöntem bulamadım...
İşte, ihtiyacım bu.
Selamlar,
Nuri Akman
8 Eylül 2013 11:00 tarihinde Serdar Güler <[email protected]>yazdı:
> Merhaba,
>
> Master alanını ne için kullanıyorsunuz tam emin olamadım belki sorgunun en
> sonuna master=0 gibi bir kriter eklemek icap edebilir. Aşağıdaki sorgu
> işinizi görecektir.
>
> select * from file_list f where not exists (select 1 from file_list f2
> where f2.FilePath=f.FilePath and
> f2.FileName=f.FileName and f2.FileDate > f.FileDate ) ;
>
> Sizin yazdığınız sorgu standart şartlar altında çalışır ancak başka
> veritabanlarında group by ın böyle bir kullanımı yok, bir de
> ONLY_FULL_GROUP_BY<http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_only_full_group_by>
>
> SQL modu aktif ise yine mysql veritabanında da hata alacaksınız.
>
> Kolay gelsin.
>
> On Sep 8, 2013, at 7:12 AM, Omer Barlas wrote:
>
> Sıralamayi ID desc olarak yapmayı dener misin?
>
> Ömer Barlas
>
> Mobil bir cihazdan gönderilmiştir, imla ve anlam hataları olabilir.
> On 8 Sep 2013 02:47, "Nuri AKMAN" <[email protected]> wrote:
>
>> Arkadaşlar,
>>
>> Aşağıdaki verilerden oluşan bir tablom var:
>>
>> ID FilePath FileName FileDate Master
>> 1 YOL1 A 2013-09-01 1
>> 2 YOL1 B 2013-09-01 1
>> 3 YOL1 C 2013-09-01 1
>> 4 YOL1 A 2013-09-02 0
>> 5 YOL1 B 2013-09-01 0
>> 6 YOL1 C 2013-09-01 0
>> 7 YOL1 A 2013-09-03 0
>> 8 YOL1 B 2013-09-03 0
>> 9 YOL1 C 2013-09-04 0
>>
>>
>> *Şu sorguyu çalıştırıyorum:*
>> SELECT * FROM file_list
>> WHERE file_date >= (select max(file_date) from file_list where
>> list_master=1)
>> GROUP BY file_path, file_name
>> ORDER BY file_path, file_name, file_date
>>
>> *Gelen cevap şöyle:*
>> 1 YOL1 A 2013-09-01 1
>> 2 YOL1 B 2013-09-01 1
>> 3 YOL1 C 2013-09-01 1
>>
>> *Fakat, ben şu cevabın gelmesini istiyorum:*
>> 7 YOL1 A 2013-09-03 0
>> 8 YOL1 B 2013-09-03 0
>> 9 YOL1 C 2013-09-04 0
>>
>> Yani, FilePath ve FileName'e göre grupladıktan sonra en güncel olan dosya
>> gelsin istiyorum. (Aynı tarihte aynı dosyanın bir çok kaydı varsa, en son
>> ID'ye sahip olan gelecek)
>>
>> Bu basit sorguyu nasıl yaparım?
>>
>> Selamlar,
>> Nuri Akman
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Linux-programlama mailing list
>> [email protected]
>> https://liste.linux.org.tr/mailman/listinfo/linux-programlama
>> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>>
>> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> https://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>
>
>
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> https://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>
>
_______________________________________________
Linux-programlama mailing list
[email protected]
https://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php