Comments 18
Если хочется без нервотрепки, то должен быть на готове сервер с необходимыми ресурсами (место на диске, память, процессоры). Если есть такой сервер, то достаточно включить log shipping и не нужно будет никакие километры логов восстанавливать, да и время на восстановление уйдёт гораздо меньше.
0
Поскольку предполагаю, что здесь в комментариях соберется большое количество знатоков SQL Server хочу спросить: А влияет ли на быстродействие базы модель восстановления (судя по названию нет :) )?
0
Влияет. Иногда очень существенно. Почитайте про BULK INSERT и команды с минимальным протоколированием.
0
Не могу согласиться. Вопрос все-таки был немного другой. Основные модели восстановления это Полная и Простая. И с точки зрения производительности БД один одинаковы, т.к. в обоих случаях ведется журнал транзакций, только при Простой модели он усекается автоматически. Что касается модель восстановления с неполным протоколированием (Bulk Logged), то эта модель предназначена для временной замены Полной модели на период проведения массовых операций, например, массовой вставки данных или перестроением индексов.
0
Разница все таки есть. Я не говорил, что она проявляется везде и всегда. Но она есть! Гипотетический пример. Удаление большого числа данных из таблицы:
В случае SIMPLE модели восстановления, чтобы лог не рос нужно делать CHECKPOINT, для FULL спасает только бекап лога, который априори медленнее работает, чем CHECKPOINT. Хотя опять же с оговорками… Например, можно сделать бекап лога быстрее:
но ни к чему хорошему это не приведет, если мы говорим про продакшен.
SET NOCOUNT ON;
DECLARE @r INT = 1
WHILE @r > 0 BEGIN
BEGIN TRANSACTION
DELETE TOP(10000) dbo.tbl
--WHERE ...
COMMIT TRANSACTION
SET @r = @@ROWCOUNT
CHECKPOINT -- SIMPLE
BACKUP LOG -- FULL
END
В случае SIMPLE модели восстановления, чтобы лог не рос нужно делать CHECKPOINT, для FULL спасает только бекап лога, который априори медленнее работает, чем CHECKPOINT. Хотя опять же с оговорками… Например, можно сделать бекап лога быстрее:
BACKUP LOG db TO DISK 'nul'
но ни к чему хорошему это не приведет, если мы говорим про продакшен.
0
Спасибо. Всегда было интересно. Просто в моих задачах с точки зрения восстановления простая модель вполне устраивает, но переживал, за быстродействие.
Но рекомендация разносить базу и журнал на разные диски все равно актуальна так? И автоматическое усечение не влияет на производительность?
Но рекомендация разносить базу и журнал на разные диски все равно актуальна так? И автоматическое усечение не влияет на производительность?
0
SIMPLE:
До шринка файла данных:
После шринка:
FULL:
До шринка:
После:
Итого: При FULL модели восстановления видим, что лог используется более интенсивно (10 метров против 146).
Мало дисков не бывает. Если есть возможность, то разносите и радуйтесь жизни :)
Очень сильно влияет. Увеличивает фрагментацию файлов базы, увеличивает фрагментацию индексов, много ресурсов тратиться на последующий AutoGrow. Почитайте при случае Auto Shrink Events.
SET NOCOUNT ON;
USE [master]
GO
IF DB_ID('shrink') IS NOT NULL BEGIN
ALTER DATABASE [shrink] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [shrink]
END
GO
CREATE DATABASE [shrink]
ON
PRIMARY (NAME = shrink_data, FILENAME = N'D:\shrink_data.mdf', SIZE = 25MB, MAXSIZE = 200MB, FILEGROWTH = 10%)
LOG ON (NAME = shrink_log, FILENAME = N'D:\shrink_log.ldf', SIZE = 3MB, MAXSIZE = 200MB, FILEGROWTH = 10%)
GO
ALTER DATABASE [shrink] SET RECOVERY SIMPLE
USE [shrink]
GO
CREATE TABLE dbo.tbl (
c1 INT IDENTITY CONSTRAINT pk PRIMARY KEY NONCLUSTERED
, c2 CHAR(3000) DEFAULT 'дефолтный бред'
)
GO
DECLARE @i INT = 1
WHILE @i <= 40000 BEGIN
INSERT INTO dbo.tbl DEFAULT VALUES
IF @i % 500 = 0 CHECKPOINT
SET @i += 1
END
GO
DECLARE @i INT = 1
WHILE @i <= 20000 BEGIN
DELETE FROM dbo.tbl WHERE c1 = @i
IF @i % 500 = 0 CHECKPOINT
SET @i += 1
END
GO
CHECKPOINT
GO
SELECT name, size * 8192 / 1048576
FROM sysfiles
GO
DBCC SHRINKFILE(shrink_data, 40) WITH NO_INFOMSGS
GO
SELECT name, size * 8192 / 1048576
FROM sysfiles
До шринка файла данных:
---------------- -----------
shrink_data 169
shrink_log 3
После шринка:
name
---------------- -----------
shrink_data 81
shrink_log 10
FULL:
SET NOCOUNT ON;
USE [master]
GO
IF DB_ID('shrink') IS NOT NULL BEGIN
ALTER DATABASE [shrink] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [shrink]
END
GO
CREATE DATABASE [shrink]
ON
PRIMARY (NAME = shrink_data, FILENAME = N'D:\shrink_data.mdf', SIZE = 25MB, MAXSIZE = 200MB, FILEGROWTH = 10%)
LOG ON (NAME = shrink_log, FILENAME = N'D:\shrink_log.ldf', SIZE = 3MB, MAXSIZE = 200MB, FILEGROWTH = 10%)
GO
ALTER DATABASE [shrink] SET RECOVERY FULL
BACKUP DATABASE [shrink] TO DISK = 'NUL'
USE [shrink]
GO
CREATE TABLE dbo.tbl (
c1 INT IDENTITY CONSTRAINT pk PRIMARY KEY NONCLUSTERED
, c2 CHAR(3000) DEFAULT 'дефолтный бред'
)
GO
DECLARE @i INT = 1
WHILE @i <= 40000 BEGIN
INSERT INTO dbo.tbl DEFAULT VALUES
IF @i % 500 = 0
BACKUP LOG [shrink] TO DISK = 'NUL'
SET @i += 1
END
GO
DECLARE @i INT = 1
WHILE @i <= 20000 BEGIN
DELETE FROM dbo.tbl WHERE c1 = @i
IF @i % 500 = 0
BACKUP LOG [shrink] TO DISK = 'NUL'
SET @i += 1
END
GO
BACKUP LOG [shrink] TO DISK = 'NUL'
GO
SELECT name, size * 8192 / 1048576
FROM sysfiles
GO
DBCC SHRINKFILE(shrink_data, 40) WITH NO_INFOMSGS
GO
SELECT name, size * 8192 / 1048576
FROM sysfiles
До шринка:
-------------- -----------
shrink_data 169
shrink_log 3
После:
-------------- -----------
shrink_data 81
shrink_log 146
Итого: При FULL модели восстановления видим, что лог используется более интенсивно (10 метров против 146).
Но рекомендация разносить базу и журнал на разные диски все равно актуальна так?
Мало дисков не бывает. Если есть возможность, то разносите и радуйтесь жизни :)
И автоматическое усечение не влияет на производительность?
Очень сильно влияет. Увеличивает фрагментацию файлов базы, увеличивает фрагментацию индексов, много ресурсов тратиться на последующий AutoGrow. Почитайте при случае Auto Shrink Events.
0
Да, актуальна.
Усечение не влияет на производительность. По крайней мере так, чтобы это заметили пользователи.
Усечение не влияет на производительность. По крайней мере так, чтобы это заметили пользователи.
0
Увидел пост коллеги сверху. Поэтому пояснение — выше я писал про автоматическое усечении лога БД в Простой модели восстановления.
0
Да. Спасибо. Я тоже про Простую модель говорил. Про настройку Автоусечения в параметрах базы знаю и так не делаю. В целом у меня все же складывается мнение, что в моих случаях вернее использовать простую модель, т.к. ни разу не возникало потребности восстановить базу на конкретный момент времени. (только возврат к конкретному бэкапу). Огромное спасибо за разъяснение обоим.
0
Восстановление на конкретный момент времени, это скорее доп. фишка, но тоже весомая. Тут главное восстановление на максимально актуальный момент времени. И тут что бы понять Простая или Полная модель вам нужна задайте главный вопрос: за какой период мы можем себе позволить потерять данные? За 15 минут, за 2 часа, за 1 день?
Если толкового ответа получить не у кого, то попытайтесь просчитать последствия сами. Сколько народу вводят данные одновременно? реально ли будет ввести данные повторно, например за день или только с обеда? есть ли другие системы с которыми обменивается ваша БД и будут ли работать обмен, если вы откатите БД? и т.п.
Если толкового ответа получить не у кого, то попытайтесь просчитать последствия сами. Сколько народу вводят данные одновременно? реально ли будет ввести данные повторно, например за день или только с обеда? есть ли другие системы с которыми обменивается ваша БД и будут ли работать обмен, если вы откатите БД? и т.п.
0
И автоматическое усечение не влияет на производительность?
Усечение не влияет на производительность.
Влияет… опять же не всегда и везде! Поэтому может не стоит быть таким категоричным. Вашу статью будут читать в дальнейшем и такие комментарии начинающими могут быть восприняты буквально.
0
Да. Вы правы. Есть некоторая двусмысленность. Насколько я понял — не влияет автоусечение которое происходит само собой при модели восстановления "Простая". Но устанавливать такой параметр в настройках файлов базы и транзакционного лога не стоит.
0
Sign up to leave a comment.
Километры логов и восстановление баз данных на MS SQL