2010-12-31 1 views
2

Я очень новичок в этом, и хороший друг в переплёте. Я нахожусь на своем пути. Я использовал gui как navicat и sqlyog для этого, но только вручную.Perl: Как скопировать/зеркально отобразить таблицу MYSQL в другую базу данных? Возможно, другая структура тоже?

Данные его группы (графики и многое другое) находятся в базе данных MYSQL на сервере (сервере администратора).

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

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

Администраторский сервер db имеет кучу таблиц и даже табличные данные, которые не нужны публичному db.

Итак, я создал таблицы на публичной стороне, содержащие только соответствующие данные.

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

(FYI Я использую модуль DBI для доступа к данным в/через мой публичный дб PERL скрипт.)

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

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

SO ...... Я хочу автоматизировать!

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

У меня нет возможности разместить сценарий на сервере администратора для уведомления о появлении обновления.

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

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

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

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

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

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

ответ

1

Два условия, которые вы ищете, либо «replication», либо «ETL».

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

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

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

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

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

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

  4. Настройка «replication» от админа сервера ТР1/ТР2 на ТР1 общественного сервера/ТР2

Другой подход заключается в написании программы (такие программы называются ETL - Extract-Transform-Load), который будет извлекать данные из T1/T2/T3 на сервере администратора (часть «Е» в «ETL»), массировать данные в формат, подходящий для загрузки в таблицы TP1/TP2 (часть «T» в «ETL»,), передать (через ftp/scp/whatnot) эти файлы на общедоступный сервер, а вторая половина части программы (L) будет загружать файлы в таблицы 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

Проблема в том, что я ничего не могу сделать на сервере администратора. Просто выберите. – DulcimerDude

+0

Затем перейдите к решению ETL. – DVK

+0

Спасибо ... Я посмотрю, вернусь ... – DulcimerDude

0

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

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

+0

Это то, что я «боялся». Я ничего не понял. Будет ли репликация концертов данных мне не нужна быстрее/эффективнее, чем какое-то псевдо-зеркало? Возможно ли, что мне нужно? – DulcimerDude

+0

Похоже, вы делаете это очень сложно - см. Много жаргона для одного комментария. Почему бы вам не попробовать SELECT для получения необходимых данных, экспортировать его в соответствующий тип файла и импортировать его в идентичную схему для запуска? Сделайте простую вещь, посмотрите, работает ли она, уточните оттуда. По крайней мере, у вас будет что-то. – duffymo

+0

Да, я на самом деле уже это сделал, но мне нужно вручную обновить и есть так много данных, что требуется несколько часов, и большая часть его дублирования. Наверное, я просто возьму столбец «обновленного времени» с админкой, чтобы определить, что будет дальше ... Спасибо за помощь .. – DulcimerDude

0

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

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

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

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

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

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

1

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

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

Если каждая таблица, которую нужно вытащить из колонки имеет обновление временной метки, то ваш хрон включает некоторые ЗЕЬЕСТ с ИНЕКЕ, основанные на времени последнего задания хрон побежал, чтобы получить только обновления. Таблицы без метки времени обновления, вероятно, нуждаются в полной дампе.

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

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^