Pull to refresh

Comments 28

Я могу написать, как я чистил логи за 5 лет (которые я бережно переносил с каждым бекапом).
С радостью бы почитал такую информацию. Заранее спасибо.
Специально для вас напишу в блог.
А я правильно понял, что в БД накопилось 42Гб транзакций которых почему-то никто не удалял, но постоянно сканировал линейным методом? Если это не так, то что тормозило тогда?
Возможно ключ к разгадке как раз CDC который не успевал применятся на таблицы с изменениями, отчего и копилась очередь.
Вот и бекап пригодился…

В общем ситуация была следующей: CDC выполнялась по расписанию и внутри обращалась к sys.transmission_queue, который в свою очередь смотрел на sys.sysxmitqueu. На плане можете увидеть, что делался Index Seek огромное число раз и именно по этому убивался диск и ЦП при выполнении:



План я взял из dbForge исключительно из-за наглядности, поскольку в SSMS надписи на «стрелками» нет.
а статистика верная на sys.sysxmitqueu?
Нет, если говорить про момент, когда я анализировал проблему. Первоначально были планы ее обновить. Но потом принял решение почистить таблицу описанные выше способом.
И забыл добавить… почему не обновил статистику. Поскольку объект системный его напрямую нельзя трогать и такая вот команда выполняться не будет:

UPDATE STATISTICS sys.sysxmitqueu WITH FULLSCAN

Msg 2706, Level 16, State 6, Line 1
Table 'sysxmitqueu' does not exist.

Простите за оффтопик, но очень уж два вопроса мучают последние эн лет. Может, они еще кого-то тоже мучают.

Почему в mssql вместо ansi sql кавычек используются квадратные скобки, а вместо точки с запятой — слово GO? Есть этому какое-то объяснение?
Можно и кавычки. Но это на один Shift больше.
А точка с запятой необходима, если будете пользоваться with()select — там перед with она необходима. Соответственно, если б была разделителем, никто б не смог создать процедуру с этой конструкцией. Из-за чего невозможно пользоваться плагином к Eclipse. Ну и вообще интересно, где это такое в стандарте. Насколько помню, там точка с запятой ставится после команды и mssql именно так и ведёт себя. А вот пакеты разделяются GO и это не стандарт языка, а формат для Management Studio.
А вообще всё это по историческим причинам.
Так при использовании CTE точка с запятой и отделяет with от предыдущей команды, чтобы было отличие от табличных хинтов.
Квадратные скобки удобнее в языках программирования, например в C#: "SELECT [Name]" вместо @"SELECT ""Name""".
точка с запятой так же может разделять стейтменты внутри блока. GO совершенно не замена её.
Да, у нас msdb тоже сильно растет из-за резервного копирования 300-500 маленьких баз.

Но на этот случай вы как раз можете создать визардом план обслуживания типа «Очистка журнала», включающий очистку
msdb.dbo.sp_delete_backuphistory
msdb.dbo.sp_purge_jobhistory
msdb..sp_maintplan_delete_log
Кто то может подсказать как зачистить
dbo.sysmaintplan_logdetail, у меня 33 гигабайт в этой таблице, встроеные зачистки и сжатия результата не дают…
Такой вариант не помог?

USE msdb
GO

ALTER TABLE dbo.sysmaintplan_log
    DROP CONSTRAINT FK_sysmaintplan_log_subplan_id
ALTER TABLE dbo.sysmaintplan_logdetail
    DROP CONSTRAINT FK_sysmaintplan_log_detail_task_id
GO

TRUNCATE TABLE msdb.dbo.sysmaintplan_logdetail
TRUNCATE TABLE msdb.dbo.sysmaintplan_log
GO

ALTER TABLE dbo.sysmaintplan_log WITH CHECK
    ADD CONSTRAINT FK_sysmaintplan_log_subplan_id
    FOREIGN KEY(subplan_id)
    REFERENCES dbo.sysmaintplan_subplans (subplan_id)
GO

ALTER TABLE dbo.sysmaintplan_logdetail WITH CHECK
    ADD CONSTRAINT FK_sysmaintplan_log_detail_task_id
    FOREIGN KEY(task_detail_id)
    REFERENCES dbo.sysmaintplan_log (task_detail_id) ON DELETE CASCADE
GO
Еще не пробовал. Сейчас попробую, насколько опасно на ходу делать (базы юзают вов всю)?
А что опасного? Если нет никаких блокировок на изменению схемы, то все нормально сможеть выполниться. Решите для себя нужны ли Вам эти данные. В них хранится история запуска планов обслуживания, насколько я помню. Что такое сжатие в Вашем понимании? Есть на уровне ROW, PAGE и отдельный фетиш — ColumnStore (начиная с 2014го).
Я спрашиваю, нет вообще опыта и понимания что может MS удумать…
Сейчас запустим. Делаю пока резерв.
Я лишь вижу, что команда отработала успешно. К тому же сервер бы не мешало обновить. Уже есть SP4, а вы все на RTM сидите.
Обновить да… ;( Но меня смутило «строк 0» и время 00:00:00
Можно попробовать в следующий раз написать более медленный вариант скрипта по удалению :) но суть не поменяется. А вообще-то советую свежие обновления на машину поставить и посмотреть что и как можно сконфигурировать, чтобы все быстрее шевелилось. Например, за счет Instant File Initialization.
Таблицу удалило. С топ 10 она пропала. Но на размер базы в общем не повлияло. Как было 30 с гаком так и осталось.
Так сделайте усечение файла данных. SQL Server за Вас это не будет делать (если конечно одна плохая настройка не включена по дефолту). Почитайте как сделать Shrink Flies.
Готово. С 38 гиг на 40 мегабайт.
Sign up to leave a comment.

Articles