Linux diff и утилиты командной строки для данных MySQL (не структура) - PullRequest
1 голос
/ 22 октября 2009

У меня есть две базы данных MySQL, и я хотел бы написать скрипт для сравнения и обновления изменений данных между ними.

Кто-нибудь знает инструмент командной строки Linux для анализа или исправления данных в базах данных MySQL?

Ответы [ 2 ]

2 голосов
/ 22 октября 2009

Путь грубой силы: сбросить обе базы данных и разнести дампы ...? ; -)

- «Если ваша проблема не решается грубой силой, значит, вы не применяете достаточно силы».

(я не (полностью) серьезно отношусь к этому ...)

1 голос
/ 22 октября 2009

Diff

Как предлагает DevSolar, простой способ получить различия состоит в том, чтобы сделать тщательный дамп двух баз данных (с одним выходным файлом на таблицу и в каждом файле, одной логической строкой на запись в таблице) и применить Замечательная, надежная и почтенная diff программа для файлов для каждой таблицы. Однако этот «осторожный» может быть чем-то вроде гаечного ключа в работах - вам нужно убедиться, что каждый файл данных выгружается в отсортированном порядке (а не только в физическом порядке), так что если запись появляется в обоих случаях, она появляется та же самая позиция в файле. Если данные не так упорядочены, вы получите много ложных различий.

Еще до того, как вы это сделаете, вам нужно сравнить две схемы - потому что многие различия в схеме автоматически приведут к тому, что каждая строка в двух таблицах с одинаковым именем будет иметь разные строки. Например, если таблица A из базы данных DB1 имеет 10 столбцов, а таблица A из базы данных Db2 имеет 11 столбцов, каждая строка в выгруженных данных будет отличаться.

Вам также нужно беспокоиться о некоторых других столбцах, которые могут отличаться - в частности, об автоматически назначаемых идентификационных номерах, а также значениях «время последнего обновления» или «время создания». Автоматические идентификационные номера в первичном ключе часто сильно влияют на порядок данных в таблицах, которые присоединяются к PK - вы должны рассмотреть, есть ли хороший способ обойти это. Это будет зависеть отчасти от истории баз данных; были ли они когда-то общей базой данных, которая была скопирована, изменена и теперь рекомбинируется? В этом случае может возникнуть меньше проблем, чем если бы это были две базы данных с одинаковой схемой, но у которых никогда не было общего происхождения с данными, хранящимися в ней.

Вы можете обнаружить, что лучше всего создавать представления так, чтобы структура данных, отраженная представлением, была одинаковой для обеих баз данных (даже если определение представления не одинаково из-за различий в схеме). Затем вы можете сравнить результаты вывода этих представлений. Сделанный аккуратно, это может уменьшить или минимизировать различия благодаря автоматически назначенным идентификационным номерам.

1012 * патч * Давайте представим, что вам удалось получить сопоставимые данные, и теперь вам нужно синхронизировать небольшое количество различий. Есть ли инструмент для исправления ошибок? Ответ вполне вероятен для того, кого вы не хотели слышать - Нет. Одна из проблем заключается в том, что вы должны решить, каков будет требуемый результат операции. Это объединение двух баз данных, или пересечение, или что? Какую базу данных вы собираетесь изменить - первую или вторую, или обе? Строки, удаленные из одной базы данных, которые появляются в другой, могут быть удалены из другой или вставлены в одну. Вставленные строки являются зеркалом удаленных строк и требуют аналогичной обработки. Это было легко ... Если по каким-либо критериям в обеих базах данных появляется «одна и та же строка», но есть различия в полях (столбцах), то вам нужно выполнить более хитрую работу. Вы должны решить, какие из разных столбцов следует изменить в базе данных, которую вы в настоящее время модифицируете. Стандартные инструменты Unix (такие как diff) предназначены для линейных различий. В этот момент я бы, вероятно, заглянул в Perl (но Python или другие языки сценариев подойдут), взяв записи различий для таблицы вместе с именем таблицы и списком столбцов (чтобы можно было связать поля в данных с колонками в базе данных), а затем организуйте для него генерацию соответствующих операторов. Типы могут быть фактором - вашему утверждению UPDATE может потребоваться заключать в кавычки строки, а не заключать в кавычки числа для обновлений. Вам также необходимо знать первичный ключ, чтобы вы могли определить строку, подлежащую обновлению. Вывод будет подходящим набором операторов UPDATE, которые преобразуют первую версию таблицы во вторую.

...