Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как лучше организовать слияние нескольких баз в одну?  [new]
uaggster
Member

Откуда:
Сообщений: 867
Коллеги, скажите, как правильно подойти к проблеме!

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

Проблемы следующие:
1. В каждой конкретной базе - порядка сотни таблиц.
2. Объем каждой базы - значительный, около 50-70 Гб
3. В некоторых базах попадаются дополнительные таблицы, которых нет в других базах, и которых не должно быть в итоговой базе (итоговая база создается каждый раз заново из эталонного скрипта).
4. Состав таблиц (вообще в базе) и состав каждой таблицы в отдельности может внезапно измениться сразу во всех базах (например - появиться или исчезнуть таблица или столбец в ней). Но это происходит согласовано во всех БД, включая эталон. Если какая то БД отличается от эталона (в части именно общих для всех таблиц) - это ошибка, и эти данные не сливаются.

Мне почему то кажется, что SSIS для этого использовать не получится, в силу п.4.
Как такую задачу вообще решать? Подскажите, в каком направлении копать?
28 окт 15, 13:47    [18337890]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
uaggster,

если все везде однаково то в чем проблема, два цикла:
Цикл по всем таблицам эталона
Цикл по всем базам
bulk insert
28 окт 15, 14:43    [18338358]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
uaggster
Мне почему то кажется, что SSIS для этого использовать не получится, в силу п.4.
В принципе SSIS можно всегда использовать, это же всего лишь программа, выполняющая некую пользовательскую программу, написанную на языке этого SSIS.
Но пользы от него будет не так много. Мы такую задачу решали в SSIS, написав скрипт-таск, который создаёт и запускает DataFlow таски. В общем, без SSIS, в обычном проекте на C#, это было бы сделать проще, но вот так уж сложилось.

Так что вот как вариант - программное создание пакета с DataFlow тасками (в среде SSIS или без таковой).

Второй вариант - писать скрипт для переливки через BCP. Тут самое сложное - создание структуры.

Ещё вот подумалось - может, проще всего вашу задачу решать снапшот-репликацией?
28 окт 15, 15:15    [18338660]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Копируйте обычным
insert into Таблица with (tablock)
 (список столбцов)
 select
  список столбцов
 from
  [Исходная БД]..Таблица;

Предварительно в целевой БД удалить все индексы и перевести ее в simple или bulk_logged.
Тогда сможете копировать с минимальным журналированием и параллельно из нескольких БД.

Подробнее тут:
https://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx
https://technet.microsoft.com/en-us/library/ms186341(v=sql.105).aspx
28 окт 15, 17:21    [18339409]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Eleanor
Member

Откуда:
Сообщений: 2932
invm,

>> параллельно из нескольких БД
согласно вашей первой ссылке INSERT … SELECT не может копировать параллельно в одну таблицу:

the target table is locked with an exclusive (X) lock, while the other bulk load methods (Integration Services, BCP, and BULK INSERT) described here issue the bulk update (BU) lock. Because exclusive (X) locks are not compatible with other exclusive (X) locks, only one insert can run at the same time
28 окт 15, 23:28    [18340712]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Eleanor
invm,

>> параллельно из нескольких БД
согласно вашей первой ссылке INSERT … SELECT не может копировать параллельно в одну таблицу
В базе ведь много таблиц, можно копировать в разные.
28 окт 15, 23:53    [18340771]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Eleanor
согласно вашей первой ссылке INSERT … SELECT не может копировать параллельно в одну таблицу
Совершенно верно.
Но я и не писал про параллельную вставку в одну таблицу.
28 окт 15, 23:54    [18340775]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Eleanor
Member

Откуда:
Сообщений: 2932
invm
Но я и не писал про параллельную вставку в одну таблицу.

Ясно. Меня просто смутила ваша вторая ссылка, посвященная параллельной ставке в одну таблицу
29 окт 15, 00:11    [18340819]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Eleanor
Ясно. Меня просто смутила ваша вторая ссылка, посвященная параллельной ставке в одну таблицу
Да, я не однозначно выразился, - трактовать можно двояко.
А ссылки дадены ТС'у для полноты картины. А он уж пусть сам выбирает подходящий для него способ.
29 окт 15, 00:21    [18340851]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7380
uaggster
Коллеги, скажите, как правильно подойти к проблеме!

На сервере имеется несколько (десятков) однотипных баз. Необходимо периодически сливать эти базы - в одну базу, простой конкатенацией таблиц (ключи в одноименных таблицах во всех базах - не пересекаются).
А зачем их сливать физически? Можно сливать логически, на уровне запросов.
29 окт 15, 00:28    [18340877]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Glory
Member

Откуда:
Сообщений: 104760
uaggster
Проблемы следующие:
1. В каждой конкретной базе - порядка сотни таблиц.
2. Объем каждой базы - значительный, около 50-70 Гб
3. В некоторых базах попадаются дополнительные таблицы, которых нет в других базах, и которых не должно быть в итоговой базе (итоговая база создается каждый раз заново из эталонного скрипта).
4. Состав таблиц (вообще в базе) и состав каждой таблицы в отдельности может внезапно измениться сразу во всех базах (например - появиться или исчезнуть таблица или столбец в ней). Но это происходит согласовано во всех БД, включая эталон. Если какая то БД отличается от эталона (в части именно общих для всех таблиц) - это ошибка, и эти данные не сливаются.

Создаете одну базу, в которой расположены только представления, ссылающиеся на таблицы в других базах через и объединенные через UNION.
(Пере)создавать представления должен генератор на основе вашего шаблона и списка баз.
29 окт 15, 09:21    [18341410]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
uaggster
Member

Откуда:
Сообщений: 867
Glory
uaggster
Проблемы следующие:
1. В каждой конкретной базе - порядка сотни таблиц.
2. Объем каждой базы - значительный, около 50-70 Гб
3. В некоторых базах попадаются дополнительные таблицы, которых нет в других базах, и которых не должно быть в итоговой базе (итоговая база создается каждый раз заново из эталонного скрипта).
4. Состав таблиц (вообще в базе) и состав каждой таблицы в отдельности может внезапно измениться сразу во всех базах (например - появиться или исчезнуть таблица или столбец в ней). Но это происходит согласовано во всех БД, включая эталон. Если какая то БД отличается от эталона (в части именно общих для всех таблиц) - это ошибка, и эти данные не сливаются.

Создаете одну базу, в которой расположены только представления, ссылающиеся на таблицы в других базах через и объединенные через UNION.
(Пере)создавать представления должен генератор на основе вашего шаблона и списка баз.

Да, это решение напрашивается, но не подходит.
Потому что часть "филиальских" баз находятся в состоянии suspend/recovery и пополняются лог-шиппингом (хаотически, надо сказать). А часть - вполне себе "флоппи мэйлом" (т.к. есть места без интернета вообще [причем парочка - принципиально], есть - с таким, что проще раз в пару тройку дней на dvd федексом прислать - и быстрее и дешевле выходит).
В общем, наблюдается инфраструктурный бардак.
Но собирать всё через union all будет мешать именно лог шиппинг.
29 окт 15, 10:51    [18342026]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Glory
Member

Откуда:
Сообщений: 104760
uaggster
Потому что часть "филиальских" баз находятся в состоянии suspend/recovery и пополняются лог-шиппингом (хаотически, надо сказать

А для импорта их что специально будут переврдить в другое состояние что ли ?
29 окт 15, 10:54    [18342044]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
uaggster
Member

Откуда:
Сообщений: 867
Glory
uaggster
Потому что часть "филиальских" баз находятся в состоянии suspend/recovery и пополняются лог-шиппингом (хаотически, надо сказать

А для импорта их что специально будут переврдить в другое состояние что ли ?

Там пара часов тишины есть - в обед и ночью. Рид-онли состояние позволяет же нормально данные прочитать.

Бизнесу не нужно очень уж оперативно всё получать. Достаточно состояния на утро - вечер (ну, или когда пришло ногами) + оперативно глянуть в "близкие" филиалы по паре позиций (причем в этом случае смотрят как раз удаленно в филиале, а "оттранслированная" база в центре нужна скорее для подстраховки, против заявлений "света нет / инет пропал").

По сводной базе считаются тяжелые отчеты и строится аналитика.
29 окт 15, 11:42    [18342372]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Glory
Member

Откуда:
Сообщений: 104760
uaggster
Там пара часов тишины есть - в обед и ночью. Рид-онли состояние позволяет же нормально данные прочитать.

Статус то кто поменяет с "suspend/recovery " и главное обратно? Само что ли ?

Сообщение было отредактировано: 29 окт 15, 11:44
29 окт 15, 11:44    [18342385]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
uaggster
Member

Откуда:
Сообщений: 867
Glory
uaggster
Там пара часов тишины есть - в обед и ночью. Рид-онли состояние позволяет же нормально данные прочитать.

Статус то кто поменяет с "suspend/recovery " и главное обратно? Само что ли ?

Стендбай-ридонли, прошу прощения. Думаю одно, пишу другое.
29 окт 15, 12:17    [18342612]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Glory
Member

Откуда:
Сообщений: 104760
uaggster
Стендбай-ридонли, прошу прощения. Думаю одно, пишу другое.

Ну "Стендбай-ридонли" позволяет обращаться к базе в любое время
29 окт 15, 12:23    [18342655]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
uaggster
Member

Откуда:
Сообщений: 867
Glory, оно ж отключает пользователя на момент восстановления логов. Или ждет, пока не разорвётся последний коннект.
И то, и другое - плохо!
29 окт 15, 13:15    [18343084]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Glory
Member

Откуда:
Сообщений: 104760
uaggster
Или ждет, пока не разорвётся последний коннект.

Не "или", а ждет. И не разрыва коннекта, а отключения пользователя от базы.
А подключен ваш пользователь постоянно будет к другой базе.
А к этой базе будет только обращаться на время выполнения запроса.
29 окт 15, 13:20    [18343113]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
o-o
Guest
Glory
uaggster
Или ждет, пока не разорвётся последний коннект.

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

почему не или, как раз или.
можно же выбрать при восстановлении "ждать, пока отпадут юзеры"
или "разорвать все соединения и восстановить"
29 окт 15, 13:40    [18343260]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Relic Hunter
А зачем их сливать физически? Можно сливать логически, на уровне запросов.

Glory
Создаете одну базу, в которой расположены только представления, ссылающиеся на таблицы в других базах через и объединенные через UNION.
(Пере)создавать представления должен генератор на основе вашего шаблона и списка баз.

Это всё теоретически возможно, но вообще, слияние баз - широко распространённая задача, её делают как раз для того, что бы не работать с территориально-распределёнными базами.

Я вот не видел, что бы отчётные/аналитические системы, или дополнительный источник филиальных данных для корпоративной OLTP системы делался как реал-тайм доступ к удалённым базам филиалов. Оно просто работать не будет, "практически", а не в теории.
29 окт 15, 14:00    [18343445]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Glory
Member

Откуда:
Сообщений: 104760
o-o
Glory
пропущено...

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

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

Хорошо - "или"
Кого отключать то, если у коннета активной является совсем другая база то ?
29 окт 15, 14:08    [18343498]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
Glory
Member

Откуда:
Сообщений: 104760
alexeyvg
Это всё теоретически возможно, но вообще, слияние баз - широко распространённая задача, её делают как раз для того, что бы не работать с территориально-распределёнными базами.

Так тут нет территориально-распределённых баз. Тут все базы на одном сервере.
Тут не логшиппинг надо делать, а мерге репликацию филиалы-центральный оффис
29 окт 15, 14:11    [18343524]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
o-o
Guest
я никого не предлагаю отключать.
хочет ТС читать в промежутках между ресторами -- пусть вьюхи создает и читает.
хочет сливать -- вон еще вчера invm ответил 18339409
29 окт 15, 14:16    [18343568]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше организовать слияние нескольких баз в одну?  [new]
aleks2
Guest
sp_msforeachtable + динамический sql

в эталонной базе спасет отца русской демократии.
30 окт 15, 06:08    [18346935]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить