INSERT ile mysqldump… ÇİFTLİ


21

Verileri bir veritabanından diğerine birleştirmek istiyorum. Böylece dökümü oluşturmak mysqldumpve daha sonra başka bir veritabanına (aynı tablo yapısı ile) almak. Bu durumda herhangi bir problemim yok (çift girişler veya başka bir şey gibi).

Ancak test amaçlı bazı birleştirmeler yaptım ve daha sonra son birleştirmeyi yapacağım. Bu yüzden, birleştirme işlemini (veriler değişebilir) birkaç kez yürütmek istiyorum. Dikkat edin, tablolarımdaki satırlarım asla silinmez, yalnızca eklenebilir veya güncellenebilir.

ON DUPLICATE seçeneğiyle mysqldump oluşturabilir miyim? Veya yeni veri ekleyen ve değiştirilen verileri güncelleyen dökümü birleştirebilir miyim?

Elbette, ON DUPLICATEdökümü manuel olarak ekleyebilirim , ancak birleştirme işlemini otomatikleştirmek istiyorum.

Yanıtlar:


34

Bu konuda size yardımcı olacak seçenekler var:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

Bu paradigmayı göz önünde bulundurun

  • mysqldump DB1 DUMP1 içine her şeyi
  • DUMP1'i DB3’e yükleyin
  • mysqldump, DB2'den --replace (veya --insert-ignore) ve --no-create-info kullanarak DUMP2'ye
  • DUMP2’yi DB3’e yükleyin

1
Bir dakika bekleyin: --replace komutunun kullanılması DB2 verilerinin DB1 verilerinin üzerine yazılacağı ve --insert-ignore komutunun kullanılması DB1 verilerinin geçerli olduğu anlamına gelir. Soru nasıl sormak gibi görünüyor GÜNCELLEME yinelenen anahtarlar durumunda. Her halükarda bilmek istiyorum.
Edward Newell

@EdwardNewell Lütfen her sütunda --replaceyapmaya eşdeğer olduğunu unutmayın ON DUPLICATE UPDATE. Ne yazık ki, mysqldump, mysqldump'ın toplu yükleme ve boşaltma yapısından dolayı belirli sütunları güncellemek için tasarlanmamıştır. Cevabım, mysqldump'ın neler yapabileceğini ortaya koyuyor. Bunu yapmak için mysqldump dışında özel kod yazmanız gerekir ON DUPLICATE UPDATE.
RolandoMySQLDBA

DB1 ve 2 tamamen aynı şemaya sahip olduğu sürece haklısınız. Ancak DB1'in fazladan alanları olduğunu varsayalım. Ardından --replace, fazladan alanların yalnızca paylaşılan alanları güncellemek yerine varsayılanlara (veya varsayılan olmadığında bir hataya) dönmesine neden olur. Ben OP'ın durum aynı şemaları ile iki veritabanları için olduğunun farkındayız, ama sadece orada olduğuna işaret ederek olduğunu fark ve bazı durumlarda gerçek bir güncelleme tipi dökümü olması faydalı olacaktır (biri şimdi yüzleşiyorum!)
Edward Newell

1
Güncelleştirilen kayda işaret eden yabancı anahtarlar varsa REPLACE INTO, kaydın bu ilişkileri kesmekle silinemediğinden kullanmanın başarısız olabileceğini unutmayın. Varsa ON DELETE CASCADE, güncellenmekte olan tabloya bağlı olan tabloları boşaltırsınız. REPLACE INTOoldukça tehlikeli bir operasyon.
Christopher Schultz,

1
@RolandoMySQLDBA Anlaşıldı. Sadece bu cevabı okuyan herkesin bu seçeneklerin (özellikle REPLACE INTO) tehlikeli olabileceğini ve "şaşırtıcı" etkilere sahip olabileceğini anlayabilmesi için yorum yapmak istedim . İyi cevap - sadece bir uyarı eklemek istedim.
Christopher Schultz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.