mysql (php üzerinden toplu yük) yinelenen girişi olduğunda giriş hatası yinelenen

5 Cevap php

i mysql kullanıyorum (5.0.32-Debian_7etch6-log) ve ben aşağıdakileri yapar (PDO Zend_Db'nin (1.5.1) kullanılarak) bir gece çalışan toplu yükleme php (5.2.6) komut dosyası var:

  1. 4 'import' tablolar seti kesiliyor
  2. Toplu ekleme bu 4 'ithalat' tablo içine veri (yenkimliken kullanarak bu doğru, bir sorun olmamalı yani, daha önce de tablolar olmuştur, ama tüm tablo kesilmiş var kimlikleri?)
  3. Her şey iyi gkimlikerse, 'canlı' ve ardından 'geçici' (eski 'canlı') tabloları 'ithal' tabloları, 'temp' için 'canlı' tabloları yenkimliken adlandırmak 'ithal' etmek

Bu hafta için çok çalıştı. şimdi ben içerim yerde bütün toplu yükleme işleminin ortasında, bu alıyorum:

Sqlstate [23000]: Bütünlük kısıtlaması ihlali: 1 tuşu için 1062 Duplicate entry '911 '

(mind you that this is not the first kimlik that has been in the table before the truncation already.) when i just start the script manually again, it works like a charm. any kimlikeas? leftover indexes, something to do with the renaming maybe?

Buna ek olarak: i sonradan kimliği 911 ile giriş tablosunu kontrol ederken, bu bile orada değil.

5 Cevap

MyISAM tablo bozuk olduğunda, bu gibi hatalar oluşabilir. Söz konusu masaya tamir komutu çalıştıran genellikle bunu düzeltmek için 'gerekli hepsi bu:

> repair table mytablename;

InnoDB çok daha fazla kurşun ve Paul doğru işaret ettiği gibi, sen MyISAM InnoDB tablolar üzerinde işlemler kullanmak olamaz, ama - daha iyi bir çözüm verileri sürekli değişiyor tablolar için MyISAM kullanmak değildir.

Bu arada, ben anında tabloları yeniden adlandırma önleyeceğini - bir düzenli olarak yapıyor olması oldukça aksak bir şey, ve yeniden adlandırma devam ederken hiç sistemdeki diğer kullanıcılar varsa, bazı çok beklenmedik sonuçlara neden olabilir. Neden sadece böyle bir şey yapamaz:

> truncate table temptable;
> truncate table importtable;

> #bulk insert new data
> insert into importtable(col1,col2,col3) 
> values(1,2,3),(4,5,6),(7,8,9);

> #now archive the live data
> insert into temptable(col1,col2,col3)
> select col1,col2,col3 from livetable;

> #finally copy the new data to live
> truncate table livetable;
> insert into livetable(col1,col2,col3)
> select col1,col2,col3 from importtable;

Eğer satır, çok sayıda ekleme varsa tabii ki o riski ekleme tamamlamak için alır gibi canlı verilerin tümünü sürece kullanılamaz, ama genel olarak bu yaklaşım çok daha az yıkıcı indeksler, tetikleyiciler veya başka bir şey olduğunu olurdu bu, söz konusu tablo ile bağlantılı olabilir.

de, bütün gün bu meşgul olmuştur.

görünüşte bazı kilit sorunlar ya da bir şey vardı, ben bir paralel bağlantı olarak etkilenen ve ilgili tablolar 'SELECT' ifadeleri vurarak davranışı yeniden başardı.

şimdi ben bunun yerine 'kesilemiyor' ve 'DELETE FROM' kullanılmış ve ifadeleri 'zzz İÇİN ALTER TABLO xxx RENAME' tek bir grup (i 3 kez her anda yeniden adlandırır yaptım) 'TABLO RENAME' ifadeleri değişti ve yeniden olamaz daha fazla hata.

bu nedenle bu çözülebilir. belki başkası araştırma ve deneme-yanılma bir sürü geçirdi benim gün kar elde edebilirsiniz.

Ithalat komut çalışırken diğer bazı komut veritabanına ekleme olabilir mi?

Eğer gerçekten bir kopyasını ekleme olup olmadığını görmek için sorgu günlük etkinleştirme denediniz mi?

Eğer test ortamında üretebileceği? Üretimde sorgu günlüğünü etkinleştirmek etmeyin.

Bu sorun orijinal olup olmadığını tablo bozulmuş olması mümkündür; Bu şeyler bir dizi neden olabilir, ancak tehlikeli donanım ya da elektrik kesintisi olasılık vardır.

Son zamanlarda ya döneminde herhangi bir sorun (veya çöktü) sahip olup olmadığını görmek için mysql günlüğünü denetleyin.

Yine, ben önerebilirsiniz tüm test ortamında yeniden deneyin. Test veri çok büyük yükler oluşturabilir ve bunları tekrar tekrar yükleyin.

Eğer işlemleri kullanıyor musunuz? Bunu tabloları kilitlemek veya seri için işlem yalıtım modunu ayarlamak da mümkün, özellikle eğer işlemleri ile sorunların bu tür bir sürü ortadan kaldırabilir. Ben MySQL üzerinde bu gerçekten aşina değilim, ama işlemler sadece InnoDB tabloları üzerinde çalışmak (ya da eski bilgi olabilir) inanıyoruz.