هذا هو الأمر pg_comparator الذي يمكن تشغيله في مزود الاستضافة المجانية OnWorks باستخدام إحدى محطات العمل المجانية المتعددة على الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
pg_comparator - مقارنة ومزامنة محتوى الجدول بكفاءة
موجز
pg_comparator [خيارات كـ --مساعدة --اختيار --رجل] conn1 conn2
الوصف
يقوم هذا البرنامج النصي بإجراء مقارنة أو مزامنة فعالة للشبكة والوقت بين اثنين
ربما طاولات كبيرة في كيو, MySQL or سكليتي قواعد البيانات ، وذلك للكشف عن إدراجها ،
المجموعات المحدثة أو المحذوفة بين هذه الجداول. الخوارزمية فعالة خاصة إذا
الفروق المتوقعة صغيرة نسبيًا.
التنفيذ عام تمامًا: مفاتيح متعددة الأعمدة (ولكن يجب أن يكون هناك مفتاح!) ، لا
افتراض أنواع البيانات الأخرى التي يمكن تحويلها إلى نص ، يمكن أن تكون مجموعة فرعية من الأعمدة
تستخدم للمقارنة ، والتعامل مع القيم الفارغة ...
يركز هذا البرنامج النصي على خوارزمية المقارنة ، وبالتالي العديد من الخيارات. حقيقة ذلك
قد تفعل أي شيء مفيد ، مثل التحقق من أن أداة النسخ تتكرر بالفعل
البيانات الخاصة بك ، أو مثل الجداول المتزامنة ، هو مجرد أثر جانبي.
OPTIONS
تسمح الخيارات بطلب المساعدة أو تعديل بعض المعايير الداخلية. حرف واحد قصير
الخيارات متاحة أيضًا ، عادةً مع الحرف الأول من اسم الخيار.
"--aggregate = (sum | xor)" أو "-a (sum | xor)"
وظيفة التجميع لاستخدامها في الملخصات أيضًا XOR or مجموع. يجب أن تعمل على
نتيجة دالة المجموع الاختباري. بالنسبة إلى PostgreSQL و SQLite ، فإن ملف XOR مجموع
يحتاج إلى تحميل. توجد مشكلة موقعة / غير موقعة على تجزئة المفتاح عند الاستخدام XOR
لمقارنة الجداول على MySQL أو SQLite مقابل PostgreSQL. نحن نقدم "ISUM" جديد
إجمالي لـ SQLite لأن كلاً من "SUM" و "TOTAL" يقومان ببعض المعالجة غير المتوافقة مع
عدد صحيح يفيض.
الافتراضي هو مجموع لأنه متاح افتراضيًا ويعمل في الوضع المختلط.
"- مهمة تمرير"
اسأل عن كلمات المرور بشكل تفاعلي. راجع أيضًا خيار "--env-pass" أدناه.
الافتراضي هو عدم طلب كلمات المرور.
"- غير متزامن" أو "-A" أو "- غير متزامن" أو "-X"
ما إذا كان سيتم تشغيل الاستعلامات غير المتزامنة أم لا. هذا يوفر بعض التوازي ، ولكن الاثنين
تكون الاتصالات متزامنة بشكل أو بآخر لكل استعلام.
الافتراضي هو استخدام الاستعلامات غير المتزامنة لتمكين بعض التوازي.
"--checksum-computation = (إنشاء | إدراج)" أو "--cc = ..."
كيفية إنشاء جدول المجموع الاختباري. يستخدم خلق لاستخدام "إنشاء ... AS SELECT ..."
الاستعلام أو أدخل لاستخدام استعلام "إنشاء ... ؛ إدراج ... تحديد ...". الوصية السابقة
تتطلب عدًا إضافيًا للحصول على حجم الجدول ، لذلك في النهاية هناك اثنان
الاستفسارات على أي حال. هناك مشكلة في حجم النوع مع أدخل إستراتيجية على MySQL و
يجب أن يكون طول سلسلة المفاتيح المتراكمة أقل من 64 بايت.
الافتراضي هو خلق لأنه يعمل دائمًا مع قاعدتي البيانات.
"--checksum-function = fun" أو "--cf = fun" أو "-c fun"
يمكن استخدام دالة المجموع الاختباري أيضًا ck, اتحاد النقابات الهولندي or md5. بالنسبة إلى PostgreSQL و MySQL و SQLite ، فإن
المقدمة ck و اتحاد النقابات الهولندي يجب تحميل وظائف المجموع الاختباري في قواعد البيانات الهدف.
Choosing md5 لا يأتي مجانًا أيضًا: يجب تحميل وظائف المصبوب المقدمة
في قواعد البيانات المستهدفة والحساب أكثر تكلفة.
الافتراضي هو ck، وهو سريع ، خاصة إذا كانت العملية مرتبطة بوحدة المعالجة المركزية و
عرض النطاق الترددي مرتفع بشكل معقول.
"--checksum-size = n" أو "--check-size = n" أو "--cs = n" أو "-zn"
يجب أن يكون حجم المجموع الاختباري للبطاقات 2, 4 or 8 بايت. حجم المجموع الاختباري للمفتاح هو دائمًا 4 بايت
طويل.
الافتراضي هو 8، بحيث يكون الاحتمال السلبي الخاطئ منخفضًا جدًا. يجب ألا يكون هناك
سبب لتغيير ذلك.
"--تنظيف"
قم بإسقاط المجموع الاختباري وجداول التلخيص مسبقًا. مفيد بعد الجري مع "--لا مؤقت" و
"- no-clear" ، تُستخدم عادةً لتصحيح الأخطاء.
الافتراضي هو عدم الإفلات لأنه ليس هناك حاجة إليه.
"--واضح"
إسقاط المجموع الاختباري وجداول الملخص بشكل صريح بعد الحساب. لاحظ أنهم كذلك
تم إسقاطها ضمنيًا افتراضيًا عند إغلاق الاتصال لأنها مؤقتة ، راجع
خيار "- (- لا) - مؤقت". هذا الخيار مفيد في التصحيح.
الافتراضي هو ليست لمسح المجموع الاختباري وجداول الملخص بشكل صريح ، لأنه ليس كذلك
الحاجة.
"--debug" أو "-d"
ضبط وضع التصحيح. كرر ذلك مع مستويات تصحيح أخطاء أعلى. انظر أيضا "- الإسراف". احذر من ذلك
يتم تخطي بعض الإجراءات الآمنة حول إعدادات الخيارات أثناء التصحيح للسماح بالاختبار
تحت ظروف مختلفة.
الافتراضي هو عدم التشغيل في وضع التصحيح.
"--env-pass = 'var'"
خذ كلمة مرور من متغيرات البيئة "var1" أو "var2" أو "var" للاتصال الأول ،
اثنان أو كلاهما. يتم تجربة ذلك قبل السؤال بشكل تفاعلي إذا تم أيضًا تعيين "--ask-pass".
الافتراضي هو عدم البحث عن كلمات المرور من متغيرات البيئة.
"--expect n" أو "-en"
العدد الإجمالي للاختلافات المتوقعة (التحديثات والحذف والإدراج). هذا الخيار هو
تستخدم فقط لاختبارات عدم الانحدار. راجع قسم الاختبارات.
"- عامل الطي = 7" أو "-f 7"
عامل الطي: سجل 2 لعدد الصفوف المجمعة معًا في كل مرحلة ، بدءًا من
من الأوراق بحيث تجمع الجولة الأولى دائمًا أكبر عدد ممكن من السجلات. ال
تسمح قوة اثنين للشخص باستخدام الحسابات المقنعة. الحد الأدنى لقيمة 1 يبني a
شجرة ثنائية.
سجل عامل الطي الافتراضي 2 هو 7، أي حجم 128 طية. تم اختيار هذه القيمة الافتراضية
بعد بعض الاختبارات الأساسية على الحالات متوسطة الحجم ذات النطاق الترددي المتوسط أو المنخفض. قيم من
يجب أن يكون 4 إلى 8 اختيارًا معقولًا لمعظم الإعدادات.
"--help" أو "-h"
عرض تعليمات قصيرة.
"--key-checkum = 'kcs'" أو "--kcs = ..."
استخدم سمة المجموع الاختباري الرئيسية لهذا الاسم ، والتي يجب أن تكون متوفرة بالفعل في الجداول
لمقارنة. يتطلب هذا الخيار أيضًا الخيار "- المجموع الاختباري الممتاز". راجع أيضًا ملف
قسم الأمثلة أدناه لكيفية تعيين مشغل المجموع الاختباري. ضع في اعتبارك "--use-key"
بدلاً من ذلك إذا كان لديك بالفعل مفتاح أساسي لعدد صحيح موزع بشكل معقول.
الإعداد الافتراضي هو إنشاء مجاميع اختبارية للمفاتيح والمجموعات بشكل سريع.
"--lock"، "- no-lock"
سواء لقفل الجداول. يؤدي تعيين الخيار صراحة إلى تجاوز الطريقة الافتراضية ذات الاتجاه الواحد
أو آخر. بالنسبة إلى PostgreSQL ، يتطلب هذا الخيار "--transaction" ، والذي يتم تمكينه بواسطة
افتراضي.
الافتراضي يعتمد على العملية الحالية: الجدول هو ليست مقفل للمقارنة ،
و لكنها مقفل للمزامنة.
"--long-read-len = 0" أو "-L 0"
تعيين الحجم الأقصى للكائنات الثنائية الكبيرة التي تم جلبها. حسنًا ، يبدو أنه تم تجاهله على الأقل
بواسطة برنامج تشغيل PostgreSQL.
الافتراضي هو الحفاظ على القيمة الافتراضية التي حددها السائق.
"--man" أو "-m"
عرض صفحة الدليل بشكل تفاعلي في المحطة.
"- النسبة القصوى = 0.1"
أقصى جهد بحث نسبي. يتم إيقاف البحث إذا كان عدد النتائج
أعلى من هذا الحد معبرًا نسبيًا عن حجم الجدول. استخدم 2.0 بلا حدود
(تم حذف جميع المجموعات وإدراج مجموعات جديدة).
الافتراضي هو 0.1، أي يُسمح بفارق إجمالي قدره 10٪ قبل الاستسلام.
"--max-report = n"
أقصى جهد بحث مطلق. يتم إيقاف البحث إذا كان عدد الاختلافات
يتجاوز هذا الحد. في حالة الضبط ، يتم تجاهل خيار "--max-ratio" السابق ،
وإلا يتم حساب الجهد مع النسبة بمجرد معرفة حجم الجدول.
الافتراضي هو حساب العدد الأقصى للاختلافات المبلغ عنها بناءً على
خيار "--max-ratio" ، بحد أدنى 100 اختلاف مسموح به.
"- الحد الأقصى للمستويات = 0"
أقصى عدد من المستويات المستخدمة. يسمح للواحد بقطع الطي. 0 يعني عدم وجود قطع.
سيؤدي تعيين القيمة 1 إلى استخدام جدول المجموع الاختباري فقط ، بدون ملخصات. قيمة
3 أو 4 ستكون معقولة ، لأن المستويات الأخيرة من الشجرة جيدة بالنسبة لـ
صيغة التعقيد النظري ، ولكن لا تحسن الأداء في الممارسة.
الافتراضي هو 0.
"--null = 'text'"
كيفية التعامل مع القيم الفارغة. أيضاً مزيج لتجزئة جميع القيم ، حيث يكون لـ NULL قيمة خاصة واحدة
قيمة التجزئة أو نص حيث يتم استبدال القيم الفارغة بسلسلة "NULL".
الافتراضي هو نص لأنها أسرع.
"--option" أو "-o"
إظهار ملخص الخيار.
"--pg-copy = 128"
خيار تجريبي لاستخدام نسخة PostgreSQL بدلاً من INSERT / UPDATE عندما
مزامنة ، بأجزاء من الحجم المحدد.
"--prefix = 'pgc_cmp'"
بادئة الاسم ، ربما تكون مؤهلة للمخطط ، وتستخدم لجداول المقارنة التي تم إنشاؤها بواسطة
إلحاق الأرقام به. ضع في اعتبارك تغيير البادئة إذا كنت تتوقع عدة
مقارنات لتعمل في نفس الوقت على نفس قاعدة البيانات.
الافتراضي هو "pgc_cmp". تسمى طاولات Cheksum "pgc_cmp_1_0" و "pgc_cmp_2_0" ، و
تتم تسمية جداول الملخص عن طريق زيادة الرقم الأخير.
"--report"، "- no-report"
الإبلاغ عن مفاتيح مختلفة إلى stdout كما تم العثور عليها.
الافتراضي هو الإبلاغ.
"- فاصل = '|'" أو "-s '|'"
يتم استخدام سلسلة أو حرف فاصل عند ربط الأعمدة الرئيسية للحوسبة
اختباري.
افتراضات لأنبوب '|' شخصية.
"- الحجم = n"
افترض هذه القيمة كحجم الجدول. يكفي أن تؤدي الخوارزمية
حسنًا ، هذا الحجم بترتيب الحجم الفعلي للجدول.
الافتراضي هو الاستعلام عن أحجام الجدول ، والتي يتم تخطيها إذا تم تعيين هذا الخيار.
"--source-1 = 'DBI: ...'" ، "--source-2 = '...'" أو "-1 '...'" ، "-2 '...'"
تحكم بشكل كامل في مواصفات مصدر بيانات DBI وتجاهل المقارنة في الغالب
جزء المصادقة من عناوين URL المصدر أو الهدف. يمكن للمرء التواصل مع
"DBI: Pg: service = backup" ، استخدم برنامج تشغيل بديل ، اضبط أي خيار يسمح به
driver ... راجع أدلة "DBD :: Pg" و "DBD: mysql" للتعرف على الخيارات المختلفة التي يمكن
مجموعة من خلال مواصفات مصدر البيانات DBI. ومع ذلك ، حدد خادم قاعدة البيانات
في عنوان URL يجب أن يكون متسقًا مع مواصفات المصدر هذا حتى تكون طلبات البحث "
النحو هو الصحيح.
الافتراضي هو الاعتماد على اثنين من وسيطات URL.
"--skip-inserts" ، "--skip-updates" ، "--skip-deletes"
عند المزامنة ، لا تقم بإجراء هذه العمليات.
الافتراضي تحت "--synchronize" هو القيام بجميع العمليات.
"--stats = (txt | csv)"
عرض إحصائيات مختلفة حول المقارنة التي تم إجراؤها بهذا التنسيق. أيضا ، الخيار
يعطي "--stats-name" اسمًا للاختبار ، وهو مفيد لإنشاء ملفات csv التي ستكون كذلك
تتم معالجتها تلقائيًا.
الافتراضي هو ليست لعرض الإحصائيات ، لأنها تتطلب عمليات مزامنة إضافية و
ليس بالضرورة أن يثير اهتمام المستخدم.
"--synchronize" أو "-S"
قم بالفعل بإجراء عمليات لمزامنة الجدول الثاني الوارد في الجدول الأول. إذا كلا
في الحقيقة ، إنه مجرد تشغيل جاف. يتم ذلك في الواقع إذا أضفت "- افعل ذلك" أو "-د". يحفظ
بياناتك قبل محاولة أي شيء من هذا القبيل!
الافتراضي هو عدم المزامنة.
"- مؤقتة" ، "- غير مؤقتة"
ما إذا كان سيتم استخدام الجداول المؤقتة. إذا لم تقم بذلك ، فسيتم الاحتفاظ بالجداول افتراضيًا في
النهاية ، لذلك سيتعين حذفها يدويًا. راجع خيار "- واضح" لطلب ملف
تنظيف. هذا الخيار مفيد في التصحيح.
الافتراضي هو استخدام الجداول المؤقتة التي يتم محوها تلقائيًا عند ملف
الاتصال مغلق.
"- unlogged"، "- no-unogged"
استخدم الجداول غير المقيدة لتخزين المجاميع الاختبارية. هذه الجداول ليست معاملات ، لذلك
قد يسرع الأمور قليلا. ومع ذلك ، لا يتم تنظيفها تلقائيًا في
نهاية. راجع خيار "- واضح" لطلب التنظيف.
الافتراضي هو عدم استخدام جداول غير مسجلة.
"--thread" أو "-T" أو "- no-thread" أو "-N"
ميزة تجريبية للغاية.
حاول استخدام الخيوط لإجراء العمليات الحسابية بالتوازي ، مع بعض الخزعبلات لأن
نموذج مؤشر ترابط بيرل لا يعمل بشكل جيد مع DBI. خيوط بيرل ثقيلة نوعًا ما
وبطيئة ، مثل عمليات التواصل أكثر من الخيوط خفيفة الوزن ، حقًا.
هذا لا يعمل على الإطلاق مع PostgreSQL. إنه يعمل جزئيًا مع MySQL ، في
ثمن إيقاف "- معاملة".
الافتراضي هو ليست لاستخدام الخيوط ، لأنه لا يعمل مع جميع قواعد البيانات.
"- timeout n"
مقارنة المهلة بعد ثانية "n".
الافتراضي هو عدم وجود مهلة. كن صبوراً.
"- معاملة" ، "- بدون معاملة"
ما إذا كان سيتم التفاف الخوارزمية بأكملها في معاملة واحدة.
الافتراضي هو استخدام معاملة التفاف ، حيث يبدو أنها أسرع وأكثر أمانًا
القيام بذلك.
"--tuple-checkum = 'tcs'" أو "--tcs = ..."
استخدم سمة المجموع الاختباري tuple لهذا الاسم ، والتي يجب أن تكون متاحة بالفعل في ملف
جداول للمقارنة. يتطلب هذا الخيار أيضًا تعيين إما "--use-key" أو
"--key-checkum = ..." أعلاه. يجب ألا تظهر سمات المجموع الاختباري المتوفرة في ملف
قوائم أعمدة المفتاح والقيمة. راجع أيضًا قسم الأمثلة أدناه للتعرف على كيفية تعيين ملف
الزناد الاختباري.
الإعداد الافتراضي هو إنشاء مجاميع اختبارية للمفاتيح والمجموعات بشكل سريع.
"--use-key" أو "-u"
ما إذا كان سيتم استخدام قيمة المفتاح مباشرةً لتوزيع المجموعات بين الفروع. ال
يجب أن يكون المفتاح بسيطًا وعددًا صحيحًا وليس فارغًا وموزعًا بالتساوي. اذا كان لديك
نشر المفتاح الأساسي لعدد صحيح بشكل معقول ، فكر في استخدام هذا الخيار لتجنب نصف
حسابات تجزئة الجدول الاختباري.
الافتراضي هو تجزئة المفتاح ، وذلك للتعامل مع أي نوع وتكوين وتوزيع.
"--use-null" ، "- no-use-null"
ما إذا كان سيتم استخدام المعلومات التي تم التصريح عن عمود بأنه ليس فارغًا للتبسيط
العمليات الحسابية عن طريق تجنب استدعاءات COALESCE لمعالجة القيم الفارغة.
الافتراضي هو استخدام هذه المعلومات ، بسعر الاستعلام عن البيانات الوصفية لجدول البيانات.
"- الإسراف" أو "-v"
كن واسعا بشأن ما يحدث. كلما طلبت أكثر ، كلما زادت الإسهاب.
الافتراضي هو أن تكون هادئًا ، حتى تبرز التحذيرات أو الأخطاء المحتملة.
"--version" أو "-V"
إظهار معلومات الإصدار والخروج.
"- Where = ..."
شرط SQL المنطقي في مجموعات الجدول للمقارنة الجزئية. مفيد لتقليل
تحميل إذا كنت تعلم أن الاختلافات المتوقعة في بعض أجزاء البيانات الخاصة بك ، قل هؤلاء
مختوم الوقت اليوم ... نفس الشرط يتم تمريره على كلا الجانبين ، لذلك يجب أن كلا الجدولين
أن تكون متشابهة جدًا بحيث تعمل. هذا هو الحال عادة.
الافتراضي هو مقارنة الجداول بأكملها.
الحجج
تصف الوسيطتان اتصالات قاعدة البيانات باستخدام بناء الجملة التالي المشابه لعنوان URL ، حيث
الأقواس المربعة تشير إلى الأجزاء الاختيارية. العديد من الأجزاء اختيارية مع الإعداد الافتراضي. الحد الأدنى
المواصفات الصحيحة نحويًا هي "/" ، لكن هذا لا يعني شيئًا ضروريًا
مفيد.
[سائق: //] [تسجيل الدخول [: تمرير] @] [مضيف] [: منفذ] / [قاعدة / [[مخطط.] جدول [؟ مفتاح [: cols]]]]
راجع قسم الأمثلة أدناه ، وكذلك خيارات "--source- *" أعلاه.
لاحظ أنه قد يتم تغيير بعض القيمة الافتراضية المستخدمة بواسطة برامج تشغيل DBI حسب برنامج التشغيل المحدد
متغيرات البيئة ، وأن DBI يوفر أيضًا الإعدادات الافتراضية الخاصة به والتجاوزات ، وماذا في ذلك
قد لا يكون الأمر واضحًا دائمًا. القيم الافتراضية لعنوان URL الثاني هي في الغالب
مأخوذ من عنوان URL الأول.
سائق
سائق قاعدة البيانات للاستخدام. يستخدم pgsql لـ PostgreSQL ، ك لـ MySQL ، سكليتي لـ SQLite.
يمكن مقارنة قواعد البيانات غير المتجانسة ومزامنتها ، ولكن احذر من ذلك دقيقًا
قد تمنع مشكلات الكتابة والتشفير والصب المقارنات غير المتجانسة أو
المزامنة للنجاح. الافتراضي هو pgsql لأول اتصال ، ونفس الشيء
الأول والثاني.
بالنسبة لـ SQLite ، من المتوقع أن يكون جزء المصادقة لعنوان URL (تسجيل الدخول ، المرور ، المضيف ، المنفذ)
ليكون فارغًا ، يجب أن يبدو عنوان URL الكامل بالشكل التالي:
sqlite: ///base.db/table؟ مفتاح ، العمود: أخرى ، أعمدة
علاوة على ذلك ، يتم تعيين متغير البيئة PGC_SQLITE_LOAD_EXTENSION مع
":" - تقوم ملفات الكائنات المشتركة المنفصلة بتحميلها في SQLite.
تسجيل الدخول
تسجيل الدخول لاستخدامه عند الاتصال بقاعدة البيانات. الافتراضي هو اسم المستخدم لأول اتصال ،
ونفس الاتصال الأول للثانية.
pass
كلمة المرور لاستخدامها عند الاتصال بقاعدة البيانات. لاحظ أن وضع ملف
كلمة المرور كوسيطة أمر. الافتراضي هو لا شيء للاتصال الأول ، و
نفس كلمة المرور الخاصة بالاتصال الأول للثانية if الاتصال يستهدف
نفس المضيف والمنفذ ويستخدم نفس تسجيل الدخول. راجع أيضًا "--ask-pass" و "--env-pass"
خيارات.
مضيف
اسم المضيف أو IP للاتصال به. الافتراضي هو السلسلة الفارغة ، مما يعني الاتصال بـ
قاعدة البيانات على المضيف المحلي بمقبس UNIX.
ميناء
منفذ TCP-IP للاتصال به. الافتراضي هو 5432 لـ PostgreSQL و 3306 لـ MySQL.
قاعدة
كتالوج قاعدة البيانات للاتصال به. الافتراضي هو اسم المستخدم لأول اتصال. الافتراضي هو
نفس الاتصال الأول للاتصال الثاني. بالنسبة لـ SQLite ، قم بتوفير ملف قاعدة البيانات
اسم. المسار نسبي افتراضيًا ، ولكن يمكن جعله مطلقًا بإضافة ملف
إضافي '/':
سكلايت: ////var/cache/sqlite/base.db/table؟ ...
جدول مخطط
الجدول الذي من المحتمل أن يكون مؤهلًا للمخطط لاستخدامه في المقارنة. لا يوجد تقصير لأول مرة
اتصال. الافتراضي هو نفس الاتصال الأول للاتصال الثاني.
لاحظ أن MySQL لا يحتوي على ملفات المخططات، ولكن الغريب بما فيه الكفاية قاعدة بيانات المفهوم
تماما مثل مخطط، لذلك لا تمتلك MySQL حقًا قواعد البيانات، على الرغم من وجود
شيء من هذا الاسم. هل أنا واضح؟
مفاتيح
قائمة بأعمدة المفاتيح مفصولة بفواصل. الافتراضي هو المفتاح الأساسي للجدول لأول مرة
اتصال. الافتراضي هو نفس الاتصال الأول للاتصال الثاني. المفتاح
لا تستطيع كن فارغا. إذا لم يكن لديك طريقة لتحديد مجموعاتك ، فلا يوجد
نقطة في البحث عن الاختلافات.
العواميد
قائمة أعمدة مفصولة بفواصل للمقارنة. قد تكون فارغة. الافتراضي هو كل الأعمدة ولكن
مفاتيح لأول اتصال. الافتراضي هو نفس الاتصال الأول للاتصال الثاني.
احذر من أن "...؟ مفتاح:" يعني أعمدة فارغة ، بينما "...؟ مفتاح" يعين الافتراضي بواسطة
الاستعلام عن جدول البيانات الوصفية.
أمثلة
قارن جداول كالفين وهوبز في عائلة قاعدة البيانات على المضيف المحلي ، مع المفتاح id والأعمدة
c1 و c2:
./pg_comparator / family / calvin؟ id: c1، c2 / family / hobbes
قارن الجداول كالفن في قاعدة البيانات الافتراضية على المضيف المحلي ونفس الجدول افتراضيًا
قاعدة بيانات على السابلونات ، مع مفتاح id والعمود البيانات:
./pg_comparator localhost / family / calvin؟ id: data sablons /
مزامنة جدول "المستخدم" في قاعدة البيانات "ويكيبيديا" من MySQL على "server1" إلى PostgreSQL على
"الخادم 2".
./pg_comparator -S -D - مهمة تمرير \
mysql: // calvin @ server1 / ويكيبيديا / مستخدم pgsql: // hobbes @ server2 /
بالنسبة إلى PostgreSQL ، يمكنك إضافة مجاميع اختبارية لمفتاح المشغّل والمجموعة الاختبارية على النحو التالي:
- TABLE Foo (id SERIAL PRIMARY KEY، data ... NOT NULL) ؛
- إضافة سمات المجموع الاختباري للمفاتيح والمجموعات
- يمكن تخطي المجموع الاختباري للمفتاح إذا كنت تستخدم --use-key ،
- التي يجب أن يكون المفتاح فيها عددًا صحيحًا بسيطًا غير فارغ.
تغيير الجدول فو
إضافة COLUMN key_cs INT4 ليس NULL افتراضيًا 0 ،
إضافة COLUMN tup_cs INT8 ليس NULL افتراضيًا 0 ؛
- وظيفة لتحديث المجموع الاختباري للمجموعة
- إذا كانت بعض السمات لاغية ، فيجب دمجها
إنشاء وظيفة foo_cs () يعيد المشغل كـ $$
ابدأ
- حساب المجموع الاختباري للمفاتيح
NEW.key_cs = cksum4 (NEW.id) ،
- حساب المجموع الاختباري tuple
NEW.tup_cs = cksum8 (NEW.id || '|' || NEW.data) ؛
عودة جديدة ؛
نهاية؛ $$ LANGUAGE plpgsql؛
- ضبط الزناد لاستدعاء وظيفة تحديث المجموع الاختباري
إنشاء الزناد foo_cs_trigger
قبل التحديث أو الإدراج على Foo
لكل إجراء تنفيذي للصف foo_cs () ؛
- إذا لم يكن table Foo فارغًا في البداية ،
- تحديث محتوياته لبدء حسابات المجموع الاختباري
تحديث Foo SET id = id ؛
ثم يمكن إجراء مقارنة سريعة ، والتي لا تحتاج إلى حساب جدول المجموع الاختباري الأولي
طلبت مع:
./pg_comparator --tcs = tup_cs --kcs = key_cs \
admin @ server1 / app / Foo؟ id: data hobbes @ server2 /
نظرًا لأن المفتاح الأساسي هو عدد صحيح بسيط ، فإن key_cs يمكن تركها والمقارنة
يمكن إطلاقه باستخدام:
./pg_comparator --tcs = tup_cs --use-key \
admin @ server1 / app / Foo؟ id: data hobbes @ server2 /
OUTPUT
يتكون إخراج الأمر من سطور تصف الاختلافات الموجودة بين
جدولين. يتم التعبير عنها من حيث عمليات الإدراج أو التحديثات أو الحذف و tuple
مفاتيح.
قم k
القفل k يتم تحديث tuple من الجدول 1 إلى الجدول 2. وهو موجود في كلا الجدولين مع
قيم مختلفة.
INSERT k
القفل k لا يظهر tuple في الجدول 2 ، ولكن فقط في الجدول 1. يجب إدخاله فيه
الجدول 2 لمزامنته جدول wrt 1.
حذف k
القفل k يظهر tuple في الجدول 2 ، ولكن ليس في الجدول 1. يجب حذفه من 2 إلى
مزامنة الجدول wrt 1.
في حالة تضارب المجموعة الاختبارية ، قد تحدث نتائج سلبية خاطئة. تغيير
ستساعد وظيفة المجموع الاختباري في مثل هذه الحالات. انظر قسم التحليل الفرعي.
التبعيات
هناك حاجة لثلاث وظائف دعم في قاعدة البيانات:
1.
تعتني الدالة "COALESCE" بالقيم الفارغة في الأعمدة.
2.
يجب استخدام دالة المجموع الاختباري لتقليل قيم المفاتيح والأعمدة وتوزيعها. ممكن
يمكن تغييرها باستخدام خيار "- checksum". يمكن تحديد حجمها بامتداد
خيار "--checksize" (حاليًا 2 أو 4 أو 8 بايت). تتطلب المجاميع الاختبارية أيضًا أن تكون الممثلين
تحويلها إلى أعداد صحيحة بأحجام مختلفة.
تتوفر تطبيقات مناسبة لـ PostgreSQL ويمكن تحميلها في الخادم
من خلال معالجة "share / Contrib / pgc_checksum.sql" و "share / Contrib / pgc_casts.sql". جديد
تتوفر أيضًا المجاميع الاختبارية والقوالب لـ MySQL ، راجع "mysql _ *. sql". قابل للتحميل
تنفيذ وظائف المجموع الاختباري المناسبة متاح أيضًا لـ SQLite ، انظر
"sqlite_checksum. *".
يعتمد المجموع الاختباري "ck" على تجزئة Jenkins و
التي تعتمد على عمليات الجمع والإزاحة والعدد الصحيح البسيط. المجموع الاختباري "fnv" هو
مستوحى من تجزئة FNV (64 بت 1 أ
الإصدار) الذي يستخدم عمليات xor والأعداد الصحيحة المتعددة ، على الرغم من أنني أضفت أيضًا بعض التحول
وإضافة للمساعدة في تعديل البتات العالية.
3.
يتم استخدام دالة تجميعية لتلخيص المجاميع الاختبارية لمجموعة من الصفوف. يجب
تعمل على نتيجة دالة المجموع الاختباري. يمكن تغييره مع
خيار "- مجمّع".
تتوفر تطبيقات مناسبة لمجموع حصري أو "xor" لـ PostgreSQL
ويمكن تحميلها في الخادم عن طريق معالجة "share / Contrib / xor_aggregate.sql".
يوفر ملف "sqlite_checksum. *" أيضًا مجموعتي "xor" و "sum" لـ SQLite التي
متوافقة مع قواعد البيانات الأخرى.
علاوة على ذلك ، فإن العديد من وحدات perl مفيدة لتشغيل هذا النص البرمجي:
· "Getopt :: Long" لإدارة الخيارات.
· "DBI" و "DBD :: Pg" للاتصال بـ PostgreSQL و "DBD :: mysql" للاتصال بـ MySQL و
"DBD :: SQLite" للاتصال بـ SQLite.
• "Term :: ReadPassword" لخيار "مهمة تمرير".
· "Pod :: Usage" للاستخراج الذاتي للمستندات ("- man" "--opt" "- help").
"المواضيع" للنسخة التجريبية مترابطة مع الخيار "- خيوط".
ملخص:: MD5 لمجموع اختباري md5 مع سكليتي.
يتم تحميل الوحدات النمطية بواسطة البرنامج النصي فقط إذا كانت مطلوبة بالفعل.
الخوارزمية
الهدف من الخوارزمية هو مقارنة محتوى جدولين ، ربما في جدولين مختلفين
الخوادم البعيدة ، مع الحد الأدنى من حركة مرور الشبكة. يتم تنفيذه على ثلاث مراحل.
1.
يتم حساب جدول المجموع الاختباري على كل جانب للجدول الهدف.
2.
يتم حساب جدول ملخص مستوى القبضة على كل جانب عن طريق تجميع أجزاء من
جدول اختباري. ثم يتم تنفيذ مستويات أخرى من التجميعات الموجزة حتى الوصول إليها
صف واحد فقط في الجدول الأخير ، والذي يخزن بعد ذلك المجموع الاختباري العالمي للكل
الجداول المستهدفة الأولية.
3.
بدءًا من جداول الملخص العلوية ، تتم مقارنة المجاميع الاختبارية المجمعة من كليهما
الجوانب للبحث عن الاختلافات ، وصولاً إلى جدول المجموع الاختباري الأولي. مفاتيح الاختلاف
يتم عرض مجموعات.
اختباري الجدول
المرحلة الأولى تحسب جدول المجموع الاختباري الأولي T(0) على كل جانب. افترض أن مفتاح
هي أعمدة الجدول الرئيسية ، و العواميد هي أعمدة بيانات الجدول التي سيتم التحقق منها
الاختلافات ، ثم يتم تنفيذها عن طريق الاستعلام عن الجدول الهدف T على النحو التالي:
إنشاء الجدول T(0) أ
SELECT key AS pk، - المفتاح الأساسي
المجموع الاختباري (مفتاح) AS kcs ، - المجموع الاختباري للمفتاح
المجموع الاختباري (مفتاح || العواميد) AS tcs - المجموع الاختباري للمجموعة
من ر ؛
يتم الاحتفاظ بالمفتاح الأولي ، حيث سيتم استخدامه لإظهار المفاتيح المختلفة في النهاية. ال
عقلاني ل KCS العمود هو التوزيع العشوائي للقيم الرئيسية لتحقيق التوازن
المجاميع في المرحلة التالية. يجب أن يظهر المفتاح في المجموع الاختباري أيضًا ، وإلا المحتوى
تبادل بين مفتاحين لن يتم الكشف عنها في بعض الحالات.
ملخص الجداول
نقوم الآن بحساب مجموعة من جداول الملخص المتتالية عن طريق التجميع f (عامل الطي) الاختباري
معًا في كل مرحلة. يعتمد التجميع على قناع على ملف KCS العمود لاتخاذ
الاستفادة من التوزيع العشوائي الاختباري. بدءا من P = 0 نحن نبني:
إنشاء جدول T (p + 1) AS
حدد kcs & القناع (p + 1) AS kcs ، - مجموعة فرعية من المجموع الاختباري للمفتاح
XOR (tcs) AS tcs - ملخص المجموع الاختباري للمجموعة
من T (ع)
تجميع حسب kcs & القناع (p + 1) ؛
يتم تعريف القناع (p) بحيث يتم تجميعها معًا في المتوسط f الاختباري معا: قناع(0)
= ceil2 (الحجم) ؛ قناع (ع) = قناع (ف 1) / و ؛ هذا يؤدي إلى تسلسل هرمي للجداول ، كل واحد منها
ملخص أصغر للملخص السابق:
مستوى 0
جدول اختباري المقاس الصفوف ، أي عدد الصفوف مثل الجدول الهدف.
مستوى 1
جدول الملخص الأول ، (الحجم / f) الصفوف.
مستوى p
جدول الملخص الوسيط ، (size / f ** p) الصفوف.
مستوى N-1
واحد قبل آخر جدول ملخص ، أقل من f من الصفوف.
مستوى n
جدول الملخص الأخير ، القناع هو 0 ، 1 صف.
من المهم أن يتم استخدام الأقنعة نفسها على كلا الجانبين بحيث يتم استخدام التجميعات
نفس الشيء ، مما يسمح بمقارنة المحتويات المطابقة على كلا الجانبين.
ابحث لأي اختلافات
بعد بناء كل طاولات الدعم هذه على كلا الجانبين ، يأتي البحث عن الاختلافات.
عند التحقق من ملخص المجموع الاختباري للجداول الأخيرة (المستوى n) مع صف واحد فقط ، فهو كذلك
مقارنة بين المجموع الاختباري لمحتويات الجدول بالكامل. إذا تطابقوا ، إذن
كلا الجدولين متساويين ، وقد انتهينا. خلاف ذلك ، إذا كانت هذه المجاميع الاختبارية تختلف ، فبعضها
هناك حاجة إلى التحقيق لاكتشاف المفاتيح المخالفة.
يتم إجراء التحقيق من خلال النزول في التسلسل الهرمي للجدول والبحث عن الكل KCS
التي كان هناك اختلاف في المجموع الاختباري عن المستوى السابق. نفس الاستعلام هو
يتم إجراؤها على كلا الجانبين في كل مرحلة:
حدد kcs، tcs
من T (ع)
أين kcs & القناع (p + 1) IN (kcs-with-diff-checkums-from-level-p + 1)
ORDER BY kcs [وعلى المستوى 0:، id]؛
ويتم دمج النتائج من كلا الجانبين معًا. عند القيام بإجراء الدمج ، أربعة
يمكن أن تنشأ الحالات:
1.
يبلغ قطر كلاً من KCS و TCS مباراة. ثم لا يوجد فرق.
2.
بالرغم ان KCS لا يتطابق ، TCS لا. ثم هذا KCS هو التحقيق في اليوم التالي
المستوى ، حيث يختلف ملخص المجموع الاختباري. إذا كنا بالفعل في المستوى الأخير ، فعندئذٍ
يمكن إظهار المفتاح المخالف.
3.
لا KCS مباراة واحدة تكميلية KCS في الجانب الأول. ثم هذا KCS تتوافق مع
مفتاح (مفاتيح) يجب إدخالها لمزامنة الجدول الثاني المكتوب الأول.
4.
لا KCS مباراة واحدة تكميلية KCS في الجانب الثاني. ثم هذا KCS تتوافق مع
المفتاح (المفاتيح) التي يجب حذفها لمزامنة الجدول الثاني المكتوب الأول.
الحالتان 3 و 4 متماثلتان ببساطة ، وهو مجرد تفسير لتقرير ما إذا كان
إنه إدراج أو حذف ، مع أخذ الجانب الأول كمرجع.
تحليل
اسمحوا n يكون عدد الصفوف ، r حجم الصف ، f عامل الطي ، k عدد من
الاختلافات التي يجب اكتشافها ، c حجم المجموع الاختباري بالبتات ، ثم تحديد التكاليف
الاختلافات ومعدل الخطأ هو:
شبكة حجم
أفضل من ك * و * سقيل (سجل (ن) / سجل (و)) * (ج + سجل (ن)). محتويات k كتل من الحجم f
على عمق الشجرة ، ويكون كل معرف كتلة بحجم تسجيل (ن) و
يحتوي على المجموع الاختباري c. إنه مستقل عن r، و انت تريد ك << ن. حجم ملف
طلبات SQL حول ك * تسجيل (ن) * سقف (سجل (ن) / سجل (و))، كقائمة غير متطابقة
اختبارية ك * تسجيل (ن) يمكن سحبها على عمق الشجرة.
عدد of طلبات (على كل جانب، القادم خوارزمية is متماثل)
الحد الأدنى 6 + سقف (تسجيل (ن) / سجل (و)) للجداول المتساوية ، الحد الأقصى هو 6 + 2 * سقف (تسجيل (ن) / سجل (و)).
أسطوانة I / O حركة المرور
حوالي n * r + n * ln (n) * (f / (f-1)).
زائف سلبي الاحتمالات
أي يعتبر جزء من الجداول متساويًا على الرغم من اختلافهما. مع
دالة المجموع الاختباري المثالية ، هذا هو احتمال تضارب المجموع الاختباري في أي نقطة
حيث تم حسابها ويجب أن تكون مختلفة: حول
ك * سقف (تسجيل (ن) / سجل (و)) * 2 ** - ج. بالنسبة لجدول مليون صف ، من المتوقع أن يتغير 1000 مع امتداد
قيم معلمات الخوارزمية الافتراضية ، هذا عن 2 10 ** * 3/2 ** 64، هذا حوالي واحد
فرصة في 2 52 ** أشواط دمج.
كلما انخفض عامل الطي f كان ذلك أفضل بالنسبة لحجم الشبكة ، ولكن كلما ارتفع حجم
أفضل بالنسبة لعدد الطلبات وإدخال / إخراج القرص: اختيار f هي مقايضة.
كلما انخفض حجم المجموع الاختباري c، كان ذلك أفضل بالنسبة لحجم الشبكة ، ولكن الأسوأ بالنسبة إلى
احتمال سلبي خاطئ.
إذا كان النطاق الترددي المتاح معقولاً ، فمن المرجح أن تكون المقارنة مرتبطة بوحدة المعالجة المركزية:
يتم إنفاق الوقت بشكل أساسي على حساب جدول المجموع الاختباري الأولي. وهكذا إذا كنت كذلك
تخطط للتحقق من الاختلافات في كثير من الأحيان ، ففكر في الاحتفاظ بمجموع اختباري tuple مع
مشغل ، وربما المجموع الاختباري للمفتاح أيضًا ، واستدعاء مع "--tuple-checkum" و
إما "- المجموع الاختباري للمفتاح" أو "--استخدام المفتاح".
التطبيق قضايا
يعطي تطبيق المجموع الاختباري أعدادًا صحيحة ، وهي ذات طول ثابت وسهلة
التلاعب بعد ذلك.
إنّ كافة أنواع عهود الـ XOR يعتبر الركام اختيارًا جيدًا لأنه لا توجد مشكلة تجاوز فيه ، فهو يتطلب
في الاعتبار جميع أجزاء الإدخال ، ويمكن بسهولة تحديدها على أي بيانات ثنائية. ال
مجموع التجميع جيد أيضًا ، لكنه يتطلب نوعًا من نوع عدد صحيح أساسي.
يجب الاهتمام بالقيم الفارغة بشكل مناسب.
يتم أخذ عامل الطي وجميع الوحدات النمطية بقوة اثنين لاستخدام الأقنعة.
هناك إدارة خاصة للقطع الكبيرة من المحذوفات أو الإدخالات التي يتم تنفيذها
على الرغم من عدم تفصيلها في نظرة عامة حول الخوارزمية وتحليل التعقيد.
هناك بعض الجهود لبناء تطبيق متوافق مع PostgreSQL / MySQL لملف
الخوارزمية ، التي أضافت الاختراقات للتعامل مع تحويلات النوع والأشياء الأخرى.
تم اختبار هذا النص بشكل معقول ، ولكن نظرًا لإثبات طبيعة المفهوم ، فهناك الكثير منه
الخيارات التي لا يمكن اختبارها جميعًا.
نوت
إذا كانت الجداول المطلوب مقارنتها موجودة في نفس قاعدة البيانات ، فيمكن لاستعلام SQL بسيط استخراج ملف
اختلافات. جداول بافتراض T1 و T2 بالمفتاح الأساسي id ومحتويات غير فارغة البيانات,
ثم خلافاتهم ، هكذا T2 يختلف عن المرجع T1، تلخيصها
الاستعلام التالي:
حدد التحالف (T1.id ، T2.id) كمفتاح ،
الحالة عندما يكون T1.id فارغًا ثم "حذف"
عندما يكون T2.id فارغًا ، يتم "إدراج"
آخر "تحديث"
إنهاء كعملية
من T1 الانضمام الكامل باستخدام T2 (معرف)
حيث يكون T1.id NULL - احذف
أو T2.id هو NULL - INSERT
أو T1.data <> T2.data - تحديث
المراجع
تم تقديم ورقة في مؤتمر حول هذه الأداة وخوارزميتها: عن بعد مقارنة
of قاعدة البيانات ترابيزات by فابيان كويلهو، في المؤتمر الدولي الثالث للتقدم في
قواعد البيانات والمعرفة وتطبيقات البيانات (DBKDA) ، ص 23-28 ، سانت مارتن ، هولندا
جزر الأنتيل ، يناير 2011. ISBN: 978-1-61208-002-4. حقوق الطبع والنشر IARIA 2011. عبر الإنترنت على Think
عقلhttp://www.thinkmind.org/index.php؟ view = article & articleid = dbkda_2011_2_10_30021>.
الخوارزمية والنص مستوحى من ترويض القادم وزعت قاعدة البيانات المشكلة: A الإطار
برامجنا باستخدام MySQL by جوزيبي ماكسيا in SYS إداري المجلد 13 العدد 8 ، أغسطس 2004 ، الصفحات 29-40. يرى
بيرل مونكسhttp://www.perlmonks.org/index.pl؟ node_id = 381053> للحصول على التفاصيل. في هذه الورقة،
يتم عرض ثلاث خوارزميات. الأول يقارن بين جدولين بمجموع اختباري
تقنية. الثاني يجد اختلافات UPDATE أو INSERT بناءً على 2-level (المجموع الاختباري
والملخص) جدول التسلسل الهرمي. الخوارزمية غير متناظرة ، مثل الاستعلامات المختلفة
أجريت على الجدولين للمقارنة. يبدو أن حجم حركة مرور الشبكة في
ك * (و + (ن / و) + ص)، أنه يحتوي على إجراء دمج احتمالي - عربات التي تجرها الدواب ، وأنه يصنع
افتراضات حول توزيع القيم الأساسية. الخوارزمية الثالثة تبحث عن الحذف
الاختلافات القائمة على العد ، مع الافتراض الضمني بوجود مثل هذه الاختلافات فقط
اختلافات.
على عكس هذا النهج ، تنفذ الخوارزمية المتماثلة لدينا جميع المهام الثلاث
في الحال ، للعثور على UPDATE و DELETE و INSERT بين الجدولين. الاختباري و
يتم إعادة استخدام فكرة المستوى الهرمي الموجز وتعميمها لتقليل الخوارزمية
تعقيد.
من وجهة نظر التنفيذ ، فإن النص هو حدودي بقدر الإمكان مع الكثيرين
خيارات ، ويضع افتراضات قليلة حول هياكل الجدول وأنواعه وقيمه.
استخدم pg_comparator عبر الإنترنت باستخدام خدمات onworks.net
