SQL सर्वर 'डेटाबेस बनाएँ' कथन। ऑटोग्रॉथ सेटिंग्स कैसे वारिस करें?


9

मैं SQL Server 2008 R2 का उपयोग कर रहा हूं और निरंतर तैनाती के माध्यम से डेटाबेस बना रहा हूं।

हमारे सिस्टम में, SQL Server में डिफ़ॉल्ट 1Mb / 10% ऑटोग्रॉथ सेटिंग्स हमारे डेटा के साथ बुरी तरह से काम करती हैं। विशेष रूप से हमारे पास एक विरासत अनुप्रयोग है जो हमें स्कीमा को बदलने से रोकता है। हम चाहेंगे कि डेटाबेस सेटिंग्स को इंस्टेंस लेवल पर कॉन्फिगर किया जाए ताकि हम इसे स्टैन्डेड तैनाती के लिए बदल सकें।

मैंने कई स्थानों पर पढ़ा है कि एक नए db के लिए डिफ़ॉल्ट सेटिंग्स 'मॉडल' के लिए सेटिंग्स पर आधारित हैं, लेकिन यह केवल SQL प्रबंधन स्टूडियो UI में नए डेटाबेस पर क्लिक करके काम करता है, न कि किसी स्क्रिप्ट जैसे कि सृजन डेटाबेस [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केवल अपनी स्क्रिप्ट में निर्दिष्ट क्यों नहीं कर सकते हैं?
जेएनके जूल

1
@ जेएनके मुझे लगता है कि वह चाहता है कि उसे यह जांचने की बजाय विरासत में मिले कि यह क्या होना चाहिए। और इसे ऐसा करना चाहिए, लेकिन मुझे इस बात से सहमत होना होगा कि यह (और यह 2012 में भी ऐसा नहीं कर रहा है)। जब तक मैंने इसे आज़माया तब तक मुझे वास्तव में विश्वास नहीं हुआ - मुझे यकीन है कि यह किसी बिंदु पर सही ढंग से काम कर रहा है। शायद उस 10000% चीज़ के लिए बग फिक्स से एक प्रतिगमन
हारून बर्ट्रेंड

उस मामले में वे आंकड़े कहीं डीएमवी में उपलब्ध हैं? क्या आप संभवतः सिस्टम टेबल्स या डीएमवी को उचित मूल्यों के लिए क्वेरी करके इसे स्क्रिप्ट कर सकते हैं? '
JNK

स्पष्ट करने के लिए, हम बल्कि वारिस होंगे। हमारे मंचित परिवेशों में भिन्न डेटा संग्रहण के साथ हमारे पास बड़ी संख्या में db सर्वर हैं और इस स्तर पर काम करने वाले स्क्रिप्ट परिवर्तनों को नियंत्रित करना अधिक काम करेगा। @ JNK का विचार वह है जिसके बारे में मैंने नहीं सोचा था। ऐसा लगता है कि वहाँ एक प्रश्न में मदद मिलेगी हो सकता है: beyondrelational.com/modules/2/blogs/28/posts/10326/...
मिशेल स्टील

जवाबों:


2

SQL सर्वर 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

यह मॉडल डेटाबेस के लिए फ़ाइल परिभाषाओं को पुनः प्राप्त करेगा।
बाद में आप इसे या तो DATABASE या ALAT 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

यदि आपका एप्लिकेशन डेटाबेस बना रहा है और आप एप्लिकेशन को संशोधित नहीं कर सकते हैं -
तो निर्माण पूरा होने के बाद आपको ALAT DATABASE का उपयोग करना होगा:

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

इसके लिए कम से कम ALAT DATABASE परमिशन
(ALTER द्वारा किसी भी DATABASE सर्वर परमिशन द्वारा निहित) की आवश्यकता होती
है, जाहिर है, आप पहले कोड नमूने (FROM sys.master_files) का उपयोग करके उस स्क्रिप्ट को उत्पन्न कर सकते हैं।

मैं SQL Server 2008R2 के लिए sysaltfiles का उपयोग नहीं करूंगा क्योंकि यह डिप्रेस्ड है।

गुड लक,
रूही


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

ps। इस तालिका यहाँ बारे में अधिक जानकारी: msdn.microsoft.com/en-us/library/ms181338.aspx । ऊपर दिए गए मेरे कोड में मैंने अधिकतम = 0 केस (यानी कोई वृद्धि नहीं) का हिसाब नहीं दिया है, और स्थिति कोड को मुखौटा कर दिया है क्योंकि मेरे पास दस्तावेज़ों में प्रतिशत के लिए एक अलग आंकड़ा था, लेकिन मूल्यों को तुलनीय बनाने में सक्षम था मास्किंग। मैं 0 स्टेटस कोड के बारे में चिंतित नहीं हूं, क्योंकि मैक्ससिज़ द्वारा देखभाल की गई है (क्या इसे लागू किया गया था)।
जॉनलेवन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.