SQL Server Backup Script with TimeStamp

Posted by Alvin You
2015. 7. 2. 10:34 SQL Server

SQL Server를 운영하다보면 백업 스케쥴링에 대해서 고민하게 됩니다. 아래 스크립트는 SQL Server에 생성된 사용자 Database들에 대해서 TimeStamp를 찍어 일단위로 지정된 폴더 경로에 데이터 베이스를 백업하도록 하는 스크립트입니다.

 

Table의 사용량(RowCount, Size) 정보 보기

Posted by Alvin You
2015. 4. 24. 10:04 SQL Server

아래 스크립트는 Database내에 있는 모든 Table의 Row Count 정보와 Size 정보를 보여 주는 스크립트입니다.

  • Sp_MSForEachTable : Database내의 모든 테이블들을 돌며, 파라미터로 받은 SQL문을 수행
  • Sp_SpaceUsed : 파라미터로 받은 테이블의 사용량을 보여줌

 

exec sp_spaceused 'TBL_HOSP_Info'

 

CREATE TABLE #RowCountsAndSizes (TableName NVARCHAR(128),rows CHAR(11),

reserved VARCHAR(18),data VARCHAR(18),index_size VARCHAR(18),

unused VARCHAR(18))

 

EXEC sp_MSForEachTable 'INSERT INTO #RowCountsAndSizes EXEC sp_spaceused ''?'' '

 

SELECT TableName,CONVERT(bigint,rows) AS NumberOfRows,

CONVERT(bigint,left(reserved,len(reserved)-3)) AS SizeinKB

FROM #RowCountsAndSizes

ORDER BY NumberOfRows DESC,SizeinKB DESC,TableName

 

DROP TABLE #RowCountsAndSizes

Failed to initialize MSDB database for tuning (exit code: -1073741819). (DTAClient)

Posted by Alvin You
2015. 4. 15. 21:47 SQL Server

Analyze Query in Database Engine Tuning Advisor 실행시 아래와 같은 오류가 발생한다면, MSDB에 DTA 관련 Objects들을 생성해 주면 됩니다.

[오류 메시지]

 

[스크립트 실행]

 

DTA_Objects_SQL.txt

 

[Powershell]SQL Server 복원 작업

Posted by Alvin You
2015. 4. 7. 10:43 SQL Server

프로젝트를 진행하다 보면 운영 DB를 백업 받아, 다시 DEV/TEST 계에 데이터를 다시 올리는 경우가 빈번하게 발생합니다. 아래 Powershell 스크립트 내용은 Backup 받은 파일을 Powershell을 이용해 Restore 하는 내용을 담고 있습니다.

업무에 참고하세요.

 

 

Upgrading SQL Server 2012 License Edition

Posted by Alvin You
2015. 1. 7. 01:00 SQL Server

Dynamics AX의 Power BI가 SQL Server Enterprise에서 구동되는 관계로 로컬에 설치되어 있는 SQL Server의 License Edition을 변경해야 될 필요성이 생겼습니다. 그래서, 관련 자료를 찾아 보니 아래 방법을 통해서 License Edition을 변경 할 수 있습니다.

아래 절차는 Standard Edition à Enterprise Edition으로 변경하는 과정입니다.

1. SQL Server Enterprise Edition 설치 CD를 넣고 SQL Server Installation Center à Edition Upgrade를 실행합니다.

2. Product Key를 확인합니다.

3. 업그레이드 할 SQL Server Instance를 선택합니다.

4. 업그레이드 규칙을 확인합니다.

5. 업그레이드를 진행합니다.

6.Standard à Enterprise Edition 업그레이드가 완료되었습니다.

시스템 테이블을 이용한 Table Names, Column Names, Data Types 조회

Posted by Alvin You
2014. 3. 13. 11:26 SQL Server
프로젝트 산출물의 하나인 테이블 명세서나 DDL 스크립트를 참고해서 데이터를 분석하는 방법 보다는 아래 Query를 이용하는 방법! 강츄~

select SchemaName=SCHEMA_NAME(t.schema_id), TableName=t.name, ColumnName=c.name, DataType=ty.name, TextLength=c.max_length, c.precision, c.scale
from sys.tables t
join sys.columns c on c.object_id = t.object_id
join sys.types ty on ty.user_type_id =c.user_type_id
order by 1, 2, 3

모든 DB 테이블에서 특정값을 찾는 프로시저

Posted by Alvin You
2014. 3. 13. 11:24 SQL Server

SQL Server Database내의 모든 테이블의 'char', 'varchar', 'nchar', 'nvarchar' 값에 들어있는 특정값을 찾아서 출력해 주는 Stored Procedure입니다.

향후 데이터 변경 프로젝트에서 사용하면 유용할 듯 합니다.

--


CREATE PROC [dbo].[SearchAllTables]
(
    @SearchStr nvarchar(100)
)
AS
BEGIN

-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 28th July 2002 22:50 GMT

DECLARE @Results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName =
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
                AND QUOTENAME(COLUMN_NAME) > @ColumnName
        )

        IF @ColumnName IS NOT NULL
        BEGIN
            INSERT INTO @Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
                FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END
END

SELECT ColumnName, ColumnValue FROM @Results
END

모든 DB 테이블에서 특정값을 찾고 변경하는 프로시저

Posted by Alvin You
2014. 3. 13. 11:23 SQL Server

이번엔 찾은 값을 다른값으로 변경해주는 기능까지 포함된 Stored Procedure입니다.
유용하게 쓰셈!

--
CREATE PROC [dbo].[SearchAndReplace]

(
@SearchStr nvarchar(100),
@ReplaceStr nvarchar(100)
)
AS
BEGIN

-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string and replace it with another string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 2nd November 2002 13:50 GMT

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @SQL nvarchar(4000), @RCTR int
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
SET @RCTR = 0

WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
      ) = 0
)

WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)

IF @ColumnName IS NOT NULL
BEGIN
SET @SQL= 'UPDATE ' + @TableName +
' SET ' + @ColumnName
+ ' =  REPLACE(' + @ColumnName + ', '
+ QUOTENAME(@SearchStr, '''') + ', ' + QUOTENAME(@ReplaceStr, '''') +
') WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
EXEC (@SQL)
SET @RCTR = @RCTR + @@ROWCOUNT
END
END
END

SELECT 'Replaced ' + CAST(@RCTR AS varchar) + ' occurence(s)' AS 'Outcome'
END

sp_MSforeachdb, sp_MSforeachtable 프로시저 활용

Posted by Alvin You
2014. 3. 13. 11:21 SQL Server

master 데이터베이스는 sp_MSforeachtdb, sp_MSForeachtable 과 같은 유용한 Stored Procedure가 있습니다.

 

 

 

[sp_MSforeachdb]

sp_MSforeachdb 프로시저는 SQL Server 인스턴스 내에 있는 모든 데이터베이스의 이름을 반환하며 이 이름을 참조하여 지정된 반복문을수행합니다..

아래 스크립트는 인스턴스내의 모든 데이터베이스의 helpfile 정보를 보여줍니다..

use master

go

 

exec sp_MSforeachdb 'use ? exec sp_helpfile'

 

[sp_MSforeachtable]

sp_MSforeachtable 프로시저는 현재 데이터베이스 내의모든 테이블 이름을 반환하며 이 테이블이름을 참조하여 지정된 반복문을 수행 한다.

 아래 스크립트는 해당 데이터베이스에 존재하는 모든 테이블의 row count를테이블에 삽입하여 출력한다.

begin try

create table #rowcount (tablename varchar(128), rowcnt int)

end try begin catch end catch

 

exec sp_MSforeachtable

 'insert into #rowcount select ''?'',

              count(*) from ?'

select top 5 * from #rowcount

    order by tablename

drop table #rowcount

 

 위의 두 시스템 프로시저를 잘 활용하면 사용자 프로시저 생성시 코드를 간결하고 빠르게 개발 할 수 있을 듯 하다.

 

[참고자료]

l  http://www.codeproject.com/Articles/459536/SQL-Server-Applying-Filter-on-sp_MSforeachDB#

l  http://www.databasejournal.com/features/mssql/article.php/3441031/SQL-Server-Undocumented-Stored-Procedures-spMSforeachtable-and-spMSforeachdb.htm

SQL Server db lock 확인 방법

Posted by Alvin You
2013. 9. 24. 22:47 SQL Server

AX Client에서 해당 프로그램을 실행시켰는데, 해당 프로그램이 아무런 응답없이 멈춰있다면 SQL Server DB Lock을 의심해 볼 수도 있습니다.

현재 진행중인 프로젝트가 DB Transaction이 많아, Stored Procedure를 호출해서 구성되는 화면이 많다보니 종종 화면이 멈춘듯한 느낌이 받을때가 많습니다.

이럴 경우 확인 방법은 sp_who2 라는 SQL 명령어를 통해서 blkBy 칼럼을 통해 확인할 수 있습니다.

image

실행중인 SQL문장을 보고 싶다면 아래 내용을 통해 확인이 가능합니다.

DECLARE @sqltext VARBINARY(128)
SELECT @sqltext = sql_handle
FROM sys.sysprocesses
WHERE spid = 70

SELECT TEXT
FROM sys.dm_exec_sql_text(@sqltext)
GO

image

당연히 Lock 이 걸린 프로세스를 Kill 명령어를 통해서 종료시키면, 해당 lock은 풀립니다.