如何扩展数据库文件?

时间:2009-02-26 21:33:46

标签: sql-server database tsql

我正在尝试使用以下代码来扩展数据库。但是我收到以下错误。如何检查尺寸(3600MB)并在必要时增长?

USING MyDatabase

ALTER DATABASE MyDatabase
MODIFY FILE (NAME =  MyDatabase_data, SIZE = 3600MB)

错误:MODIFY FILE失败。指定的大小小于或等于当前大小。

更新:由于交通拥挤,我没有使用Auto Grow。由于我在这里的设置(长期无关的故事),我需要使用代码进行更改。但是,如果此代码运行多次,我会收到上述错误。在再次尝试更改之前,我需要先检查尺寸。

4 个答案:

答案 0 :(得分:4)

数据库的大小将以

显示
USE MyDatabase
EXEC sp_spaceused

查看sp_spaceused的代码(我碰巧在查看SQL 2000服务器,但SQL2005 / SQL2008也是如此)

USE master
EXEC sp_helptext 'sp_spaceused'

,相关代码是:

declare @dbsize dec(15,0)
declare @logsize dec(15)
declare @bytesperpage   dec(15,0)
declare @pagesperMB     dec(15,0)

    select @dbsize = sum(convert(dec(15),size))
        from dbo.sysfiles
        where (status & 64 = 0)

    select @logsize = sum(convert(dec(15),size))
        from dbo.sysfiles
        where (status & 64 <> 0)

    select @bytesperpage = low
        from master.dbo.spt_values
        where number = 1
            and type = 'E'
    select @pagesperMB = 1048576 / @bytesperpage

    select  database_name = db_name(),
        database_size =
            ltrim(str((@dbsize + @logsize) / @pagesperMB,15,2) + ' MB')

因此您可以将大小保存到变量并再次比较您尝试设置的大小:

DECLARE @database_size bigint
SELECT  @database_size = (@dbsize + @logsize) / @pagesperMB
IF @database_size < 3600
BEGIN
    PRINT 'Expanding MyDatabase ...'
    ALTER DATABASE MyDatabase
    MODIFY FILE (NAME =  MyDatabase_data, SIZE = 3600MB)
    PRINT 'Expanding MyDatabase DONE'
END
ELSE
BEGIN
    PRINT 'No expansion of MyDatabase required'
END

答案 1 :(得分:2)

数据库将自动增长。 如果你(无论如何MS SQL Server)右键单击数据库,属性。您可以将其设置为百分比增长,例如10%,或者固定大小,例如100Mb。

您不需要自己维护数据库大小。

答案 2 :(得分:1)

MS SQL分配的空间超出了需要。因此,您实际使用的数据库大小通常远小于分配的大小。

MS SQL分配的空间超出了所需的空间,因为分配更多数据非常昂贵,而且定期执行它而不是每次写入数据库都更有效。

如果要一次更改分配的空间量,可以使用 FILEGROWTH 参数设置数据库中所需的文件增长类型。

值:

  • 0表示不允许增长
  • [X] MB或[X] GB表示在达到DB当前大小时增长那么多
  • [X]%表示达到DB当前大小时增长的百分比

ALTER DATABASE [databasename] MODIFY FILE ( NAME = N'databasename', FILEGROWTH = 1GB )

要释放额外分配的空间,您可以执行DBCC SHRINKDATABASE

要获取数据库的实际大小,您可以执行以下操作:

SELECT size FROM sys.database_files WHERE name = 'databasename'

要获取数据库日志的实际大小,您可以执行以下操作:

SELECT size FROM sys.database_files WHERE name = 'databasename_log'

答案 3 :(得分:1)

获取服务器上所有数据库文件的大小(和其他信息)(显然你可以过滤它):

select * from sys.database_files