Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перенести работающую базу на другой сервер  [new]
JMLabs
Member

Откуда:
Сообщений: 66
Передо мной стоит задача перенести базу данных на другой сервер и минимизировать время простоя сервиса. База не маленькая - 12Гб, в ней есть хранимые процедуры и вьюшки. Самое простое - сделать бекап и развернуть на новом месте не подойдет из-за длительного времени простоя. При создании репликации я сталкиваюсь с предупреждением о том что view и процедуры нужно переносить руками. В результате я не совсем понимаю как быть? Можно ли сделать бекап рабочей базы, развернуть его на новом месте а уже потом настроить репликацию чтобы дореплицировалось только то что появилось за время переноса бекапа?
В идеале бы я хотел иметь 2 синхронные базы с которыми я бы мог работать одновременно, т.е. изменения в любой транслируются в другую базу. Помогите, пожалуйста, советом.
13 июл 18, 01:05    [21567573]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
SERG1257
Member

Откуда:
Сообщений: 2730
JMLabs
База не маленькая - 12Гб,
Маленькая
JMLabs
Самое простое - сделать бекап и развернуть на новом месте не подойдет из-за длительного времени простоя.
Сделать полный бакап, а в момент Х сделать дифференциальный и накатить. Бакапчик будет маленький, быстро сделается, быстро скопируется и быстро накатится.
За репликацию не скажу. Двунаправленная репликация зло, чреватое конфликтами
13 июл 18, 01:09    [21567578]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7362
Mirroring, Log Shipping - не предлагать?
13 июл 18, 02:07    [21567609]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
JMLabs
Member

Откуда:
Сообщений: 66
SERG1257
Сделать полный бакап, а в момент Х сделать дифференциальный и накатить.

Спасибо за идею, я раньше так не пробовал делать.

Relic Hunter
Mirroring, Log Shipping - не предлагать?

Насколько я знаю Mirroring держит базу приемник в состоянии недоступном для чтения. Чтобы она стала рабочей, нужно разорвать зеркалирование. Вероятно это тоже путь. Про Log Shipping ничего сказать не могу, т.к. ни разу не делал.

Мне не хватает опыта практического применения технологий, которые есть в арсенале SQL. Понятно, что та или иная репликация или зеркалирование может решить мою задачу, но возникает масса подводных камней, а у меня только 1 попытка все сделать правильно. Например с зеркалированием, судя по отзывам, именно оно позволяет универсально транслировать любую базу (а для репликации нужно готовить базу), но у меня был неудачный опыт когда из-за небольшого сбоя сети начинал непомерно расти лог, который заполнял диск и все падало. Знаю, что зеркалирование отлично работает в случае если сервера стоят рядом, но у меня сервера на разных площадках и связь через интернет.
13 июл 18, 09:30    [21567876]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
JMLabs
Понятно, что та или иная репликация или зеркалирование может решить мою задачу, но возникает масса подводных камней, а у меня только 1 попытка все сделать правильно.
Да, самый простой путь - полный бакап, потом непосредственно перед переключением снять и накатить дифф бакап, как уже предложил SERG1257.
Можно даже 2 раза с дифф бакапом - пользователей отключать после первого раза, и быстро сделать, копировать и накатывать второй дифф. И потом сразу включить пользователей. Для надёжности провести тренировки.
13 июл 18, 09:50    [21567909]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
SERG1257
Member

Откуда:
Сообщений: 2730
Настраивать Mirroring для одномоментной акции это "из пушки по воробьям", особенно для новичка
Log Shipping уже лучше. По сути заменив diff бакап log бакапом мы его и реализуем в ручном режиме.

JMLabs
а у меня только 1 попытка все сделать правильно
На самом деле ничего сложного нет, если убрать суровое требование "2 синхронные базы с которыми я бы мог работать одновременно, т.е. изменения в любой транслируются в другую базу".
Базу источник сразу после бакапа надо перевести в offline, чтобы те, кто не обновил строку подключения, получали ошибку.
13 июл 18, 16:46    [21569494]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
SERG1257
Настраивать Mirroring для одномоментной акции это "из пушки по воробьям", особенно для новичка
Log Shipping уже лучше. По сути заменив diff бакап log бакапом мы его и реализуем в ручном режиме.

JMLabs
а у меня только 1 попытка все сделать правильно
На самом деле ничего сложного нет, если убрать суровое требование "2 синхронные базы с которыми я бы мог работать одновременно, т.е. изменения в любой транслируются в другую базу".
Базу источник сразу после бакапа надо перевести в offline, чтобы те, кто не обновил строку подключения, получали ошибку.
Направильно. После полного бэкапа базу-исчтоник надо перевести в ReadOnly, чтобы исключить дальнейшую модификацию, и сделать после этого бэкап лога (который так же надо будет восстановить). Потом уже оффлайнить.
13 июл 18, 17:43    [21569643]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Если у автора полная модель восстановления, то достаточно бэкапа журнала к бэкапу базы. Перед этим выгнать всех пользователей (отключить IP протокол, например, в настройках соединения или иным способом) и остановить SQL Agent.
13 июл 18, 18:07    [21569708]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Владислав Колосов
Если у автора полная модель восстановления, то достаточно бэкапа журнала к бэкапу базы. Перед этим выгнать всех пользователей (отключить IP протокол, например, в настройках соединения или иным способом) и остановить SQL Agent.
Чтобы исчключить модификацию данных есть способ гораздо проще и надежней.
13 июл 18, 18:51    [21569786]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
JMLabs
Member

Откуда:
Сообщений: 66
У меня simple модель.
По поводу дифф бекапа хотел спросить. Где система берет информацию с какого момента нужно делать дифф бекап? Правильно ли я понимаю что SQL запоминает когда был сделан последний полный бекап и относительно него делает дифф бекап?

Гавриленко Сергей Алексеевич
Чтобы исчключить модификацию данных есть способ гораздо проще и надежней.

Как? Поделитесь пож
14 июл 18, 01:03    [21570247]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
JMLabs
У меня simple модель.
По поводу дифф бекапа хотел спросить. Где система берет информацию с какого момента нужно делать дифф бекап? Правильно ли я понимаю что SQL запоминает когда был сделан последний полный бекап и относительно него делает дифф бекап?

Гавриленко Сергей Алексеевич
Чтобы исчключить модификацию данных есть способ гораздо проще и надежней.

Как? Поделитесь пож
Как я отмечал выше:
alter database ... set read_only with rollback immediate
14 июл 18, 01:29    [21570256]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
JMLabs
Где система берет информацию с какого момента нужно делать дифф бекап? Правильно ли я понимаю что SQL запоминает когда был сделан последний полный бекап и относительно него делает дифф бекап?
В базе хранится битовая карта экстентов, изменённых после последнего полного бакапа. Любое изменение страниц меняет там биты. А дифф-бакап сканирует эту карту, делая бакап только изменённых страниц.
14 июл 18, 11:11    [21570567]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
uaggster
Member

Откуда:
Сообщений: 827
12 Тб может быть?
12Гб забекапить-скопировать-восстановить - это минут 10 отсилы.
14 июл 18, 19:03    [21571010]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
JMLabs
Member

Откуда:
Сообщений: 66
uaggster
12 Тб может быть?
12Гб забекапить-скопировать-восстановить - это минут 10 отсилы.

Нет, у меня 12Гб, вообще сомнительная бравада - чтобы протолкнуть 12 Гб по сети нужна скорость 164 мегабит, в локальной сети возможно, но интернет - врядли. По факту у меня 10 минут только бекап делается.
15 июл 18, 17:56    [21572194]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
SERG1257
Member

Откуда:
Сообщений: 2730
Надеюсь версия позволяет делать сжатый бакап?
https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/backup-compression-sql-server?view=sql-server-2017
15 июл 18, 18:20    [21572227]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
JMLabs
Member

Откуда:
Сообщений: 66
SERG1257
Надеюсь версия позволяет делать сжатый бакап?
https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/backup-compression-sql-server?view=sql-server-2017


Да, можно делать сжатый бекап. Я думаю реализовать идею с дифф бекапом, хочу понять, правильно ли я рассуждаю: после полного бекапа в базе хранится битовая карта экстентов, как написал alexeyvg, т.е. мои действия буквально:
1. снять полный бекап
2. мувнуть его на новую площадку
3. развернуть обычным способом
4. в нужный момент сделать дифф бекап (при этом в бекап сохранятся только изменения после полного бекапа)
5. мувнуть и накатить дифф бекап на новой площадке

Такой вопрос: а если на новой площадке поле разворота полного бекапа в базе будут изменения, как накатится дифф бекап? Или не накатится?
15 июл 18, 19:07    [21572280]     Ответить | Цитировать Сообщить модератору
 Re: Перенести работающую базу на другой сервер  [new]
SERG1257
Member

Откуда:
Сообщений: 2730
Немного не так
На старом месте за час(два/три) до времени Ч делаете полный бакап
На новом месте восстанавливаете его с NORECOVERY
https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-2017#comparison-of-recovery-and-norecovery
База при этом будет недоступна, но на нее можно будет накатить дифф
В момент времени Ч переводите базу в read-only
Это нужно для того чтобы за время создания дифф (пусть короткое) никто ничего не записал в старую базу (чтобы значит наверняка)
Делаете дифф и переводите базу в оффлайн - теперь все будут получать отлуп
Восстанавливаете дифф с recovery - теперь база доступна, но все еще в read-only
Переводите ее в read_write
Все

Итого время простоя -
alter datatabase mybase set read_only with rollback immediate
дифф бакап
копирование на другой сервер
восстановление
alter datatabase mybase set read_write with rollback immediate

если пропустить переключения в read_only и назад
(только полный бакап дифф бакап и восстановления) можно проводить тесты, писать скрипты и замерять сколько точно это займет
15 июл 18, 20:32    [21572461]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить