SQL Server: как вырастить лог файл искусственно?
От: кубик  
Дата: 13.03.19 10:09
Оценка:
Всем привет,

С обучающими целями нужно вырастить базе большой лог файл в несколько гигабайт. Не просто зарезервить пространство, а забить чем то.
Как это сделать ?
Re: SQL Server: как вырастить лог файл искусственно?
От: кубик  
Дата: 13.03.19 10:22
Оценка:
Вот есть база которую надо оберегать. Я на копии сервера могу в этой базе сделать временые таблички и с помощю их принудительно создать большуший лог.
Re: SQL Server: как вырастить лог файл искусственно?
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.03.19 14:59
Оценка: +1
Здравствуйте, кубик, Вы писали:

К>С обучающими целями нужно вырастить базе большой лог файл в несколько гигабайт. Не просто зарезервить пространство, а забить чем то.

К>Как это сделать ?
Крутить транзакции. Если стоит полноценная backup policy, то лог не будет урезаться вплоть до выполнения бэкапа.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: SQL Server: как вырастить лог файл искусственно?
От: VladCore  
Дата: 14.03.19 05:17
Оценка: 4 (1) +1
Здравствуйте, кубик, Вы писали:

К>Всем привет,


К>С обучающими целями нужно вырастить базе большой лог файл в несколько гигабайт. Не просто зарезервить пространство, а забить чем то.

К>Как это сделать ?

А нафига?

Для начала поменяем Recovery Mode на Full:
Alter Database [DB1] Set Recovery Full


И создадим таблицу для транзакций:
Create table T1(buffer nvarchar(max))
go
Insert T1(buffer) Values('hello')


Потом в цикле делаем
Insert T1(buffer) Select buffer from T1

Можно просто N раз нажать на F5 в Managment Studio

С пропускной способностью диска он забъется логом в несколько раз быстрее чем данными.
Re[2]: SQL Server: как вырастить лог файл искусственно?
От: Olaf Россия  
Дата: 14.03.19 06:37
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>
VC>Insert T1(buffer) Select buffer from T1
VC>

VC>Можно просто N раз нажать на F5 в Managment Studio

Согласен
А чтобы освободить руки, можно один раз выполнить запрос
set nocount on
go

Insert T1(buffer) Select buffer from T1
go N

где N — целое число
Re[3]: SQL Server: как вырастить лог файл искусственно?
От: _ABC_  
Дата: 14.03.19 11:23
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Согласен

Вот так побыстрее можно забить лог, да и файл данных будет поменьше при этом:

  SQL
declare @i int = 1

insert into t1(buffer) 
select 'Hello'

while @i <= 25
begin
    insert into t1(buffer) 
    select 'Hello' 
    from t1 t

    update t1 set buffer = 'Hell'
    
    if @i%10 = 0
    begin
        delete top (50) percent from t1
    end
    
    set @i = @i + 1
end

delete from t1

С размером лога можно экспериментировать, изменяя длину строки, например.
Re[4]: SQL Server: как вырастить лог файл искусственно?
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.03.19 13:42
Оценка:
Здравствуйте, _ABC_, Вы писали:
Зачем так сложно?
create table t1(data uniqueidentifier default newid())
insert into t1(id) default values

declare @i int = 1

while @i <= 1000000 // tune as desired
begin
   update t1 set data = newid()
   commit tran
   set @i = @i + 1
end
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: SQL Server: как вырастить лог файл искусственно?
От: _ABC_  
Дата: 14.03.19 22:19
Оценка: :)
Здравствуйте, VladCore, Вы писали:

VC>Для начала поменяем Recovery Mode на Full:

VC>
VC>Alter Database [DB1] Set Recovery Full
VC>


И очень важно после этого не забыть сделать фулл бэкап базы. Иначе она останется в simple mode. Сам при экспериментах позабыл, минуты две в ступоре сидел, почему лог после выполнения запроса пустой, пока не вспомнил.
Re[5]: SQL Server: как вырастить лог файл искусственно?
От: _ABC_  
Дата: 14.03.19 23:19
Оценка: 121 (3)
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _ABC_, Вы писали:

S>Зачем так сложно?
Разминка для ума. Задача — за разумный срок забить лог на несколько (2.5-5) ГБ. Разумный срок — до 3 минут на моем лаптопе.

Первый вариант — за 3 минуты забил лог на 2ГБ (из которых 10% свободны).
Твой вариант — за 3 минуты забил лог на 260 МБ.
Мой первый вариант — за 2 минуты отрастил лог до 5ГБ, из которых примерно 50% свободны.
Второй вариант ниже — за 2:10 лог вырос до 3.3ГБ, из которых занято 97%.

  вариант 2
--drop table t1
--go

--create table t1(data nvarchar(max))
truncate table t1
insert into t1(data) select 'Hello'

declare 
  @i int = 1
, @v nvarchar(max)


while @i <= 200
begin
    set @v = 'Hello' + str(@i)

    insert into t1(data) 
    select top 65000 'Hello'
    from t1

    update top (65000) t1 set data = @v
    
    set @i = @i + 1
end


Из потенциально интересных моментов:
1. Вставка константы 'Hello', а не колонки buffer/data — экономится порядка минуты. Посмотри на планы выполнения для того, чтобы разницу увидеть.
2. В логе поинтереснее будет копаться если вдруг понадобится для каких-то целей — он более разнообразен.
3. Масштабируется это решение лучше, чем первый вариант. Рост по константе, а не экспоненте.

Можно еще дальше покопаться, найти оптимальные константы, может индексы создать. Если будет время — покопаюсь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.