|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Посоветуйте лучший вариант. Есть большая таблица которую можно партицировать по месяцам (буфер сообщений) . Т.е. изменений в прошлых месяцах не бывает. Хочу реализовать партицирование с возможностью убирать данные из прошлых месяцев безвозвратно в архив для освобождения места т.е. если они понадобятся восстановить одну партицию. Мне пока пришел в голову только один вариант а) Сделать партицированную таблицу перелить туда нужные данные. б) По прошествии нескольких месяцев - прошлый период заархивировать , а после выполнить команду TRUNCATE TABLE PartitionTable1 WITH (PARTITIONS (2, в) Сделать shrink файловой группы заархивированной партиции тем самым освободив место Из минусов - truncate по партиции поддерживается только в SQL Server 2016 (13.x), а у меня 2008r2 но это решаемо. Как понимаю штатных средств сделать отсоединение партиции нет ни в какой версии MS SQL Server. Возможно есть какие то еще варианты? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 20:36 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 Как понимаю штатных средств сделать отсоединение партиции нет ни в какой версии MS SQL Server. См. ALTER TABLE ... SWITCH ... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 21:21 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg selis76 Как понимаю штатных средств сделать отсоединение партиции нет ни в какой версии MS SQL Server. См. ALTER TABLE ... SWITCH ... Видел в доке но не понимаю как оно мне может помочь в вопрос освобождения места. Основная цель, легко отстегивать партиции в архив освобождая место на дисках. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 21:28 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 alexeyvg Как это нет, для чего тогда нужны партиции??? См. ALTER TABLE ... SWITCH ... Видел в доке но не понимаю как оно мне может помочь в вопрос освобождения места. Основная цель, легко отстегивать партиции в архив освобождая место на дисках. Я бы хотел, что бы в сиквеле можно было отсоединить файлгруппу от базы, и подсоединить её к другой базе - вот это было бы "отстёгивать в архив". Или положить файлы на ленту, а потом, через 10 лет, подсоединить к этой или другой базе. Так что будем считать, что вы как то там перенесли данные из партиции в архив, и теперь хотите освободить место. Для этого 1) делаете пустую таблицу, такую же, как партицированная, но без секциониролвания. 2) Потом делаете ALTER TABLE ... SWITCH ..., и данные секции оказываются в этой новой таблице, а партиция освобождается. 3) Далее, если данные не нужны, дропаете эту таблицу (или делаете TRUNCATE) - место освободилось. 4) Далее, если вам не нужна пустая секция, то можете её схлопнуть, выполнив ALTER PARTITION FUNCTION ... MERGE RANGE. Но для освобождения места это не нужно. 5) (если партиции в отдельных файлгруппах) После этого можно либо шринкнуть файл до пустого (если не делать (4)), либо его удалить (если делать (4)) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 21:42 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, "Легко отстегивать" легко. Но вот перемещать в архив придется переливкой. Волшебства, по которому кусок дынных из одного файла "легко" переместится в другой, нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 21:43 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg 1) делаете пустую таблицу, такую же, как партицированная, но без секциониролвания. alexeyvg 3) Далее, если данные не нужны, дропаете эту таблицу (или делаете TRUNCATE) - место освободилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 21:45 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич selis76, "Легко отстегивать" легко. Но вот перемещать в архив придется переливкой. Волшебства, по которому кусок дынных из одного файла "легко" переместится в другой, нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 21:45 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, Давайте начнет с другого. А что вы в точности понимаете под "архивировать" партицию или её данные? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 08:02 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 Посоветуйте лучший вариант. Тупо делать Код: sql 1. 2. 3. 4.
И не выдумывать приключений на собственную задницу. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 10:02 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
aleks222 selis76 Посоветуйте лучший вариант. Тупо делать Код: sql 1. 2. 3. 4.
И не выдумывать приключений на собственную задницу. Но если данных действительно много, то приходится оптимизировать (как у selis76 - непонятно, про размеры он не писал). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 10:24 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg selis76 пропущено... Видел в доке но не понимаю как оно мне может помочь в вопрос освобождения места. Основная цель, легко отстегивать партиции в архив освобождая место на дисках. Я бы хотел, что бы в сиквеле можно было отсоединить файлгруппу от базы, и подсоединить её к другой базе - вот это было бы "отстёгивать в архив". Или положить файлы на ленту, а потом, через 10 лет, подсоединить к этой или другой базе. Так что будем считать, что вы как то там перенесли данные из партиции в архив, и теперь хотите освободить место. ..... Задача простая - взять секцию данных (за месяц) положить на ленту, а если ктото попросит архивные данные вернуть их в секцию той же таблицы. Поскольку это последовательный буфер сообщений, причины возврата секции могут быть разные напр нужно переимпортировать данные в незакрытом годе по новому алгоритму, либо аудиторы попросят исходные данные на основе которых были транзакции. Эти причины сравнительно редкие, а объем за год 400 миллионов записей с XML полем, и гдето 5 терабайт. Bcp даже месяц таких данных тяжело переваривает, а зеркалировать это для отказоустойчивости накладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 12:19 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
aleks222 selis76 Посоветуйте лучший вариант. Тупо делать Код: sql 1. 2. 3. 4.
И не выдумывать приключений на собственную задницу. Без приключений в моем случае никак, Transaction log нерезиновый когда за год 400 миллионов записей , а если пакетами записей делать, то нужно городить хороший скрипт на TSQL . Delete самая накладная операция , да еще индексы все затормозят а их отключать нельзя, поскольку это буфер сообщений который должен быть почти всегда Online ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 12:28 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, если только копировать секцию в новую базу и эту базу бэкапить. Саму секцию очищать при помощи switch/truncate. Обратное действие такое же - восстановление бэкапа и копирование в исходную базу, если требуется, через промежуточную таблицу/switch. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 13:24 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 alexeyvg пропущено... "Отстёгивать в архив" не совсем понятное задание :-) Я бы хотел, что бы в сиквеле можно было отсоединить файлгруппу от базы, и подсоединить её к другой базе - вот это было бы "отстёгивать в архив". Или положить файлы на ленту, а потом, через 10 лет, подсоединить к этой или другой базе. Так что будем считать, что вы как то там перенесли данные из партиции в архив, и теперь хотите освободить место. ..... Задача простая - взять секцию данных (за месяц) положить на ленту, а если ктото попросит архивные данные вернуть их в секцию той же таблицы. Поскольку это последовательный буфер сообщений, причины возврата секции могут быть разные напр нужно переимпортировать данные в незакрытом годе по новому алгоритму, либо аудиторы попросят исходные данные на основе которых были транзакции. Эти причины сравнительно редкие, а объем за год 400 миллионов записей с XML полем, и гдето 5 терабайт. Bcp даже месяц таких данных тяжело переваривает, а зеркалировать это для отказоустойчивости накладно. Увы, просто скопировать файлы секции нельзя. так что только либо копировать данные, либо выгружать bcp. Зеркалирование тут неважно, оно же не заменяет бакапа/выгрузки в архив. По моему опыту, bcp в нейтив формат будет быстрый. Секции на месяц будут по полтеррабайта, в общем не особо много, но, конечно, дисковые подсистемы должны соответствовать. У меня были ссуточные секции по 150 гигов, не помню точно, сколько их bcp выгружал, но вроде меньше часа. На слабом железе. Выгружать лучше из отсоединённой секции, что бы уж точно ничего не блокировать, и потом удалять эти данные, после проверки корректности выгрузки, и записи её на ленту. Владислав Колосов если только копировать секцию в новую базу и эту базу бэкапить Но этот вариант тоже можно проверить. Прямо делать select * into из отсоединённой секции. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 15:02 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 aleks222 пропущено... Тупо делать Код: sql 1. 2. 3. 4.
И не выдумывать приключений на собственную задницу. Без приключений в моем случае никак, Transaction log нерезиновый когда за год 400 миллионов записей , а если пакетами записей делать, то нужно городить хороший скрипт на TSQL . Delete самая накладная операция , да еще индексы все затормозят а их отключать нельзя, поскольку это буфер сообщений который должен быть почти всегда Online Не смешите мои тапочки. Весь скрипт: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 15:18 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
aleks222 Код: sql 1.
Вы всерьез считаете это оптимальным методом? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 15:23 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
msLex aleks222 Код: sql 1.
Вы всерьез считаете это оптимальным методом? Секция страдальцу НЕ нужна. Кластерный индекс по дате и фсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 15:24 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
aleks222, И правда, транкейт для трусов. Он же примерно около 0 байт в лог напишет, не будет долго и упорно на вторичной реплике применяться, не будет долго и упорно в лог бэкапиться. Скукотища, в общем. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 15:27 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
aleks222 Секция страдальцу НЕ нужна. Кластерный индекс по дате и фсе. По моему, это как раз тот случай, когда нужно использовать секционирование. Не то, что без него не обойтись (удаление по 20 гб в день мелкими порциями вполне реально, при кластерном индексе по дате), но польза будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 15:29 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич aleks222, И правда, транкейт для трусов. Он же примерно около 0 байт в лог напишет, не будет долго и упорно на вторичной реплике применяться, не будет долго и упорно в лог бэкапиться. Скукотища, в общем. Ну, если бы надо было только транкейтнуть. Желания страдальца немного шире. alexeyvg aleks222 Секция страдальцу НЕ нужна. Кластерный индекс по дате и фсе. По моему, это как раз тот случай, когда нужно использовать секционирование. Не то, что без него не обойтись (удаление по 20 гб в день мелкими порциями вполне реально, при кластерном индексе по дате), но польза будет. Если цель: быстро и сразу. Да флаг ему в руки. Только куда торопиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 16:15 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg, пустую базу можно создавать сразу нужного размера, если применить bulk вставку при помощи SSIS, то должно быть быстро. Плюс надежность резервных копий. Хотя у Вас практический опыт применения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 16:45 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Владислав Колосов пустую базу можно создавать сразу нужного размера Владислав Колосов Плюс надежность резервных копий. И вообще, можно замутить восстановление (при необходимости) таких баз, и модификацию вьюх для доступа к архивным "секциям" (объединяя архивные данные ) Если стоит задача регулярного доступа к архивным данным, то получится быстро. PS Мы SSIS не применяли, потому что у нас архивный сервер был доступен только по sftp, поэтому была такая извращённая схема. PPS А только по sftp, потому что сетевые админы клиента где то случайно закрыли порты, и не знали, где ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 17:56 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg Владислав Колосов пустую базу можно создавать сразу нужного размера Владислав Колосов Плюс надежность резервных копий. И вообще, можно замутить восстановление (при необходимости) таких баз, и модификацию вьюх для доступа к архивным "секциям" (объединяя архивные данные ) Если стоит задача регулярного доступа к архивным данным, то получится быстро. PS Мы SSIS не применяли, потому что у нас архивный сервер был доступен только по sftp, поэтому была такая извращённая схема. PPS А только по sftp, потому что сетевые админы клиента где то случайно закрыли порты, и не знали, где спасибо за развернутый ответ но как я понимаю bcp индексы не сохраняет потом их ребилдить отдельно - неудобно, но решаемо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2020, 14:44 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Владислав Колосов alexeyvg, пустую базу можно создавать сразу нужного размера, если применить bulk вставку при помощи SSIS, то должно быть быстро. Плюс надежность резервных копий. Хотя у Вас практический опыт применения. В принципе красиво будет, как понимаю switch на другую базу пройдет сразу с индексами ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2020, 14:45 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 Владислав Колосов alexeyvg, пустую базу можно создавать сразу нужного размера, если применить bulk вставку при помощи SSIS, то должно быть быстро. Плюс надежность резервных копий. Хотя у Вас практический опыт применения. В принципе красиво будет, как понимаю switch на другую базу пройдет сразу с индексами А есть способ перекинуть файловую группу или файл БД из одной БД в другую БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2020, 14:52 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
aleks222 Весь скрипт: Код: sql 1.
Делал так на несекционированных логах, когда их по чуть-чуть переносил в архив. Работало вполне нормально на довольно большом объеме. Но у меня операция выполнялось редко и только во время минимальной активности пользователей. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2020, 15:18 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 но как я понимаю bcp индексы не сохраняет потом их ребилдить отдельно - неудобно, но решаемо То есть bcp в таблицу-кучу, потом строю кластерный индекс, потом переключаю секцию. Критик Делал так на несекционированных логах, когда их по чуть-чуть переносил в архив. Работало вполне нормально на довольно большом объеме. А так то да, если можно просто удалить, чего зря городить код? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2020, 18:42 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg selis76 но как я понимаю bcp индексы не сохраняет потом их ребилдить отдельно - неудобно, но решаемо То есть bcp в таблицу-кучу, потом строю кластерный индекс, потом переключаю секцию. .... ? А как боролись с объемом файлов данных которые порождает BCP - ? клали в папки типа Compressed folders? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2020, 13:15 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 alexeyvg пропущено... Я же в секции загружал. Как описал выше. То есть bcp в таблицу-кучу, потом строю кластерный индекс, потом переключаю секцию. .... ? А как боролись с объемом файлов данных которые порождает BCP - ? клали в папки типа Compressed folders? Потом, перед копированием, коненчно, сжимал. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2020, 13:56 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Интересно, а так - будет работать: 1. Создаем таблицу в другой БД. 2. Создаем к ней алиас в основной БД 3. Переименовываем таблицу в основной базе. 4. Создаем view в основной базе, и называем его как таблицу в основной базе: Select * from таблица_в_основной_базе Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_основной_таблице union all Select * from алиас Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_архивной_таблице И в дальнейшем везде оперируем только view. Ну и, собственно, загрузка старых данных - это bcp в рядомстоящую таблицу в архивной базе, а потом alter table switch. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2020, 07:48 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
uaggster Интересно, а так - будет работать: 1. Создаем таблицу в другой БД. 2. Создаем к ней алиас в основной БД 3. Переименовываем таблицу в основной базе. 4. Создаем view в основной базе, и называем его как таблицу в основной базе: Select * from таблица_в_основной_базе Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_основной_таблице union all Select * from алиас Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_архивной_таблице И в дальнейшем везде оперируем только view. Ну и, собственно, загрузка старых данных - это bcp в рядомстоящую таблицу в архивной базе, а потом alter table switch. Сиквел на это специально рассчитан, такая вьюха называется "Секционированное представление" (на разных серверах "Распределённое секционированное представление"), и сервер оптимизирует обращения к отдельным его "частям". После появления секционирования этим представлениям стали меньше уделять внимания, но раньше это был единственный способ секционирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2020, 10:47 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Подскажите пожалуйста способы наиболее эффективного бэкапа для партицированных таблиц, которые используют файловые группы в циклическом режиме Т.е. заниматься частым архивированием только активной партиции + иметь возможность truncate данные одной партиции и восстановить ее без манипуляций со switch Из https://docs.microsoft.com/ru-ru/sql/t-sql/statements/backup-transact-sql?view=sql-server-ver15 https://blog.coeo.com/five-cool-things-you-can-do-using-partitioning Я понял что можно переводить в режим read only только файловые группы и архивировать именно файловые группы, но я не вижу команд для архивирования просто партиций . Просто при циклическом переключении файловых групп неудобно их переводить в Read only и обратно (нужно следить скриптом) SQL Server 2019 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 13:43 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 Подскажите пожалуйста способы наиболее эффективного бэкапа для партицированных таблиц, которые используют файловые группы в циклическом режиме Т.е. заниматься частым архивированием только активной партиции ... Я понял что можно переводить в режим read only только файловые группы и архивировать именно файловые группы, но я не вижу команд для архивирования просто партиций . Просто при циклическом переключении файловых групп неудобно их переводить в Read only и обратно (нужно следить скриптом) SQL Server 2019 Без отдельных файловых групп никак. Сиквел не имеет функциональности (как и любые другие СУБД) делать бакап и рестор отдельных секторов в файле базы данных. selis76 + иметь возможность truncate данные одной партиции и восстановить ее без манипуляций со switch "Восстановить" нельзя, т.к. нельзя бакапить и рестроить отдельные сектора в файле БД, как я уже говорил. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 14:36 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg "Восстановить" нельзя, т.к. нельзя бакапить и рестроить отдельные сектора в файле БД , как я уже говорил. для полноты картины, можно восстанавливать страницы файла Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 14:42 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
komrad alexeyvg"Восстановить" нельзя, т.к. нельзя бакапить и рестроить отдельные сектора в файле БД , как я уже говорил. для полноты картины, можно восстанавливать страницы файлаНе, ну это ковыряние ручками, а не бакап-рестор. Тут команда называется "RESTORE DATABASE", да, но при этом но не является рестором базы (или её части) из бакапа... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 14:49 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg Под архивированием вы подразумеваете бакап? Без отдельных файловых групп никак. Да именно бэкап. База является буфером который наполняется последовательно , и поэтому хотелось сократить время резервного копирования + иметь возможность оперативно убирать \восстанавливать старые партиции. Но видимо придется делать обычную схему - полный бэкап раз в неделю + инкрементальный + дневной бэкап логов. А с архивными партициями управляться через BCP , конечно неудобно что в MS SQL нет удобного механизма подключения и отключения архивных партиций а только через BCP + Switch . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 16:19 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, подумайте над архитектурой вашего ПО, к примеру, если уйти от хранения xml в СУБД, то и куча ваших проблем также исчезнет ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 16:35 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, наиболее эффективный путь - это перенос "секций" в отдельную базу + секционированное представление. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 16:41 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 alexeyvg Под архивированием вы подразумеваете бакап? Без отдельных файловых групп никак. Да именно бэкап. База является буфером который наполняется последовательно , и поэтому хотелось сократить время резервного копирования + иметь возможность оперативно убирать \восстанавливать старые партиции. Но видимо придется делать обычную схему - полный бэкап раз в неделю + инкрементальный + дневной бэкап логов. А с архивными партициями управляться через BCP , конечно неудобно что в MS SQL нет удобного механизма подключения и отключения архивных партиций а только через BCP + Switch . посмотрите тут Partial Backups ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2021, 08:56 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Надо сказать switch это еще то приключение даже если делаешь таблицы как копия метаданных switch out проходит норм , а для switch in приходится городить констрейнт ALTER TABLE [dbo].[msg_buffer_temp] ADD CONSTRAINT Range_msg_buffer_temp CHECK (MsgCounter>2560000000 AND MsgCounter<=2590000000); иначе MS SQL выдает ошибку "allow values that are not allowed by range defined by partition" Т.е. получается что партицирование как инструмент удобного перевода исторических данных в архив и обратно (по партициям) не такое уж и удобное. 1) Alter table switch работает только в рамках одной файловой группы в другую базу его не сделаешь 2) Бэкап, truncate , восстановление нужной партиции можно сделать только через BCP - долго 3) Бэкап\восстановление отдельных партиций через файловые группы можно делать только если она в read -only, т.е последующий транкейт не сделаешь. Т.е. с одной стороны куча контролей по констрейнтам, а с другой узкие возможности по переносу данных. Получается если чтото историческое хочешь отправить в архив проще 1) Сделать архив базы buffer 2) Затранкейтить ненужные партиции Если понадобится восстановить отдельную партицию 3) При необходимости восстановить его в том же Instance SQL под именем buffer_backup 4) Далее через insert перенести данные в нижний диапазон. Хорошо что insert почти не раздувает transaction log ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:18 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 для switch in приходится городить констрейнт Но всё равно же быстрее, чем вставка/удаление обычными insert delete. selis76 Получается если чтото историческое хочешь отправить в архив проще Намного производительней, проще, гибче, и надёжней. Притом всё это несравнимо, не "чуть чуть" Но с партициями тоже можно кое как работать, если приноровиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:49 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, зачем гонять из архива секции, я выше написал магические слова - "секционированное представление". Достаточно изменить представление, чтобы архив стал доступен. Читаете, но не видите... И Алексей об этом же пишет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 23:28 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Владислав Колосов selis76, зачем гонять из архива секции, я выше написал магические слова - "секционированное представление". Достаточно изменить представление, чтобы архив стал доступен. Читаете, но не видите... И Алексей об этом же пишет. Я читал про секционированное представление, но для себя решил пока его не использовать по 3м причинам 1) Чтобы соединить два набора данных (архивная + актуальная таблицы) и это будет View с union причем таблиц из разных баз одного инстанса . Т.е. для оптимизатора это будут по сути разные таблицы с разными индесами (даже если там все логически одинаково) и он наверняка будет всегда делать поиск по обоим всегда. 2) Мне может понадобится восстановить более чем один диапазон из архива из разных бэкапов. 3) У меня много запросов с разными комбинациями условий и join + чтобы избежать обращения ко всем партициям (известная особенность) приходится везде ставить условие на основное поле партицированного индекса MsgCounter. Учитывая это решил, что заставлять оптимизатор Microsoft работать правильно сложнее чем загнать архивные данные через insert если нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 14:14 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, а что мешает вам сделать два представления, для архива и для текущей базы? А уже потом соединят их результаты так или иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 14:18 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, Похожая проблема на oltp базе. Пока что делаю топорно пару раз в год: - создаю новую пустую таблицу (в некоторых случаях переливаю часть данных, создаю индексы, синхронизтрую последние записи) - переименовываю обе, чтобы вставки шли в новую - копирую старую в архив и удаляю Это работает, так как данные в этих таблицах не меняются. Партиционированные виды не применяю, т.к. не выполнить условие по PK. Партиционированные таблицы (скользящее оконо) не применяю, так как: таблица периодически меняется, в случае ошибки с организацией скользящего окна ляжет приложение т.е. что бы что то изменить, нужен человек с опытом, нужно тестировать - т.е. затраты времени на небольшую сервисную функцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 15:02 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76 1) Чтобы соединить два набора данных (архивная + актуальная таблицы) и это будет View с union причем таблиц из разных баз одного инстанса . Т.е. для оптимизатора это будут по сути разные таблицы с разными индесами (даже если там все логически одинаково) и он наверняка будет всегда делать поиск по обоим всегда selis76 2) Мне может понадобится восстановить более чем один диапазон из архива из разных бэкапов. Вы можете иметь произвольное количество архивных копий, и подсоединять их, модифицируя само представление. Можете включить один архив в представление/ можете все сразу, варианты ограничены только вашей фантазией и железом. Например, у вас есть база с транзакциями за активный период, и базы за прошедшие месяцы. Архивные базы хранятся на ленте. Вы копируете с ленты баз за феврали с 2001 по 2010 год, потом оп - за 1 мс меняется представление ,у вас доступны активный период, плюс феврали за 10 лет. С секционировнаной таблицей для того же самого нужно будет дополнительно восстанавливать бакапы, плюс делать чек констрэйн. Присоединять секции снаружи там нельзя, чек-констрейн оно тоже почему то не сохраняет при отоединении. selis76 Учитывая это решил, что заставлять оптимизатор Microsoft работать правильно сложнее чем загнать архивные данные через insert если нужно. Кроме того, не преувеличивайте негативные последствия обращения ко всем секциям, там накладные расходы проявляются только для огромного потока сверх-лёгких обращений. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 17:56 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
alexeyvg, я правильно понял, что вы предлагает менять код на проде в онлайн режиме, так сказать? Это универсальный совет или только для случая ленточных баз? С ними я дела не имел, поэтому специфики не знаю. Мы на лентах только бекапы хранили, и то это было 15 лет назад. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2021, 11:30 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Еще один подводный камень с партициями. Нужно сделать массовую загрузку данных в несколько свободных партиций, а для этого нужно отключить все индексы кроме кластреного (для скорости) И вот что получается - ребилд по партициям можно сделать , а Disable уже нет только для всего индекса https://docs.microsoft.com/ru-ru/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver15 У microsoft формально есть решение с 2005 года, типа грузите в стейдж таблицу, там ребилд индексов а далее переключите ее в партицию https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2005/administrator/cc966380(v=technet.10) т.е. если еще нужно констрейнты по диапазонам ставить то уже эта акробатика напрягает. Вроде бы партиции специально придумали для изолированной работы с партициями , но по факту без stage таблиц ничего не живет. Сразу захотелось поизучать как дела у Oracle с этим, по опыту использования там всегда продуманней механизмы были ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 15:48 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Кесарь Это универсальный совет или только для случая ленточных баз? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 23:07 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
selis76, Вообще-то все "некурильщики" загружают в отдельные пустые таблицы, которые потом получают нужные индексы и переключаются в основную таблицу. Если лень пересоздавать кластерный индекс, то можно направить в таблицу уже отсортированный поток ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2021, 13:33 |
|
Партицирование с возможностью убрать партицию в архив
|
|||
---|---|---|---|
#18+
Критик Вообще-то все "некурильщики" загружают в отдельные пустые таблицы, которые потом получают нужные индексы и переключаются в основную таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2021, 13:49 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1684604]: |
0ms |
get settings: |
17ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
others: | 281ms |
total: | 447ms |
0 / 0 |