Поиск доступного дискового пространства баз данных, хранящихся на LUN - PullRequest
1 голос
/ 28 января 2009

У нас есть множество баз данных, файлы которых хранятся в отдельных точках монтирования на диске

(ex. Z:\dbname_db\dbname_db.mdf and Z:\dbname_log\dbname_log.ldf)

Я ищу способ найти свободное место в точке монтирования.

    EXEC xp_cmdshell 'fsutil volume diskfree Z:\dbname_db'

Но служба не работает от имени администратора, поэтому fsutil не будет работать.

Как бы я это сделал, является ли хранимая процедура наиболее эффективным способом сделать это?

Ответы [ 3 ]

1 голос
/ 29 января 2009

xp_fixeddrives не будет отображать информацию о точках монтирования, только обычные фиксированные диски.

Следующая ссылка содержит процедуру CLR, которая будет использовать счетчик производительности для возврата емкости и свободного места в точке монтирования.

http://weblogs.sqlteam.com/tarad/archive/2007/12/18/60435.aspx

1 голос
/ 04 мая 2009

HI, Смотрите скрипт ниже, который отображает общий размер и свободное пространство Fxied и монтирует тома. Чтобы запустить этот сценарий, включите WMIC (перейдите в DOS, введите WMIC, который установит WMIC в первый раз) и XP_CMDShell.

SET ARITHIGNORE ON
SET NOCOUNT ON
GO

DECLARE @dsize VARCHAR(20)
DECLARE @SQL NVARCHAR(500)

SET @sql = 'xp_cmdshell ''fsutil volume diskfree ' --+'D:'''+''

CREATE TABLE #Dletter (
    Drive VARCHAR(50),
    )

CREATE TABLE #Size (Sinfo VARCHAR(250))

CREATE TABLE #DriveInfo (
    Drive VARCHAR(30),
    TotalSize REAL,
    Freesize REAL
    )

--set @x='xp_cmdshell''wmic volume get capacity,caption,freespace'''
INSERT INTO #Dletter
EXEC xp_cmdshell 'wmic volume where drivetype="3" get caption'

SET ROWCOUNT 1

DELETE
FROM #Dletter

SET ROWCOUNT 0

DELETE
FROM #Dletter
WHERE drive IS NULL
    OR len(drive) < 4

UPDATE #dletter
SET drive = replace(drive, ' ', '')

--delete from #Dletter where Drive like'R:\%'
--delete from #Capacity where Dcapacity is null or len(Dcapacity)<15 
--delete from #dletter where
-- convert(int,substring(drive,len(drive)-1,len(drive)))=5
--SELECT Row_Number() OVER (order by Drive asc) as RowNumber,drive from #Dletter
DECLARE @dv VARCHAR(30)

DECLARE dx CURSOR
FOR
SELECT *
FROM #dletter

OPEN dx

FETCH NEXT
FROM dx
INTO @dv

WHILE @@fetch_status = 0
BEGIN
    SET @sql = @sql + @dv + ''''

    --  print @sql
    INSERT INTO #Size
    EXEC sp_executesql @sql

    DELETE
    FROM #size
    WHERE sinfo IS NULL
        OR sinfo LIKE 'Total # of avail free bytes  :%'

    --select Drive from #dletter
    --insert into #DriveInfo(Drive,TotalSize,Freesize)
    SELECT @dv AS Drive,
        convert(REAL, substring(sinfo, isnull(charindex(':', sinfo), 0) + 2, len(isnull(sinfo, 0)))) / 1024 / 1024 / 1024 AS Size
    INTO #rama
    FROM #size
    ORDER BY 2 ASC

    DECLARE @d VARCHAR(30)
    DECLARE @s REAL
    DECLARE @cntr INT

    SET @cntr = 1

    DECLARE x CURSOR
    FOR
    SELECT *
    FROM #rama
    ORDER BY 2 DESC

    OPEN x

    FETCH NEXT
    FROM x
    INTO @d,
        @s

    WHILE @@fetch_status = 0
    BEGIN
        IF @cntr = 1
        BEGIN
            INSERT INTO #Driveinfo (
                Drive,
                Totalsize
                )
            VALUES (
                @d,
                @s
                )
                --print convert(char,@cntr)+' '+convert(varchar,@d)+'TotalSize:'+convert(varchar, @s)
        END

        IF @cntr = 2
        BEGIN
            UPDATE #DriveInfo
            SET Freesize = @s
            WHERE drive = @d
                --print convert(char,@cntr)+' '+convert(varchar,@d)+'FreeSize:'+convert(varchar, @s)
        END

        FETCH NEXT
        FROM x
        INTO @d,
            @s

        SET @cntr = @cntr + 1
    END

    CLOSE x

    DEALLOCATE x

    DROP TABLE #rama

    DELETE
    FROM #size

    SET @Cntr = 1

    FETCH NEXT
    FROM dx
    INTO @dv

    --print @sql
    SET @sql = 'xp_cmdshell ''fsutil volume diskfree ' --+'D:'''+''
END

CLOSE dx

DEALLOCATE dx

SELECT Drive,
    convert(DECIMAL(10, 2), TotalSize) AS "TotalSize(GB)",
    convert(DECIMAL(10, 2), FreeSize) AS "FreeSize(GB)"
FROM #DriveInfo
ORDER BY drive

DROP TABLE #Dletter

DROP TABLE #size

DROP TABLE #DriveInfo
0 голосов
/ 28 января 2009

что происходит при запуске

exec master..xp_fixeddrives
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...