Оператор SQL Server «Создать базу данных». Как наследовать настройки автоматического роста?

9

Я использую SQL Server 2008 R2 и создаю базы данных путем непрерывного развертывания.

В нашей системе стандартные параметры автоматического наращивания 1Mb / 10% в SQL Server плохо работают с нашими данными. Тем более, что у нас есть устаревшее приложение, которое не позволяет нам сильно изменять схему. Мы бы хотели, чтобы параметры базы данных были настроены на уровне экземпляра, чтобы мы могли изменить его для поэтапного развертывания.

Я читал в нескольких местах, что настройки по умолчанию для новой базы данных основаны на настройках «модели», но, похоже, это работает только при нажатии новой базы данных в пользовательском интерфейсе SQL Management studio, а не в сценарии, например, CREATE DATABASE [MyDb].

msdn.microsoft.com/en-us/library/ms186388(v=sql.105).aspx

sqlservercentral.com/Forums/Topic1065073-391-1.aspx

/programming/8828557/possible-to-configure-database-autogrowth-settings-at-the-instance-level/8828604#comment15586568_8828604

Кто-нибудь на самом деле получил это для работы со скриптом создания? Есть ли другой способ, которым я могу установить автоматический рост для экземпляра сервера?

Мишель Стил
источник
5
Если вы пишете сценарий, CREATE DATABASEпочему вы не можете просто указать это в своем сценарии?
JNK
1
@JNK Я думаю, он хочет, чтобы он унаследовал, а не проверял, каким он должен быть. И это должно быть сделано, но я должен согласиться, что это не так (и в 2012 году этого не происходит). На самом деле я не верил в это, пока не попробовал - уверен, что в какой-то момент это сработало правильно. Может быть, регрессия от исправления ошибок для этой вещи 10000% .
Аарон Бертран
В таком случае, доступны ли эти цифры в DMV? Вы могли бы написать это, запросив системные таблицы или DMV для соответствующих значений?
JNK
Чтобы уточнить, мы бы предпочли наследовать. У нас есть большое количество серверов БД с различным объемом хранения данных в наших поэтапных средах, и контроль изменений сценариев для каждой среды будет более трудоемким на данном этапе. Идея @ JNK - это идея, о которой я даже не думал. Похоже, что может быть запрос, который поможет: beyondrelational.com/modules/2/blogs/28/posts/10326/…
Мишель Стил

Ответы:

2

Для SQL Server 2005+ вы можете использовать следующее:

SELECT FILE_ID, type, type_desc, 
CAST( CAST( (CASE WHEN size < 128 THEN 128 ELSE size END) * 8. / 1024. AS INT ) AS VARCHAR(20) ) + 'MB' AS SIZE, 
CASE max_size WHEN -1 THEN 'UNLIMITED' ELSE CAST( CAST( max_size * 8. / 1024. AS INT ) AS VARCHAR(20) ) + 'MB' END  AS MAXSIZE,
CASE is_percent_growth
    WHEN 0 THEN CAST( CAST( growth * 8. / 1024. AS INT ) AS VARCHAR(20) ) + 'MB'
    WHEN 1 THEN CAST( growth AS VARCHAR(30) ) + '%'
END AS FILEGROWTH
FROM sys.master_files
WHERE database_id = DB_ID('model')
GO

Это позволит получить определения файлов для базы данных моделей.
Позже вы можете использовать его либо в CREATE DATABASE, либо в ALTER DATABASE.

SSMS фактически использует SMO для получения этих параметров, а затем создает скрипт, который выглядит следующим образом:

CREATE DATABASE [aaa] ON  PRIMARY 
( NAME = N'aaa', FILENAME = N'D:\Data\aaa.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'aaa_log', FILENAME = N'D:\Logs\aaa_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO

Если ваше приложение создает базу данных, и вы не можете изменить приложение -
тогда вы должны использовать ALTER DATABASE после завершения создания:

ALTER DATABASE [aaa] MODIFY FILE ( NAME = N'aaa', MAXSIZE = 102400KB )
GO
ALTER DATABASE [aaa] MODIFY FILE ( NAME = N'aaa_log', FILEGROWTH = 10240KB )
GO

Для этого требуется как минимум разрешение ALTER DATABASE
(подразумеваемое ALTER ANY DATABASE Server Permission).
Очевидно, вы можете сгенерировать этот скрипт, используя первый пример кода (FROM sys.master_files).

Я бы не использовал sysaltfiles для SQL Server 2008R2, потому что он устарел.

Удачи
Рой

Рой Гавиш
источник
0

Как насчет:

use master
go

declare @newDbName sysname
, @fn nvarchar(1024)
, @growthAmount integer
, @growth nvarchar(128)
, @growthAmount_log integer
, @growth_log nvarchar(128)

set @newDbName = 'myNewDB'

--see what's available to us
--select * 
--from sys.sysaltfiles saf
--inner join sys.databases db
--  on saf.dbid = db.database_id
--where db.name = 'model'

select @growthAmount = saf.growth 
, @growth = case saf.status & 0x100000 when 0 then 'MB' else '%' end
, @fn = replace(saf.filename,'model.mdf','')
from sys.sysaltfiles saf
inner join sys.databases db
    on saf.dbid = db.database_id
where db.name = 'model'
and saf.name = 'modeldev'

select @growthAmount_log = saf.growth 
, @growth_log = case saf.status & 0x100000 when 0 then 'MB' else '%' end
from sys.sysaltfiles saf
inner join sys.databases db
    on saf.dbid = db.database_id
where db.name = 'model'
and saf.name = 'modellog'

if @growth = 'MB' set @growthAmount = @growthAmount / 128
if @growth_log = 'MB' set @growthAmount_log = @growthAmount_log / 128

set @growth = cast(@growthAmount as nvarchar(10)) + @growth
set @growth_log = cast(@growthAmount_log as nvarchar(10)) + @growth_log

print '
    CREATE DATABASE ' + @newDbName + '
    ON 
    (   
        NAME = ' + @newDbName + '_data
        ,FILENAME = ''' + @fn + @newDbName + '.mdf''
        ,FILEGROWTH = ' + @growth + '
    )
    LOG ON
    ( 
        NAME = ' + @newDbName + '_log
        ,FILENAME = ''' + @fn + @newDbName + '.ldf''
        ,FILEGROWTH = ' + @growth_log + '
    ) 
'
exec('
    CREATE DATABASE ' + @newDbName + '
    ON 
    (   
        NAME = ' + @newDbName + '_data
        ,FILENAME = ''' + @fn + @newDbName + '.mdf''
        ,FILEGROWTH = ' + @growth + '
    )
    LOG ON
    ( 
        NAME = ' + @newDbName + '_log
        ,FILENAME = ''' + @fn + @newDbName + '.ldf''
        ,FILEGROWTH = ' + @growth_log + '
    ) 
')
JohnLBevan
источник
пс. больше информации об этой таблице здесь: msdn.microsoft.com/en-us/library/ms181338.aspx . В моем коде выше я не учел случай maxsize = 0 (т. Е. Нет роста) и замаскировал код состояния, поскольку у меня было другое значение в процентах по сравнению с тем, что в документации, но я смог сделать значения сопоставимыми с помощью маскировки. Меня не беспокоит код состояния 0, так как он позаботился о maxsize (если бы он был реализован).
JohnLBevan