Php ile ayrı veritabanlarında aynı tablolar senkronize

3 Cevap php

Ben veritabanı A MySQL tabloları bir avuç okuyup sonra Gerçekten basit bir senaryo veritabanları B ve C içine eklemek için bir PHP komut dosyası kurmak için çalışıyorum - üzerinden kopyalanan tabloları bile boşaltılması ya da sahip oldukları daha önce düşmüş olabilir bunların içine değerleri. Tüm veritabanları aynı sunucu üzerinde ve ben sadece üzerine yazmak, eski verileri korumak gerekmez.

Ben yapamam tek şey masa çoğaltma olduğunu; benim barındırma kurulum buna izin vermez.

Ben ile geldi ve SO ve başka bir yerde Burada birkaç soru ve cevapları okudum bir kaç yöntem denedi, ama ben cevap bulma değilim - Benim soru muhtemelen çok basit! Bu belki bir günde en fazla bir kez, ben elle bir cron işi veya aramak istediğiniz bir şeydir. Hatta çok etkili zorunda değildir.

Teşekkürler, ben size sunmak için olabilecek herhangi bir yardım takdir - benim arama mojo zayıf olsaydı cevap ile önceki sorulara bile bağlantılar harika olurdu.

Dürüst

3 Cevap

Ben bile bu halletmek için PHP kullanmak zorunda sanmıyorum.

Veritabanları aynı MySQL örnek altında olması koşuluyla, sadece bir tablodan verileri seçmek ve başka içine bırakın bir çapraz-veritabanı sorgusu kullanabilirsiniz. Örneğin, sizin elden önce tabloyu temizlemek isteyen dahil:

TRUNCATE TABLE DatabaseA.Table1;
INSERT INTO DatabaseA.Table1A SELECT 
       ColumnFoo, ColumnBar, ColumnBaz 
       FROM DatabaseB.Table1B;

Sen cron sonra diyebiliriz ki, bir PHP komut dosyası içine yazabiliriz. MySQL adaptör ile diğer herhangi bir betik dili muhtemelen gerçekten çalışmak istiyorum.

Bir komut içine veri yükleme ve geri veritabanına redumping bunu yaparken çok daha fazla ağ bant genişliği, depolama, ve gerekli olandan işleme içerecektir.

Bir son not, daha sonra diğer veritabanları kullanmaya başlarsanız, hepsi çapraz-veritabanı sorguları destekleyen akılda çıplak (ben değil en az PostgreSQL biliyorum).

Siz sadece bunu yapabiliriz:

İlk olarak, 3 tablolar oluşturabilir.

  • Veritabanı A A = tablo
  • Veritabanı B'den B = tablo
  • C = veritabanlarının herhangi tablo ama biri olmak zorundadır ...

(En C veritabanı A'da olduğunu varsayalım)

TRUNCATE TABLE DatabaseA.C;
INSERT INTO DatabaseA.C SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseB.B;
INSERT INTO DatabaseA.C SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.A;
TRUNCATE TABLE DatabaseA.A;
TRUNCATE TABLE DatabaseB.B;
INSERT INTO DatabaseA.A SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.C;
INSERT INTO DatabaseB.B SELECT 
   ColumnFoo, ColumnBar, ColumnBaz 
   FROM DatabaseA.C;

Şimdi birbirleriyle senkronize hem veritabanları var ve hiçbir veri kaybı oldu.

Ben kelime eşitleme doğru anlamak, bu güvenle hem veritabanlarından veri almak ve bunları birbirine karıştırmak demektir ...

Tabii kimlikleri ve malzeme ile ilgili sorunlar olabilir, ama veritabanı indeks oranları çok eşitlenir, o sadece hile yapabilir ...

Yanı sıra, bu bağlantıyı kontrol: About Data Overwrite and Identical Keys

Çeşitli çözümler vardır.

  • Tablo çoğaltma kurmak. MySQL Bu özellik, dağıtık veri için tasarlanmıştır, ama (ben denemedim bile) veritabanı veritabanı çalışması gerekir.

  • Periodically drop the table and recreate with:

    use b;
    drop table table;
    create table table as
     select *
     from a.table;

    use c; drop table table; create table table as select * from a.table;

    This assumes that a contains the master.