Скопируйте несколько таблиц в одну таблицу (из нескольких баз данных) - PullRequest
3 голосов
/ 12 января 2011

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

Идея состоит в том, чтобы взять Table1, Table2, ..., TableN из каждой базы данных, объединяем их и помещаем результат в одну большую базу данных.

Чтобы иметь возможность писать запросы и знать, из какой базы данных поступила каждая строка, мы добавимодин столбец DatabaseID целевой таблицы, описывающий, откуда появилась строка.Редактирование исходных таблиц не вариант, оно принадлежит некоторому проприетарному программному обеспечению.

У нас есть ~ 40 серверов, ~ 170 баз данных и нам нужно скопировать ~ 40 таблиц.

Теперь, какдолжны ли мы реализовать это, учитывая, что оно должно быть:

  • Простота в настройке
  • Простота в обслуживании
  • Предпочтительно легко настроить, если схема базы данных изменяется
  • Надежный, регистрация / тревога, если что-то не получается
  • Не слишком сложно добавить дополнительные таблицы для копирования

Мы изучили SSIS, но казалось, что нам придется добавить каждыйтаблица в качестве источника / преобразования / назначения.Я предполагаю, что это также будет довольно привязано к схеме базы данных.Правильно?

Другой вариант - использовать репликацию SQL Server, но я не вижу, как добавить столбец DatabaseID в каждую таблицу.Кажется, что возможно только копировать данные, но не изменять их.Может быть, мы могли бы скопировать все данные в отдельные базы данных, а затем запустить локальное задание на целевом сервере для объединения таблиц?Также кажется, что нам нужно много работы, чтобы добавить еще несколько таблиц для копирования, поскольку нам пришлось бы перераспределять новые публикации для каждой базы данных (ручная работа?).

Последний вариант (?) - этонаписать пользовательское приложение для наших нужд.Большие временные вложения, но они, по крайней мере, сделали бы именно то, что нам хотелось бы.

Чтобы еще хуже ... мы используем Microsoft SQL Server 2000. Мы обновимся до SQL Server 2008 R2 в течение 6месяцев, но мы бы хотели, чтобы проект стал пригодным для использования раньше.

Дайте мне знать, что вы, ребята, думаете!

ОБНОВЛЕНИЕ 20110721

Мы закончилис программой на F #, открывающей соединение с SQL Server, где нам нужны объединенные базы данных.Оттуда мы запрашиваем 40 связанных SQL-серверов, чтобы получить все строки (но не все столбцы) из некоторых таблиц и добавить дополнительную строку в каждую таблицу, чтобы сообщить, из какого DatabaseID получена эта строка.Конфигурация серверов для выборки, из каких таблиц и из каких столбцов является комбинация конфигурации текстового файла и жестко заданных значений (хе: D).Это не супер-быстрый (пока последовательная выборка), но он абсолютно управляем, и последующая обработка данных занимает гораздо больше времени.

Будущие улучшения могут быть:

  • улучшить ошибкуобработка, если это оказывается проблемой (если сервер не подключен и т. д.).
  • реализует параллельную выборку, чтобы сократить общее время до завершения выборки.
  • выяснитьесли достаточно выбрать только некоторые строки, например, только то, что было добавлено / обновлено.

В целом все оказалось довольно просто, никаких зависимостей от других продуктов, и он хорошо работает впрактика.

Ответы [ 2 ]

4 голосов
/ 12 января 2011

Ничего особенного, но вы не могли бы сделать что-то вроде

DROP TABLE dbo.Merged

INSERT INTO dbo.Merged
SELECT  [DatabaseID] = "Database1", * FROM ServerA.dbo.Table
UNION ALL SELECT  [DatabaseID] = "Database2", * FROM ServerB.dbo.Table
...
UNION ALL SELECT  [DatabaseID] = "DatabaseX", * FROM ServerX.dbo.Table

Преимущества

  • Простота настройки
  • Простота в обслуживании
  • Легко настроить
  • Легко добавить больше таблиц

Недостатки

  • Производительность
  • Надежная регистрация
0 голосов
/ 23 августа 2015

У нас было похожее требование, когда мы использовали другой подход.Сначала создали центральную базу данных для сбора данных.Затем мы создали таблицу инвентаризации для хранения списка целевых серверов / баз данных.Затем небольшая процедура CLR на основе vb.net, которая принимает путь SQL-запроса, имя целевого экземпляра SQL и целевую таблицу, в которой будут храниться данные (это устранит настройку связанного сервера при добавлении новых целей).Это также добавляет два дополнительных столбца к набору результатов.Имя целевого сервера и временная метка при захвате данных.

Затем мы настраиваем очередь / службу посредника служб и отправляем список целевых серверов для взаимодействия.

Вышеупомянутая процедура CLR переноситсяв другой процедуре, которая удаляет сообщение из очереди, выполняет SQL на указанном целевом сервере.Процедура обертки затем настраивается как активированная процедура для очереди.

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

Преимущества:

  • Простота настройки Простота управления (Добавить / Удалить цели)
  • Та же структура работает для нескольких запросов
  • Журналирование таблиц для проверки неудачных запросов.
  • Работает независимо откаждая цель, поэтому, если одна из целей не отвечает, другие все равно продолжают.
  • Рабочий процесс можно изящно приостановить, отключив очередь (для обслуживания на центральном сервере), а затем возобновив сбор, повторно включив ее.

Недостаток:

  • требует хорошего понимания сервис-брокеров.
  • должен правильно обрабатывать ядовитые сообщения.

Пожалуйста, дайте мне знать, если это поможет

...