pg_comparator - Bulutta Çevrimiçi

Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen pg_comparator komutudur.

Program:

ADI


pg_comparator - verimli tablo içeriği karşılaştırması ve senkronizasyonu

SİNOPSİS


pg_karşılaştırıcı [seçenekler olarak --yardım et --seçenek --adam] bağlantı1 bağlantı2

AÇIKLAMA


Bu komut dosyası, ağ ve zaman açısından verimli bir karşılaştırma veya iki senkronizasyon gerçekleştirir.
muhtemelen büyük tablolar PostgreSQL, MySQL or SQLite veritabanları, eklenen algılamak için,
bu tablolar arasında güncellenen veya silinen demetler. Algoritma özellikle aşağıdaki durumlarda verimlidir:
beklenen farklar nispeten küçüktür.

Uygulama oldukça geneldir: çok sütunlu anahtarlar (ancak bir anahtar olmalı!), hayır
metne dönüştürülebilecekleri dışındaki veri türlerinin varsayımı, sütunların alt kümesi olabilir
karşılaştırma için kullanılır, NULL değerlerin işlenmesi...

Bu komut dosyası, karşılaştırma algoritmasına, dolayısıyla birçok seçeneğe odaklanır. olduğu gerçeği
bir çoğaltma aracının gerçekten çoğaldığını kontrol etmek gibi yararlı bir şey yapabilir
verileriniz veya tabloları senkronize etmek gibi, yalnızca bir yan etkidir.

SEÇENEKLER


Seçenekler, yardım istemeye veya bazı dahili parametreleri ayarlamaya izin verir. Kısa tek harf
genellikle seçenek adının ilk harfiyle birlikte seçenekler de mevcuttur.

"--toplama=(toplam|xor)" veya "-a (toplam|xor)"
Özetler için kullanılacak toplama işlevi, xor or toplam. üzerinde çalışması gerekir
sağlama toplamı işlevinin sonucu. PostgreSQL ve SQLite için, xor toplam
yüklenmesi gerekiyor. Kullanırken anahtar karmasında imzalı/imzasız bir sorun var xor
MySQL veya SQLite ile PostgreSQL üzerindeki tabloları karşılaştırmak için. Yeni bir "ISUM" sağlıyoruz
SQLite için toplama çünkü hem "SUM" hem de "TOPLAM" bazı uyumsuz işlemler yapıyor
tamsayı taşar.

Varsayılan toplam çünkü varsayılan olarak mevcuttur ve karışık modda çalışır.

"--ask-pass"
Etkileşimli olarak şifreleri isteyin. Ayrıca aşağıdaki "--env-pass" seçeneğine bakın.

Varsayılan, şifre istememektir.

"--asenkron" veya "-A", "--no-asenkron" veya "-X"
Eşzamansız sorguların çalıştırılıp çalıştırılmayacağı. Bu biraz paralellik sağlar, ancak ikisi
bağlantılar, sorgu başına aşağı yukarı eşitlenir.

Varsayılan, bazı paralellikleri etkinleştirmek için zaman uyumsuz sorguları kullanmaktır.

"--checksum-computation=(create|insert)" veya "--cc=..."
Sağlama tablosu nasıl oluşturulur. Kullanmak yaratmak "CREATE ... AS SELECT ..." kullanmak için
sorgu veya eklemek "CREATE ...; INSERT ... SELECT ..." sorgusu kullanmak için. eski irade
tablo boyutunu elde etmek için ek bir sayım gerektirir, bu nedenle sonunda iki tane vardır
yine de sorgular. İle ilgili bir tür boyutu sorunu var eklemek MySQL'de strateji,
kümülatif anahtar dizesi uzunluğu 64 baytın altında olmalıdır.

Varsayılan yaratmak çünkü her zaman her iki veritabanı için de çalışır.

"--checksum-function=eğlence" veya "--cf=eğlence" veya "-c eğlenceli"
Kullanılacak sağlama toplamı işlevi, ck, fnv or md5. PostgreSQL, MySQL ve SQLite için
sağlanan ck ve fnv sağlama toplamı işlevleri hedef veritabanlarına yüklenmelidir.
Seçme md5 ücretsiz de gelmiyor: sağlanan yayın işlevleri yüklenmelidir
hedef veritabanlarına girer ve hesaplama daha pahalıdır.

Varsayılan ck, bu hızlıdır, özellikle işlem işlemciye bağlıysa ve
bant genişliği oldukça yüksektir.

"--checksum-size=n" veya "--check-size=n" veya "--cs=n" veya "-zn"
Tuple sağlama toplamı boyutu, olmalıdır 2, 4 or 8 bayt. Anahtar sağlama toplamı boyutu her zaman 4 bayttır
uzun.

Varsayılan 8, böylece yanlış negatif olasılık çok düşüktür. hayır olmalı
bunu değiştirmek için sebep.

"--Temizlemek"
Sağlama toplamı ve özet tablolarını önceden bırakın. "--no-temp" ile çalıştırıldıktan sonra kullanışlıdır ve
"--no-clear", genellikle hata ayıklama için kullanılır.

Varsayılan, gerekli olmadığı için düşürmemektir.

"--açık"
Hesaplamadan sonra sağlama toplamı ve özet tablolarını açıkça bırakın. olduklarına dikkat edin
geçici oldukları için bağlantı kapatıldığında varsayılan olarak örtük olarak düştü, bkz.
"-(-hayır)-geçici" seçeneği. Bu seçenek hata ayıklama için kullanışlıdır.

Varsayılan değil olmadığı için sağlama toplamı ve özet tablolarını açıkça temizlemek için
gerekli.

"--debug" veya "-d"
Hata ayıklama modunu ayarlayın. Daha yüksek hata ayıklama düzeyleri için tekrarlayın. Ayrıca bkz. "--ayrıntılı". dikkat edin
seçenek ayarlarıyla ilgili bazı güvenlik önlemleri, teste izin vermek için hata ayıklama altında atlanır
farklı koşullar altında.

Varsayılan, hata ayıklama modunda çalıştırılmamasıdır.

"--env-pass='var'"
Birinci bağlantı için "var1", "var2" veya "var" ortam değişkenlerinden şifre alın,
iki veya her ikisi. Bu, etkileşimli olarak "--ask-pass" ayarının da ayarlanıp ayarlanmadığını sormadan önce denenir.

Varsayılan, ortam değişkenlerinden parola aramamaktır.

"--n'yi bekle" veya "-en"
Beklenecek toplam fark sayısı (güncellemeler, silmeler ve eklemeler). Bu seçenek
sadece regresyon olmayan testler için kullanılır. TESTLER bölümüne bakın.

"--katlama faktörü=7" veya "-f 7"
Katlama faktörü: her aşamada birlikte gruplandırılmış satır sayısının log2'si, başlangıç
ilk turda her zaman mümkün olduğu kadar çok kayıt gruplaması için yapraklardan. bu
ikinin gücü, birinin maskeli hesaplamaları kullanmasına izin verir. 1'in minimum değeri bir
ikili ağaç.

Varsayılan katlama faktörü log2 7, yani boyut 128 katlanır. Bu varsayılan değer seçildi
orta veya düşük bant genişliğine sahip orta büyüklükteki kasalarda bazı temel testlerden sonra. gelen değerler
Çoğu ayar için 4 ila 8 makul bir seçim olmalıdır.

"--yardım" veya "-h"
Kısa yardım göster.

"--key-checksum='kcs'" veya "--kcs=..."
Tablolarda zaten mevcut olması gereken bu adın anahtar sağlama toplamı özelliğini kullanın
karşılaştırmak. Bu seçenek ayrıca "--tuple-checksum" seçeneğini gerektirir. Ayrıca bkz.
Bir sağlama toplamı tetikleyicisinin nasıl ayarlanacağını öğrenmek için aşağıdaki ÖRNEKLER bölümü. "--use-key" düşünün
bunun yerine, zaten makul şekilde dağıtılmış bir tamsayı birincil anahtarınız varsa.

Varsayılan, anında hem anahtar hem de demet sağlama toplamları oluşturmaktır.

"--kilit", "--kilit yok"
Masaların kilitlenip kilitlenmeyeceği. Seçeneği ayarlamak, varsayılanı tek yönlü olarak açıkça geçersiz kılar
veya başkası. PostgreSQL için bu seçenek, tarafından etkinleştirilen "--transaction" gerektirir.
Varsayılan.

Varsayılan, geçerli işleme bağlıdır: tablo değil kilitli karşılaştırma için,
ama bu kilitli bir senkronizasyon için.

"--long-read-len=0" veya "-L 0"
Getirilen ikili büyük nesneler için maksimum boyutu ayarlayın. En azından görmezden gelinmiş gibi görünüyor
PostgreSQL sürücüsü tarafından.

Varsayılan, sürücü tarafından ayarlanan varsayılan değeri korumaktır.

"--adam" veya "-m"
Kılavuz sayfasını terminalde etkileşimli olarak gösterin.

"--max-oran=0.1"
Maksimum göreceli arama çabası. Sonuç sayısı ise arama durdurulur.
tablo boyutuna göre ifade edilen bu eşiğin üzerinde. Sınırsız olarak 2.0 kullanın
(tüm demetler silindi ve yenileri eklendi).

Varsayılan 0.1, yani pes etmeden önce genel olarak %10'luk bir farka izin verilir.

"--max-raporu=n"
Maksimum mutlak arama çabası. Farklılık sayısı varsa arama durdurulur.
bu eşiğin ötesine geçer. Ayarlanırsa, önceki "--max-ratio" seçeneği yok sayılır,
aksi takdirde efor, tablo boyutu bilindiğinde oran ile hesaplanır.

Varsayılan, rapor edilen maksimum fark sayısını aşağıdakilere dayalı olarak hesaplamaktır:
En az 100 farka izin verilen "--max-ratio" seçeneği.

"--max-levels=0"
Kullanılan maksimum seviye sayısı. Birinin katlamayı kesmesine izin verir. 0, kesinti olmadığı anlamına gelir.
1 değeri ayarlamak, özetler olmadan yalnızca sağlama toplamı tablosunu kullanır. bir değeri
Ağacın son seviyeleri insanlar için iyi olduğundan, 3 veya 4 raisonable olacaktır.
teorik karmaşıklık formülü, ancak pratikte performansı iyileştirmez.

Varsayılan 0.

"--null='metin'"
NULL değerler nasıl işlenir. Herhangi biri esrar NULL'un bir özel olduğu tüm değerleri toplamak için
hash değeri veya metin burada NULL değerlerin yerine "NULL" dizesi gelir.

Varsayılan metin çünkü daha hızlı.

"--seçenek" veya "-o"
Seçenek özetini göster.

"--pg-kopya=128"
INSERT/UPDATE yerine PostgreSQL'in COPY'sini kullanmak için deneysel seçenek
belirtilen boyuttaki parçalarla senkronize edilir.

"--prefix='pgc_cmp'"
Ad öneki, muhtemelen şema nitelikli, tarafından oluşturulan karşılaştırma tabloları için kullanılır
ona sayılar ekleyerek. Birkaç tane bekliyorsanız öneki değiştirmeyi düşünün.
aynı veritabanına karşı eşzamanlı olarak çalışacak karşılaştırmalar.

Varsayılan "pgc_cmp" dir. Cheksum tabloları "pgc_cmp_1_0" ve "pgc_cmp_2_0" olarak adlandırılır ve
özet tablolar son sayı artırılarak adlandırılır.

"--rapor", "--rapor yok"
Farklı anahtarları bulundukça stdout'a bildirin.

Varsayılan, rapor etmektir.

"--separator='|'" veya "-s '|'"
Bilgi işlem için anahtar sütunları birleştirirken kullanılan ayırıcı dize veya karakter
sağlama toplamı.

'|' borusu için varsayılanlar karakter.

"--boyut=n"
Bu değeri tablo boyutu olarak kabul edin. Algoritmanın gerçekleştirmesi yeterlidir
iyi ki bu boyut, gerçek tablo boyutunun büyüklük sırasına göredir.

Varsayılan, bu seçenek ayarlanırsa atlanan tablo boyutlarını sorgulamaktır.

"--source-1='DBI:...'", "--source-2='...'" veya "-1 '...'", "-2 '...'"
DBI veri kaynağı spesifikasyonunun tam kontrolünü elinize alın ve çoğunlukla karşılaştırmayı görmezden gelin
kaynak veya hedef URL'lerin kimlik doğrulama kısmı. Bir ile bağlanabilir
"DBI:Pg:service=backup", alternatif bir sürücü kullanın, izin verilen herhangi bir seçeneği ayarlayın
sürücü... Kullanılabilecek çeşitli seçenekler için "DBD::Pg" ve "DBD:mysql" kılavuzlarına bakın.
DBI veri kaynağı belirtimi aracılığıyla ayarlanır. Ancak, belirtilen veritabanı sunucusu
URL'deki sorguların bu kaynak belirtimi ile tutarlı olması gerekir.
sözdizimi doğru olanıdır.

Varsayılan, iki URL bağımsız değişkenine güvenmektir.

"--atla-ekler", "--güncellemeleri atla", "--atla-siler"
Senkronizasyon yaparken bu işlemleri yapmayın.

"--synchronize" altındaki varsayılan tüm işlemleri yapmaktır.

"--stats=(txt|csv)"
Bu formatta gerçekleştirilen karşılaştırma hakkında çeşitli istatistikleri gösterin. Ayrıca, seçenek
"--stats-name", teste csv dosyaları oluşturmak için yararlı olan bir ad verir.
otomatik olarak işlenir.

Varsayılan değil istatistikleri göstermek için, çünkü ek senkronizasyonlar gerektirir ve
kullanıcı için mutlaka ilginç değildir.

"--senkronize et" veya "-S"
Aslında, ilk tabloyla ikinci tabloyu senkronize etmek için işlemler gerçekleştirin. İyi değil
gerçekten, bu sadece kuru bir çalışma. Aslında "--do-it" veya "-D" eklerseniz yapılır. Kayıt etmek
Böyle bir şey denemeden önce verileriniz!

Varsayılan, senkronize edilmemektir.

"--geçici", "--geçici olmayan"
Geçici tabloların kullanılıp kullanılmayacağı. Bunu yapmazsanız, tablolar varsayılan olarak
sona erdirilir, bu nedenle elle silinmeleri gerekir. Talep etmek için "--clear" seçeneğine bakın.
Temizlemek. Bu seçenek hata ayıklama için kullanışlıdır.

Varsayılan, otomatik olarak silinen geçici tabloları kullanmaktır.
bağlantı kapalı.

"--kayıtsız", "--kayıtsız"
Sağlama toplamlarını depolamak için günlüğe kaydedilmemiş tablolar kullanın. Bu tablolar işlemsel değildir, bu nedenle
işleri biraz hızlandırabilir. Ancak, otomatik olarak temizlenmezler.
son. Temizleme talebinde bulunmak için "--clear" seçeneğine bakın.

Varsayılan, günlüğe kaydedilmemiş tabloları kullanmamaktır.

"--threads" veya "-T", "--threads" veya "-N"
Son derece DENEYSEL özellik.

Bazı hokus-pokuslarla paralel olarak hesaplamalar yapmak için konuları kullanmayı deneyin çünkü
perl thread modeli DBI ile gerçekten iyi çalışmıyor. Perl konuları oldukça ağırdır
ve yavaş, hafif ipliklerden çok iletişim süreçleri gibi, gerçekten.

Bu PostgreSQL ile hiç çalışmaz. MySQL ile kısmen çalışır.
"--transaction" kapatma fiyatı.

Varsayılan değil tüm veritabanlarında çalışmadığı için iş parçacığı kullanmak.

"--zaman aşımı n"
"n" saniye sonra zaman aşımı karşılaştırması.

Varsayılan, zaman aşımı olmamasıdır. Sabırlı ol.

"--işlem", "--işlem yok"
Tüm algoritmanın tek bir işlemde sarılıp sarmalanmayacağını belirtir.

Varsayılan, hem daha hızlı hem de daha güvenli göründüğü için bir sarma işlemi kullanmaktır.
böyle yap.

"--tuple-checksum='tcs'" veya "--tcs=..."
Zaten mevcut olması gereken bu ismin sağlama toplamı özniteliğini kullanın.
karşılaştırılacak tablolar. Bu seçenek ayrıca "--use-key" veya
"--key-checksum=..." yukarıda. Sağlanan sağlama toplamı öznitelikleri,
anahtar ve değer sütunlarının listeleri. nasıl ayarlanacağıyla ilgili olarak aşağıdaki ÖRNEKLER bölümüne de bakın.
sağlama toplamı tetikleyicisi.

Varsayılan, anında hem anahtar hem de demet sağlama toplamları oluşturmaktır.

"--use-key" veya "-u"
Tuple'ları dallar arasında dağıtmak için anahtarın değerinin doğrudan kullanılıp kullanılmayacağı. bu
anahtar basit, tamsayı olmalı, NULL değil ve eşit olarak dağıtılmış olmalıdır. eğer bir
makul bir şekilde yayılmış tamsayı birincil anahtarı, yarısından kaçınmak için bu seçeneği kullanmayı düşünün.
sağlama toplamı tablosu karma hesaplamaları.

Varsayılan, herhangi bir tür, kompozisyon ve dağıtımı işlemek için anahtarın hash edilmesidir.

"--use-null", "--no-use-null"
Basitleştirmek için bir sütunun NOT NULL olarak bildirildiği bilgisinin kullanılıp kullanılmayacağı
NULL değerleri işlemek için COALESCE çağrılarından kaçınarak hesaplamalar.

Varsayılan, bu bilgiyi tablo meta verilerini sorgulama fiyatına kullanmaktır.

"--verbose" veya "-v"
Neler olduğu hakkında ayrıntılı olun. Ne kadar çok sorarsanız, o kadar ayrıntılı olur.

Varsayılan, sessiz olmaktır, böylece olası uyarılar veya hatalar göze çarpar.

"--versiyon" veya "-V"
Sürüm bilgilerini göster ve çık.

"--nerede=..."
Kısmi karşılaştırma için tablo demetlerinde SQL boole koşulu. azaltmak için kullanışlıdır.
Verilerinizin bazı bölümlerinde beklenen farklılıkların olduğunu biliyorsanız, şunları söyleyin:
bugün zaman damgalı... Her iki tarafta da aynı koşul geçildi, bu nedenle her iki tablo da
işe yaraması için oldukça benzer olun. Bu genellikle böyledir.

Varsayılan, tüm tabloları karşılaştırmaktır.

ARGÜMANLAR


İki bağımsız değişken, aşağıdaki URL benzeri sözdizimi ile veritabanı bağlantılarını tanımlar;
köşeli parantezler isteğe bağlı parçaları belirtir. Birçok parça varsayılan olarak isteğe bağlıdır. En az miktar
sözdizimsel olarak doğru belirtim "/" dir, ancak bu gerekli değildir
işe yarar.

[sürücü://][giriş[:geçiş]@][ana bilgisayar][:bağlantı noktası]/[temel/[[şema.]tablo[?anahtar[:sütunlar]]]]

Aşağıdaki ÖRNEKLER bölümüne ve ayrıca yukarıdaki "--source-*" seçeneklerine bakın.

DBI sürücüleri tarafından kullanılan bazı varsayılan değerlerin sürücüye özel olarak değiştirilebileceğini unutmayın.
ortam değişkenleri ve bu DBI ayrıca kendi varsayılanlarını ve geçersiz kılmalarını sağlar, öyleyse ne
aslında olur her zaman net olmayabilir. İkinci URL için varsayılan değerler çoğunlukla
ilk URL'den alınmıştır.

sürücü
Kullanılacak veritabanı sürücüsü. Kullanmak pgsql PostgreSQL için, mysql MySQL için, sqlite SQLite için.
Heterojen veritabanları karşılaştırılabilir ve senkronize edilebilir, ancak dikkatli olun
yazma, kodlama ve döküm sorunları heterojen karşılaştırmaları veya
başarılı olmak için senkronizasyonlar. Varsayılan pgsql ilk bağlantı için ve aynı
ikinci için birinci.

SQLite için, URL'nin kimlik doğrulama kısmı (oturum açma, geçiş, ana bilgisayar, bağlantı noktası) bekleniyor
boş olması için tam URL şöyle görünmelidir:

sqlite:///base.db/table?key,col:other,sütunlar

Ayrıca, PGC_SQLITE_LOAD_EXTENSION ortam değişkenini şununla ayarlamak
":"-ayrılmış paylaşılan nesne dosyaları, bunları SQLite'a yükler.

giriş
Veritabanına bağlanırken kullanmak için oturum açın. Varsayılan, ilk bağlantı için kullanıcı adıdır,
ve ikincisi için ilk bağlantı ile aynı.

geçmek
Veritabanına bağlanırken kullanılacak parola. koymanın kötü bir fikir olduğunu unutmayın.
komut argümanı olarak şifre. Varsayılan, ilk bağlantı için hiçbiridir ve
ikinci için ilk bağlantı ile aynı şifre if bağlantı şunları hedefliyor
aynı ana bilgisayar, bağlantı noktası ve aynı oturum açma bilgilerini kullanır. Ayrıca bkz. "--ask-pass" ve "--env-pass"
seçenekleri.

ev sahibi
Bağlanılacak ana bilgisayar adı veya IP. Varsayılan boş dizedir; bu, bağlanmak anlamına gelir.
UNIX soketi ile localhost üzerindeki veritabanı.

Liman
Bağlanmak için TCP-IP bağlantı noktası. Varsayılan, PostgreSQL için 5432 ve MySQL için 3306'dır.

baz
Bağlanılacak veritabanı kataloğu. Varsayılan, ilk bağlantı için kullanıcı adıdır. Varsayılan
ikinci bağlantı için ilk bağlantı ile aynı. SQLite için veritabanı dosyasını sağlayın
isim. Yol varsayılan olarak görelidir, ancak başına bir dosya eklenerek mutlak hale getirilebilir.
ek olarak '/':

sqlite:////var/cache/sqlite/base.db/table?...

şema.tablo
Karşılaştırma için kullanılacak muhtemelen şema nitelikli tablo. İlk için varsayılan yok
bağlantı. Varsayılan, ikinci bağlantı için ilk bağlantı ile aynıdır.

MySQL'in olmadığını unutmayın. şemalar, ama garip bir şekilde onların veritabanı kavram
tıpkı bir plan, bu nedenle MySQL'in gerçekten veritabanlarıolmasına rağmen
bu isimde bir şey. temiz miyim?

anahtarlar
Anahtar sütunların virgülle ayrılmış listesi. Varsayılan, ilk önce tablo birincil anahtarıdır
bağlantı. Varsayılan, ikinci bağlantı için ilk bağlantı ile aynıdır. Anahtar
Amerika’ya vize ile ya da Meksika üzerinden geldikten sonra ilticaya başvuran kişileri, herhangi bir suça karışmadıkları sürece mahkeme kararı olmadan sınır dışı (deport) ettiremez. boş ol. Tuple'larınızı tanımlamanın bir yolu yoksa, o zaman
farklılıkları aramakta bir nokta.

yaka
Karşılaştırılacak sütunların virgülle ayrılmış listesi. Boş olabilir. Varsayılan tüm sütunlardır, ancak
anahtarlar ilk bağlantı için. Varsayılan, ikinci bağlantı için ilk bağlantı ile aynıdır.
"...?key:" öğesinin boş bir sütun anlamına geldiğine dikkat edin, "...?key" ise varsayılanı şu şekilde ayarlar:
tablo meta verilerini sorgulama.

ÖRNEKLER


Yerel ana bilgisayardaki veritabanı ailesindeki calvin ve hobbes tablolarını anahtarla karşılaştırın id ve sütunlar
c1 ve c2:

./pg_comparator /family/calvin?id:c1,c2 /family/hobbes

Localhost'ta varsayılan veritabanındaki calvin tablolarını ve varsayılan olarak aynı tabloyu karşılaştırın
anahtar ile sablons üzerinde veritabanı id ve sütun veri:

./pg_comparator localhost/family/calvin?id:veri sablonları/

"wikipedia" veritabanındaki "user" tablosunu "sunucu1"deki MySQL'den PostgreSQL'e senkronize edin
"sunucu2".

./pg_comparator -S -D --ask-pass
mysql://calvin@sunucu1/wikipedia/kullanıcı pgsql://hobbes@sunucu2/

PostgreSQL için, tetikleyici bakımlı anahtar ve demet sağlama toplamlarını şu şekilde ekleyebilirsiniz:

-- TABLE Foo(id SERİ BİRİNCİL ANAHTAR, veri ... NULL DEĞİL);
-- bir anahtar ve sağlama toplamı öznitelikleri ekleyin
-- --use-key kullanırsanız anahtar sağlama toplamı atlanabilir,
-- bunun için anahtarın basit bir NOT NULL tamsayı olması gerekir.
DEĞİŞTİR TABLOSU
SÜTUN EKLE key_cs INT4 NOT NULL DEFAULT 0,
SÜTUN EKLE tup_cs INT8 NOT NULL DEFAULT 0;
-- demet sağlama toplamını güncelleme işlevi
-- eğer bazı nitelikler NULL ise, birleştirilmeleri gerekir
CREATE FUNCTION foo_cs() TETİKLEMEYİ $$ OLARAK GERİ DÖNDÜR
BAŞLA
-- anahtar sağlama toplamını hesapla
YENİ.key_cs = cksum4(YENİ.id);
-- demet sağlama toplamını hesapla
NEW.tup_cs = cksum8(NEW.id || '|' || YENİ.data);
YENİ DÖNÜŞ;
SON; $$ DİL plpgsql;
-- sağlama toplamı güncelleme işlevini çağırmak için tetikleyiciyi ayarlayın
TETİK OLUŞTUR foo_cs_trigger
GÜNCELLEMEDEN VEYA EKLEMEDEN ÖNCE Foo
HER SATIR YÜRÜTME PROSEDÜRÜ İÇİN foo_cs();
-- eğer Foo tablosu başlangıçta boş değilse,
-- sağlama toplamı hesaplamalarını tetiklemek için içeriğini güncelleyin
GÜNCELLEME Foo SET id=id;

Ardından, ilk sağlama toplamı tablosunu hesaplaması gerekmeyen hızlı bir karşılaştırma yapılabilir.
ile talep edildi:

./pg_comparator --tcs=tup_cs --kcs=key_cs
admin@server1/app/Foo?id:veri hobbes@server2/

Birincil anahtar basit bir tam sayı olduğundan, anahtar_cs dışarıda bırakılabilir ve karşılaştırma
ile başlatılabilir:

./pg_comparator --tcs=tup_cs --use-key
admin@server1/app/Foo?id:veri hobbes@server2/

ÇIKTI


Komutun çıktısı, komutlar arasında bulunan farkları açıklayan satırlardan oluşur.
iki masa. Eklemeler, güncellemeler veya silmeler ve tanımlama grubu cinsinden ifade edilirler.
anahtarlar.

GÜNCELLEME k
anahtar k Tuple tablo 1'den tablo 2'ye güncellendi.
farklı değerler.

INSERT k
anahtar k Tuple tablo 2'de görünmüyor, sadece tablo 1'de görünüyor.
tablo 2 ile senkronize etmek için tablo 1'e bakın.

SİL k
anahtar k Tuple tablo 2'de görünüyor, ancak tablo 1'de değil.
tablo 1 ile senkronize edin.

Tuple sağlama toplamı çakışmaları durumunda, yanlış negatif sonuçlar ortaya çıkabilir. değiştirme
sağlama toplamı işlevi bu gibi durumlarda yardımcı olacaktır. ANALİZ alt bölümüne bakın.

BAĞIMLILIKLAR


Veritabanında üç destek işlevi gereklidir:

1.
"COALESCE" işlevi, sütunlardaki NULL değerlerle ilgilenir.

2.
Anahtar ve sütun değerlerini azaltmak ve dağıtmak için bir sağlama toplamı işlevi kullanılmalıdır. Olabilir
"--checksum" seçeneği ile değiştirilebilir. Boyutu ile seçilebilir
"--checksize" seçeneği (şu anda 2, 4 veya 8 bayt). Sağlama toplamları ayrıca yayınların olmasını gerektirir
çeşitli boyutlarda tam sayılara dönüştürülür.

PostgreSQL için uygun uygulamalar mevcuttur ve sunucuya yüklenebilir
"share/contrib/pgc_checksum.sql" ve "share/contrib/pgc_casts.sql" işlenerek. Yeni
MySQL için sağlama toplamları ve yayınlar da mevcuttur, bkz. "mysql_*.sql". yüklenebilir
SQLite için uygun sağlama toplamı işlevlerinin uygulanması da mevcuttur, bkz.
"sqlite_checksum.*".

"ck" sağlama toplamı, Jenkins karma değerine dayanmaktadır ,
basit ekleme, kaydırma ve xor tamsayı işlemlerine dayanır. "fnv" sağlama toplamı
FNV karmasından ilham aldı (64 bit 1a
sürüm) xor ve çok tamsayı işlemlerini kullanır, ancak bazı kaymalar da ekledim
ve yüksek bitleri düzeltmeye yardımcı olmak için ekleyin.

3.
Bir dizi satır için sağlama toplamlarını özetlemek için bir toplama işlevi kullanılır. O olmalı
sağlama toplamı işlevinin sonucu üzerinde işlem yapın. ile değiştirilebilir.
"--topla" seçeneği.

PostgreSQL için özel veya "xor" toplamının uygun uygulamaları mevcuttur
ve "share/contrib/xor_aggregate.sql" işlenerek sunucuya yüklenebilir.

"sqlite_checksum.*" dosyası ayrıca SQLite için bir "xor" ve "sum" kümeleri sağlar.
diğer veritabanlarıyla uyumludur.

Ayrıca, bu betiği çalıştırmak için birkaç Perl modülü yararlıdır:

· Seçenek yönetimi için "Getopt::Long".

· PostgreSQL'e bağlanmak için "DBI", "DBD::Pg", MySQL'e bağlanmak için "DBD::mysql" ve
SQLite'a bağlanmak için "DBD::SQLite".

· "--ask-pass" seçeneği için "Term::ReadPassword".

· Dokümanın kendi kendine çıkarılması için "Pod::Kullanım" ("--man" "--opt" "--help").

· "--threads" seçeneği ile deneysel dişli sürüm için "threads".

· SQLite ile md5 sağlama toplamı için "Özet::MD5".

Modüller, yalnızca gerçekten gerekliyse komut dosyası tarafından yüklenir.

ALGORITMASı


Algoritmanın amacı, muhtemelen farklı iki tablonun içeriğini karşılaştırmaktır.
minimum ağ trafiğine sahip uzak sunucular. Üç aşamada gerçekleştirilir.

1.
Hedef tablo için her iki tarafta bir sağlama toplamı tablosu hesaplanır.

2.
Parçaların bir araya getirilmesiyle her iki tarafta birinci seviye bir özet tablosu hesaplanır.
sağlama tablosu. Daha sonra, diğer özet toplama seviyeleri, elde edilene kadar gerçekleştirilir.
son tabloda yalnızca bir satır, daha sonra bütün için genel bir sağlama toplamı depolar
ilk hedef tabloları.

3.
Üst özet tablolarından başlayarak, toplu sağlama toplamları her ikisinden de karşılaştırılır.
İlk sağlama toplamı tablosuna kadar farklılıkları aramak için taraflar. farklı tuşları
tuples görüntülenir.

SAĞLAMA TABLO
İlk aşama, ilk sağlama toplamı tablosunu hesaplar T(0) her tarafta. varsayarsak anahtar
tablo anahtar sütunlarıdır ve yaka kontrol edilecek tablo veri sütunlarıdır
farklılıklar, daha sonra hedef tablo sorgulanarak gerçekleştirilir. T aşağıdaki gibi:

TABLO OLUŞTUR T(0) OLARAK
SELECT tuşu AS pk, -- birincil anahtar
sağlama toplamı(anahtar) AS kcs, -- anahtar sağlama toplamı
sağlama toplamı(anahtar || sütunlar) AS tcs -- demet sağlama toplamı
t'DEN;

Başlangıç ​​anahtarı, sonunda farklı anahtarları göstermek için kullanılacağından korunur. bu
için rasyonel kcs sütun, denge sağlamak için anahtar/değer çiftlerini rastgele dağıtmaktır.
sonraki aşamada toplanır. Anahtar sağlama toplamında da görünmelidir, aksi takdirde içerik
bazı durumlarda iki anahtar arasında değiştirilenler algılanmayacaktır.

ÖZET TABLOLAR
Şimdi gruplandırarak bir dizi basamaklı özet tablo hesaplıyoruz f (katlama faktörü) sağlama toplamları
her aşamada birlikte Gruplandırma, bir maskeye dayalıdır. kcs alınacak sütun
sağlama toplamı rastgeleleştirme avantajı. Den başlayarak p = 0 inşa ediyoruz:

TABLO T(p+1) AS OLUŞTUR
kcs & mask(p+1) AS kcs, -- anahtar sağlama toplamı alt kümesini SEÇ
XOR(tcs) AS tcs -- demet sağlama toplamı özeti
T(p)'DEN
GROUP BY kcs & mask(p+1);

mask(p), ortalama olarak birlikte gruplanacak şekilde tanımlanır f birlikte sağlama toplamı: maske(0)
= ceil2(boyut); maske(p) = maske(p-1)/f; Bu, her biri
öncekinin daha küçük bir özeti:

seviye 0
sağlama tablosu, boyut satırlar, yani hedef tablo kadar satır.

seviye 1
ilk özet tablo, (beden/f) satırları.

seviye p
ara özet tablosu, (size/f**p) satırları.

seviye n-1
son özet tablosundan bir önce, f satırdan daha az.

seviye n
son özet tablo, maske 0, 1 satırdır.

Her iki tarafta da aynı maskelerin kullanılması önemlidir, böylece kümelenmeler olur.
aynı, her iki taraftaki eşleşen içerikleri karşılaştırmaya izin verir.

ARAMA İÇİN FARKLILIKLARI
Tüm bu destek tabloları her iki tarafta da oluşturulduktan sonra, farklılık arayışı gelir.
Son tabloların sağlama toplamı özetini kontrol ederken (seviye n) sadece bir satır ile,
temel olarak tüm tablo içeriğinin sağlama toplamının bir karşılaştırması. Eğer eşleşirlerse, o zaman
her iki tablo da eşit ve işimiz bitti. Aksi takdirde, bu sağlama toplamları farklıysa, bazıları
Soruna neden olan anahtarları tespit etmek için araştırma gereklidir.

Soruşturma, masa hiyerarşisinde aşağı inerek ve hepsini arayarak gerçekleştirilir. kcs
önceki düzeyde sağlama toplamında bir fark olduğu için. Aynı sorgu
her aşamada her iki tarafta gerçekleştirilir:

kcs, tcs SEÇ
T(p)'DEN
WHERE kcs & mask(p+1) IN (kcs-with-diff-checksums-from-level-p+1)
ORDER BY kcs [ve seviye 0'da: , id];

Ve her iki taraftan gelen sonuçlar birleştirilir. Birleştirme işlemi yapılırken, dört
durumlar ortaya çıkabilir:

1.
Her ikisi de kcs ve TCS kibrit. O zaman fark yok.

2.
Rağmen kcs eşleşir, TCS değil. Sonra bu kcs bir sonrakinde araştırılacak
düzeyi, sağlama toplamı özeti farklı olduğundan. Zaten son seviyedeysek, o zaman
rahatsız edici anahtar gösterilebilir.

3.
Yok hayır kcs maç, bir ek kcs ilk tarafta. Sonra bu kcs karşılık
birinci tabloyla ikinci tabloyu eşitlemek için eklenmesi gereken anahtar(lar).

4.
Yok hayır kcs maç, bir ek kcs ikinci tarafta. Sonra bu kcs karşılık
birinci tablo ile ikinci tabloyu eşitlemek için silinmesi gereken anahtar(lar).

Durum 3 ve 4 basitçe simetriktir ve olup olmadığına karar vermek sadece bir yorumdur.
ilk tarafı referans olarak alan bir ekleme veya silmedir.

ANALİZ
Let n satır sayısı olsun, r satır boyutu, f katlama faktörü, k sayısının
tespit edilecek farklılıklar, c bit cinsinden sağlama toplamı boyutu, ardından tanımlama maliyetleri
farklar ve hata oranı:

hacim
daha iyi k*f*tavan(log(n)/log(f))*(c+log(n)). içeriği k boyut blokları f
ağacın derinliğine aktarılır ve her blok tanımlayıcısı boyutundadır. günlük (n) ve
sağlama toplamı içerir c. bağımsızdır r, ve sen istiyorsun k<<n. Hacmi
SQL istekleri hakkında k*log(n)*tavan(log(n)/log(f)), eşleşmeyenlerin listesi olarak
toplamlarını k*log(n) ağaç derinliğinde sürüklenebilir.

numara of isteklerinizi (on her Yan, the algoritma is simetrik)
minimum 6+tavan(log(n)/log(f)) eşit tablolar için maksimum 6+2*tavan(log(n)/log(f)).

disk I / O trafik
yaklaşık n*r+n*ln(n)*(f/(f-1)).

yanlış negatif olasılık
yani tabloların bir kısmı farklı olmasına rağmen eşit kabul edilir. Birlikte
mükemmel sağlama toplamı işlevi, bu herhangi bir noktada bir sağlama toplamı çakışması olasılığıdır
nerede hesaplandıkları ve farklı olmaları gerektiği: hakkında
k*tavan(log(n)/log(f))*2**-c. Bir milyon satırlık tablo için,
varsayılan algoritma parametre değerleri, bu yaklaşık 2 ** 10 *3/2**64, bu yaklaşık bir
şansı 2 ** 52 birleştirme koşuları.

Katlama faktörü ne kadar düşükse f ağ hacmi için daha iyi, ancak daha yüksek
istek sayısı ve disk G/Ç'leri için daha iyi: f bir takastır.

Sağlama toplamı boyutu ne kadar düşükse c, ağ hacmi için daha iyi, ancak ağ hacmi için daha kötü
yanlış negatif olasılık.

Kullanılabilir bant genişliği makul ise, karşılaştırma büyük olasılıkla işlemciye bağlı olacaktır:
zaman esas olarak ilk sağlama toplamı tablosunu hesaplamak için harcanır. Böylece eğer
farklılıkları oldukça sık kontrol etmeyi planlıyorsanız, bir Tuple sağlama toplamı sağlamayı düşünün.
bir tetikleyici ve muhtemelen bir anahtar sağlama toplamı ve "--tuple-checksum" ile çağırın ve
"--key-checksum" veya "--use-key".

UYGULAMA KONULAR
Sağlama toplamı uygulaması, sabit uzunlukta ve kullanımı kolay tamsayılar verir.
sonra manipüle edin.

The xor agrega iyi bir seçimdir çünkü onunla ilgili herhangi bir taşma sorunu yoktur.
girdinin tüm bitlerini hesaba katar ve herhangi bir ikili veri üzerinde kolayca tanımlanabilir. bu
toplam toplama da tamamdır, ancak bir tür temel tamsayı türü gerektirir.

NULL değerlere uygun şekilde özen gösterilmelidir.

Katlama faktörü ve tüm modüller, bir maske kullanmak için ikinin gücü olarak alınmıştır.

Uygulanan büyük silme veya ekleme parçalarının özel bir yönetimi vardır.
algoritmik genel bakış ve karmaşıklık analizinde ayrıntılı olmamasına rağmen.

PostgreSQL/MySQL uyumlu bir uygulamasını oluşturmak için bazı çabalar vardır.
tür dönüşümleri ve diğer şeylerle başa çıkmak için hackler ekleyen algoritma.

Bu komut dosyası makul bir şekilde test edilmiştir, ancak kavramın doğasının kanıtı nedeniyle birçok
kombinasyonlarının tümü test edilemeyen seçenekler.

NOT
Karşılaştırılacak tablolar aynı veritabanındaysa, basit bir SQL sorgusu
farklılıklar. Tabloları Varsaymak T1 ve T2 birincil anahtarla id ve boş olmayan içerikler veri,
o zaman farklılıkları, işte böyle T2 referanstan farklıdır T1, tarafından özetlenir
aşağıdaki sorgu:

COALESCE(T1.id, T2.id) anahtarını SEÇİN,
T1.id NULL OLDUĞUNDA DURUM SONRA 'SİL'
T2.id NULL OLDUĞUNDA 'EKLE'
BAŞKA 'GÜNCELLEME'
SON OLARAK operasyon
T1'DEN FULL JOIN T2 KULLANARAK (id)
T1.id NEREDE NULL - SİL
VEYA T2.id NULL -- INSERT
VEYA T1.veri <> T2.veri -- GÜNCELLEME

REFERANSLAR
Bu araç ve algoritması hakkında bir konferansta bir bildiri sunuldu: uzak karşılaştırma
of veritabanı tablolar by Fabian tavşan, Üçüncü Uluslararası Konferansta Gelişmeler
Veritabanları, Bilgi ve Veri Uygulamaları (DBKDA), s. 23-28, St Marteen, Hollanda
Antiller, Ocak 2011. ISBN: 978-1-61208-002-4. Telif hakkı IARIA 2011. Think'te Çevrimiçi
Akılhttp://www.thinkmind.org/index.php?view=makale&articleid=dbkda_2011_2_10_30021>.

Algoritma ve komut dosyası ilham aldı taming the Dağıtılmış veritabanı Sorun: A dava
Ders çalışma kullanma MySQL by Giuseppe maksiya in Sys admin cilt 13 sayı 8, Ağustos 2004, sayfa 29-40. Görmek
Perl Rahiplerihttp://www.perlmonks.org/index.plAyrıntılar için ?node_id=381053>. Bu sayfada,
üç algoritma sunulmuştur. İlki, iki tabloyu bir sağlama toplamı ile karşılaştırır
teknik. İkincisi, 2 seviye (sağlama toplamı) temelinde UPDATE veya INSERT farklarını bulur.
ve özet) tablo hiyerarşisi. Algoritma asimetriktir, çünkü farklı sorgular
karşılaştırmak için iki tablo üzerinde gerçekleştirilir. Görünüşe göre ağ trafiği hacmi
k*(f+(n/f)+r), olasılıksal olarak hatalı bir birleştirme prosedürüne sahip olduğunu ve
anahtar değerlerin dağılımı hakkında varsayımlar. Üçüncü algoritma DELETE'i arar
sadece böyle olduğu varsayımıyla, saymaya dayalı farklılıklar
farklılıklar.

Bu yaklaşımın aksine, tamamen simetrik algoritmamız üç görevi de uygular.
bir kerede, iki tablo arasında GÜNCELLEME, SİL ve EKLE'yi bulmak için. sağlama toplamı ve
Özet hiyerarşik düzey fikri, algoritmik sorunları azaltmak için yeniden kullanılır ve genelleştirilir.
karmaşıklık.

Uygulama açısından, komut dosyası mümkün olduğu kadar parametriktir.
seçenekleri ve tablo yapıları, türleri ve değerleri hakkında birkaç varsayımda bulunur.

onworks.net hizmetlerini kullanarak pg_comparator'ı çevrimiçi kullanın



En yeni Linux ve Windows çevrimiçi programları