Perl: Как скопировать / отразить удаленные таблицы MYSQL в другую базу данных?Возможно, другая структура тоже? - PullRequest
2 голосов
/ 31 декабря 2010

Я очень новичок в этом, и хороший друг в безвыходном положении.Я в своем уме.Я использовал для этого графические интерфейсы, такие как navicat и sqlyog, но только вручную.

Его данные о группе (расписания и еще много чего) находятся в базе данных MYSQL на сервере (сервер администратора).

Я собираю для него базовый сайт, написанный на Perl, который извлекает данные из базы данных, которая находится на моем сервере (общедоступном сервере) и отображает информацию о расписании, предыдущие информационные бюллетени и некоторые взаимодействия с поклонниками.

Он использует административныйинтерфейс, который он любит и хочет сохранить, для управления данными на сервере администратора.

База данных администратора сервера имеет кучу таблиц и даже табличных данных, которые не нужны общедоступной базе данных.

Итак, я создал открытые таблицы, которые содержат только релевантные данные.

Я в основном использовал графический интерфейс для экспорта данных, а затем вставлял их в открытую часть всякий раз, когда он делал обновления в базе данных администратора (копировать и вставлять).).

(К вашему сведению, я использую модуль DBI для доступа к данным в / через мой публичный сценарий Perl db.)

Я могу получить доступ к директории сервера администратораДля того, чтобы получить только те данные, которые мне нужны, но вся цель этого состоит в том, чтобы «зеркалировать» данные, не обращаясь к серверу администратора при каждом запросе.Кроме того, некоторые таблицы - это ТЫСЯЧИ строк, и разбор каждой строки в цикле мне показался слишком «громоздким».Однако есть столбец «время», который можно использовать для сравнения.

Я не могу «синхронизировать» из-за того, что структуры разные, мне нужны только соответствующие данные таблицы только из трех таблиц.

ТАК ...... Хочу автоматизировать!

Я читал, что "копирование" было быстрым способом, но мои выводы о том, как реализовать, были слишком продвинуты для моего уровня.

Я не могу позволить себе роскошь разместить скрипт на сервере администратора.чтобы уведомить о появлении обновления.

1- Я хотел бы настроить скрипт для проверки таблицы, чтобы увидеть, была ли строка обновлена ​​или добавлена ​​на административных серверах db.Затем я хотел бы обновить или вставить новые или измененные данные на общедоступные серверы db.

Эта «проверка» может быть установлена ​​в задании cron, которое я предполагаю или запускается, когда конкретная страница загружается на общедоступной стороне.,(та же самая подпрограмма, вызываемая cron, я бы предположил).

Эти данные не обязательно должны быть «в реальном времени», но, если он что-то обновляет, было бы неплохо, чтобы они появлялись как можно быстрее.

Я много читал, изучал модули и экспериментировал, но здесь я снова в стеке потока, где я всегда получаю отличные советы и примеры.

Большая часть терминологии до сих пор у меня над головой, так чтоподробные примеры с объяснениями действительно помогают мне учиться быстрее.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 04 января 2011

Я думаю, вы неправильно поняли ETL как проблемную область, которая является сложной, в отличие от ETL как одноразового решения, которое зачастую не намного сложнее, чем написание отчета.Если я полностью не понял вашу проблему, вам не нужно общее решение ETL, вам нужно одноразовое решение, которое работает с несколькими таблицами и несколькими тысячами строк.Картирование ETL и схемы звучит страшнее, чем для одной работы.(Обобщение, масштабирование, управление изменениями и поддержка ETL OLTP-to-OLAP - вот где это становится особенно трудным.) Если вы можете использовать Perl для записи отчета из базы данных SQL, вы, вероятно, знаете достаточно для обработки ETLучаствует здесь.

1- Я хотел бы настроить скрипт для проверки таблицы, чтобы увидеть, была ли строка обновлена ​​или добавлена ​​на административных серверах db.Затем я хотел бы обновить или вставить новые или измененные данные на общедоступные серверы. БД.

Если в каждой таблице, из которой нужно извлечь данные, есть столбец отметки времени обновления, то в задании cron есть несколько операторов SELECT.с предложениями WHERE, основанными на последнем времени, когда выполнялось задание cron, чтобы получать только обновления.Для таблиц без отметки времени обновления, вероятно, потребуется полный дамп.

Я бы использовал сопоставление таблиц один-к-одному, если не требуется нормализация ... просто, на мой взгляд, проще.Зачем усложнять это «большими» изменениями схемы, если вам это не нужно?

некоторые таблицы - это ТЫСЯЧИ строк, и разбор каждой строки в цикле мне показался слишком «громоздким».

Ограничьте ваши запросы только теми столбцами, которые вам нужны (и, если в том, что вам нужно, нет больших двоичных объектов или исключительно больших столбцов), несколько тысяч строк не должны вызывать проблем при использовании DBI с методом FETCHALL.Зацикливайте все, что вам нужно, локально, просто совершите как можно меньше поездок в удаленную базу данных.

Если строка имеет более новую дату, обновите ее.Я также должен проверить наличие новых строк для вставки.

Каждая таблица нуждается в одной SELECT ... WHERE updated_timestamp_columnname > last_cron_run_timestamp.Этот результирующий набор будет содержать все строки с более новыми временными метками, которые содержат вновь вставленные строки (если столбец временной метки ведет себя так, как я ожидал).Для обновления вашей локальной базы данных проверьте синтаксис MySQL ON DUPLICATE KEY UPDATE ... это позволит вам сделать это за один шаг.

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

Несколько вопросов, которые помогут нам понять ваш уровень ... Вы обращаетесь к базе данных из командной строки клиента mysql или из графического интерфейса?Достигли ли вы того момента, когда вы завершили свои SQL-запросы в Perl и DBI?

1 голос
/ 31 декабря 2010

Два термина, которые вы ищете: « replication » или «ETL».

Во-первых, подход к репликации.

Предположим, что на вашем сервере администратора есть таблицыT1, T2, T3 и ваш общедоступный сервер имеют таблицы TP1, TP2.

Итак, что вы хотите сделать (поскольку у вас разные структуры таблиц, как вы сказали):

  1. Возьмите таблицы с общего сервера и создайте точные копии этих таблиц на сервере администратора (TP1 и TP2).

  2. Создайте триггер в исходных таблицах сервера администратора для заполнения данных из T1 / T2 / T3 в копию сервера администрирования TP1 / TP2.

  3. Вам также нужно будет выполнить начальную загрузку данных из T1 / T2 / T3 в копию административного сервера TP1 / TP2.Duh.

  4. Настройка " replication " от TP1 / TP2 административного сервера к TP1 / TP2 общего сервера

Другой подход заключается в написании программы (такие программы называются ETL - Extract-Transform-Load), которая извлекает данные из T1 / T2 / T3 на сервере администратора (часть «E» в «ETL»), массирует данныев формат, подходящий для загрузки в таблицы TP1 / TP2 (часть «T» в «ETL»), передачи (через ftp / scp / whatnot) этих файлов на общедоступный сервер и во второй половине программы («L»)part загрузит файлы в таблицы TP1 / TP2 на общедоступном сервере.Обе половины программы будут запущены cron или вашим выбранным планировщиком.

Есть статья с очень хорошим примером того, как начать сборку Perl / MySQL ETL: http://oreilly.com/pub/a/databases/2007/04/12/building-a-data-warehouse-with-mysql-and-perl.html?page=2

Если вы предпочитаете не создавать свои собственные, вот список систем ETL с открытым исходным кодом, никогда не использовал ни одну из них, поэтому нет мнения об их удобстве использования / качестве: http://www.manageability.org/blog/stuff/open-source-etl

0 голосов
/ 04 января 2011

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

Затем выберите из мастера все строки, измененные с момента последней временной метки или превышающие идентификатор.Вставьте их в соответствующую таблицу на подчиненном сервере.

Вам нужно быть осторожным с обновленными строками.Если строка на главном сервере обновляется, но временная метка не изменяется, то как вы узнаете, какие строки выбрать?Если это не проблема, процесс довольно прост.

Если это проблема, то вам нужно быть более изощренным, но, не зная структуры данных и механизма обновления, это погоня за указателями.

Сценарий может быть вызванcron время от времени обновляет изменения.

если структуры баз данных должны отличаться на двух серверах, то может потребоваться добавить простой шаг перевода, но большую часть времени это можно сделать в sql selectзаявление и, возможно, соединение или два.

0 голосов
/ 31 декабря 2010

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

Если схемы одинаковы, все, что вам нужно сделать, - это реплицировать данные из одной в другую.другой.

...