SQL Server оператор "Створити базу даних". Як успадкувати налаштування автоматичного зростання?


9

Я використовую SQL Server 2008 R2 і створюю бази даних шляхом постійного розгортання.

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

Я читав у декількох місцях, що налаштування за замовчуванням для нового db засновані на налаштуваннях 'model', але, здається, це працює лише натисканням нової бази даних в інтерфейсі SQL студії управління SQL, а не зі скрипту, наприклад, 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

Для уточнення, ми скоріше наслідуємо. У нас є велика кількість db-серверів з різними сховищами даних у наших поетапних середовищах, а контроль за змінами скриптів у кожному середовищі буде більше роботи на цьому етапі. @ Ідея JNK - це та, про яку я не думав. Схоже, може виникнути запит, який допоможе: извънrelational.com
modules/

Відповіді:


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

Це дозволить отримати визначення файлів для Модельної бази даних.
Пізніше ви можете використовувати його або у СТВОРЕННІ ДАНИХ або АЛЬТЕР ДАТАБАЗИ.

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

Для цього потрібно як мінімум дозвіл DATABASE
(мається на увазі
ВСІЙНЯЯ ДОСЛІДЖЕННЯ сервера DATABASE). Очевидно, що ви можете створити цей скрипт, використовуючи перший зразок коду (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 + '
    ) 
')

пс. Більше інформації про цю таблицю тут: msdn.microsoft.com/en-us/library/ms181338.aspx . У своєму коді вище я не враховував випадок maxsize = 0 (тобто не збільшувався), і маскував код статусу, оскільки я мав інший показник у відсотках до того, що є в документації, але зміг порівняти значення через маскування. Я не переживаю за код статусу 0, оскільки про це піклується maxsize (чи було реалізовано).
JohnLBevan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.