2009년 11월 26일 목요일
MS-SQL DB 백업 스케줄
1. 풀백업 (일주일에 한번 일요일 오전 2시 이후)
DECLARE CurQuery CURSOR FOR
select name from dbo.sysdatabases where name not in ('master', 'msdb', 'model', 'pubs', 'tempdb', 'Northwind') and convert(sysname,DatabasePropertyEx(name,'Status')) ='ONLINE' and convert(sysname,DatabasePropertyEx(name,'Updateability')) <>'READ_ONLY' and convert(sysname,DatabasePropertyEx(name,'Recovery')) <>'SIMPLE'
DECLARE @name varchar(100) OPEN CurQuery
FETCH NEXT FROM CurQuery INTO @name WHILE @@FETCH_STATUS = 0 BEGIN declare @dir nvarchar(200) set @dir = N'D:\DBBackUP\' + @name+ '\' + @name + '_' + + convert
(nvarchar(20), getDate(), 112) + replace(substring(convert(nvarchar(20), getDate(), 114),
1,5),':','') + '.dmp' backup database @name to DISK = @dir PRINT @dir FETCH NEXT FROM CurQuery INTO @name
END --end of while
CLOSE CurQuery
DEALLOCATE CurQuery
2. 차등백업 (하루에 한번 오전 2시 이후)
DECLARE CurQuery CURSOR FOR
select name from dbo.sysdatabases where name not in ('master', 'msdb', 'model', 'pubs', 'tempdb', 'Northwind') and convert(sysname,DatabasePropertyEx(name,'Status')) ='ONLINE' and convert(sysname,DatabasePropertyEx(name,'Updateability')) <>'READ_ONLY' and convert(sysname,DatabasePropertyEx(name,'Recovery')) <>'SIMPLE'
DECLARE @name varchar(100) OPEN CurQuery
FETCH NEXT FROM CurQuery INTO @name WHILE @@FETCH_STATUS = 0 BEGIN declare @dir nvarchar(200) set @dir = N'D:\DBBackUP\' + @name+ '\' + @name + '_' + + convert
(nvarchar(20), getDate(), 112) + replace(substring(convert(nvarchar(20), getDate(), 114),
1,5),':','') + '.dif'
backup database @name to DISK = @dir with differential PRINT @dir FETCH NEXT FROM CurQuery INTO @name
END --end of while
CLOSE CurQuery
DEALLOCATE CurQuery
3. 로그백업 (한시간에 한번) (sp_helpDB로 DB recovery가 simple이 아닐 경우 )
DECLARE CurQuery CURSOR FOR
select name from dbo.sysdatabases where name not in ('master', 'msdb', 'model', 'pubs', 'tempdb', 'Northwind') and convert(sysname,DatabasePropertyEx(name,'Status')) ='ONLINE' and convert(sysname,DatabasePropertyEx(name,'Updateability')) <>'READ_ONLY' and convert(sysname,DatabasePropertyEx(name,'Recovery')) <>'SIMPLE' DECLARE @name varchar(100) OPEN CurQuery
FETCH NEXT FROM CurQuery INTO @name WHILE @@FETCH_STATUS = 0 BEGIN declare @dir nvarchar(200) set @dir = N'D:\DBBackUP\' + @name+ '\' + @name + '_' + + convert
(nvarchar(20), getDate(), 112) + replace(substring(convert(nvarchar(20), getDate(), 114),
1,5),':','') + '.lg'
backup log @name to DISK = @dir PRINT @dir FETCH NEXT FROM CurQuery INTO @name
END --end of while
CLOSE CurQuery
DEALLOCATE CurQuery
2009년 11월 25일 수요일
SQL Server 2000에서 SQL Server 2005로 로그인 및 암호를 전송하는 경우
SQL Server 2000에서 SQL Server 2005로 로그인 및 암호를 전송하는 경우
역할에 로그인을 할당하는 경우서로 다른 버전의 SQL Server 간에 로그인 및 암호를 전송한 다음 역할에 로그인을 할당하려면 다음과 같이 하십시오.
원본 SQL Server에서 다음 스크립트를 실행합니다.
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar(256) OUTPUT
AS
DECLARE @charvalue varchar(256)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin_2000_to_2005') IS NOT NULL
DROP PROCEDURE sp_help_revlogin_2000_to_2005
GO
CREATE PROCEDURE sp_help_revlogin_2000_to_2005
@login_name sysname = NULL,
@include_db bit = 0,
@include_role bit = 0
AS
DECLARE @name sysname
DECLARE @xstatus int
DECLARE @binpwd varbinary (256)
DECLARE @dfltdb varchar (256)
DECLARE @txtpwd sysname
DECLARE @tmpstr varchar (256)
DECLARE @SID_varbinary varbinary(85)
DECLARE @SID_string varchar(256)
IF (@login_name IS NULL)
DECLARE login_curs CURSOR STATIC FOR
SELECT sid, [name], xstatus, password, isnull(db_name(dbid), 'master')
FROM master.dbo.sysxlogins
WHERE srvid IS NULL AND
[name] <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT sid, [name], xstatus, password, isnull(db_name(dbid), 'master')
FROM master.dbo.sysxlogins
WHERE srvid IS NULL AND
[name] = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated '
+ CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
PRINT ''
PRINT ''
PRINT '/***** CREATE LOGINS *****/'
WHILE @@fetch_status = 0
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF (@xstatus & 4) = 4
BEGIN -- NT authenticated account/group
IF (@xstatus & 1) = 1
BEGIN -- NT login is denied access
SET @tmpstr = '' --'EXEC master..sp_denylogin ''' + @name + ''''
PRINT @tmpstr
END
ELSE
BEGIN -- NT login has access
SET @tmpstr = 'IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE [name] = ''' + @name + ''')'
PRINT @tmpstr
SET @tmpstr = CHAR(9) + 'CREATE LOGIN [' + @name + '] FROM WINDOWS'
PRINT @tmpstr
END
END
ELSE
BEGIN -- SQL Server authentication
EXEC sp_hexadecimal @SID_varbinary, @SID_string OUT
IF (@binpwd IS NOT NULL)
BEGIN -- Non-null password
EXEC sp_hexadecimal @binpwd, @txtpwd OUT
SET @tmpstr = 'CREATE LOGIN [' + @name + '] WITH PASSWORD=' + @txtpwd + ' HASHED'
END
ELSE
BEGIN -- Null password
SET @tmpstr = 'CREATE LOGIN [' + @name + '] WITH PASSWORD='''''
END
SET @tmpstr = @tmpstr + ', CHECK_POLICY=OFF, SID=' + @SID_string
PRINT @tmpstr
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
END
IF @include_db = 1
BEGIN
PRINT ''
PRINT ''
PRINT ''
PRINT '/***** SET DEFAULT DATABASES *****/'
FETCH FIRST FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
WHILE @@fetch_status = 0
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
SET @tmpstr = 'ALTER LOGIN [' + @name + '] WITH DEFAULT_DATABASE=[' + @dfltdb + ']'
PRINT @tmpstr
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
END
END
IF @include_role = 1
BEGIN
PRINT ''
PRINT ''
PRINT ''
PRINT '/***** SET SERVER ROLES *****/'
FETCH FIRST FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
WHILE @@fetch_status = 0
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF @xstatus &16 = 16 -- sysadmin
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''sysadmin'''
PRINT @tmpstr
END
IF @xstatus &32 = 32 -- securityadmin
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''securityadmin'''
PRINT @tmpstr
END
IF @xstatus &64 = 64 -- serveradmin
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''serveradmin'''
PRINT @tmpstr
END
IF @xstatus &128 = 128 -- setupadmin
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''setupadmin'''
PRINT @tmpstr
END
IF @xstatus &256 = 256 --processadmin
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''processadmin'''
PRINT @tmpstr
END
IF @xstatus &512 = 512 -- diskadmin
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''diskadmin'''
PRINT @tmpstr
END
IF @xstatus &1024 = 1024 -- dbcreator
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''dbcreator'''
PRINT @tmpstr
END
IF @xstatus &4096 = 4096 -- bulkadmin
BEGIN
SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''bulkadmin'''
PRINT @tmpstr
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
END
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
exec sp_help_revlogin_2000_to_2005 @login_name=NULL, @include_db=1, @include_role=1
GO
출력을 저장한 다음 대상 SQL Server 2005의 SQL Server Management Studio에 붙여 넣고 실행합니다.참고 원본 SQL Server에 암호가 비어 있는 로그인이 포함되어 있으면 출력에 다음과 유사한 문이 들어 있습니다.
CREATE LOGIN LoginName WITH PASSWORD = '', CHECK_POLICY = OFF, SID = MySID
http://support.microsoft.com/kb/246133/ko
SQL Azure 알아보기(2) – 데이터베이스 스키마 마이그레이션, 데이터 전송
AdventureWork2008 예제 데이터베이스를 통해서 시도를 해보겠습니다. 스크립트는 Sqlcmd를 통
해서 접근할 수 도 있습니다.
일단 로컬 서버의 AdventureWork2008 데이터베이스의 스키마를 실행해보면 지원되지 않는 T-SQL 기능들을 알 수 있습니다. 지원되지 않는 T-SQL 기능들을 정리하고 스키마와 데이터를 SQL Azure에 게시해보도록 하겠습니다.
AdventureWork2008 의 스키마를 생성하기 위해 데이터베이스를 오른쪽 클릭하여 태스크 메뉴에서 스크립트 생성을 클릭합니다.
옵션들을 default 로 해서 스키마를 생성해 ‘HJ’ 데이터베이스에서 실행해보겠습니다.
HJ 데이터베이스에서 실행할 것이므로 데이터베이스 생성, USE 구문에 대한 부분은 제거합니다.
생성된 스크립트를 실행해보면 “sys.sp_addextendedproperty” 저장 프로시저를 찾을 수 없다는 에러가 발생합니다.

[그림2-1 스크립트 생성]
그래서 위 그림과 같이 스크립트를 생성할 때 옵션을 수정해주어야 합니다.
l Convert UDDTs to Base Types => True
l USE Database 스크립팅 => False
l 확장 속성 스크립팅=> False
스크립트 생성에서 옵션을 지정했지만 CREATE TYPE 구문 등은 남아있으므로 아래와 같은 정리 작업을 해주어야 실행이 성공할 수 있습니다.
l ANSI_NULLS 제거
l CREATE TYPE 구문 제거
l ON FileGroup 을 Primary 그룹으로 변경
l NOT FOR REPLICATION 제거
l PAD_INDEX 제거
l Windows LOGIN
l INDEX 관련
l XML SCHEMA 관련
l XML INDEX 구문 제거
l ON [Primary] 구문 제거
l HierarchId, FILESTREAM
생각보다 정리할게 너무 많고 손이 참 많이 갑니다. 왜 해야되냐는 의구심이 팍 ㅠㅠ힘내서 자 성공적으로 끝나고 아래 그림과 같이 테이블과 개체들이 생성되었습니다

[그림2-2 스크립트 실행]
이제 데이터를 전송, 게시해보도록 하겠습니다.
게시 마법사를 통해 INSERT 구문을 실행해도 상관없으며 SQL Server Integration Services(SSIS)를 이용해서 접근할 수도 있습니다. 실무라면 SSIS가 더 일반적이겠죠.

[그림2-3 INSERT]

[그림2-4 SSIS]
이상 클라우딩 환경에서 이용할 데이터베이스 개체와 데이터를 간단히 처리해보았습니다.
지원되지 않는 T-SQL 기능에 대한 부분은 아래 링크를 확인해보시기 바랍니다. 아직 CTP1이랍니다.
http://msdn.microsoft.com/en-us/library/ee336281.aspx
http://msdn.microsoft.com/en-us/library/ee336253.aspx
감사합니다.
SQL Azure 알아보기 (1) - 데이터베이스 개체 생성
이번 블로그에서는 SQL Server Management Studio(SSMS) 를 이용하여 SQL Azure 데이터베이스에 데이터베이스 개체(데이터베이스, 테이블, 인덱스, 제약, 데이터)를 생성해보겠습니다. 향후 데이터베이스 개체를 웹 응용 프로그램에서 이용해 볼 것입니다.
SQL Server Management Studio(SSMS)를 통해 SQL Azure 데이터베이스 서버를 접근해보도록 하겠습니다. 이전 블로그에서 본 것처럼 개체 탐색기에서는 연결이 안되었지만 아래 그림의 새 쿼리를 통하면 연결이 가능합니다.
SSMS를 시작할 때 연결 창이나 개체 탐색기에서 연결을 사용하시면 이전 블로그에서와 같은 에러를 보실 수 있습니다. 그래서 ‘새 쿼리’ 메뉴를 선택하거나 파일> 새로 만들기> 데이터베이스 엔진 쿼리를 이용하시면 됩니다. 새 쿼리 메뉴를 클릭하시면 연결 창이 보이고 SQL Azure 서버주소와 계정과 암호를 입력하시면 됩니다.

[그림1-1 SQL Azure 서버에 연결]
연결하시면 아래와 같은 경고 창을 보실 수 있습니다. 아래 경고에서는 확인을 선택합니다.

[그림 1-2 경고창]
쿼리 창에서 아래와 같이 @@version 구문을 실행해봅니다. 그러면 SQL Azure 서버의 버전을 알 수 있습니다.
사용자 데이터베이스를 만들기 위해 sys.databases 라는 카탈로그 뷰를 아래 그림과 같이 실행해 봅니다. 실행 결과에서 데이터베이스 목록을 알 수 있습니다.

[그림 1-4 sys.databases]
사용자 데이터베이스를 생성하기 위해 CREATE DATABASE 구문을 아래와 같이 실행해봅니다. 물리적인 데이터베이스 파일 위치까지 지정한 구문은 실행되지 않습니다. 마찬가지로 DROP DATABASE 구문도 실행 가능합니다.
[그림 1-5 CREATE DATABASE]
해당 사용자 데이터베이스로 이동해서 테이블 개체를 생성하려고 합니다. USE 구문을 사용하면 해당 데이터베이스가 존재하지 않는다는 에러 메시지가 나오면서 전환이 되지 않습니다. 사용자 데이터베이스로 이동할 경우는 아래와 같이 진행합니다.
파일 > 새로 만들기 > 데이터베이스 엔진 쿼리를 선택해서 SQL Azure 서버 정보를 입력하고 옵션을 선택해서 연결할 데이터베이스부분에 데이터베이스 이름을 직접 타이핑해서 연결하면 됩니다.

[그림 1-6 DATABASE 연결]
이제 테이블을 생성해서 데이터를 추가해보도록 하겠습니다. 아래 그림과 같이 실행해서 테이블을 생성합니다.

[그림 1-7 테이블생성]
CREATE 구문에 보는 것처럼 클러스터형 인덱스와 DEFAULT 제약이 생성된 것을 확인가능합니다.
생성된 테이블에 INSERT 구문을 실행해봅니다.
물론 4번 데이터는 UPDATE 또는 DELETE를 수행할수 있습니다.~ 이상으로 SSMS를 이용하여 SQL Azure 서버에 데이터베이스, 테이블, 인덱스, 데이터 INSERT를 다루어 보았습니다. 다음 블로깅에서는 로컬에 있는 SQL Server 2008의 Sample 데이터베이스를 SQL Azure 로 게시를 해보겠습니다. 게시하면서 지원하지 않는 T-SQL에 대한 부분을 알아보겠습니다.
감사합니다.
SQL Azure - CTP1

SQL Azure 데이터 액세스 구조는 아래 그림을 참조해주세요. ADO.NET 등의 응용 프로그램이나 Windows Azure를 통해 SQL Azure 데이터베이스를 액세스할 수 있습니다.

클라우드 데이터베이스는 1개 서버에 5개 데이터베이스까지 현재는 지원하고 있으며 SQL Server Management Studio에서는 아직 아래 그림처럼 연결이 되지 않고 있습니다. 조만간 될 예정이라고 하니 그때는 좀 더 편하게 작업이 가능해져 SQL Azure에 대한 부분이 더 활성화 될것으로 보입니다.

SSMS 외에 SQL Azure에 접근할 수 있는 방법은 ADO.NET, SqlCmd를 이용한 방법이 있으며 이를 통해 대부분의 T-SQL 구문을 실행해볼수 있습니다. 아래는 SQL Azure 데이터베이스를 생성하기 위해 ADO.NET 으로 구현한 내용입니다. 아래 주소의 소스를 참고했습니다. http://msdn.microsoft.com/en-us/library/ee336243.aspx생성하려면 SQL Azure 계정이 있어야 하고 이를 통해 ADO.NET을 호출해야 합니다. 계정이 없는 분을 대신해서 제가 호출해보았습니다. 제 환경은 Visual Studio 2010 에서 c# Windows 응용 프로그램으로 접근합니다. 아래 소스는 클라우드 데이터베이스를 생성해주는 구문입니다. 다 알고 있는 것처럼 ADO.NET으로 CREATE DATABASE 구문을 실행해주는 내용입니다. 연결 문자열은 위에서 ConnectionStringBuilder 클래스를 통해 미리 생성해두었습니다. 사전에 정의된 계정으로 연결 문자열이 생성되며 실제 실행시켜 볼때는 계정이름을 'hongju@ServerName' 으로 하셔야 합니다.Windows 응용 프로그램에서 접근해서 클라우드 데이터베이스가 생성됩니다.
01.using (SqlConnection conn =
02.new SqlConnection(connString1Builder.ToString()))
03.{
04. using (SqlCommand command = conn.CreateCommand())
05. {
06.conn.Open();
07.// 테스트 데이터베이스 생성
08.string cmdText = String.Format("CREATE DATABASE {0}", sampleDatabaseName);
09.command.CommandText = cmdText;
10.command.ExecuteNonQuery();
11.conn.Close();
12.}
13.}데이터베이스가 생성되었으니 테이블을 만들고 INSERT, SELECT는 아래처럼 기존 ADO.NET 코드와 동일하게 접근이 가능합니다. SqlCommand 로 작업하는 것은 다 아시니 불필요한 코드는 지면상 생략하겠습니다.~
01.// 테이블 생성
02.command.CommandText = "CREATE TABLE T2(Col1 int primary key, Col2 nvarchar(20))";
03.command.ExecuteNonQuery();
04.
05.// INSERT
06.command.CommandText = "INSERT INTO T2 (col1, col2) values (8, N'한글 1'), (2, N'한글 2'), (3, N'한글 3')";
07.int rowsAdded = command.ExecuteNonQuery();
08.// SELECT
09.command.CommandText = "SELECT * FROM T1";
10.using (SqlDataReader reader = command.ExecuteReader())
11.{
12. // MessageBox로 결과 확인
13. while (reader.Read())
14.{
15. MessageBox.Show(reader["Col1"].ToString().Trim() +reader["Col2"].ToString().Trim());
16.}
17.}유니코드로 한글을 입력하면 한글 결과를 확인할수 있습니다. 다 아시는 구문이며 SQL Azure라고 큰 차이는 없다는것을 확인 가능합니다. 아래 구문이 새로운 것은 아니며 SQL Server 2008에서 제공되는 구문이랍니다.INSERT INTO T2 (col1, col2) values (8, N'한글 1'), (2, N'한글 2'), (3, N'한글 3')기존 T-SQL과의 차이점 등은 아래 링크를 참조해주십시오.이상으로 SQL Azure CTP1에 대한 첫 소개를 말씀드렸습니다. 다음에는 보다 더 구체적인 예제로 SQL Azure를 접근해보겠습니다.감사합니다.SQL Azure Documentation:http://msdn.microsoft.com/en-us/library/ee336279.aspx
SQL Azure Forum:http://social.msdn.microsoft.com/forums/en-US/ssdsgetstarted/threads/
Connecting to SQL Azure Using ADO.NET: http://msdn.microsoft.com/en-us/library/ee336243.aspx
출처 :http://vsts2010.tistory.com/116
Azure Services in Visual Studio 2010 Beta 2
해당 사이트에 동영상 제공:
Video: Azure Services in Visual Studio 2010 Beta 2, Part III
This is the first of three videos showing how Visual Studio 2010 Beta 2 provides support for the development and deployment of Azure Services applications. In these short How Do I Videos, I filmed Jim Nakashima as he demonstrated practical techniques for quickly deploying applications to the cloud. These videos will eventually be published in the How Do I section of the C# Dev Center. I’m hosting them here for now, so that they will be available in time for PDC.
Azure Services in Visual Studio Part III
Download the Videos
Click the links below to download the videos to your local machine and view them at their native 1024 X 768 resolution.
Azure Services with Visual Studio Part I
Azure Services with Visual Studio Part II
Azure Services with Visual Studio Part III
Other Posts in this Series
Windows Azure Platform
2 윈도우 애저 플랫폼
2.1 윈도우 애저
2.1.1 애플리케이션 구동 (Compute 서비스)
2.1.2 데이터를 저장 (Storage 서비스)
2.2 윈도우 애저 플랫폼
2.2.1 .NET Services
2.2.2 SQL Azure
2.2.3 Live Services
3 참고문헌
요약
마이크로소프트의 클라우드 컴퓨팅 기술은 “소프트웨어 + 서비스(Software + Services, 줄여서 S+S)”라는 전략을 바탕으로 하여:
대량 가상화 그리드 (Massive Virtualization Grid) 기술
클라우드 클라이언트(Cloud Client) 기술
클라우드 서비스 플랫폼(Cloud Services Platform) 기술
클라우드 서비스로 확장 연동(Scale Out To Cloud Services)하는 기술
모두 네 가지 서로 다른 기술 시나리오의 총합으로 요약할 수 있다. 본 글에서는 이 가운데 (2),(3),(4)에 해당하는 윈도우 애저 플랫폼(Windows Azure Platform) 기술에 중점을 두고 여타 클라우드 컴퓨팅 기술과 대비되는 차별성을 논한다.
글쓴이
장현춘, 솔루션 아키텍트
신현석, 인프라 아키텍트
윈도우 애저 플랫폼
애저 서비스 플랫폼은 2008년 10월 말경 공식 발표되었다. 애저 서비스 플랫폼은 [그림 1]과 같이 윈도우 애저(Windows Azure)라 명명된 클라우드 운영체제와 다섯 개의 서비스 개발자 블록을 한 데 묶은 통칭이다. 이는 그간 하드웨어 업체를 중심으로 데이터 센터의 고도화된 인프라스트럭처(Infrastructure) 구성에 중점을 두고 클라우두 컴퓨팅의 가치를 해석하던 것과는 달리, 어플리케이션 개발의 편의성과 비용 측면에서 초점을 맞추어 “고성능의 SaaS 플랫폼(High-performance SaaS Platform)”을 실현하는데 클라우드 컴퓨팅을 활용하였다는 점에서 차별성과 의의를 찾을 수 있다. 지금부터는 애저 서비스 플랫폼이 제공하는 서비스 블록들의 기능적 특성을 차례로 상세하게 설명한다.
윈도우 애저
Windows Azure는 두 가지 중요한 일, 애플리케이션을 구동(Compute), 데이터를 저장(Storage)하는 역할을 한다. Windows Azure는 마이크로소프트 데이터센터에 존재하는 수많은 서버를 통합 운영하여 강력한 프로세싱 파워를 낼 수 있는데, Fabric이라고 하는 개념을 기반으로 Compute & Storage서비스가 구축 되어 있다. Compute 서비스는 Windows Server 기반으로 이루어져 있고, 초기 CTP(Community Technology Preview) 버전에서는 .NET Framework 기반으로 구축된 애플리케이션만 구동되지만, Unmanaged 코드 역시 지원할 계획을 가지고 있다. CTP 버전에서는 ASP.NET 애플리케이션과 Windows Communication Foundation (WCF) 서비스 같은 .NET 기반의 소프트웨어를 만들 수 있는데 C#, 기타 다른 .NET 언어를 Visual Studio 2008 같은 개발 도구를 이용할 수 있다.
애플리케이션 구동 (Compute 서비스)
애플리케이션은 보통 여러 개의 Instance를 가지고 있고, 각 Instance는 독자적인 VM 안에서 구동 된다. 이 VM들은 64비트 Windows Server 2008 환경이고, Cloud에서 사용되도록 디자인된 Hypervisor에 의해 서비스 된다. Windows Azure 애플리케이션은 실제로 그 VM을 볼 수 없도록 설계되어 있다. CTP 버전에서는 Web Role, Worker Role Instance를 통해서 .NET 3.5 애플리케이션을 만들도록 구성되어 있다. Web Role Instance는 IIS7 웹서버를 경유하여 HTTP(HTTPs) 요청을 받아 들인다. Web Role은 ASP.NET, WCF, .NET Framework 기술을 통해 구현하는데 Web Role Instance 간에 요청을 분산시킬 수 있도록 Built-In 로드밸런싱을 지원한다. Worker Role Instance는 외부로부터 요청을 직접 받아들 일 수 없게 되어 있기 때문에 외부의 네트웍 커넥션은 허용되지 않고, 웹서버가 VM 내부에 구동 되지 않는다. 입력이 Web Role Instance로 부터 들어와서, Windows Azure Storage 내부의 Queue에 저장된 후 작업 결과 값이 Windows Azure Storage에 저장되거나 외부로 보내진다. Incoming HTTP 요청을 처리하고, 요청이 처리된 후 종료되는 Web Role과 다르게 Worker Role Instance는 배치 작업처럼 무한히 구동될 수 있다.
Windows Azure의 초기 배포 버전은 VM과 물리적 프로세서 코어 간에 1:1 관계를 유지하게 되어 있고 이 원칙을 통해 각 애플리케이션의 성능이 보장된다. 각 Web Role, Worker Role Instance는 자신에게 할당된 프로세서 코어가 있는 것이다. 애플리케이션의 성능을 증가시키기 위해, 소유자는 애플리케이션 설정 파일 안에 운영되는 Instance의 수를 증가시킬 수 있다. 그런 후에 Windows Azure Fabric이 새로운 VM을 생성한 후, 코어에 할당하고 이 애플리케이션에 더 많은 Instance를 구동하도록 한다. Fabric은 또한 Web Role, Worker Role Instance에 오류가 발생했을 때 새로운 Instance를 구동해주는 역할을 한다. Windows Azure의 Web Role Instance는 stateless 형태를 지원한다. 상태 정보를 처리하기 위해서는 Windows Azure Storage를 사용하거나 쿠키를 이용해야 한다. Web Role의 statelessness는 또한 Windows Azure의 Built-In Load Balancer에 의한 특징이다. 요청이 특정 웹 Role Instance에게만 보내지는 것이 허용되지 않기 때문이고, 한 사용자가 사용하는 여러 요청들이 동일 Instance로 보내진다는 보장이 없기 때문이다. Web Role과 Worker Role은 모두 표준 .NET 기술을 사용하여 구현되었다. 그러나, 현재 있는 .NET Framework 애플리케이션을 Windows Azure로 변경 없이 사용하도록 하는 것은 불가능하다. 애플리케이션이 스토리지를 접근하는 방식이 다르기 때문이다. Worker role Instance는 입력을 위해 Windows Azure 스토리지의 큐를 이용한다. 개발의 편의를 위해 제공되는 Windows Azure 소프트웨어 개발 Kit은 개발자의 데스크탑에서 구동할 수 있는 Windows Azure Environment를 포함하고 있다. 이 Windows Azure-in-a-box는 Windows Azure Storage, Windows Azure agent, 그리고 Cloud에서 애플리케이션이 구동되기 위해 필요한 것은 다 포함되어 있다. 개발자는 이 환경에서 애플리케이션 디버깅을 할 수 있고, 테스트가 완료됐을 때 실제 Windows Azure Cloud로 배포할 수 있다. Windows Azure fabric은 애플리케이션 실패를 감지하고, 결과를 보낼 수 있다. 또한, Windows Azure platform은 애플리케이션의 자원 소비량, 프로세서 시간, incoming & outcome 대역폭, 스토리지 등에 대한 상세한 정보를 제공한다.
데이터를 저장 (Storage 서비스)
애플리케이션은 데이터와 다양한 방식으로 동작한다. (Blob, Queues, Tables) Blobs은 가장 간단한 방식이다. Windows Azure Storage의 계정은 Container, 50기가 바이트의 크기까지 저장 가능한 Blob, 더 작은 단위인 Block으로 구성되어 있다. 만약 오류가 발생하면, 전체 Blob을 다시 보내는 것이 아니고 가장 최근의 Block을 다시 보내준다. Blobs은 JPEG 사진이 어디서 찍었고, MP3파일의 작곡가가 누구인지 등에 메타데이터 정보를 가질 수 있다.
또 다른 유형인 Tables의 경우 Entity의 계층 구조를 저장할 수 있다. 정해진 스키마를 가지고 있지 않고, 프로퍼티를 통해 다양한 유형의 데이터 타입, 문자열, Int, Bool, DateTime등을 가질 수 있다. 테이블은 여러 서버에 파티션으로 나뉘어 저장되기 때문에 수십억 개의 Entity를 저장할 수 있다.
Queues는 Web Role Instance가 Worker Role Instance와 통신할 수 있는 방법을 제공 한다. 사용자가 Windows Azure Web Role을 통해 구현된 웹 페이지에서 컴퓨팅을 많이 필요로 하는 작업을 요청할 경우 Web Role Instance가 어떤 작업이 이루어져야 하는지를 큐에 메시지로 넣고 Worker Role Instance가 이 큐 값을 읽어서 정해진 작업을 수행하고, 다른 큐를 통해 해당 결과 값을 돌려줄 수 있다. Blobs, Tables, Queues에 관계 없이 Windows Azure storage에 저장된 데이터는 Fault Tolerance를 위해 3번 복제 된다.
Windows Azure storage는 REST 방식을 사용한다. 모든 자원은 URI로 이름이 부여되고, 표준 HTTP 방식으로 처리된다. .NET 클라이언트는 ADO.NET 서비스나 LINQ를 사용할 수 있지만, Java 애플리케이션으로는 표준 REST 방식을 사용할 수 있다. Blob이 HTTP GET을 이용해, URI를 호출하는 방법은 아래와 같다. http://
Tables, Queues 역시 유사한 방식을 사용한다. Windows Azure 플랫폼은 Compute와 Storage 자원을 개별적으로 비용을 책정하기 때문에 On-Premise 애플리케이션이 RESTful 방식으로 Windows Azure Storage를 사용할 수 있다.
윈도우 애저 플랫폼
Windows Azure와 함께 Windows Azure Platform을 구성하는 다른 한 축은 개발자가 사용할 수 있는 클라우드 스케일의 빌딩 블록 서비스 모음이라 할 수 있는 Azure Services이다. 아래 그림에서 보듯이 Windows Azure가 제공하는 클라우드 OS로서의 기본 서비스와는 차별되는 고급 기능을 제공하며, 여기에는 .NET Services, SQL Azure 등이 현재 제공되고 있으며 향후 Live Services, Sharepoint Services, Dynamic CRM Services과 같이 현재 마이크로소프트가 SaaS 서비스로 제공하고 있는 기능과 연동할 수 있는 기능을 제공할 예정이다.
.NET Services
.NET Services는 일반적인 닷넷 애플리케이션 개발에서 .NET Framework이 제공하던 기능을 클라우드 스케일로 확장한 개념이다. 즉, 클라우드 상의 애플리케이션이 서비스를 노출함에 있어서 접근하는 사용자를 어떻게 인증할 것이며, 방화벽으로 막혀 있는 서비스들 사이의 연동은 어떻게 가능하게 할 것이며, 클라우드 상에서 워크플로우를 실행시켜 나의 애플리케이션 상의 워크플로우와 어떻게 연동할 것인가 등에 대한 입증된 빌딩 블록 서비스를 제공하는 것이다. SOA 기반의 인프라를 갖추기 위해 기업들은 ESB (Enterprise Service Bus)를 도입하여 표준 웹 서비스 기반으로 기업내 다양한 애플리케이션간 서비스 연동을 지원하는데, ESB가 클라우드 스케일로 확장되어 기업간 애플리케이션간 서비스 연동을 제공하는 것이 ISB (Internet Service Bus)이며, ISB의 마이크로소프트 버전 구현체가 바로 .NET Service Bus인 것이다.
그림에서 보듯이 .NET Service Bus는 서비스 제공자는 마이크로소프트 데이터 센터에 개설한 자신의 계정에 서비스를 노출하고, 서비스 사용자는 http 프로토콜을 통해 일반 웹 서비스를 호출하는 방식으로 접근할 수 있는 방법을 제공한다. Access Control Services는 다양한 인증 체계를 가진 서비스들 사이에 SAML과 같은 합의된 Federation 표준 기반의 토큰 서비스를 통해 연동할 수 있는 방법을 제공한다.
SQL Azure
SQL Services는 마이크로소프트의 SQL Server가 제공하는 각종 Relational한 기능들, 즉 리포팅, 분석, 데이터 동기화, Relational 쿼리 등을 클라우드 서비스로 제공하는 것으로 현재 SQL Data Services (SDS)를 통해 일부 기능을 제공하고 있다. SQL Server 기반으로 구현되어 있는 SDS는 현재 버전의 CTP에서는 일반적인 Relational한 데이터베이스 접근 방식을 제공하지는 않고 REST 및 SOAP 기반의 웹 서비스 인터페이스를 제공하고 있다. 하지만, 향후 SDS의 방향은 Transact-SQL을 지원하여 현재 개발자가 사용하고 있는 Relational한 쿼리를 그대로 활용할 수 있는 클라우드 상의 Relational Database로 역할을 할 예정이며, 이를 통해 앞서 기술한 Windows Azure내의 Storage 서비스와는 차별화된 서비스를 제공하게 된다.
Live Services
Live Services Live Services는 Windows Live Hotmail, Windows Live Messenger 등 기존에 마이크로소프트가 제공하던 각종 Windows Live 애플리케이션과의 원활한 연동을 제공하며 개발자는 Live Services가 제공하는 Live Framework을 통해 일관된 방식으로 마이크로소프트의 각종 Live 애플리케이션이 관리하는 데이터에 접근할 수 있다. 즉, 아래 그림에서 보듯이 Hotmail이나 Messenger에서 관리되고 제공되는 엄청난 양의 개인 정보, 지인 연락처 정보, 지인의 로그인 여부, 검색 서비스 등에 대해 접근할 수 있으며 이를 기반으로 애플리케이션을 개발할 수 있고 또한 내 애플리케이션이 사용하는 데이터를 다양한 디바이스간에 동기화 기능도 제공할 수 있다.
현재 Live Services를 이용하여 마이크로소프트가 제공하는 서비스로 Live Mesh (http://www.mesh.com/) 가 있으며, 다양한 디바이스간 데이터 및 애플리케이션 동기화 기능을 제공하고 있다.
참고문헌
Windows (R) Azure(TM) Platform, Microsoft, http://www.azure.com/
David Chappell, “Introducing The Azure Services Platform,” http://download.microsoft.com/download/e/4/3/e43bb484-3b52-4fa8-a9f9-ec60a32954bc/Azure_Services_Platform.pdf, 2008.10
Microsoft, Azure Services Platform, http://www.microsoft.com/azure/windowsazure.mspx
Microsoft, Azure Services Platform, http://msdn.microsoft.com/en-us/azure/default.aspx
Microsoft, MSDN, http://msdn.microsoft.com/en-us/azure/cc994380.aspx
Microsoft, Windows Azure Blog, http://blogs.msdn.com/windowsazure
신현석, “WOA, 전문가기고,” IT Today, 2008.12.21
신현석, “MS 클라우드 전략의 ‘코어’, 윈도우 애저,” 마이크로소프트웨어, 2009.01
Retrieved from "http://www.architecturejournal.org/wiki/Windows_Azure_Platform"
해당 글 출처 : http://www.architecturejournal.org/wiki/Windows_Azure_Platform
마이크로소프트의 클라우드 컴퓨팅, Azure 가격 정책 공개
마이크로소프트의 Public Cloud, Windows Azure와 Azure Services Platform의 가격정책이 WPC(Worldwide Partner Conference) 2009 행사에서 공개되었습니다. 아직은 Azure가 테스트 상태인 CTP(Community Technology Preview) 버전이기 때문에 무료로 사용하실 수 있습니다. 올해 11월에 예정된 PDC(Professional Developer Conference)에 맞춰 상용화 될 예정입니다.
마이크로소프트의 클라우드 컴퓨팅은 크게 3가지 유형의 가격 정책으로 나뉘어져 있습니다.
1. 사용한 만큼 비용 지불 (Consumption) - Pay as you go 모델, 즉 클라우드 컴퓨팅의 가장 보편적인 방식
2. 월별로 정해진 비용을 지불하는 방식 (Subscription)
- 1번 방식을 통하면 매월 지불하는 비용이 달라지므로, 지출에 대한 예측이 어렵습니다. 월정액 방식을 선호하는 고객이 선호하는 방식
3. 볼륨 라이선스
- 엔터프라이즈 고객이 맺고 있는 EA(Enterprise Agreement) 방식으로 계약을 체결하는 방식
2,3번에 대한 정확한 가격은 PDC2009에 맞춰 발표될 예정입니다. 이번에 발표된 가격 정책은 1번에 해당하는 내용입니다.
CTP 기간 동안에는 아래와 같이 사용량에 제한이 있습니다.- Total compute usage: 2000 VM hours - Cloud storage capacity: 50GB - Total storage bandwidth: 20GB/day
Windows Azure:
Compute = $0.12 / hour
Storage = $0.15 / GB stored / month Storage Transactions = $0.01 / 10K Bandwidth = $0.10 in / $0.15 out / GB
산정방식
Compute: 애플리케이션이 Azure에 배포되어 있을 때의 시간을 계산함. 만약, 개발이나 테스트 중일
경우에는 배포했던 것을 제거한 후 개별 로컬 머신 에서 개발 및 테스트하는 것이 유리함,
Storage: 30GB의 데이터를 Azure에 하루 동안 저장했다면 30일 기준으로 1GB로 비용 청구됨, 30일 내내 사용했다면 30GB로 비용 청구됨, 즉 30GB * $0.15 = $4.5스토리지 트랜잭션, 즉 신규, 수정, 읽기, 삭제 등의 트랜잭션도 별도로 빌링이 되는데 10,000건에 $0.01 입니다.
대역폭: 30일 동안 인터넷을 통해 애저로 유입되고 나가는 총 데이터를 기준으로 비용 정산됩니다.
SQL Azure
웹 Edition:
T-SQL 기반의 관계형 데이터베이스 1GB까지
Self-managed DB, 자동 고가용성, 백업 제공
사용한 만큼 비용을 지불하고, 자동으로 확장됨
웹 애플리케이션에 적합
비즈니스 Edition:
T-SQL 기반의 관계형 데이터베이스 10 GB까지
Self-managed DB, 자동 고가용성, 백업 제공
사용한 만큼 비용을 지불하고, 자동으로 확장됨
자동 파티션, CLR 등의 기능은 추후에 추가 예정
솔루션을 개발하는 ISV의 LOB 애플리케이션에 적합
.NET Services:
메시지 (Access Control, Orchestration, 메시지 큐): .NET Services를 사용하면 개발자들이 현재 운영중인 소프트웨어 자산이나 사용자가 클라우드 애플리케이션 및 데이터베이스에 쉽게 연결할 수 있습니다. 클라우드와 직접 운영 중인 On-premise와의 통신은 주로 메시지를 통해 이루어지게 됩니다. 사용한 만큼 비용을 지불하는 방식은 애플리케이션이 사용하는 메시지의 숫자를 기준으로 과금 하는 것을 의미합니다. 메시지는 서비스 버스의 메시지와 Access Control 토큰이라고 보시면 됩니다. 1달동안 10만개 기준으로 과금이 이루어 집니다. 예를들면,
. 95,000개의 메시지를 사용했다면, 100,000개 기준으로 빌링 + 나가고 들어온 메시지 대역폭 비용
. 150,000개의 메시지를 사용했다면 200,000개 기준으로 빌링 + 나가고 들어온 메시지 대역폭 비용
자, 이제 가장 중요한 서비스 수준 협약 (SLA)에 대한 부분이 남았군요.
Service Level Agreements (SLA)
Windows Azure:
Windows Azure는 Compute와 Storage를 위한 SLA가 별도로 존재합니다. Compute에 대해서는 2개 이상의 역할 인스턴스를 배포하고, Fault 및 Upgrade 도메인을 사용하는 경우 99.95%의 가동율을 보장합니다. 또한, 역할 인스턴스가 작동하지 않는 경우 적절한 조치를 취하기 위해 2분 이내에 탐지한 후 문제를 해결하기 위해 모니터링을 실시할 것 입니다. Storage 영역은 데이터의 추가, 수정, 조회, 삭제 요청이 제대로 동작하게 하기 위해 99.9%의 가동율을 보장합니다.
SQL Azure:
99.9%의 가동율을 보장 합니다.
.NET Services:
특성 상 On-premise와 클라우드 상의 엔드포인트가 많기 때문에 정확한 가동율 보장은 어렵지만, 기본적으로 Windows Azure가 제공하는 SLA를 기준으로 생각하시면 됩니다.
출처:http://blogs.msdn.com/eva/archive/2009/07/17/azure.aspx
2009년 11월 19일 목요일
DB 복원 (접속자가 있는 상태에서)
alter database selfdb54 set single_user with rollback immediate
---------------첫번째 풀백업 복원 Disk 위치 도 변경------------------
RESTORE DATABASE selfdb54 FROM DISK = 'E:\DBBackup\selfdb54\selftdb54_db_20091117.dmp'WITH MOVE 'selfdb54_sys' To 'E:\SQLData\selfdb54\selfdb54_sys.mdf',MOVE 'selfdb54_data1' To 'E:\SQLData\selfdb54\selfdb54_data1.ndf',MOVE 'selfdb54_log' To 'E:\SQLData\selfdb54\selfdb54_log.ldf',FILE =1, NORECOVERY , REPLACE
---------------두번째 증분백업 복원 변경------------------
RESTORE DATABASE selfdb54 FROM DISK = 'E:\DBBackup\selfdb54\selfdb54_200911201132.dif'WITH RECOVERY
---------------이용자 접속 가능하게------------------
alter database selfdb54 set multi_user with rollback immediate
범위 지정 복구 관련 옵션- StopAt : 복원 시점을 시간으로 지정
Restore Database DB이름 From Disk='경로\파일명.bak'StopAt = '2001-11-19 01:09' --2001년 11월 19일 1시 9분 데이터까지 복원
파일 리스트 확인
Restore FileListOnly from Disk ='E:\ContentMaster_200911251720.dmp'
백업 기본 샘플
-- 2) 여러 파일 그룹을 갖는 Sample 데이터베이스 만들기
USE Master
GO
CREATE DATABASE Sample
ON PRIMARY (
NAME = 'Sample', FILENAME = 'C:\Data\Sample.mdf'),
FILEGROUP FG01(
NAME = 'Sample_01', FILENAME = 'C:\Data\Sample_01.ndf'),
FILEGROUP FG02(
NAME = 'Sample_02', FILENAME = 'C:\Data\Sample_02.ndf'),
FILEGROUP FG03(
NAME = 'Sample_03', FILENAME = 'C:\Data\Sample_03.ndf')
LOG ON (
NAME = 'Sample_log', FILENAME = 'C:\Data\Sample_log.ldf')
GO
-- 3) 각각의 파일 그룹에 테이블 만들기
USE Sample
GO
CREATE TABLE T1 (
col1 int,
col2 int
) ON FG01
CREATE TABLE T2 (
col1 int,
col2 int
) ON FG02
CREATE TABLE T3 (
col1 int,
col2 int
) ON FG03
-- 4) 전체 백업
BACKUP DATABASE Sample
TO DISK = 'C:\Backup\Sample_Full.bak'
WITH INIT -- 처음엔 생략 가능(반복 학습을 위해 포함시킴)
GO
-- 5) 데이터 추가 #1
INSERT INTO T1 VALUES (1, 10)
INSERT INTO T2 VALUES (1, 10)
INSERT INTO T3 VALUES (1, 10)
GO
-- 6) 트랜잭션 로그 백업
BACKUP LOG Sample
TO DISK = 'C:\Backup\Sample_Log.bak'
WITH INIT -- 처음엔 생략 가능
GO
-- 7) 데이터 추가 #2
INSERT INTO T1 VALUES (2, 20)
INSERT INTO T2 VALUES (2, 20)
INSERT INTO T3 VALUES (2, 20)
GO
-- 8) 서비스 종료 후 Sample_02 제거 후 재 시작
-- 9) Sample 데이터베이스 접근 시도시 에러 발생
-- 다음 에러는 세션이 끊어져 발생하는 것이므로 무시하고 다시 시도하면 됨
-- 메시지 233, 수준 20, 상태 0, 줄 0
-- 서버로 요청을 보내는 동안 전송 수준 오류가 발생했습니다.
-- (provider: 공유 메모리 공급자, error: 0 - 파이프의 다른 끝에 프로세스가 없습니다.)
USE Sample
GO
-- 메시지 945, 수준 14, 상태 2, 줄 1
-- 파일에 액세스할 수 없거나 메모리 또는 디스크 공간이 부족하여
-- 데이터베이스 'Sample'을(를) 열 수 없습니다.
-- 자세한 내용은 SQL Server 오류 로그를 참조하십시오.
-- 10) Sample_02 파일 오프라인 시키기
-- 이렇게 한 후 서비스 재시작 하면 나머지 파일의 테이블은 사용가능 해짐
ALTER DATABASE Sample
MODIFY FILE (NAME = 'Sample_02', OFFLINE)
GO
-- 11) 서비스 재시작
-- 12) Sample 데이터베이스 접근 가능 확인
USE Sample
GO
SELECT * FROM T1 -- 정상
GO
SELECT * FROM T2 -- 에러
GO
SELECT * FROM T3 -- 정상
GO
-- 13) T2 테이블이 포함된 Sample_02 파일 살리기
-- a) 로그 꼬리 백업
-- 데이터 추가#2 부분에서 추가된 데이터의 백업이 없으므로 필수적으로 로그 꼬리 백업 필요
USE Master
GO
BACKUP LOG Sample
TO DISK = 'C:\Backup\Sample_Tail_Log.bak'
WITH INIT -- 처음엔 생략 가능
GO
-- b) 전체 백업에서 파일 복원
RESTORE DATABASE Sample
FILE = 'Sample_02'
FROM DISK = 'C:\Backup\Sample_Full.bak'
WITH NORECOVERY -- 이어서 복원할 내용이 있으므로 NORECOVERY 옵션
GO
-- c) T1, T3 테이블은 여전히 사용 가능한 상태
USE Sample
GO
SELECT * FROM T1
SELECT * FROM T3
-- d) 데이터 추가도 가능
INSERT INTO T1 VALUES(3, 30)
INSERT INTO T3 VALUES(3, 30)
GO
-- e) 로그 복원
USE Master
GO
RESTORE LOG Sample
FROM DISK = 'C:\Backup\Sample_Log.bak'
WITH NORECOVERY -- 이어서 복원할 내용이 있으므로 NORECOVERY 옵션
GO
RESTORE LOG Sample
FROM DISK = 'C:\Backup\Sample_Tail_Log.bak'
WITH RECOVERY -- 마지막 복원 과정이므로 RECOVERY 옵션
GO
-- 14) 복원 결과 최종 확인
USE Sample
GO
SELECT * FROM T1 -- 정상
GO
SELECT * FROM T2 -- 정상
GO
SELECT * FROM T3 -- 정상
GO
-- 15) 정리
USE Master
GO
DROP DATABASE Sample
GO
-- 윈도우즈 탐색기에서 C:\Data 폴더 및 C:\Backup 폴더 삭제
-- 16) 수고하셨습니다^^
원격에서 터미널서비스 세션끊기
2. 원격 서버의 연결된 터미널서비스 세션 확인C:\>query session /server:IP
3. 연결된 해당 세션 끊기C:\>tsdiscon 2 /server:IP
2009년 11월 18일 수요일
DB 계정 및 암호를 전송
요약
새 서버로 데이터베이스를 이동한 후 사용자가 새 서버에서 로그인하지 못할 수 있으며 다음과 같은 오류 메시지가 나타납니다.
메시지 18456, 수준 16, 상태 1 '%ls' 사용자가 로그인하지 못했습니다.
새 서버로 로그인과 암호를 전송해야 합니다. 이 문서에서는 새 서버로 로그인과 암호를 전송하는 방법을 설명합니다.
SQL Server 7.0을 실행하는 서버 간에 로그인 및 암호를 전송하는 방법
SQL Server 7.0 DTS(데이터 변환 서비스) 개체 전송 기능을 사용하면 두 서버 간에 로그인 및 사용자를 전송할 수 있지만 SQL Server의 인증된 로그인에 대한 암호는 전송할 수 없습니다. SQL Server 7.0을 실행하는 한 서버에서 SQL Server 7.0을 실행하는 다른 서버로 로그인과 암호를 전송하려면 "서로 다른 버전의 SQL Server 간에 로그인 및 암호를 전송하는 방법" 절에 나와 있는 단계를 수행하십시오.
SQL Server 7.0에서 SQL Server 2000으로 또는 SQL Server 2000을 실행하는 서버 간에 로그인 및 암호를 전송하는 방법
SQL Server 7.0 서버에서 SQL Server 2000 인스턴스로 또는 두 SQL Server 2000 인스턴스 간에 로그인과 암호를 전송하려면 SQL Server 2000에서 새로운 DTS 패키지 로그인 전송 작업을 사용하면 됩니다. 이렇게 하려면 다음과 같이 하십시오.
1. SQL Server 2000 대상 서버에 연결하여 SQL SQL Server 엔터프라이즈 관리자에서 데이터 변환 서비스로 이동하고 폴더를 확장한 다음 로컬 패키지를 마우스 오른쪽 단추로 누르고 새 패키지를 누릅니다.
2. DTS 패키지 디자이너가 열리면 작업 메뉴에서 로그인 전송 작업을 누릅니다. 원본, 대상 및 로그인 탭에 대한 정보를 적절하게 완성합니다. 중요 SQL Server 2000 대상 서버에서는 64비트 버전의 SQL Server 2000을 실행할 수 없습니다. 64비트 버전의 SQL Server 2000용 DTS 구성 요소를 사용할 수 없습니다. 다른 컴퓨터에 있는 SQL Server 인스턴스에서 로그인을 가져오는 경우 이 작업을 완료하려면 사용자 컴퓨터에 있는 SQL Server 인스턴스가 도메인 계정에서 실행되어야 합니다. 참고 DTS 방법을 사용하면 암호를 전송할 수 있지만 원본 SID는 전송할 수 없습니다. 로그인이 원본 SID를 사용하여 만들어지지 않은 경우 사용자 데이터베이스도 새 서버로 전송되면 데이터베이스 사용자가 로그인에서 분리됩니다. 원본 SID를 전송하고 분리된 사용자를 방지하려면 "서로 다른 버전의 SQL Server 간에 로그인 및 암호를 전송하는 방법" 절에 나와 있는 단계를 수행하십시오.
SQL Server 2005 인스턴스 간에 로그인 및 암호를 전송하는 방법
SQL Server 2005 인스턴스 간에 로그인 및 암호를 전송하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
918992 (http://support.microsoft.com/kb/918992/) SQL Server 2005 인스턴스 간에 로그인 및 암호를 전송하는 방법
서로 다른 버전의 SQL Server 간에 로그인 및 암호를 전송하는 방법
이 방법은 다음과 같은 경우에 적용됩니다. 참고 다음 단계에 대한 중요한 정보는 이 문서의 끝에 나오는 비고를 참조하십시오.서로 다른 버전의 SQL Server 간에 로그인 및 암호를 전송하려면 다음과 같이 하십시오.
1.
USE masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256), @hexvalue varchar (514) OUTPUTASDECLARE @charvalue varchar (514)DECLARE @i intDECLARE @length intDECLARE @hexstring char(16)SELECT @charvalue = '0x'SELECT @i = 1SELECT @length = DATALENGTH (@binvalue)SELECT @hexstring = '0123456789ABCDEF'WHILE (@i <= @length)BEGIN DECLARE @tempint int DECLARE @firstint int DECLARE @secondint int SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1)) SELECT @firstint = FLOOR(@tempint/16) SELECT @secondint = @tempint - (@firstint*16) SELECT @charvalue = @charvalue + SUBSTRING(@hexstring, @firstint+1, 1) + SUBSTRING(@hexstring, @secondint+1, 1) SELECT @i = @i + 1ENDSELECT @hexvalue = @charvalueGO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL DROP PROCEDURE sp_help_revloginGOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name sysnameDECLARE @type varchar (1)DECLARE @hasaccess intDECLARE @denylogin intDECLARE @is_disabled intDECLARE @PWD_varbinary varbinary (256)DECLARE @PWD_string varchar (514)DECLARE @SID_varbinary varbinary (85)DECLARE @SID_string varchar (514)DECLARE @tmpstr varchar (1024)DECLARE @is_policy_checked varchar (3)DECLARE @is_expiration_checked varchar (3)DECLARE @defaultdb sysname IF (@login_name IS NULL) DECLARE login_curs CURSOR FOR SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'ELSE DECLARE login_curs CURSOR FOR SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_nameOPEN login_cursFETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denyloginIF (@@fetch_status = -1)BEGIN PRINT 'No login(s) found.' CLOSE login_curs DEALLOCATE login_curs RETURN -1ENDSET @tmpstr = '/* sp_help_revlogin script 'PRINT @tmpstrSET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'PRINT @tmpstrPRINT ''WHILE (@@fetch_status <> -1)BEGIN IF (@@fetch_status <> -2) BEGIN PRINT '' SET @tmpstr = '-- Login: ' + @name PRINT @tmpstr IF (@type IN ( 'G', 'U')) BEGIN -- NT authenticated account/group SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']' END ELSE BEGIN -- SQL Server authentication -- obtain password and sid SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) ) EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT -- obtain password policy state SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']' IF ( @is_policy_checked IS NOT NULL ) BEGIN SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked END IF ( @is_expiration_checked IS NOT NULL ) BEGIN SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked END END IF (@denylogin = 1) BEGIN -- login is denied access SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name ) END ELSE IF (@hasaccess = 0) BEGIN -- login exists but does not have access SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name ) END IF (@is_disabled = 1) BEGIN -- login is disabled SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE' END PRINT @tmpstr END FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO
2.
sp_help_revlogin 저장 프로시저를 만든 다음 원본 서버의 쿼리 분석기에서 sp_help_revlogin 프로시저를 실행합니다. sp_help_revlogin 저장 프로시저는 SQL Server 7.0과 SQL Server 2000에서 모두 사용할 수 있습니다. sp_help_revlogin 저장 프로시저의 출력은 원본 SID와 암호를 사용하여 로그인을 만드는 로그인 스크립트입니다. 출력을 저장한 다음 대상 SQL Server의 쿼리 분석기에 붙여 넣고 실행하십시오. 예를 들면 다음과 같습니다.EXEC master..sp_help_revlogin
참고) http://support.microsoft.com/kb/918992/
2009년 11월 17일 화요일
계정 매핑 스크립트
Exec Sp_change_users_login ‘Update_One’ , ’db_계정’ , ‘로그인 계정’
보통 db 계정 , 로그인 계정은 동일합니다.


