MS-SQL / SQL Server

컴퓨터이름 변경했을때 MSSQL 서버이름 변경하기


컴퓨터이름을 변경했을때, MS-SQL 서버의 이름도 변경해야한다.

 

현재 MS-SQL 서버이름을 확인 하는 방법

SELECT @@servername


일단 위의 쿼리에서 서버이름으로 등록되어있는 정보를 삭제한다.

 

서버이름 삭제

SP_DROPSERVER '현재의 MSSQL서버이름'


새로운 서버이름 추가

SP_ADDSERVER '현재 컴퓨터이름(새로운이름)', 'local'

 

 

이렇게 하고 서비스 재시작 한번 해주고..

 

다시  MS-SQL 서버 이름을 확인해보면..

SELECT @@servername

 

변경된것을 알수 있다.

MS-SQL / SQL Server

인덱스를 다시 정리하자(조각모음)


데이터를 입력,수정,삭제를 하다보면 인덱스에 조각화가 일어난다.

조각화가 많아지면 성능이 느려진다.

 

그럼, 다시 정리를 해줘야지!!

 

인덱스를 다시 작성하는 방법에는

 

-. DBCC DBREINDEX

-. DBCC INDEXDEFRAG

-. ALTER INDEX ALL ON 테이블명 REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90)

 

이 있다..

여기에서 속도도 가장 빠르고 효율적인것이..

MS-SQL 2005 이상에서 지원하는 아래의 쿼리다.

 

ALTER INDEX ALL ON 테이블명 REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90)

 

 

테이블 하나씩 하나씩 언제하냐고??

 

한방에 해당 데이터베이스의 인덱스를 정리하는 방법을 알려 달라고???

 

해당 데이터베이스의 모든 테이블의 모든 인덱스를 재정리하는 쿼리다.

 

------------------------------------------------------------------------------------

 

 

DECLARE @i int, @sql varchar(1000)
DECLARE @tablename varchar(1000),@ownerName  varchar(1000)

SET @i = 1

DECLARE DB_Cursor CURSOR FOR 
 SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME
OPEN DB_Cursor

FETCH NEXT FROM DB_Cursor
INTO @ownerName, @tablename
WHILE @@FETCH_STATUS = 0
BEGIN

 SET @sql = 'ALTER INDEX ALL ON ' + @ownerName + '.' + @tablename + ' REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90) '
 EXEC (@sql)

 PRINT CONVERT(VARCHAR, @i) + '__' + @ownerName + '.' + @tablename + '............ OK'
 SET @i = @i + 1

 FETCH NEXT FROM DB_Cursor
 INTO @ownerName, @tablename

END

CLOSE DB_Cursor
DEALLOCATE DB_Cursor

MS-SQL / SQL Server

백업 스크립트


제가 일본에서 일을 하다보니.. 주석이 일본어로 되어있네요.. ^^

작업설정은 이러합니다.

아래의 쿼리에서..

 

SET @Path = 'D:\backup'
SET @DBName = 'master'

 

부분에 경로와 백업하고자 하는 디비명만 적어주면 됩니다.

 

그러면..

D:\backup\master\master_Backup_2010-04-07_10-54.bak

 

이런식으로 백업경로에 백업하는 디비명 폴더를 만들고 그 안에 백업파일을 저장합니다.

백업파일은 백업시간을 파일명에 넣어서 백업을 하게 되어있습니다

 

 

----------------------------------------------------------

 


DECLARE @Path nvarchar(200)
DECLARE @DBName nvarchar(100)

DECLARE @FileName nvarchar(100)
DECLARE @FullFileName nvarchar(500)

 

SET @Path = 'D:\backup'
SET @DBName = 'master'

 

-- 経路設定
SET @Path = @Path + N'\' + @DBName

-- フォルダー生成
EXECUTE master.dbo.xp_create_subdir @Path

-- ファイル名
SET @FileName = @DBName + N'_Backup_' + CONVERT(VARCHAR(10), GETDATE(), 120) + +N'_' + LEFT(REPLACE(CONVERT(VARCHAR, GETDATE(), 108),':','-'),5)

-- 経路 + ファイル名
SET @FullFileName = @Path + N'\' + @FileName + N'.bak'

-- バクアップ実行
BACKUP DATABASE @DBName TO DISK = @FullFileName WITH NOFORMAT, NOINIT, NAME = @FileName, SKIP, REWIND, NOUNLOAD, STATS = 10

MS-SQL / SQL Server

Lock(락) 자동으로 죽이기


-- 로그 테이블 생성


CREATE TABLE [dbo].[LogLockKill](
 [LogDate] [char](10) NOT NULL CONSTRAINT [DF_LogLockKill_LogDate]  DEFAULT (CONVERT([char](10),getdate(),(120))),
 [LogDateTime] [datetime] NOT NULL CONSTRAINT [DF_LogLockKill_LogDateTime]  DEFAULT (getdate()),
 [SpID] [int] NOT NULL,
 [Status] [nvarchar](30) NOT NULL,
 [LoginName] [nvarchar](128) NOT NULL,
 [HostName] [nvarchar](128) NOT NULL,
 [Blocked] [smallint] NOT NULL,
 [DbName] [varchar](30) NOT NULL,
 [Cmd] [nvarchar](16) NOT NULL,
 [WaitType] [binary](2) NOT NULL
) ON [PRIMARY]

GO

-- 인덱스 생성
CREATE NONCLUSTERED INDEX [IX_LogLockKill] ON [dbo].[LogLockKill] 
(
 [LogDate] DESC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [IX_LogLockKill_1] ON [dbo].[LogLockKill] 
(
 [SpID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

 

 

 

-- 잡으로 1분 혹은 5분등 적당한 주기로 아래의 쿼리를 돌린다.

-- 아래의 쿼리 중간 정도 에 보면.. (IF (LEN(@spid) > 0 AND Rtrim(@loginame) = 'accountforweb')) 이라는 부분이 있습니다.

-- 혹시 특정 계정에 한해서 lock(락)이 걸리는걸 죽이고 싶으시다면 accountforweb 부분에 그 계정명을 적으시면 됩니다.

-- 개인적으로는 특정계정에 한해서 하는게 좋을것 같습니다.

-- 대용량 데이터베이스에서 잡에서 집계하는 데이터양이 많다거나 여러가지 이유로 끊겨버리면 안되니까요.

 

DECLARE @spid int, @status nvarchar(30), @loginame nvarchar(128), @hostname nvarchar(128), @blocked smallint, @dbname varchar(30), @cmd nvarchar(16), @waittype binary(2)
DECLARE @StrSql nvarchar(20)
DECLARE @IsOK bit

SET @IsOK = 0

DECLARE DB_Cursor CURSOR FOR 
 SELECT spid, status, loginame, hostname, blocked, db_name(dbid) dbname, cmd, waittype FROM master.dbo.sysprocesses WHERE spid IN (SELECT blocked FROM master.dbo.sysprocesses) AND blocked = 0
OPEN DB_Cursor

FETCH NEXT FROM DB_Cursor
INTO @spid , @status , @loginame , @hostname , @blocked , @dbname , @cmd , @waittype
WHILE @@FETCH_STATUS = 0
BEGIN

 
 
 BEGIN TRY
--  IF (LEN(@spid) > 0 AND Rtrim(@loginame) = 'accountforweb')

IF (LEN(@spid) > 0 )
  BEGIN
   
   SET @StrSql = 'KILL ' + CONVERT(VARCHAR, @spid)
   EXEC sp_executesql @StrSql    
   
   IF @@ERROR = 0
    SET @IsOK = 1
  END
 END TRY
 
 BEGIN CATCH
  SET @IsOK = 0

--  SELECT ERROR_NUMBER()
--  SELECT ERROR_MESSAGE()
 END CATCH


 IF (@IsOK = 1)
 BEGIN
  INSERT INTO dbo.LogLockKill (SpID, Status, LoginName, HostName, Blocked, DbName, Cmd, WaitType)
  VALUES (@spid , @status , Rtrim(@loginame) , Rtrim(@hostname) , @blocked , @dbname , @cmd , @waittype)

  SET @IsOK = 0
 END


 FETCH NEXT FROM DB_Cursor
 INTO @spid , @status , @loginame , @hostname , @blocked , @dbname , @cmd , @waittype

END

CLOSE DB_Cursor
DEALLOCATE DB_Cursor

MS-SQL / SQL Server

SQL Server 데이터 파일 축소


SQL Server 2005 에서 데이터(mdf,ndf) 파일을 축소하는 방법에 대해서 아래와 같이 정리하였습니다.

데이터 파일의 할당 정보는 DBCC SHOWFILESTATS 명령을 사용하여 확인할 수 있습니다. 트랜잭션 로그 파일의 현재 사용 가능한 빈공간을 조회할 때 DBCC SQLPERF(LOGSPACE) 명령을 사용하면 됩니다.


USE LAIGO

GO

DBCC SHOWFILESTATS



아래와 같이 LAIGO 데이터베이스의 데이터 파일 LAIGO 의 전체 크기와 사용량을 확인할 수 있습니다. 

Fileid FileGroup TotalExtents UsedExtents Name FileName

--------------------------------------------------------------------------------------------------------------

1 1 880 92 LAIGO D:\LAIGO.mdf


(1개 행 적용됨)



자, 산수시간입니다.

SQL Server 의 기본 저장 단위 Page 의 크기는 8KB, 이며 8개의 연속 페이지로 크기가 고정된 Extent 로 저장됩니다.

1MB = 1024KB = 128(1024/8) Page = 16(1024/64) Extents


TotalExtents 값이 880 Extents 면, 1MB가 16 Extents 이므로 880/16 = 55 MB 가 됩니다.

UsedExtents 값이 92 면, 92/16 = 5.75 MB 가 됩니다.


즉, 현재 할당된 데이터 파일의 크기는 55MB 입니다만 실제 사용량은 5.75MB 라는 것을 알 수 있습니다. 


불필요한 공간을 줄이기 위해 데이터 파일을 축소하는 방법은 아래와 같습니다. LAIGO 파일의 크기를 10MB 로 축소하라는 의미입니다. 실제 TotalExtents 가 160 즉, 10MB 로 줄었습니다.


DBCC SHRINKFILE (LAIGO, 10)


Fileid FileGroup TotalExtents UsedExtents Name FileName

--------------------------------------------------------------------------------------------------------------

1 1 160 92 LAIGO D:\LAIGO.mdf


(1개 행 적용됨)



TRUNCATEONLY 를 사용해 보면 어떨까요?


DBCC SHRINKFILE (LAIGO, TRUNCATEONLY)

DBCC SHOWFILESTATS


아직 사용되지 않은 뒷부분 빈공간이 싹뚝 잘려 나갔습니다.

Fileid FileGroup TotalExtents UsedExtents Name FileName

--------------------------------------------------------------------------------------------------------------

1 1 92 92 LAIGO D:\LAIGO.mdf


(1개 행 적용됨)


Single user 모드가 아니어도 작업은 가능합니다만 가능하면 Single User 모드가 아닌 상태에서 Deadlock 이 발생하는 사례가 있으므로 급한 상황이 아니라면 Single user 모드에서 작업하는 게 좋을 것 같다는 의견입니다. 만약 작업이 실패할 경우에는 SQL Error Log 을 살펴봐야 할 것 같습니다.

ALTER DATABASE LAIGO SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO


DBCC SHRINKFILE(LAIGO_DATA1, 3000) -- 3GB


ALTER DATABASE LAIGO SET MULTI_USER
GO



[참고자료]

DBCC SHRINKFILE(Transact-SQL)
http://msdn.microsoft.com/ko-kr/library/ms189493(SQL.90).aspx



MS-SQL / SQL Server

미러링 강제종료


alter database 데이터베이스명 Set Partner off

MS-SQL / SQL Server

링크드서버(Linked Server) 리스트


SELECT * FROM sys.servers A JOIN sys.linked_logins B
ON A.server_id = B.server_id AND A.is_linked = 1

 

 

난 그냥 이정도로만...

-----------------------------------------------------

SELECT A.name, A.product, A.provider, A.data_source, location, provider_string, A.modify_date LinkedServerUpdateDate
, C.name, B.remote_name, B.modify_date UserUpdateDate
FROM sys.servers A JOIN sys.linked_logins B
ON A.server_id = B.server_id 
LEFT OUTER JOIN sys.server_principals C
ON B.local_principal_id = C.principal_id
ORDER BY A.name

MS-SQL / SQL Server

MS-SQL에서 대소문자 구분하기


ex) 값이 abc이고 비교값이

 1. 'abc'

 2. 'ABC'

 3. 'aBc'

 4. 'aBC'

 5. 'abc '

 

일 경우

 

기본적으로 설치시 어떤 설정을 하면 비교가 된다고 한다...

 

하지만 확인된 결과가 아니라서 이곳에 작성하지는 않았다.

 

Test1. 일반적으로 테스트 할 경우

 1. 같음   2. 같음   3. 같음   4. 같음   5. 같음

 

Test2. BINARY_CheckSum을 이용 할 경우

 1. 같음   2. 틀림   3. 틀림   4. 틀림   5. 같음

 

Test3. collate Latin1_General_CS_AI_KS_WS를 이용 할 경우

 1. 같음   2. 틀림   3. 틀림   4. 틀림   5. 같음

 

결론...

 BINARY_CheckSum와 collate Latin1_General_CS_AI_KS_WS를 이용하되

 빈칸이 안들어가도록 막으면...Ok...

 너무 간단한 결론인가...ㅡㅡ;;

MS-SQL / SQL Server

백업정보 얻기 - 백업한 데이터베이스에 대한 수행된 백업들의 정보를 얻는다.


USE msdb;

GO

 

SELECT backup_start_date, type, physical_device_name, backup_set_id

FROM backupset bs inner join backupmediafamily bm

ON bs.media_set_id = bm.media_set_id

WHERE database_name = '[데이터베이스 명]'

ORDER BY backup_start_date desc

MS-SQL / SQL Server

MSSQL 서버, 데이터베이스 유져 리스트


서버의 유저 리스트

select * from sys.server_principals where type = 'S'

 

데이터베이스의 유저 리스트

SELECT * FROM sys.database_principals

 


name컬럼과 default_schema_name 컬럼을 이용하시면 될듯 합니다.

 

인터넷에 검색되는건 아래의 이상한 값만 나오는 것만 나와있네요..

 

SELECT u.name as UserName, s.name as SchemaName 

FROM sys.sysusers u JOIN sys.schemas s ON u.uid = s.principal_id

MS-SQL / SQL Server

컬럼타입 변경하기


MSSQL 에서 컬럼타입을 변경하는 쿼리입니다.

 

 

ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 [변경할 컬럼타입]

 

예>

ALTER TABLE dbo.Test ALTER COLUMN UserID varchar(20)

MS-SQL / SQL Server

프로시저 생성일, 수정일, 내용 출력하기


SELECT

CONVERT(varchar(10), getdate(), 120) LogDage

, getdate() AS LogDateTime

, A.name

, A.type_desc

, A.create_date

, A.modify_date

, B.definition

FROM sys.objects AS A JOIN sys.sql_modules AS B

ON A.object_id = B.object_id

WHERE A.schema_id = 1 AND type = 'P'

MS-SQL / SQL Server

프로시져 내용 확인하기


해당 프로시저의 내용을 확인할 수 있다.

definition 컬럼을 확인.

 

SELECT * FROM sys.sql_modules WHERE OBJECT_ID = OBJECT_ID('프로시저명');

MS-SQL / SQL Server

프로시저 생성일/수정일 확인하기


SELECT

CONVERT(varchar(10), getdate(), 120) LogDage

, getdate() AS LogDateTime

, A.name

, A.type_desc

, A.create_date

, A.modify_date

FROM sys.objects AS A JOIN sys.sql_modules AS B

ON A.object_id = B.object_id

WHERE A.schema_id = 1 AND type = 'P'

트랜잭션 백업시 BACKUP LOG is terminating abnormally 에러는? 


트랜잭션 로그를 백업을 하였을때

다음과 같은 에러가 발생하였다면,

 

Msg 4214, Level 16, State 1, Line 1

BACKUP LOG cannot be performed because there is no current database backup.

Msg 3013, Level 16, State 1, Line 1

BACKUP LOG is terminating abnormally.

 

로그백업은 전체백업을 받은 시점부터 그 이후의 로그를 백업하는 개념이라서 반드시 전체백업이 한본 있어야 합니다.

그리고 로그백업을 받더라도 전체백업을 가지고 있어야 합니다.

그래야 전체백업을 복원하고 그 이후의 로그백업들을 차레차레 복원하면서 최신상태로 백업 복원을 할 수 있습니다.

즉, 전체백업을 한번 실행시킨후에 로그백업을 해보세요.

MS-SQL / SQL Server

DBCC 명령어 - 데이터베이스, 테이블, 인덱스, 카탈로그, 파일그룹 관리 요약

 

유지 관리: 데이터베이스, 인덱스 또는 파일 그룹에 대한 유지 관리 작업

DBCC CLEANTABLE
테이블 또는 인덱싱된 뷰의 삭제된 가변 길이 열에서 공간을 반환

DBCC INDEXDEFRAG
지정된 테이블 또는 뷰의 인덱스를 조각 모음
(*2005 이후에는 지원되지 않음. ALTER INDEX로 대체됨)

DBCC DBREINDEX
지정한 데이터베이스의 테이블에 대해 하나 이상의 인덱스를 다시 작성
(*2005 이후에는 지원되지 않음. ALTER INDEX로 대체됨)

DBCC SHRINKDATABASE
지정한 데이터베이스에 있는 데이터 및 로그 파일의 크기를 축소

DBCC DROPCLEANBUFFERS
버퍼 풀에서 빈 버퍼를 모두 제거

DBCC SHRINKFILE
지정한 데이터 또는 로그 파일의 크기를 축소하거나 데이터를 같은 파일 그룹의 다른 파일로 이동

DBCC FREEPROCCACHE
프로시저 캐시에서 모든 요소를 제거

DBCC UPDATEUSAGE 
카탈로그 뷰의 부정확한 페이지와 행 개수를 보고하고 수정

 
기타: 추적 플래그 설정이나 메모리에서 DLL 제거 같은 기타 작업

DBCC dllname(FREE)
지정된 확장 저장 프로시저 DLL을 메모리에서 언로드

DBCC TRACEON
지정한 추적 플래그를 설정

DBCC TRACEOFF
지정한 추적 플래그를 해제

DBCC HELP
지정한 DBCC 명령의 구문 정보를 반환


알림
: 다양한 정보를 수집하고 표시하는 작업

DBCC CONCURRENCYVIOLATION
SQL Server 2000 Desktop Engine 또는 SQL Server 2000 Personal Edition에서 다섯 개가 넘는 일괄 처리가 동시에 실행되는 횟수에 대한 통계를 표시 (*2005 에서는 하위 호환성을 위해 지원)

DBCC SHOW_STATISTICS
지정한 테이블에서 특정 대상에 대한 현재 배포 통계를 표시합니다.

DBCC INPUTBUFFER
클라이언트가 Microsoft SQL Server 2005 인스턴스로 마지막으로 전송한 문을 표시

DBCC SHOWCONTIG
지정한 테이블이나 뷰의 데이터와 인덱스에 대한 조각화 정보를 표시(*2005 이후는 지원되지 않음)

DBCC OPENTRAN
지정한 데이터베이스에서 가장 오래된 활성 트랜잭션과 가장 오래된 분산 및 비분산 복제 트랜잭션에 대한 정보를 표시

DBCC SQLPERF
모든 데이터베이스에서 트랜잭션 로그 공간이 사용된 방법에 관한 통계를 제공

DBCC OUTPUTBUFFER
지정된 session_id의 현재 출력 버퍼를 16진수와 ASCII 형식으로 반환

DBCC TRACESTATUS
추적 플래그의 상태를 표시

DBCC PROCCACHE
프로시저 캐시에 대한 정보를 테이블 형식으로 표시

DBCC USEROPTIONS
현재 연결에 설정된 SET 옵션을 반환


유효성 검사: 데이터베이스, 테이블, 인덱스, 카탈로그, 파일 그룹 또는 데이터베이스 페이지 할당에 대한 유효성 검사 작업

DBCC CHECKALLOC
지정된 데이터베이스에 대한 디스크 공간 할당 구조의 일관성을 검사

DBCC CHECKFILEGROUP
현재 데이터베이스의 지정한 파일 그룹에서 모든 테이블과 인덱싱된 뷰의 할당 및 구조적 무결성 검사

DBCC CHECKCATALOG
지정한 데이터베이스 내의 카탈로그 일관성을 검사

DBCC CHECKIDENT
지정한 테이블의 현재 ID 값을 검사하고 필요에 따라 변경

DBCC CHECKCONSTRAINTS
현재 데이터베이스의 지정한 테이블에서 특정 제약 조건이나 모든 제약 조건의 무결성을 검사

DBCC CHECKTABLE
테이블 또는 인덱싱된 뷰를 구성하는 모든 페이지 및 구조의 무결성을 검사

DBCC CHECKDB
지정한 데이터베이스에서 모든 개체의 논리적 무결성 및 물리적 무결성을 검사

MS-SQL / SQL Server

테이블목록,필드정보 가져오는 프로시저생성

 

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

 


create   proc sp_tableform
as
declare @no varchar(35), @yes varchar(35), @none varchar(35)
 select @no = name from master.dbo.spt_values where type = 'B' and number = 0
 select @yes = name from master.dbo.spt_values where type = 'B' and number = 1
 select @none = name from master.dbo.spt_values where type = 'B' and number = 2
 declare @numtypes nvarchar(80)
  select @numtypes = N'tinyint,smallint,decimal,int,real,money,float,numeric,smallmoney'
 select
   so.name as 'table_name', 
   sc.name as 'colum_name' ,
   type_name(sc.xusertype)  as 'Type',
   case when sc.iscomputed = 0 then @no else @yes end as 'Computed',
   convert(int, sc.length) as 'Length',
    case when charindex(type_name(sc.xtype), @numtypes) > 0
   then convert(char(5),ColumnProperty(sc.id, sc.name, 'precision'))
   else '     ' end  as 'Prec',
    case when charindex(type_name(sc.xtype), @numtypes) > 0
   then convert(char(5),OdbcScale(sc.xtype,sc.xscale))
   else '     ' end  as 'Scale',
   case when sc.isnullable = 0 then @no else @yes end  as 'Nullable',
   sp.value 'value'
  from sysobjects so, syscolumns sc,sysproperties sp
   where so.xtype='U' and sc.id = so.id  and so.id*=sp.id and sc.colid *= sp.smallid
   and sc.number = 0 order by so.name, sc.colid

 


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

MS-SQL / SQL Server

두 테이블의 데이터 차이 비교 - TableDiff Utility

 

SQL Server 에서 두 테이블의 데이터 차이점을 비교해 볼 수 있을까요?
네, TableDiff 유틸리티를 사용하여 차이점을 비교해 볼 수 있습니다. TableDiff 도구를 사용하는 방법에 대해서 아래와 같이 예제를 만들어 봤습니다.

-- A, B 2개의 테이블을 생성하여 데이터를 입력합니다.

USE LAIGO
GO

CREATE TABLE A
(
MEMBER_ID int IDENTITY(1,1) NOT NULL,
MEMBER_NAME nvarchar(10) NOT NULL,
MEMBER_POINT int NOT NULL -- 포인트
)

INSERT INTO A VALUES ('라이고',30000)
INSERT INTO A VALUES ('정지훈',10000)
INSERT INTO A VALUES ('박지성',5000)
INSERT INTO A VALUES ('장동건',2000)
INSERT INTO A VALUES ('이병헌',9000)
INSERT INTO A VALUES ('김태희',4000)
INSERT INTO A VALUES ('고현정',8000)



CREATE TABLE B
(
MEMBER_ID int IDENTITY(1,1) NOT NULL,
MEMBER_NAME nvarchar(10) NOT NULL,
MEMBER_POINT int NOT NULL
)

-- 2건의 데이터를 A 테이블과 다르게 입력하였습니다.
INSERT INTO B VALUES ('라이고',3000) -- 30000
INSERT INTO B VALUES ('정지훈',10000)
INSERT INTO B VALUES ('박지성',5000)
INSERT INTO B VALUES ('장동건',20000)-- 2000
INSERT INTO B VALUES ('이병헌',9000)
INSERT INTO B VALUES ('김태희',4000)
INSERT INTO B VALUES ('고현정',8000)


[TableDiff 사용방법]
A, B 테이블의 차이점을 d:\temp\diff.sql 파일로 Export 하는 명령 구문
C:\Program Files\Microsoft SQL Server\90\COM>TableDiff -sourceserver laigo-pc -sourcedatabase laigo -sourcetable A -sourceuser sa -sourcepassword Pa$$w0rd -destinationserver . -destinationdatabase laigo -destinationtable B -destinationuser sa -destinationpassword Pa$$w0rd -f d:\temp\diff.sql


[TableDiff 결과]
diff.sql 파일을 열어보면 아래와 같이 쿼리가 생성되어 있습니다.
SET IDENTITY_INSERT [dbo].[b] ON
UPDATE [dbo].[b] SET [MEMBER_POINT]=30000 WHERE [MEMBER_ID] = 1
UPDATE [dbo].[b] SET [MEMBER_POINT]=2000 WHERE [MEMBER_ID] = 4
SET IDENTITY_INSERT [dbo].[b] OFF


[참고자료]
tablediff Utility
http://msdn.microsoft.com/en-us/library/ms162843.aspx

 

MS-SQL / SQL Server

SQL Server 2005에서 DBCC SHRINKFILE 문을 사용하여 

트랜잭션 로그 파일을 축소하는 방법


Microsoft SQL Server 2005에서는 데이터베이스의 트랜잭션 로그 파일을 축소하여 사용하지 않는 페이지를 제거할 수 있습니다.

 

데이터베이스 엔진에 의해 공간이 효율적으로 다시 사용되지만 트랜잭션 로그 파일이 예기치 않게 커지면 트랜잭션 로그 파일을 수동으로 축소해야 할 수 있습니다.

 

이 문서에서는 DBCC SHRINKFILE 문을 사용하여 SQL Server 2005 데이터베이스의 전체 복구 모델에서 트랜잭션 로그 파일을 수동으로 축소하는 방법을 설명합니다.

 

SQL Server 2005에서 트랜잭션 로그 파일을 축소하는 데 사용하는 방법은 SQL Server 2000에서 트랜잭션 로그 파일을 축소하는 데 사용하는 방법과 다를 수 있습니다.

 

 

일단, 트랜잭션 로그 파일을 축소하기 전에 로그 파일에 데이터가 들어가 있으면 축소가 되지 않으므로, 로그 파일 내에 데이터를 비우는 작업을 해야합니다.

 

트랜잭션 로그 데이터를 지우는 방법은 2가지 방법이 있습니다.

기본적으로 트랜잭션 로그는 백업을 받으면 비우게 되어있습니다.

그래서 트랜잭션 로그 백업을 진행합니다.

 

여기에서 파일로 백업을 받을 것인지 그냥 데이터만 지울것인지를 선택하면 됩니다.

 

1.트랜잭션 로그를 파일로 백업

BACKUP LOG <DatabaseName> TO DISK = '<BackupFile>'


예> BACKUP LOG TestDB TO DISK='C:\TestDB1.bak'

 

2.트랜잭션 로그를 파일로 백업안하고 그냥 비우기

BACKUP LOG [데이터베이스명] WITH TRUNCATE_ONLY

 

위의 쿼리를 실행하면 트랜잭션 로그 파일 내의 데이터를 비우게 됩니다.

하지만, 파일크기는 그대로 이기 때문에 파일 크기를 축소해야할 필요가 있습니다.

 

트랜잭션 로그 파일 크기 축소하기

USE [데이터베이스명];
GO

DBCC SHRINKFILE (트랜잭션로그명, 파일크기(단위:MB));

GO

 

예> TempDB 데이터베이스의 트랜잭션 로그 파일명 templog 를 1MB 크기로 축소하는 예..

USE TempDB;
GO

DBCC SHRINKFILE (templog, 1);

GO

 

데이터베이스 파일명 찾기

sp_helpfile

GO

 

위의 쿼리를 실행하면 트랜잭션 로그명을 알수 있습니다.

MS-SQL / SQL Server

Windows 데이터 정렬 스타일


SQL Server 설치 중에 Windows 데이터 정렬 또는 이진 데이터 정렬 중 하나를 선택하라는 메시지가 표시됩니다. 선택하는 데이터 정렬에 따라 Microsoft SQL Server 인스턴스의 데이터 비교 및 정렬 순서 동작이 달라집니다. 이 항목에서는 SQL Server 구현 시 Microsoft Windows 데이터 정렬 또는 이진 데이터 정렬을 선택할 때 고려해야 할 사항을 다룹니다.

참고:

Windows 데이터 정렬의 경우 ncharnvarchar 및 ntext 유니코드 데이터 형식은 charvarchar 및 text 비유니코드 데이터 형식과 같은 정렬 동작을 합니다.

Windows 데이터 정렬은 관련 Windows 로캘을 기반으로 문자 데이터 저장 규칙을 정의합니다. 기본 Windows 데이터 정렬 규칙은 사전 정렬이 적용될 때 사용되는 알파벳이나 언어를 지정하고 비유니코드 문자 데이터를 저장하는 데 사용되는 코드 페이지도 지정합니다. 이진 데이터 정렬은 로캘 및 데이터 형식으로 정의된 코딩 값 시퀀스에 따라 데이터를 정렬합니다. SQL Server의 이진 데이터 정렬은 사용할 로캘과 ANSI 코드 페이지를 정의하며 이진 정렬 순서를 적용합니다. 이진 데이터 정렬은 비교적 간단하므로 응용 프로그램 성능 향상에 도움이 됩니다. 비유니코드 데이터 형식의 경우 데이터 비교는 ANSI 코드 페이지에 정의된 코드 포인트를 기준으로 수행됩니다. 유니코드 데이터 형식의 경우 데이터 비교는 유니코드 코드 포인트를 기준으로 수행됩니다. 유니코드 데이터 형식에서의 이진 데이터 정렬의 경우 데이터 정렬 시 로캘은 고려되지 않습니다. 예를 들어 Latin_1_General_BIN과 Japanese_BIN은 유니코드 데이터에서 사용할 때 동일한 정렬 결과를 생성합니다.

더 이전의 SQL Server 이진 데이터 정렬은 WCHAR로 첫 번째 문자를 비교한 후 바이트 단위 비교를 수행했으므로 SQL Server의 이전 이진 데이터 정렬은 유니코드 데이터에 대해 불완전한 코드 포인트 간 비교를 수행했습니다. 이전 버전과의 호환성을 위해 기존의 이진 데이터 정렬 의미 체계는 변경되지 않습니다.

이 SQL Server 릴리스의 이진 데이터 정렬에는 순수 코드 포인트 비교 데이터 정렬 집합도 포함되어 있습니다. 이진 데이터 정렬로 마이그레이션하면 진정한 코드 포인트 비교 기능을 활용할 수 있으며, 새 응용 프로그램을 개발할 때는 이진 데이터 정렬을 사용해야 합니다. BIN2 접미사는 코드 포인트 데이터 정렬 의미 체계를 구현하는 데이터 정렬 이름을 식별합니다. 새로운 이진 정렬에서 BIN2에 해당하는 비교 플래그를 사용할 수도 있습니다. 자세한 내용은 BIN 및 BIN2 데이터 정렬 사용 지침을 참조하십시오.

다음 표에서는 SQL Server에 대한 Windows 데이터 정렬 순서 옵션에 대해 설명합니다.

정렬 순서(접미사)정렬 순서 설명

이진(_BIN)1

각 문자에 대해 정의된 비트 패턴을 사용하여 SQL Server 테이블의 데이터를 정렬하고 비교합니다. 이진 정렬 순서는 대/소문자와 악센트를 구분합니다. 이진 정렬은 가장 빠른 정렬 순서입니다. 자세한 내용은 BIN 및 BIN2 데이터 정렬 사용 지침을 참조하십시오.

이 옵션을 선택하지 않으면 SQL Server는 관련된 언어 또는 알파벳에 대해 사전에 정의된 정렬 및 비교 규칙을 따릅니다.

이진 코드 포인트(_BIN2)1

유니코드 데이터에 대한 유니코드 코드 포인트를 사용하여 SQL Server 테이블의 데이터를 정렬하고 비교합니다. 비유니코드 데이터의 경우 이진 코드 포인트에서는 이진 정렬과 동일한 비교를 사용합니다.

이진 코드 포인트 정렬 순서 사용 시의 이점은 정렬된 SQL Server 데이터를 비교하는 응용 프로그램에서 데이터를 재정렬할 필요가 없다는 점입니다. 결과적으로 이진 코드 포인트 정렬 순서를 사용하면 응용 프로그램을 더 간단하게 개발할 수 있으며 성능이 향상될 수 있습니다. 자세한 내용은 BIN 및 BIN2 데이터 정렬 사용 지침을 참조하십시오.

대/소문자 구분(_CS)

대/소문자를 구분합니다. 이 정렬 순서를 선택하면 소문자가 대문자보다 먼저 정렬됩니다.

이 옵션을 선택하지 않으면 SQL Server는 정렬할 때 대문자와 소문자가 동일한 것으로 간주합니다.

악센트 구분(_AS)

악센트가 있는 문자와 악센트가 없는 문자를 구분합니다. 예를 들어 'a'는 'ấ'와 같지 않습니다.

이 옵션을 선택하지 않으면 SQL Server는 정렬할 때 악센트가 있는 문자와 악센트가 없는 문자가 동일한 것으로 간주합니다.

가나 구분(_KS)

일본어 가나 문자의 두 가지 유형인 히라가나와 가타가나를 구분하도록 지정합니다.

이 옵션을 선택하지 않으면 SQL Server는 정렬할 때 히라가나와 가타가나가 동일한 것으로 간주합니다.

전자/반자 구분(_WS)

같은 문자라도 싱글바이트 문자와 더블바이트 문자를 구분합니다.

이 옵션을 선택하지 않으면 SQL Server는 정렬할 때 싱글바이트와 더블바이트로 표시된 같은 문자를 동일한 것으로 간주합니다.

1 이 옵션을 선택하면 대/소문자 구분, 악센트 구분, 일본어 가나 구분 및 전자/반자 구분 옵션을 사용할 수 없습니다.

각 Windows 데이터 정렬은 일련의 접미사를 조합하여 대/소문자, 악센트, 일본어 가나, 전자/반자 구분 여부를 정의합니다. 다음 예에서는 다양한 접미사 조합에 대한 정렬 순서 동작에 대해 설명합니다.

Windows 데이터 정렬 접미사정렬 순서 설명

_BIN1

이진 정렬

_BIN21

이진 코드 포인트 정렬 순서

_CI_AI

대/소문자 구분 안 함, 악센트 구분 안 함, 일본어 가나 구분 안 함, 전자/반자 구분 안 함

_CI_AI_KS

대/소문자 구분 안 함, 악센트 구분 안 함, 일본어 가나 구분, 전자/반자 구분 안 함

_CI_AI_KS_WS

대/소문자 구분 안 함, 악센트 구분 안 함, 일본어 가나 구분, 전자/반자 구분

_CI_AI_WS

대/소문자 구분 안 함, 악센트 구분 안 함, 일본어 가나 구분 안 함, 전자/반자 구분

_CI_AS

대/소문자 구분 안 함, 악센트 구분, 일본어 가나 구분 안 함, 전자/반자 구분 안 함

_CI_AS_KS

대/소문자 구분 안 함, 악센트 구분, 일본어 가나 구분, 전자/반자 구분 안 함

_CI_AS_KS_WS

대/소문자 구분 안 함, 악센트 구분, 일본어 가나 구분, 전자/반자 구분

_CI_AS_WS

대/소문자 구분 안 함, 악센트 구분, 일본어 가나 구분 안 함, 전자/반자 구분

_CS_AI

대/소문자 구분, 악센트 구분 안 함, 일본어 가나 구분 안 함, 전자/반자 구분 안 함

_CS_AI_KS

대/소문자 구분, 악센트 구분 안 함, 일본어 가나 구분, 전자/반자 구분 안 함

_CS_AI_KS_WS

대/소문자 구분, 악센트 구분 안 함, 일본어 가나 구분, 전자/반자 구분

_CS_AI_WS

대/소문자 구분, 악센트 구분 안 함, 일본어 가나 구분 안 함, 전자/반자 구분

_CS_AS

대/소문자 구분, 악센트 구분, 일본어 가나 구분 안 함, 전자/반자 구분 안 함

_CS_AS_KS

대/소문자 구분, 악센트 구분, 일본어 가나 구분, 전자/반자 구분 안 함

_CS_AS_KS_WS

대/소문자 구분, 악센트 구분, 일본어 가나 구분, 전자/반자 구분

_CS_AS_WS

대/소문자 구분, 악센트 구분, 일본어 가나 구분 안 함, 전자/반자 구분

1 BIN 또는 이진 코드 포인트를 선택하면 대/소문자 구분, 악센트 구분, 일본어 가나 구분 및 전자/반자 구분 옵션을 사용할 수 없습니다.


+ Recent posts