Синхронизация БД

1. cad2206 30.03.22 11:30 Сейчас в теме
Добрый день.
На один момент времени есть две идентичные базы в ms sql. По сути вторая база это просто снятая копия первой. С копией в течении некоторого времени проводятся действия, а именно сжатие. По завершении этих действий в копию нужно залить все данные из первой базы, что появились в ней с момента снятия копии. Как это сделать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. namazi74 5 30.03.22 13:04 Сейчас в теме
(1)
Добрый день.
На один момент времени есть две идентичные базы в ms sql. По сути вторая база это просто снятая копия первой. С копией в течении некоторого времени проводятся действия, а именно сжатие. По завершении этих действий в копию нужно залить все данные из первой базы, что появились в ней с момента снятия копии. Как это сделать?

очень общее описание задачи
2. TokarevV 35 30.03.22 12:34 Сейчас в теме
А просто заменить старую копию на новую не вариант?
Долго сжимается, что-ли, за ночь не успеть?
Вы средствами sql хотите это сделать?
Что если перенести обработкой "Выгрузка и загрузка данных XML" документы с определённой даты и провести эти документы в базе-приёмнике?
3. cad2206 30.03.22 12:57 Сейчас в теме
Чуть подробнее:

Есть задача сжать базу размером ~800ГБ. Но в окно служебной доступности к базе, SHRINKDATABASE не успеет отработать.

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

Вопрос, как залить данные?
8. namazi74 5 30.03.22 13:06 Сейчас в теме
(3)
Появилась идея создать копию рабочей базы, сжать ее и затем залить в нее те данные из рабочей базы, которых не достает (которые прилетели за время сжатия), ну и после заливки переключить работу на сжатую базу.

Вопрос, как залить данные?


Через РИБ, зарегистрировать объекты для обмена, выгрузить в подчиненный узел, потом сделать узел основным
11. cad2206 30.03.22 15:01 Сейчас в теме
(8) Включить две базы в репликацию возможно только если это две абсолютно идентичные базы. А здесь одна рабочая и несжатая, а вторая сжатая и без новых данных за время сжатия
4. cad2206 30.03.22 12:59 Сейчас в теме
(2)
Долго сжимается, что-ли, за ночь не успеть?


Именно


(2)
Вы средствами sql хотите это сделать?


Да


(2)
Что если перенести обработкой "Выгрузка и загрузка данных XML" документы с определённой даты и провести эти документы в базе-приёмнике?


Конфигурация 1С не штатная и придется привлекать программистов 1С, что не желательно.
7. TokarevV 35 30.03.22 13:05 Сейчас в теме
(4) Обработка сама создаёт список объектов конфигурации базы, и предназначена для загрузки в идентичную конфигурацию. Можно попробовать протестировать, а там не получится без программиста, так не получится.
У вас обычные формы или управляемые?
9. cad2206 30.03.22 13:19 Сейчас в теме
(7)
(7)
У вас обычные формы или управляемые?


Управляемые
10. TokarevV 35 30.03.22 13:27 Сейчас в теме
(9)
В сообщении 6 вроде нормальный совет, хотя в несколько экспрессивной форме.
Цепляю обработку, хотя для безопасности можете сами скачать.
Прикрепленные файлы:
Выгрузка и загрузка данных XML.epf
6. user1203706 15 30.03.22 13:04 Сейчас в теме
(3)
занимайтесь хренью..
на вот, запустишь на рабочей базе , сделает тебе шринк покусочно

USE YouDataBase
GO

DECLARE @FileName sysname = N'YouDataBase';
DECLARE @TargetSize INT = (SEL ECT 1 + size*8./1024 FR OM sys.database_files WHERE name = @FileName);
DECLARE @Factor FLOAT = .999;

WHILE @TargetSize > 0
BEGIN
SET @TargetSize *= @Factor;
DBCC SHRINKFILE(@FileName, @TargetSize);
-- DECLARE @msg VARCHAR(200) = CONCAT('Shrink file completed. Target Size: ',
-- @TargetSize, ' MB. Timestamp: ', CURRENT_TIMESTAMP);
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: '
+cast( @TargetSize as VARCHAR(20))+' MB.'+ cast(CURRENT_TIMESTAMP as varchar(20));
-- @TargetSize+ ' MB. Timestamp: '+ CURRENT_TIMESTAMP;

RAISERROR(@msg, 1, 1) WITH NOWAIT;
WAITFOR DELAY '00:00:01';
END;
Показать


Это для 2008, для более старших, можешь расскоментить, что б красившее мессаги выводились. Размер шринка, то же можешь увеличить. Хотя, и так норм. Работе остальных юзверей не мешает.
12. cad2206 30.03.22 15:56 Сейчас в теме
(6)

При таком раскладе, файл с 800ГБ до 200ГБ будет усекаться несколько дней...
31. namazi74 5 01.04.22 08:30 Сейчас в теме
(12)
При таком раскладе, файл с 800ГБ до 200ГБ будет усекаться несколько дней...


всё зависит от мощности и загруженности оборудования
13. user1203706 15 30.03.22 16:03 Сейчас в теме
(12) Быстрее на самом деле. И..не всё ли равно, сколько он будет делаться ? Он не мешает работе пользователей. Запустил и радуйся.
Это всяко быстре, чем из твоей базы делать риб, создавать узел с полным обменом, разворачивать бэкап скуля, прибивать всю регистрацию изменений для этого узла, потом все изменения тащить еще в шринкованную базу, в надежде что что-то не потерялось, потом подменять имена баз. Оно тебе вообще нннадо ?
У тя хоть база в 800 гигов за сколько из бэкапа подымается ?
15. cad2206 30.03.22 16:09 Сейчас в теме
(13)

1. А не помешает ли она ежедневному обслуживанию базы (бэкап, дефраг, статистика)?

2. И главное, прежде чем усекать базу (SHRINKFILE) ее нужно сначала сжать (DATA_COMPRESSION), т.к. внутри файла свободного места нет, а эта процедура точно блочит таблицы и выполняться в рабочее время не может. А за технологическое окно выполниться не успеет. Тут какие мысли?
14. user1203706 15 30.03.22 16:09 Сейчас в теме
Если тебе надо разово и "быстро", то делай шринк в процентном отношении -по 20%, например. За 5 раз сожмешь. Это тоже быстрее, чем шринк до нуля.
16. user1203706 15 30.03.22 16:14 Сейчас в теме
(15)
1.нет
2. DATA_COMPRESSION сделаешь потом опосля шринка.
18. cad2206 30.03.22 16:17 Сейчас в теме
(16)

2. Мне нет смысла запускать шринк, т.к. внутри файла нет свободного места. Сначала нужно сжать данные внутри файла.
17. user1203706 15 30.03.22 16:15 Сейчас в теме
Ты запускай прям щас. Скрипт всегда можно остановить в любой момент.
Да смотри в мониторе активности, кто и чего там у тя грузит.
19. user1203706 15 30.03.22 16:21 Сейчас в теме
(18) ? А откуда тогда утверждение 800 ---->200 ?
Ты надеешься, что после сжатия (DATA_COMPRESSION = PAGE) у тя будет кучка свободного места для шринка ?
20. cad2206 30.03.22 16:37 Сейчас в теме
(19)

Да, проверено экспериментально на копии базы
21. user1203706 15 30.03.22 16:43 Сейчас в теме
Каким скриптом ты делаешь сжатие, и сколько по времени оно занимает. И что мешает потом, делать шринк по частям ?
22. user1203706 15 30.03.22 16:44 Сейчас в теме
+ помимо сжатия, желательно еще и триггер повесить на сжатие для новых таблиц..валялся тут на нимфостарте.
23. cad2206 30.03.22 16:57 Сейчас в теме
(21)

https://infostart.ru/1c/articles/692209/ из этой статьи, и конечно вешаю триггеры.

По времени сжатие занимает порядка 5,5 часов
24. user1203706 15 30.03.22 17:17 Сейчас в теме
(23) ясно-понятно. Ну и делайте сжатие, тупо выполнив
EXEC sp_MSforeachtable 'ALT ER TABLE ? REBUILD WITH (DATA_COMPRESSION = PAGE)'
EXEC sp_MSforeachtable 'ALT ER INDEX ALL ON ? REBUILD WITH (DATA_COMPRESSION = PAGE)'

И перед этим базу в симпл, мдоп поднять>1 (потом вернуть взад).
А шринк, потом уже скриптом на работающих пользователях.
25. user1203706 15 30.03.22 17:19 Сейчас в теме
Можно и не сразу все таблички, а тем же скриптом фрагстера, по частям. Если не успеваете в технологическое окно влезть.

А делать всякие выгрузки- загрузки из базы в базу не стоит.
26. user1203706 15 30.03.22 17:20 Сейчас в теме
Ну и регламенты, на время сжатия с базы потушите (тупо службу агента скуля остановить, например)
27. cad2206 30.03.22 17:25 Сейчас в теме
(26)

На самом деле я этот скрипт доделал и ограничил его выполнение по времени и отрабатывал его. Но потом возникла идея сделать все на копии, а потом в сжатую и усеченную копию залить недостающие данные. Рассматривал вариант системы отслеживания измененных данных в MS SQL и затем через SSIS заливать, но похоже это гораздо сложнее реализовать, чем за несколько ночей прогонять на рабочей базе.

Спасибо за советы.
28. cad2206 31.03.22 16:52 Сейчас в теме
А тут у меня вопрос возник, а не нужно ли перед выполнением Вашего скрипта запускать SHRINKFILE с параметром NOTRUNCATE, дабы сместить все данные в начало файла?
29. cad2206 31.03.22 16:56 Сейчас в теме
Сорян, сам нашел ответ:

target_size
Если он указан, то инструкция DBCC SHRINKFILE пытается сжать файл до размера target_size. Используемые страницы в освобождаемой области файла перемещаются в свободное пространство в сохраняемых областях файла.
30. cad2206 31.03.22 17:21 Сейчас в теме
Хм, на одном из прогонов в цикле на тестовой базе зависло и уже больше часа выполняется, что может быть?
32. namazi74 5 01.04.22 08:32 Сейчас в теме
(30)
Хм, на одном из прогонов в цикле на тестовой базе зависло и уже больше часа выполняется, что может быть?


сжимает видимо
33. cad2206 01.04.22 09:36 Сейчас в теме
(32)

да сжал то я до этого. сейчас скрипт от user1203706, который SHRINKFILE выполняет кусками. за 17 часов 100ГБ усек всего... или это нормально...
38. namazi74 5 01.04.22 10:36 Сейчас в теме
(33)
а сжал то я до этого. сейчас скрипт от user1203706, который SHRINKFILE выполняет кусками. за 17 часов 100ГБ усек всего... или это нормально...


100 гб - это супер нормально)
34. user1203706 15 01.04.22 09:47 Сейчас в теме
(33) вполне нормально. Там же усечение минимальное выставлено. Если нужно разово и быстро - руками по гигов 50 выставляй и вперёд
35. cad2206 01.04.22 10:20 Сейчас в теме
(34)

может что не понял, как можно руками по 50ГБ выставлять?
36. user1203706 15 01.04.22 10:22 Сейчас в теме
(35) либо в скрипте поправить формулу,либо тупо руками указывать % в консоли самого скуля при шринке
37. cad2206 01.04.22 10:26 Сейчас в теме
target_size же не в процентном соотношении
39. user1203706 15 01.04.22 10:49 Сейчас в теме
(37) ну ты тугой.. % указать в окошке сколько будет доступно свободного места после сжатия.
А в формуле в скрипте не трудно увидеть, по сколько он за раз усекает.. разве это не очевидно, не ?
40. user1203706 15 01.04.22 10:53 Сейчас в теме
+ если сжимать не базу, а файлы - там можно выбрать размер (не в %, а в мб)..
41. cad2206 01.04.22 11:01 Сейчас в теме
не ругайтесь. я не понял что Вы имеете ввиду GUI, а не консоль, видимо
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот