คำสั่ง 'สร้างฐานข้อมูล' ของ SQL Server วิธีสืบทอดการตั้งค่า autogrowth เป็นอย่างไร


9

ฉันใช้ SQL Server 2008 R2 และสร้างฐานข้อมูลผ่านการปรับใช้อย่างต่อเนื่อง

ในระบบของเราการตั้งค่า autogrowth 1Mb / 10% เริ่มต้นใน SQL Server ทำงานได้ไม่ดีกับข้อมูลของเรา โดยเฉพาะอย่างยิ่งเมื่อเรามีแอปพลิเคชันรุ่นเก่าที่ป้องกันไม่ให้เราเปลี่ยนสคีมามาก เราต้องการให้การตั้งค่าฐานข้อมูลถูกกำหนดค่าในระดับอินสแตนซ์เพื่อให้เราสามารถเปลี่ยนแปลงการปรับใช้แบบฉากได้

ฉันได้อ่านในหลาย ๆ ที่ที่การตั้งค่าเริ่มต้นสำหรับฐานข้อมูลใหม่นั้นขึ้นอยู่กับการตั้งค่าสำหรับ 'model' แต่ดูเหมือนว่าจะทำงานได้โดยคลิกฐานข้อมูลใหม่ใน SQL Management studio UI และไม่ได้มาจากสคริปต์เช่น 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

มีใครที่จะได้รับสิ่งนี้เพื่อทำงานกับสคริปต์สร้างหรือไม่? มีวิธีอื่นที่ฉันสามารถตั้งค่า autogrowth ต่อหนึ่งเซิร์ฟเวอร์ได้หรือไม่


5
หากคุณกำลังใช้สคริปต์กับCREATE DATABASEทำไมคุณไม่สามารถระบุได้ในสคริปต์ของคุณ
JNK

1
@JNK ฉันคิดว่าเขาต้องการให้สืบทอดมากกว่าต้องตรวจสอบสิ่งที่ควรจะเป็น และควรทำอย่างนั้น แต่ฉันต้องยอมรับว่ามันไม่ได้ (และมันก็ไม่ได้ทำอย่างนั้นในปี 2012 เช่นกัน) ฉันไม่เชื่อจริง ๆ จนกว่าฉันจะลอง - ฉันแน่ใจว่านี่ทำงานได้อย่างถูกต้องในบางจุด บางทีการถดถอยจากการแก้ไขข้อบกพร่องสำหรับสิ่งที่ 10000%
Aaron Bertrand

ในกรณีนั้นตัวเลขเหล่านั้นมีอยู่ใน DMV หรือไม่ คุณสามารถสคริปต์มันออกมาได้โดยการสืบค้นตารางระบบหรือ DMVs สำหรับค่าที่เหมาะสมหรือไม่? '
JNK

เพื่อชี้แจงเราค่อนข้างจะสืบทอด เรามีเซิร์ฟเวอร์ฐานข้อมูลจำนวนมากที่มีการจัดเก็บข้อมูลที่หลากหลายในสภาพแวดล้อมแบบจัดฉากและการควบคุมการเปลี่ยนแปลงสคริปต์ต่อสภาพแวดล้อมจะทำงานได้มากขึ้นในขั้นตอนนี้ @ ความคิดของ JNK เป็นสิ่งที่ฉันไม่ได้คิด ดูเหมือนว่าอาจมีข้อความค้นหาที่จะช่วย: Beyondrelational.com/modules/2/blogs/28/posts/10326/…
Michelle Steele

คำตอบ:


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

สิ่งนี้ต้องการการอนุญาตอย่างน้อยการเปลี่ยนแปลงฐานข้อมูล
(โดยนัยโดยการเปลี่ยนแปลงการอนุญาตเซิร์ฟเวอร์ฐานข้อมูลใด ๆ )
เห็นได้ชัดว่าคุณสามารถสร้างสคริปต์นั้นโดยใช้ตัวอย่างโค้ดแรก (จาก 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 + '
    ) 
')

PS ข้อมูลเพิ่มเติมเกี่ยวกับตารางนี้ที่นี่: msdn.microsoft.com/en-us/library/ms181338.aspx ในรหัสของฉันด้านบนฉันไม่ได้คิดกรณี maxsize = 0 (เช่นไม่มีการเติบโต) และปิดบังรหัสสถานะเนื่องจากฉันมีตัวเลขที่แตกต่างกันสำหรับเปอร์เซ็นต์ของสิ่งที่อยู่ในเอกสาร แต่ก็สามารถทำให้ค่าเปรียบเทียบได้ผ่าน การกำบัง ฉันไม่กังวลเกี่ยวกับรหัสสถานะ 0 เนื่องจากได้รับการดูแลโดยขนาดสูงสุด (มีการใช้งาน)
JohnLBevan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.