The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Сравнение таблиц на удаленных серверах PostgreSQL
Пришлось придумать как сравнить довольно таки объемные таблицы на предмет
одинаковости данных в заданном поле.
Сравнивать построчно слишком долго и накладно таскать эти объемы по сети. 
Выход посчитать md5 сумму по колонке для всех значений.

Для этого выбираем поле по которому будем сравнивать, поле должно быть независимым от серверов. 
Делаем из него blob, и считаем md5.

Пример: есть таблица A и поле B.

   select md5(array_send(array(select B from A order by 1))) as md5;

после это сравнив md5 суммы с обоих серверов можно утверждать об одинаковости набора данных.
 
20.03.2009 , Автор: Тормал
Раздел:    Корень / Программисту и web-разработчику / SQL и базы данных / PostgreSQL специфика / Оптимизация и администрирование PostgreSQL

Обсуждение [ RSS ]
 
  • 1.1, Аноним, 14:42, 20/03/2009 [ответить] [смотреть все]
  • +/
    Увы, нельзя утверждать Коллизии никто не отменял ... весь текст скрыт [показать]
     
     
  • 2.2, Aleksey, 14:47, 20/03/2009 [^] [ответить] [смотреть все]  
  • +/
    >Увы, нельзя утверждать. Коллизии никто не отменял.

    Угу. Только в данном случае вероятностью коллизии можно пренебречь. Потому что вероятность получить один хеш для случайных данных почти нулевая. Другое дело, если подбирать данные целенаправленно.

     
  • 1.3, uldus, 15:11, 20/03/2009 [ответить] [смотреть все]  
  • +/
    А если "B" текстовое поле и данных уйма,  от такого PostgreSQL ресурсы не съест ?

    Для текстовых данных лучше еще один вызов md5 добавить:

    select md5(array_send(array(select md5(B) from A order by 1))) as md5;


     
     
  • 2.4, Aleksey, 18:29, 20/03/2009 [^] [ответить] [смотреть все]  
  • +/
    В реальности все намного хуже. Мы же не учитываем порядок и ключ у таблицы. На примере: в первой таблице у Васи 100 рублей, у Пети 200. Во второй - наоборот. Просчет md5 по рублям даст один и тот же результат для этих двух таблиц. Т.е. они типа равны :)

    Поэтому в реальной ситуации надо использовать ключевые поля. Пусть в таблице A два поля - обычное B и ключевое K, тогда

    select md5(array_send(array(select md5('' || K) || md5('' || B) from A order by K))) as md5;

     
     
  • 3.5, Александр Макаренко, 10:41, 22/03/2009 [^] [ответить] [смотреть все]  
  • +/
    Это, наверное, выйдет за рамки задачи, которая стояла перед автором. :) Хотя довольно интересно. Если развивать Вашу идею далее, может выйти функция, обращающаяся к системным таблицам pg_*. :)
     
  • 1.6, Тормал, 19:07, 23/03/2009 [ответить] [смотреть все]  
  • +/
    Ну ни кто не запрещал добавлять дополнительные условия во WHERE. Я только предложил методику. Так как у меня порядка 30 миллионов записей в таблице. Мне нужно было сравнить  наборы данных. И естественно я просматривал некоторые таблиц разбив на сегменты по дате например.
     
     
  • 2.7, konst, 18:15, 24/03/2009 [^] [ответить] [смотреть все]  
  • +/
    1. а что мешает делать вывод поля таблицы в файл (используя нужный order by x,y,z), а далее сравнивать по md5 сами файлы?
    2. играясь опциями LIMIT/OFFSET можно вычислить "тонкое место" (где данные не совпадают), чтобы не таскать по сети большие объемы. а далее использовать diff...
    3. Для этой цели можно написать скриптик, который сам все сделает:
    Напр.:
    1) с помощью limit/offset выгрузит поле в 100 (1000) файликов.
    2) md3sum по ним с рез-тами в файл >> md5_1 (1-й сервер), md5_2 (2-й)
    3) diff md5_1 md5_2
    4) если найдены расхождения - diff по "несовпадающим" файлам...

     
     
  • 3.8, Тормал, 20:43, 24/03/2009 [^] [ответить] [смотреть все]  
  • +/
    Собственно говоря а зачем файлы ?
     
     
  • 4.9, konst, 20:49, 24/03/2009 [^] [ответить] [смотреть все]  
  • +/
    >Собственно говоря а зачем файлы ?

    2 причины:
    1) меньше нагрузка на БД (?)
    2) иногда может потребоваться не только констатировать факт различий, но и найти их...

     
     
  • 5.10, Тормал, 20:57, 24/03/2009 [^] [ответить] [смотреть все]  
  • +/
    LIMIT/OFFSET можно использовать на лету. Дальше поиск делением где различия. Нагрузка на БД как раз будет больше при создании файлов. Так как диск используется дважды. + Сортировка по полям съест тотже объем памяти что и при подсчете md5.
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:

     Добавить заметку
     Версия для печати
     
     Поиск заметки:
     

    Последние заметки
    - 12.05 Организация шифрованного бэкапа с помощью rdiff-backup, encfs и Dropbox
    - 11.05 Настройка беспроводного соединения в Debian GNU/Linux
    - 07.05 Использование Google Drive в Linux
    - 18.04 Использование нескольких сетевых стеков в Linux
    - 15.04 Восстановление стандартного KDE меню после его удаления (например, wine)
    - 11.04 Настройка gmirror при использовании GPT во FreeBSD 9
    - 09.04 Маршрутизатор на базе FreeBSD с приоритизация трафика средствами PF и ALTQ
    - 02.04 Частичное восстановление данных MySQL из бэкапа, созданного с использованием LVM
    - 21.03 Настройка DNSSEC в BIND 9.9
    - 17.03 Набор номера на Cisco IP Phone 7960/7940 из скрипта
    RSS | Следующие 15 записей >>


    ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!

    Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

    Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

    Оформить подписку на год


      Закладки на сайте
      Проследить за страницей
    Created 1996-2012 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    RUNNet TopList