SQL Server 'Veritabanı Oluştur' ifadesi. Otomatik büyüme ayarları nasıl devralınır?


9

SQL Server 2008 R2 kullanıyorum ve sürekli dağıtım yoluyla veritabanları oluşturuyorum.

Sistemimizde, SQL Server'daki varsayılan 1Mb /% 10 otomatik büyüme ayarları verilerimizle kötü çalışıyor. Özellikle şemayı çok değiştirmemizi engelleyen eski bir uygulamamız olduğu için. Aşamalı dağıtımlar için değiştirebilmemiz için veritabanı ayarlarının örnek düzeyinde yapılandırılmasını istiyoruz.

Birkaç yerde yeni bir db için varsayılan ayarları 'model' ayarlarına dayalı okudum, ama bu sadece bir komut dosyası örneğin CREATE DATABASE [MyDb] değil, sadece SQL Management studio UI yeni veritabanı tıklatarak çalışır görünüyor.

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

Herkes bunu bir oluşturma komut dosyası ile çalışmak için var mı? Sunucu örneği başına otomatik büyümeyi ayarlamanın başka bir yolu var mı?


5
Komut dosyası ile yazıyorsanız, bunu CREATE DATABASEneden komut dosyanızda belirleyemiyorsunuz?
JNK

1
@JNK Bence ne olması gerektiğini kontrol etmek yerine miras almasını istiyor. Ve bunu yapmalı, ama kabul etmemeliyim (ve 2012'de de yapmıyor). Denemeden aslında inanmadım - eminim ki bu bir noktada doğru bir şekilde çalıştı. Belki de bu% 10000 şey için hata düzeltmelerinden kaynaklanan bir gerileme .
Aaron Bertrand

Bu durumda bu rakamlar bir yerde bir DMV'de mevcut mu? Sistem tablolarını veya DMV'leri uygun değerler için sorgulayarak komut dosyasını yazabilir misiniz? '
JNK

Açıklığa kavuşturmak için miras almayı tercih ederiz. Aşamalı ortamlarımızda değişen veri depolamasına sahip çok sayıda db sunucumuz var ve ortam başına komut dosyası değişikliklerini kontrol etmek bu aşamada daha fazla iş olacak. @ JNK'nın fikri hiç düşünmediğim bir fikir. Yardımcı
Michelle Steele

Yanıtlar:


2

SQL Server 2005+ için Aşağıdakileri kullanabilirsiniz:

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

Bu, Model Veritabanı için Dosya tanımlarını alır.
Daha sonra CREATE DATABASE veya ALTER DATABASE içinde kullanabilirsiniz.

SSMS aslında bu parametreleri almak için SMO'yu kullanır ve ardından şöyle bir Komut Dosyası oluşturur:

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

Uygulamanız Veritabanını oluşturuyorsa ve uygulamayı değiştiremiyorsanız -
oluşturma işlemi tamamlandıktan sonra ALTER DATABASE'i kullanmanız gerekir:

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

Bu, en azından ALTER DATABASE İzni gerektirir
(ALTER ANY DATABASE Sunucu İzni tarafından ima edilir)
Açıkçası, bu kodu ilk kod örneğini (FROM sys.master_files) kullanarak oluşturabilirsiniz.

Kullanımdan kaldırıldığı için SQL Server 2008R2 için sysaltfiles kullanmam.

İyi şanslar,
Roi


0

Nasıl olur:

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 + '
    ) 
')

ps. burada bu tablo hakkında daha fazla bilgi: msdn.microsoft.com/en-us/library/ms181338.aspx . Yukarıdaki kodumda, maxsize = 0 durumunu (yani büyüme yok) hesaba katmadım ve belgelerdeki yüzdeler için farklı bir rakamım olduğu için durum kodunu maskeledim, ancak değerleri karşılaştırılabilir hale getirebildim maskeleme. Ben maxsize tarafından halledilir, çünkü 0 durum kodu hakkında endişe değilim (o uygulandı).
JohnLBevan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.