'sql2005'에 해당되는 글 78건

  1. 2007.09.22 ASP 속도 개선법
  2. 2007.09.22 Ms-Sql DB연결방법(ODBC,OLEDB) 1
  3. 2007.09.22 Ms-Sql 특정 시점으로 데이터베이스 복구하기
  4. 2007.09.22 Ms-Sql sa패스워드를 분실했을때 복구하는 방법
  5. 2007.09.22 Query Analyzer 에서 256 문자 이상은 잘려 출력될때
  6. 2007.09.22 windows 2000 server에서 패킷 사용량 확인방법
  7. 2007.09.22 Windows 2000 AD 계정 백업 및 복원 하는 방법
  8. 2007.09.22 윈도우 단축키모음
  9. 2007.09.22 Ms-Sql 하드디스크가 부족하여 DB를 옮길때
  10. 2007.09.22 Ms-Sql 쿼리명령어 모음
  11. 2007.09.22 Ms-Sql DB명 변경하기
  12. 2007.09.22 Ms-Sql 데이터베이스의 물리적인 위치를 변경시키는 다양한 방법
  13. 2007.09.22 Ms-Sql 설치오류시 SQL Server를 수동으로 제거 하는 방법
  14. 2007.09.22 Ms-Sql 컴퓨터 이름 변경 후 SQL Server가 시작되지 않는 현상
  15. 2007.09.22 *.bak파일로 된 백업파일 리스토어시키는 방법입니다.
  16. 2007.09.22 Ms-Sql의 mdf , ldf 파일을 복사하는 방법
  17. 2007.09.22 Ms-Sql mdf 화일과 ldf 파일의 분리와 연결 복구하기
  18. 2007.09.21 Ms-Sql SQL 서버간에 로그인 정보(사용자 정보) 옮기기
  19. 2007.09.21 Userdump.exe 도구를 사용하여 덤프 파일을 만드는 방법
  20. 2007.09.21 Ms-Sql 데드락(DeadLock)의 방지
  21. 2007.09.21 Ms-Sql 백업파일 안에 들어 있는 MDF, LDF 이상 확인법
  22. 2007.09.21 Windows 2000 레지스트리에서 이용자와 소속 바꾸기
  23. 2007.09.21 Windows 서비스에서 사용되는 TCP/IP 포트(Port)
  24. 2007.09.21 Windows 2000 예약 리부팅하기
  25. 2007.09.21 Ms-Sql SQL 서버 CPU 사용 모니터링 방법
  26. 2007.09.21 Windows 2000 명령창(cmd)에서 터미널서비스 접속자 연결끊기
  27. 2007.09.20 Windows 2003 "라이센스를 제공할 터미널서버 라이센스서버가 없으므로 원격 연결이 끊어졌습니다"
  28. 2007.09.20 Ms-Sql 웹서버를 독립서버로 이전후 OLEDB연결이 안될때
  29. 2007.09.20 Ms-Sql 정상적으로 분리되지않은 MDF파일만으로 DB복구하기
  30. 2007.09.20 도스창(MS-DOS)창에서 nslookup 이용하기

ASP 속도 개선법

Windows2003 2007. 9. 22. 14:15
*Response.Redirect 대신 Sever.Transfer를 사용하라

Response.Redirect는 Sever에서 브라우저에 요청 후 Sever로 돌아오나. Sever.Transfer는 Server내부에서 처리됩니다.

*Directory URL에 후행 슬러시 사용

후행 슬래시를 생략하면 브라우저는 서버에 요청하여 디렉터리를 요구하고 있다는 응답을 받습니다. 그러면 브라우저는 URL에 슬래시를 첨가하여 두번째 요청을 하며 이때서야 서버가 그 디렉터리에 대한 기본 문서로 응답합니다.

*Sever 변수사용금지

서버 변수에 액세스하면 웹 사이트가 서버에 특별한 요청을 하게 되어 요청한 것만이 아니라 모든 서버 변수를 수집하게 됩니다. 속도가 저하됨
ex : < Response.Write(“Data”)>

*< OBJECT> Tag를 사용하라

Server.CreateObject는 즉시 개체를 만듭니다. 이 개체를 나중에 사용하지 않는다면 결국 리소스를 낭비하는 것입니다. < object id=objname> 태그는 objname을 선언하지만 이 개체의 메서드 또는 속성 중 하나가 처음 사용될 때까지 objname은 실제로 만들어지지 않습니다.
Ex : < OBJECT runat=server progid=ADODB.Connection id=dbcon> < /OBJECT>

*일괄 처리 인라인 스크립트 및 Response.Write 문

응답버퍼링을 켜지 않으면 이 문(statement)이 여러 작은 패킷으로 네트워크를 통해 브라우저로 데이터를 쓰게 됩니다. 이 과정은 매우 느립니다. 작은 양의 스크립트 및 HTML을 여기 저기 배치하면 스크립트 엔진과 HTML간의 전환이 일어나서 성능이 떨어집니다. 가깝게 모여있는 인라인 식(expression)을 Response.Write를 한 번 호출하는 것으로 교체합니다. 특히 게시판과 같이 Until 문을 사용할 때 사용하시면 좋은 효과를 보것입니다.
Ex)
< table>
< % For Each fld in rs.Fields %>
< th>< % = fld.Name %>< /th>
< %
Next
While Not rs.EOF
%>
< tr>
< % For Each fld in rs.Fields %>
< td>< % = fld.Value %>< /td>
< % Next
< /tr>
< % rs.MoveNext
Wend %>
< /table>
아래에 있는 더 효율적인 코드는 행마다 응답 스트림에 쓰기가 하나 있습니다. 모든 코드는 하나의 VBScript 블록에 포함됩니다.
< table>
< %
For each fld in rs.Fields
Response.Write ("< th>" & fld.Name & "< /th>" & vbCrLf)
Next
While Not rs.EOF
Response.Write ("< tr>")
For Each fld in rs.Fields %>
Response.Write("< td>" & fld.Value & "< /td>" & vbCrLf)
Next
Response.Write "< /tr>"
End
%>< /table>


*세션 개체의 현명한 사용

ASP는 자동으로 웹 서버에 접근하는 모든 사용자를 위한 세션을 작성합니다. 각 세션은 약 10 KB의 메모리 오버헤드(세션에 저장된 모든 데이터의 상단에 있는)를 갖고 있어서 모든 요청을 약간 늦춥니다. 세션은 구성할 수 있는 시간 제한 기간동안 유효하며 이 제한 시간은 일반적으로 20분입니다.
세션이 필요하지 않은 컨텐츠(도움말 화면, 방문자 영역 등)를 세션이 꺼진 별도의 ASP 응용 프로그램으로 옮길 수 있습니다. 각 페이지를 기초로 해당 페이지에 세션 개체가 필요 없다는 것을 알리기 위해 다음과 같은 지시어를 ASP 페이지 상단에 놓을 수 있습니다.
< % @EnableSessionState=False %>
이 지시어를 사용하게 되는 이유 중 하나는 세션이 프레임셋과 관심있는 문제를 만드는 것입니다. ASP는 언제나 한번에 한 세션에서 하나의 요청만이 실행되도록 보장합니다. 따라서 브라우저가 한 사용자를 위해 여러 페이지를 요청하면 한번에 단지 하나의 ASP 요청만이 세션에 전달되기 때문에 세션 개체에 액세스할 때 멀티스레딩 문제를 방지하지만 모든 페이지는 동시에 페인트되지 않고 차례로 순차적 방법으로 페인트됩니다. 어떤 프레임셋 페이지가 세션에 의지하지 않는 다면 ASP가 @EnableSessionState=False 지시어를 사용하도록 하십시오

Posted by 시스템매니아
,
출처 : http://www.taeyo.pe.kr

★가정을 하자!!

하야시의 컴퓨터는 다음과 같다.

컴퓨터이름 : waglnet

IP :123.123.123.123 (<--IP가 참 특이하죠 ^^; )

OS : WIN2000

DATABASE : SQL2000

DB : blood (sql서버안의 계정. master, model, pubs...등과같은)

SQL ODBC연결명 : bloodwar

사용자 계정 : hahaysh

비밀번호 : 123

CNU(클라이언트유틸러티셋팅) : starcraft

엑세스 파일명 : asp.mdb

엑세스파일경로 : c:\asp\asp.mdb

엑세스파일 ODBC연결명 : asp




▷ SQL서버 : ODBC 연결방법

이방법은 ODBC 설정없이도 ODBC를 통한 접근을 가능하게 만들어준다.

Driver= {SQL Server}; Server=(컴퓨터이름)혹은(IP)혹은(CNU셋팅명);Database=디비이름; UID=아이디; PWD=비밀번호

※위의 CNU는 클라이언트 네트워크 유틸리티의 약자이다.

예)

첫 번째 : ODBC이용

Driver={SQL Server}; Server=bloodwar;Database=blood; UID=hahaysh; PWD=123

두 번째 : 컴퓨터이름이용

Driver={SQL Server}; Server=waglnet;Database=blood; UID=hahaysh; PWD=123

세 번째 : IP이용

Driver={SQL Server}; Server=123.123.123.123;Database=blood; UID=hahaysh; PWD=123

네 번째 : CNU셋팅이용

Driver={SQL Server}; Server=starcraft;Database=blood; UID=hahaysh; PWD=123

예제:

아래의 예제가 실제 사용할 수 있는 예제인데... 우리는 디비연결하는 부분만 알아보기로 했기 때문에... 잡다한(?)것들은 뺀상태로 디비연결하는 부분만 따로 그밑에 소스에서 정리를 하였다. 혼동하지 않도록 하자.

<object runat=server progid=adodb.command id=cm></object>
<object runat=server progid=adodb.connection id=db></object>
<object runat=server progid=adodb.recordset id=rs></object>
<% '이소스가 실제를 쓰는 소스일 것이다.
db.open "Driver={SQL Server}; Server=waglnet;Database=blood; UID=zerg; PWD=zerg"
function nullcheck(a)
if trim(a)="" then
%>
<script language="javascript">
alert("\n빈값이 있습니다.!!")
history.back();
</script>
<% response.end
else
nullcheck=replace(trim(a),"'","''")
end if
end function
function htmlcheck(b)
htmlcheck=server.htmlencode(b)
end function
%>


원래 하야시는 디비연결을 해주는 인클루드파일에 recordset개체와 command개체를 생성시켜두는 방법을 쓴다. 하지만 밑의 예제에서 뺐다. 이점도 유의 하기 바란다.

DNS이용 ODBC연결법 첫번째

<object runat=server progid=adodb.connection id=db></object>

<% 'ODBC설정이 선수되어야 한다. ODBC연결명으로

db.open "dsn=bloodwar;uid=hahaysh;pwd=123"

%>


DNS없이 ODBC연결법 두번째

<object runat=server progid=adodb.connection id=db></object>

<% 'ODBC설정이 필요없다. IP로

db.open "Driver={SQL Server}; Server=123.123.123.123;Database=blood; UID=hahaysh; PWD=123"

%>


DNS없이 ODBC연결법 세번째

<object runat=server progid=adodb.connection id=db></object>

<% 'ODBC설정이 필요없다. 컴퓨터이름으로

db.open "Driver={SQL Server}; Server=waglnet;Database=blood; UID=hahaysh; PWD=123"

%>


DNS없이 ODBC연결법 네번째

<object runat=server progid=adodb.connection id=db></object>

<% 'ODBC설정이 필요없다. CNU설정으로

db.open "Driver={SQL Server}; Server=starcraft;Database=blood; UID=hahaysh; PWD=123"

%>






▷ SQL서버 : OLE DB 접근 방법

Provider=SQLOLEDB; Data Source=컴퓨터이름혹은IP혹은CNU설정명;Initial Catalog= ;디비이름; User id= 아이디;password= 비밀번호

예:

첫 번째: 컴퓨터이름으로

Provider= SQLOLEDB;Data Source=waglnet;Initial Catalog= blood;User id= hahaysh; password=123

두 번째: IP이름으로

Provider= SQLOLEDB;Data Source=123.123.123.123;Initial Catalog= blood;User id= hahaysh; password=123

세 번째: CNU셋팅으로

Provider= SQLOLEDB;Data Source=starcraft;Initial Catalog= blood;User id= hahaysh; password=123



OLE DB 직접 접근 방법 첫번째

<object runat=server progid=adodb.connection id=db></object>

<% '컴퓨터이름으로

db.open "Provider= SQLOLEDB;Data Source=waglnet;”&_
“Initial Catalog= blood;User id= hahaysh; password=123"

%>


OLE DB 직접 접근 방법 두번째

<object runat=server progid=adodb.connection id=db></object>

<% ' IP로

db.open "Provider= SQLOLEDB;Data Source=123.123.123.123;”&_
”Initial Catalog= blood;User id= hahaysh; password=123"

%>


OLE DB 직접 접근 방법 세번째

<object runat=server progid=adodb.connection id=db></object>

<% 'CNU연결명으로

db.open "Provider= SQLOLEDB;Data Source=starcraft;”&_
”Initial Catalog= blood;User id= hahaysh; password=123"

%>




▷ Ms-Access OLE DB 직접접근 방법

Provider=Microsoft.Jet.OLEDB.4.0;Data Source= 엑세스파일의 물리경로

예:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\asp\asp.mdb

OLE DB 직접 접근 방법

<object runat=server progid=adodb.connection id=db></object>

<% 'CNU연결명으로

db.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\asp\asp.mdb"

%>




위의 내용을 하나의 파일로 정리를 해보았다. 참고하도록 하자.

별로 의미가 없는거기는 하지만... 한번 봐두록 하자.

도움이 되리라 생각을 한다.

<object runat=server progid=adodb.connection id=db></object>

<%

밑에꺼 중에서 하나를 쓰면 될것이다.!!

db.open "dsn=bloodwar;uid=hahaysh;pwd=123"

db.open "Driver={SQL Server}; Server=123.123.123.123;Database=blood; UID=hahaysh; PWD=123"

db.open "Driver={SQL Server}; Server=waglnet;Database=blood; UID=hahaysh; PWD=123"

db.open "Driver={SQL Server}; Server=starcraft;Database=blood; UID=hahaysh; PWD=123"

db.open "Provider=SQLOLEDB;Data Source=waglnet;Initial Catalog=blood;User id=hahaysh; password=123"

db.open "Provider=SQLOLEDB;Data Source=123.123.123.123;Initial Catalog=blood;User id=hahaysh; password=123"

db.open "Provider=SQLOLEDB;Data Source=starcraft;Initial Catalog=blood;User id=hahaysh; password=123"

db.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\asp\asp.mdb

db.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\asp\asp.mdb"

%>




※아래의 OLEDB에대해 너무나 깜찍하게 정리를 해주신 태오님의 멘트를 같이 올린다.

더욱 자세한 사항은 태오님의 사이트를 방문해서 자세히 보도록 하자.

그럴리는 없겠지만, 혹시나해서 태오님의 사이트주소를 같이 올린다.

자주 들러 태오님의 내공을 흡입해보도록 하자.!!

http://www.taeyo.pe.kr

잠깐 !! 잘 모르겠는디요. ADO, ODBC, OLEDB 뭐가 무엇을 하는것이죠?

그렇습니다. 분명 혼란함을 느끼시는 분들이 있을 것입니다.
이 즈음에서 간단하게만 정리하고 계속나아가고자 하는데요.
ADO는 데이터를 다루는 개체이며, ODBC, OLEDB는 데이터의 제공자격입니다.
무슨 말인지 잘 이해가 안 된다면 다음 예를 보도록 하세요. (이것은 단지 예일 뿐이기는 합니다)

우리에게는 동시통역기가 하나있다고 가정해 봅시다요.
이를 동작시키면 외국말들이 자동으로 알아들을 수 있게 나온다고 가정합니다.
또한, 우리가 이야기하면 자동으로 번역해서 말을 전해주기도 하고 말이죠.
대신에 그러한 기능을 사용하기 위해서는 그 통역기에는 통역하고픈 각각의 나라용 칩을
기계에 추가해 주어야 합니다.

기본적으로 미국, 러시아, 일본의 칩은 제공된다고 가정합시다.
이제 외국사람들을 만나는 것은 겁나지 않을 것입니다.
만나면 즉시 이 자동통역기를 동작시키면 되니 말이죠. 하하.. 이젠 외제를 만나도 걱정없을 검다...
그런데, 갑작스럽게 남아프리카 사람을 만나게 되었습니다. 이 때도 걱정이 없슴다.
남아프리카용 통역 칩을 사서 기계에 장착하면 되니 말이죠. 돈만 있으면... 하하

이 동시통역기가 바로 ADO라고 볼 수 있으며, 각 나라용 칩은 ODBC 라고 볼 수 있습니다.
그리고 각각의 외국인들은 데이터베이스들이라고 볼 수 있고 말이죠. 이해가 가시죠?

그런 어느날, 기존의 통역기능을 좀 더 효과적으로 사용할 수 있으면서도,
동물의 언어까지도 통역이 가능한 기술이 개발되었으니 그것이 바로 OLEDB 기술이라
하더라는 말씀입니다.

주의할 것은 이렇게 원본 데이터를 우리가 사용할 수 있게 제공해주는 역할을 하는 것이
ODBC, OLEDB 기술이구요. 이렇게 제공받은 데이터를 처리하는 기술이 ADO라는 것.

어때요? 쏙쏙 들어오죠???

Posted by 시스템매니아
,
출처 : http://www.sqlworld.pe.kr

데이터베이스를 사용하다보면 잘못된 트랙젠션으로 인하여 그 이전의 상태로 복구해야 하는 필요성을 느끼게 되는 경우가 있습니다. 예를 들어 잘못해서 테이블을 전부 지워버린 경우 그 이전 상태로 복구하거나 아니면 수작업으로 입력해야 합니다.

로그 백업을 이용하여 특정 시점으로 데이터베이스를 복구하는 방법을 살펴보도록 하겠습니다.


가끔 이런 질문을 받습니다.

"큰일 났어요. 잘못해서 테이블을 다 지워버렸거든요. 이거 복구하지 못하면 저 짤려요. 제발 살려주세요.."

저도 위와 같은 경우를 경험한 적이 있었습니다. 분명히 SELECT를 하려는 생각으로 쿼리문을 날렸는데 아뿔사, 제가 수행한 쿼리문은 SELECT 문이 아니고 DELETE 문이었습니다. 참으로 황당하더군요.

SQL 서버에서는 트랜잭션 로그 백업을 이용하여 특정 시점으로 데이터베이스를 복구하는 방법이 있습니다. 위와 같이 테이블을 전부 지워버렸으면 지우기 바로 이전 상태로 복구하면 모든 문제는 해결이 됩니다. 물론 이와 같은 복구 작업이 항상 가능한 것은 아닙니다. 다음과 같은 조건이 만족된 상태여야 합니다.

① 데이터베이스 백업모델이 "최대" 여야 합니다.
② 전체 백업을 받은 상태여야 합니다.
③ 이전의 로그백업이 있다면 안전하게 보관된 상태여야 합니다.

지금 부터의 복구 예제는 다음과 같은 순서로 이루어 집니다.

o 예제 테이블 만들기
o 테이블에 5개의 레코드 추가
o 데이터베이스 전체 백업
o 테이블에 5개의 레코드 추가
o 데이터베이스 로그 백업
o 테이블에 5개의 레코드 추가
o 테이블 삭제 (문제발생)
o 현 시점의 로그 백업
o 전체백업 Restore
o 기존 로그 백업 Restore
o 문제 발생후 백업 받은 로그 Restore(테이블을 지우기 전까지만)

단, 예제에 사용되는 sqlworld 데이터베이스의 복구모델은 "최대" 입니다.

1) 데이터베이스 전체 백업

우선 Test1 이라는 예제 테이블을 만들고 레코드 5개를 추가하도록 하겠습니다.


CREATE TABLE Test1
(
col1 int,
col2 char(05)
)
GO
INSERT INTO Test1 VALUES(1,'AAAAA')
INSERT INTO Test1 VALUES(2,'BBBBB')
INSERT INTO Test1 VALUES(3,'CCCCC')
INSERT INTO Test1 VALUES(4,'DDDDD')
INSERT INTO Test1 VALUES(5,'EEEEE')


이제 지금 상태의 sqlworld 데이터베이스를 전체 백업 받도록 하겠습니다.


BACKUP DATABASE sqlworld TO DISK = 'D:\sqlworld.bak'

위 전체 백업으로 인해 우리는 어떤 사태가 발생하더라도 Test1 테이블에 5개의 레코드가 추가된 상태로 복구를 할 수 있습니다.(당연하죠)

2) 로그백업

이제Test1 테이블에 레코드를 5개 더 추가하도록 하겠습니다.


INSERT INTO Test1 VALUES(6,'FFFFF')
INSERT INTO Test1 VALUES(7,'GGGGG')
INSERT INTO Test1 VALUES(8,'HHHHH')
INSERT INTO Test1 VALUES(9,'IIIII')
INSERT INTO Test1 VALUES(10,'JJJJJ')

앞에서 전체 백업을 받은 상태이므로 이제는 방금 작업한(5개의 레코드 추가) 트랜잭션만을 보관하도록 로그 백업을 받도록 하겠습니다. (물론 지금 같은 경우는 예제이므로 데이터량이 많지 않아 전체 백업을 다시 받아도 되지만 실무에서는 전체 데이터베이스 양이 엄청 큰 경우라면 로그 백업을 받는게 더 효율적일 수 있습니다.)


BACKUP LOG sqlworld TO DIsk = 'D:\sqlworld_log.bak'

만일 이 상태에서 데이터베이스에 문제가 발생하여 복구를 해야 하는 경우는 처음에 받은 전체 백업을 Restore 한 후에 뒤에 받은 로그 백업을 Restore 하면 됩니다. 여기 까지는 누구나 다 아는 사실입니다.

3) 사태발생

이제Test1 테이블에 레코드를 5개 더 추가하도록 하겠습니다.


INSERT INTO Test1 VALUES(11,'KKKKK')
INSERT INTO Test1 VALUES(12,'LLLLL')
INSERT INTO Test1 VALUES(13,'MMMMM')
INSERT INTO Test1 VALUES(14,'NNNNN')
INSERT INTO Test1 VALUES(15,'OOOOO')

자! 지금까지는 일반적인 작업이 순조롭게 진행이 되고 있는 상태임을 볼 수 있습니다.

그런데 제가 잘못해서 이 상태에서 다음과 같은 퀴리문을 이용하여 Test1 테이블을 전부 삭제 해 버렸습니다. 이 때의 시간이 2001-11-19 1:10AM 입니다.


DELETE FROM Test1

큰일 났습니다!
엄청난(?) 양의 Test1 테이블이 전부 지워져 버렸습니다!

4) 복구하기

이제 해야 할 일은 Test1 테이블을 지우기전 즉 15개의 레코드가 존재하는 상태로 복구하는 것입니다. 다음의 순서를 정확히 기억하시기 바랍니다.

1) 현재 시점의 로그를 NO_TRUNCATE 옵션을 이용하여 백업받기

다음과 같이 NO_TRUNCATE 옵션을 이용하여 현재 상태의 로그를 백업 받습니다.(실무에서는 "모두 작업을 멈추시오!" 라고 외치고 백업 받아야 합니다)


BACKUP LOG sqlworld TO DISK = 'D:\Check.bak' WITH NO_TRUNCATE

2) 전체 백업 Restore

우선 제일 먼저 백업 받은 전체 백업을 Restore해야 합니다. 단 계속해서 추가적인 Restore 작업이 수행되어야 하므로 WITH NORECOVERY 옵션을 이용해야 합니다.


RESTORE DATABASE sqlworld FROM DISK = 'D:\sqlworld.bak' WITH NORECOVERY

이제 처음 레코드 5개가 추가된 상태로는 복구가 되었습니다. 하지만 WITH NORECOVERY를 사용했으므로 아직은 접근할 수 없는 상태입니다.

3) 로그 백업 Restore

전체 백업 후에 5개의 레코드를 추가하고 백업받은 로그가 있습니다. 이것을 WITH NORECOVERY 옵션으로 계속해서 Restore 해야 합니다.


RESTORE LOG sqlworld FROM DISK = 'D:\sqlworld_log.bak' WITH NORECOVERY

이제 처음 레코드 5개를 포함해서 새로 추가된 5개의 레코드 까지는 복구가 된 셈입니다. 하지만 WITH NORECOVERY를 사용했으므로 여전히 접근할 수 없는 상태입니다

4) STOPAT을 이용한 특정 시점까지의 로그 백업 Restore

문제 발생후 백업받은 로그 안에는 새롭게 추가된 5개의 레코드에 대한 작업과 함께 테이블 전체를 지운 작업이 포함되어 있습니다. 여기서 우리는 테이블 전체를 지운 작업 바로 이전까지만 Restore를 하면 됩니다. 이때 사용되는 것이 STOPAT 이라는 옵션입니다.

이 옵션을 이용하여 다음과 같이 테이블 전체를 지웠던 2001-11-19 1:10AM 이전 까지만 Restore 하면 됩니다. 그래서 2001-11-19 01:09 까지만 Restore 하겠습니다.


RESTORE LOG sqlworld FROM DISK = 'D:\Check.bak'
WITH RECOVERY, STOPAT = '2001-11-19 01:09'

그리고 WITH RECOVERY 옵션을 사용한 이유는 Restore가 다 끝났으므로 사용자가 접근 할 수 있게 하기 위함 입니다.

이렇게 해서 우리는 완벽하게 테이블이 지워지기 바로 전까지를 복구 할 수 있었습니다.

5) 정리

위 내용을 직접 수행해서 결과를 확인해보시기 바랍니다. 그렇지 않고 실제 문제가 발생한 경우에 복구 작업을 하려고 하면 안절부절 하게되기 때문입니다. 많은 분들이 백업은 받을 줄 아는데 정작 중요한 복구는 못하는 경우가 있습니다.

물론 복구할 일이 없는데 제일 좋지만 만일의 경우에 대비해서 연습해 두는 것이 좋습니다. 그리고 백업받은 데이터는 안전하게 보관을 하고 있어야 합니다. 아무리 복구 방법을 잘 안다고 해도 백업받은 데이터가 손상이 된 상태라면 아무 의미가 없기 때문입니다.
Posted by 시스템매니아
,
sp_password null, '바꿀SA암호', 'sa'
Posted by 시스템매니아
,
Query Analyzer 를 이용한 데이터 추출 시 256 문자가 넘는 필드 값이 잘려 나오는 경우가 발생할 때
다음과 같이 옵션을 바꾸어 줌으로써 해결할 수 있습니다.

Query Analyzer 를 실행 시킨 후 도구 -> 옵션 -> 결과 탭 에서 "열 당 최대 문자 수" 값을 기본 256에서 원하는 값으로 바꿉니다.
Posted by 시스템매니아
,
관리도구 - 성능 - 카운터 추가 - Network Interface



Packets Recevied/sec

Packets Sent/sec

Packets/sec



필요로 하는 또는 참고해야할 카운터를 추가하고 확인을 누릅니다.



CPU - 작업관리자에서 편하게 보셔도 되고요.



관리도구 - 성능 - 카운터 추가 - Processor

% Processor Time 추가 하고 로그를 보실 수 가 있습니다.

Sysmon 에는 이외에도 많은 카운터들이 있습니다. System 성능 모니터링을 위한

충분한 도구가 될 수 있습니다.

Posted by 시스템매니아
,
출처 : http://www.devpia.com

< ADDUSERS >

[User]

UserName,FullName,Password,comment,HomeDriveAndPath,Profile,Script,

[Global]

GlobalGroupName,Comment,UserName,.....

[Local]

LocalGroupName,Comment,UserName,.....


ADDUSERS {/c|/d{:u}|/e} filename [/t][/s:x] [/?]

[\\computername|domainname][/p:{l|c|e|d}]



- 사용자를 백업하는 방법

예) Addusers /d:u userlist.txt

한글 사용자 부분을 추가 하기위해 /d:u 옵션을 주고 "userlist.txt"으로

백업한다는 뜻입니다.

백업한 파일을 메모장으로 살펴볼 수 있으며 기본적인 문법 규칙에 맞게

수정작업이 가능하며,백업된 자료를 복원을 할 경우 사용자가 추가한 부분에

대해서도 복원이 가능합니다.

- 사용자 복원 방법

예) Addusers /c userlist.txt /p:l /p:c

백업 할 때 작업해 둔 "userlist.txt" 파일을 가지고 복원을 할 때 사용하며

계정이 존재하지 않는 시스템에서 작업해야 하며 자신의 시스템에 작업할

경우에는 현재 존재하는 계정 때문에 복원이 제대로 이루어지지 않을 수

있습니다.


사용자 계정을 추가 할 때 하위 옵션에 대해서도 정의를 해 주어야 하며,추가

옵션 스위치로 처리할 수 있습니다.

[/p:{l|c|e|d}]과 같이 나타나며,"/p:l /p:c"과 같은 문법으로 필요한 내용을

첨가합니다.먼저 데모 장비에서 테스트한 후 작업하는 것이 좋습니다.


다음 로그온할 때 반드시 암호 변경 ( /p:l )

암호 변경 할 수 없음 ( /p:c )

암호 사용 기간 제한 없음 ( /p:e )

계정 사용 안함 ( /p:d )

< CSVDE >

일반 매개 변수

-i 가져오기 모드 사용(기본값은 내보내기)

-f 파일 이름 입력 또는 출력 파일 이름

-s 서버 이름 바인딩 대상 서버(기본값은 로그인된 도메인의 도메인 컨트롤러)

-v 자세한 정보 표시 모드 사용

-c 원본 DN 대상 DN 원본 DN을 대상 DN으로 바꿈

-j 로그 파일 위치

-t 포트 번호(기본값 = 389)

-u 유니코드 형식 사용

-? 도움말

내보내기 특정

-d RootDN LDAP 검색의 루트(기본값은 명명 컨텍스트)

-r 필터 LDAP 검색 필터(기본값은 "(objectClass=*)")

-p SearchScope 검색 범위(Base/OneLevel/Subtree)

-l 목록 LDAP 검색에서 검색될

특성 목록(쉼표 구분)

-o 목록 입력에서 생략될 특성 목록(쉼표 구분)

-g 페이지 검색 안함

-m 내보내기 작업에 SAM 논리법 사용

-n 이진 값 내보내지 않음

- 가져오기

-k : 가져오기 작업에서 '제약 조건 위반' 및 '개체가 이미 있음' 오류를

무시합니다.

- 자격 증명

자격 증명이 지정되지 않은 경우에는 CSVDE가 SSPI를 사용하여 현재 로그온된

사용자로 바인딩합니다.

-a UserDN [암호 | *] 단순 인증

-b UserName 도메인 [암호 | *] SSPI 바인딩 방법

예) 현재 도메인의 단순 가져오기

csvde -i -f INPUT.CSV

예) 현재 도메인의 단순 내보내기

csvde -f OUTPUT.CSV

예) 자격 증명을 사용하여 특정 도메인 내보내기

csvde -m -f OUTPUT.CSV

-b USERNAME DOMAINNAME *

-s SERVERNAME

-d "cn=users,DC=DOMAINNAME,DC=Microsoft,DC=Com"

-r "(objectClass=사용자)"

Posted by 시스템매니아
,
Ctrl 키

+ A : 전체 선택
+ C : 복사 하기
+ V : 붙여넣기
+ S : 저장 (편집기에서 많이 사용됩니다.)
+ P : 프린터
+ X : 잘라내기
+ Z : 되살리기
+ Y : 되살리기 취소
+ D : 삭제 하기
+ Home : 커서위치부터 동일한 줄에 있는 앞으로 모든글 선택
+ End : 커서위치부터 동일한 줄에 있는 뒤로 모든글 선택
+ → 방향키 : 한문단 앞으로 이동
+ ← 방향키 : 한문단 뒤로 이동
+ Esc : 시작버튼 누르기
+ Shift + → 방향키 : 한문단 앞으로 선택
+ Shift + ← 방향키 : 한문단 뒤로 선택
+ Shift + Esc : 작업관리자 실행


WindowKey 키

+ D : 모든창 최소화(원상복귀)
+ M : 모든창 최소화(복귀시 + Shift + M)
+ E : 윈도우탐색기
+ R : 직접실행
+ U : 유틸리티 관리자
+ F : 파일 찾기
+ TAB : 프로그램 이동
+ Ctrl + F : 컴퓨터 찾기
+ Pause Break : 시스템 등록 정보

다음은 문서 편집시 사용되는 윈도우 단축키 입니다.

커서가 있는 위치에서 Shift + End : 커서위치부터 끝까지 선택 하기
커서가 있는 위치에서 Shift + Home : 커서위치부터 앞까지 선택 하기
Shift + Insert : Ctrl + V 와 같은 기능
Shift + Home : 뒤로 한문단 선택하기
Shift + End : 앞으로 한문단 선택하기
Shift + Backspace : 뒤로 한문단 지우기
Shift + Delete : 앞으로 한문단 지우기
Shift + PageUp : 커서위치 부터 위로 50줄 선택
Shift + PageDown : 커서위치 부터 아래로 50줄 선택
Shift + Ctrl + PageUp : 커서위치 부터 위로 모든 글 선택
Shift + Ctrl + PageDown : 커서위치 부터 아래로 모든 글 선택
Shift + Space : 한영전환
Shift + Ctrl + → : 앞으로 한글자씩 선택 하기
Shift + Ctrl + ← : 뒤로 한글자씩 선택 하기


기타 단축키

PrtScnSysRq : 윈도우 전체 화면을 클립보드에 복사
Alt + PrtScnSysRq + 활성화 되있는 프로그램 화면을 클립보드에 복사
Alt + F4 : 프로그램 종료 (윈도우 종료)
Posted by 시스템매니아
,
출처 : http://www.devpia.com

[상황]
1:00 FULL BACKUP완료.
2:00 INSERT TABLE1 VALUES("데이터A")
3:00 INSERT TABLE1 VALUES("데이터B")
4:00 DELETE TABLE1 -- 실수로 데이터를 지움


위의 상황에서 데이터B까지 전부복구하기를 원한다. 하지만, 데이터A와 데이터B는 백업을 해놓지 않아
1:00 FULL BACKUP파일을 복구하여도 데이터A,데이터B는 복구할 수 없다.
그렇다면, 어떻게 데이터를 살릴수 있는 가 ?
1. 로그백업을 수행한다. -- 로그파일에는 4:00까지 모든 작업들이 기록되어 있다.

2. 로그백업한 것을 stopat옵션을 사용하여 특정한 시간을 기준으로 복구한다.
-- 왜냐하면 로그백업한 내용에는 insert작업도 있지만, delete작업도 있다. 따라서, 3:00까지만
데이터를 복구해야만 데이터A,데이터B가 복구된다.


-- stopat을 사용한 T - SQL 참조 --

restore database testdb from testdbback
with norecovery -- 회복프로세서를 시작하지 않는다.
restore log testdb from testdbback
with recovery, stopat ="jan 01,2000 3:00 am"
-- 3:00까지의 데이터를 복구하고,with recovery로 회복프로세서를 시작한다.


-- 주의 사항 --
모든 백업의 시작은 fullbackup이다. 한 번의 fullbackup도 없다면, 로그백업을 하더라도 복구할 수가 없
다. 그리고, 로그가 생성되지 않는 옵션을 설정해 놓았다면, 로그가 없으므로 로그백업은 무의미하다.

Posted by 시스템매니아
,
출처 : http://www.devpia.com
아래의 SQL을 그대로 복사해서 쿼리 어널라이저에서 바로 실행할수 있도록 만들었습니다.
SQL을 잘 만들면 프로그램이 깔끔해집니다.
왜 이렇게 나오는지 곰곰히 생각은 여러분이 해봐야 겠죠.
이번 강좌는 사실 이론보다는 실무위주의 업무로 작성했습니다.
데이터베이스도 제가 만든것이 아닌 MSSQL에 기본적으로 들어 있는 Pubs데이터
베이스를 이용을 했구요.

함수에대한 자세한 설명은 MSDN이나 다른사이트 또는 책을 참조하세요.

-- DB를 선택해 내림차순으로 authors테이블의 데이터를 추출
USE pubs
SELECT *
FROM authors
ORDER BY au_lname ASC, au_fname ASC

-- 테이블명, 소유자, 타입, 만든날짜등 테이블에 관한 모든정보를 가져오는 프로시져
EXEC sp_help "테이블명"
EXEC sp_columns "테이블명"

-- 컬럼 제목바꾸기
SELECT title_id AS Title_No, pub_id AS 출판사번호, price, title FROM titles

-- TSQL 기초
-- 변수의 선언과 값의 설정 DECLARE, SET, SELECT
DECLARE ";@º?嗤?quot; "자료형", ";@º?嗤?quot; "자료형"
SET ";@º?嗤?quot; = 값
SELECT ";@º??quot;

DECLARE @id int, @name varchar(10)
SET @id = 1
SET @name = '조준철'
SELECT @id, @name

-- 사용자변수와 시스템 함수(시스템 변수/전역변수)
-- SQLServer는 정의된 변수만을 전역으로 사용할수 있다.
@@error
@@identity
@@lock_timeout
@@nestlevel
@@rowcount
@@trancount

-- decimal, numeric 숫자유형(차이없음)
-- decimal(precision, scale) 예를들어 (10, 5)의 경우 전체 10자리 숫자중에서
-- 소수점 이하 5자리를 사용할수 있는 의미
decimal[(p, [s])] precision의 범위, 1~38 디폴트 : 18, scale의 범위 1~precision, 디
폴트 : 0

-- SELECT에서의 자료형 바꾸기
--1)
SELECT title_id AS 타이틀넘버
, pub_id AS 출판사번호
, price
, CONVERT(char(30), title) AS 줄인제목
FROM titles
--2)
SELECT title_id AS 타이틀넘버
, pub_id AS 출판사번호
, price
, SUBSTRING(title, 1, 30) AS 줄인제목
FROM titles

-- CONVERT() / CAST()
-- CONVERT()는 자료형을 바꾸는 함수로 다양한용도로 사용한다. 이기능은 SQLServer의
고유
-- 기능이기 때문에 ANSI와 호환되지않는다.
CONVERT (datatype[(length)], expression[, style])
-- style은 날짜함수에서 사용한다.

SELECT CONVERT(int, '32.2')
SELECT CONVERT(int, '32')
SELECT CONVERT(varchar(5), 32.2)
SELECT CONVERT(float, 32)

-- 숫자에 대한 산술적 연산함수(자주 쓰는것만...)
CEILING(numeric_expr) -- 주어진값보다 크거나 같은, 가장작은 정수
FLOOR(numeric_expr) -- 주어진값보다 작거나 같은, 가장큰 정수
RAND(seed) --램덤수
ROUND(numeric_expr, length) --반올림

SELECT title_id, price, FLOOR(price) AS Floor, CEILING(price) AS ceiling, ROUND
(price, )
AS Round FROM titles

-- 문자에 대한 함수(자주 쓰는것만...)
+
CHARINDEX('pattern', expression)
LEFT(character_expression, integer_expression)
LEN(string_expression)
LOWER(char_expression)
LTRIM(char_expression)
PATINDEX('%pattern%', expression)
REPLACE(string_expression, string_expression, string_expression)
REPLICATE(char_expression, integer_expression)
RIGHT(char_expression, integer_expression)
RTRIM(char_expression)
SPACE(integer_expression)
STUFF(char_expression, start, length, char_expression)
SUBSTRING(_expression, start, length)
UPPER(char_expression)

-- 날짜에 대한 함수
SELECT CONVERT(varchar(30), GETDATE(), 9)
SELECT CONVERT(varchar(30), GETDATE(), 2)
SELECT CONVERT(varchar(30), GETDATE(), 102)

-- 조건에 맞는 행 가져오기
SELECT title_id, qty FROM sales WHERE qty >= 20
SELECT title_id, qty FROM sales WHERE title_id = 'bu1032'

-- 비교문 (=, >, <, >=, <=, <>, !=, !>, !<)
-- 정렬
SELECT title_id, qty FROM sales ORDER BY qty ASC
SELECT title_id, qty FROM sales ORDER BY qty DESC

-- 몇 개만 가져오기
SELECT TOP 5 title_id, qty FROM sales

-- 범위
SELECT title_id, qty FROM sales WHERE qty EETWEEN 10 AND 20
SELECT title_id, qty FROM sales WHERE qty >= 10 AND qty <= 20

-- 목록
SELECT title_id, qty FROM sales WHERE title_id IN ('BU1032', 'BU1111', 'MC3021')
SELECT title_id, qty FROM sales WHERE title_id = 'BU1032' OR 'BU1111' OR 'MC3021'

-- 문자열 / LIKE와 패턴 매칭
/*
_(underscore) : 어떤 것이든 한문자가 와야한다.
% : 아무것도 없는 경우를 포함하여 어떤것이든 상관없다.
[] : []안에 있는 글자들
[^] : ^다음에 있는 글자를 제외한 다른것이 와야한다.
book_
book%
%book%
[st]ing
[b-f]ing
M[^c]%
자세한 것은 온라인 설명서 참조
*/
SELECT title_id, title FROM titles WHERE title LIKE '%computer%'
SELECT title_id, title FROM titles WHERE title LIKE 'computer%'
SELECT title_id, title FROM titles WHERE title LIKE 'computer_'

-- PATINDEX는 해당 패턴이 다음 문자열에 있는지 알려준다.
SELECT PATINDEX('%Mi%', 'James Mike')

-- 중복된 행 제거 - DISTINCT
SELECT DISTINCT title_id FROM sales ORDER BY title_id

-- 요약 정보 처리
/*
AVG ([ALL|DISTINCT] expression) 표현식의 전체나 각각의 평균값
COUNT ([ALL|DISTINCT] expression) 표현식의 전체나 각각의 개수
COUNT (*) 선택된 모든행의 개수 주의 NULL값을 계산되지 않는다.
MAX (expression) 표현식에서 가장 큰값
MIN (expression) 표현식에서 가장 작은 값
SUM ([ALL|DISTINCT] expression) 수치 표현식에서 전체나 각각의 합계
*/
SELECT MAX(qty), MIN(qty) FROM sales
SELECT COUNT(*) FROM sales
SELECT COUNT(title_id) FROM sales

-- ISNULL NULL 값을 다른값으로 바꾸기
-- ISNULL (표현식, 널일때의 값)
SELECT AVG(ISNULL(price, 0)) FROM sales

-- GROUP BY / HAVING
SELECT title_id, sum(qty) AS SUMqty FROM sales GROUP BY title_id HAVING SUM(qty)
>= 30
SELECT title_id, sum(qty) AS SUMqty FROM sales GROUP BY ALL title_id

-- COMPUTE / COMPUTE BY
-- 그룹별로 상세 내역과 그룹 합계를 한꺼번에 출력하는 함수
SELECT type, title_id, price FROM titles ORDER BY type COMPUTE avg(price) BY type

-- ROLLUP과 CUBE (표현식은 10개를 넘을수 없다. GROUP BY ALL을 사용할수 없다.)
-- 각 평균과 각 type별 그룹 평균
SELECT type, pub_id, AVG(price)
FROM titles GROUP BY type, pub_id WITH ROLLUP

-- 각 평균과 각 type별 그룹 평균
SELECT type, pub_id, AVG(price)
FROM titles GROUP BY type, pub_id WITH CUBE

-- JOIN (조인)
-- INNER JOIN (두 값을 비교해 일치하는 데이터만을 가져온다.)
SELECT title_ price, pub_name FROM titles, publishers
WHERE titles.pub_id = publishers.pub_id

SELECT title_id price, pub_name FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id

-- OUTER JOIN (어느 한쪽의 데이터를 가져온다.)
SELECT title_id price, pub_name FROM titles LEFT OUTER JOIN publishers
ON titles.pub_id = publishers.pub_id

-- 흐름제어문
/*
BEGIN...END 명령문의 시작 / 끝을 블록화한다.
IF ELSE 조건에 맞는 처리를 한다.
WHILE 조건에 맞는동안 반복한다.
BREAK 가장안쪽의 WHILE반복을 무조건 빠져나간다.
CONTINUE 가장안쪽의 WHILE 반복을 무조건 다시 시작한다.
RETURN 무조건 끝낸다.
GOTO 라벨 무조건 라벨부분으로 건너뛴다.
WAITFOR 지정된만큼 지연을 한다.
CASE 주어진 조건에 따라 다른 처리를 한다.
/**/ 주석처리
-- 주석처리
DECLARE 변수를 정의 한다.
SET(SELECT) 변수를 초기화한다.
EXECUTE 사용자정의 함수, 시스템 프로시저, 사용자정의 저장프로시저, 확장프로시저를
수행한다.
PRINT 주어진 메시지를 출력한다.
RAISERROR 주어진 메시지나 오류번호를 출력한다.
FORMATMESSAGE 정의된 번호의 메시지에서 오류메시지를 만든다.
*/

Posted by 시스템매니아
,

Ms-Sql DB명 변경하기

MS-SQL 2007. 9. 22. 12:20
DB명변경 명령어는 sp_renamedb '현재디비명', '새 디비명' 입니다.

하지만 제약 조건이 있습니다.

먼저 해당하는 DB에 Single user모드가 설정 되어야 합니다.

이를 위해서는

USE master
EXEC sp_dboption '디비명', 'single user', 'true'

하시면 됩니다. 만약 사용자가 있어 수행이 불가하다는 메세지가 나온다면?

sp_who로 누가 해당하는 DB에 붙어 있는지 보시고.. 해당하는 사용자의 spid번호를

기억하신후..

kill spid번호

명령으로 죽이신후 해 보시길 바랍니다.

싱글유져가 되었다면..

sp_renamedb를 수행하시길 바랍니다.

예제
다음은 accounting 데이터베이스의 이름을 financial로 바꾸는 예제입니다.

EXEC sp_renamedb 'accounting', 'financial'

수행후 다시 싱글 유져를 필요에 의해 풀어 주시면 되며

TRUE를 FALSE로만 바꾸신후 다시 수행하시면됩니다.
Posted by 시스템매니아
,
데이터베이스를 물리적인 위치를 변경시키는 다양한 방법

Database를 다른 위치로 이동/복사하고자 하는 경우에 다음의 세 가지 방법을 사용할 수 있다.

-Database Backup을 수행한 다음에 Restore 작업을 수행하면서 이동이 가능하다.
-Database를 detaching하고 Database File들을 원하는 위치로 이동한 다음에 다시 attaching함으로써 이동이 가능하다.
-BCP, DTS를 사용하여 이동이 가능하다.

어떤 방법을 사용할 것인지는, SQL Server 버전, SQL Server가 사용하는 Character Set/Sort Order, Database Size, 운영 여건 등의 여러 가지 요소들을 확인한 다음에 결정해야 한다.

위의 세 가지 방법 중에서 두 번째 방법을 사용하여 데이터베이스를 이동하는 방법에 대해서 자세히 알아보자. 동일한 SQL Server 내에서 Database의 파일 위치를 이동하는 경우에는 관계 없지만, 서로 다른 SQL Server간의 이동을 위해 두 번째 방법을 사용하고자 하는 경우에는, Source Database가 존재하는 SQL Server와 Destination Database가 존재할 SQL Server의 버전이 동일해야 하며 양쪽 SQL Server가 사용하는 Character Set과 Sort Order가 동일해야 한다.

데이터베이스를 분리하고 다시 연결하는 방법

SQL Server 7.0과 2000에서 Database의 위치를 이동하고자 하는 경우에, sp_detach_db와 sp_attach_db를 사용하여 작업하는 것이 가능하다.

이용하기전 온라인 도움말의 sp_detach_d, sp_attach_db 예제 구문을 보면 이해가 쉬울 것이다.

다음과 같이 작업하면 된다.

아래의 예문들은 Database 명이 "userdb" 라고 가정하고 작성된 내용이므로, "userdb" 라고 기술한 위치에 실제 작업할 Database명을 기술하면 된다. 작업에 앞서 기존내용들을 백업한 후 테스트 해보기 바란다.

-작업할 Database file의 위치를 확인한다.
Use userdb
Go
Sp_helpfile
Go

-해당 Database를 SQL Server에서 분리한다. 이 작업을 수행하기 위해서는, 해당 Database를 사용하는 Process가 없어야 한다. 현재 해당 Database를 사용하는 사용자가 있다면, 현재 수행중인 작업들이 종료되기를 기다렸다가 작업하시기 바란다. 그리고, Query Analyzer 등에서, 작업할 Database에 연결한 사용자들이 있다면 모두 그 Database에서 빠져 나가도록 한 다음에 작업을 수행해야 한다. 기다리는 것이 지루하다면 서비스를 잠시 멈췄다가 사용할 수 있다.
sp_detach_db userdb
go

-위의 Scripts를 수행한 다음에 Results창에 다음과 같이 메시지가 나타나는지 확인한다.
Successfully detached Database 'userdb'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

-만약, 작업할 Database를 사용하고 있는 사용자가 있으면, 다음과 같이 에러 메시지가 발생하면서 작업이 중단된다.
Server: Msg 3702, Level 16, State 1, Line 0
Cannot drop the Database 'userdb' because it is currently in use.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

-해당 Database가 제대로 분리(detaching)되었는지 확인한다.
sp_helpdb userdb
go

-제대로 분리되었다면, 다음과 같은 형태의 메시지가 리턴 될 것이다.
Server: Msg 15010, Level 16, State 1, Procedure sp_helpdb, Line 51
The Database 'userdb' does not exist. Use sp_helpdb to show available Databases.

-이동하고자 하는 위치로 Database file들을 이동/복사한다.

-이동한 Database file을 원하는 SQL Server에서 다시 부착(attaching)해 준다.
sp_attach_db N'userdb', N'E:\mssql7\Dbdevice\userdbdata.mdf', N'E:\mssql7\Dbdevice\userdblog.ldf'
go

-위의 Scripts를 수행하면, 다음과 같은 메시지가 리턴된다.
Successfully attached Database 'userdb'.

-해당 Database가 SQL Server에 제대로 부착되었는지 확인한다.
sp_helpdb userdb
go

Posted by 시스템매니아
,
출처 : http://korea.internet.com

Microsoft SQL Server 2000 설치 작업 도중 실패하여 이후 프로그램 제거 옵션을 사용하지 못할때 해결 하는 방법에 대해서 알아보자. 여기에서 제안하는 방법은 잘못된 설치 환경을 깨끗하게 제거 하기 위해 같은 환경과 방법으로 설치를 한다. 이를 통해 제거 옵션을 사용해서 제거 하는 방법이고 이를 가능하게 하기 위해 안정된 재 설치 시점으로 되돌리는 방법에 대해서 이야기 한다.

Microsoft SQL Server 2000을 제거하기 전에

기본 데이터베이스 중 하나에 속할 수 있는 변경 사항과 함께 현재 상태로 저장하고자 하는 데이터베이스가 있을 수 있다. 그럴 경우 본 문서의 단계를 사용하기 전에 MSSQL 디렉터리를 삭제해야 하므로 MSSQL 디렉터리 이외의 디렉터리에 저장해야 하는 데이터의 양호한 백업이나 모든 데이터와 로그 파일의 복사본이 있는지 확인한다.

이러한 파일에는 Microsoft SQL Server 2000이 기본적으로 설치하는 데이터베이스 파일이 포함된다.

Distmdl.*
Master.*
Mastlog.*
Model.*
Modellog.*
Msdbdata.*
Msdblog.*
Northwnd.*(옵션 설치)
Pubs.*
Pubs_log.*
Tempdb.*
Templog.*
또한 다음과 같이 하는 것이 좋다.

Microsoft SQL Server 2000이 클러스터된 경우 다른 클러스터 리소스가 Microsoft SQL Server 2000에 종속되어 있는지 확인한다.
활성 연결이 있으면 제거 프로세스가 성공적으로 완료되지 못할 수 있으므로 Microsoft SQL Server 2000을 중지한다.
Microsoft SQL Server 2000 클라이언트 또는 관리 도구가 다른 노드에서 열려 있지 않도록 한다.
Microsoft SQL Server 2000 서비스 계정이나 동등한 권한을 가진 계정(로컬 관리자 계정의 구성원인 계정)으로 서버에 로그온한다. SQL Server가 클러스터된 경우 사용하는 계정은 모든 클러스터 노드에 있는 로컬 관리자의 구성원이어야 한다.
제거 하려면 다음과 같이 진행한다.

다음 목록에서 사용자의 환경에 따라 옵션을 한 가지 이상 사용할 수 있다. 아래 순서대로 옵션을 실행한다.

2단계와 3단계는 Microsoft SQL Server 2000의 로컬 설치에 적용할 수 있으며 Microsoft SQL Server 2000의 클러스터된 설치에는 적용할 수 없다.

CD의 Microsoft SQL Server 2000 설치 프로그램을 사용하고 제거를 누른다.
제어판에서 프로그램 추가/제거 애플릿을 연다.
regedit을 실행한 다음 다음 레지스트리 키를 찾는다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
제거 키에서 제거하려는 Microsoft SQL Server 2000의 인스턴스에 해당하는 제품 키를 찾는다.
작업 표시줄에서 시작을 누른 다음 실행을 누른다.
실행 대화 상자에 다음 명령을 복사하여 붙여넣거나 입력한다.
C:\WINNT\IsUninst.exe -f"C:\Program Files\Microsoft SQL Server\MSSQL$Server1\Uninst.isu" -c"C:\Program Files\Microsoft SQL Server\MSSQL$Server1\sqlsun.dll" -msql.mif i=I1
앞의 단계가 작동하지 않는 경우 마지막 수단으로 다음 단계를 사용하여 Microsoft SQL Server 2000을 수동으로 제거할 수 있다.
참고로 당장 SQL Server 2000을 제거하는 것은 아니다. 이 단계는 시스템을 성공적으로 다시 설치할 수 있는 상태로 만든 다음 Microsoft SQL Server 2000 인스턴스를 적절하게 제거하는 것이다.
설치용 Data 폴더를 찾고 데이터를 저장해야 할 경우 이름을 바꾼다. 또는 Data 폴더를 삭제한다. 마이크로소프트는 MDF와 LDF 형식으로 데이터베이스 백업을 사용할 수 있게하기 위해, 사용자들이 데이터 폴더를 삭제하는 것을 권장하지 않는다.
%drive% :\Program Files\Microsoft SQL Server\MSSQL\Binn 폴더를 찾은 다음 삭제한다.
다음 레지스트리 키를 찾은 다음 삭제한다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
다음 레지스트리 키를 찾은 다음 삭제한다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLServer
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLServerADHelper
앞의 레지스트리 키 세 개는 Microsoft SQL Server 2000의 기본 인스턴스에 대응한다. instance_name은 특정 인스턴스에 주어진 이름이기 때문에 명명된 인스턴스는 $instance_name과 함께 d단계에 표시된 것과 비슷하게 나타난다. 제거하려는 인스턴스의 올바른 키를 찾아서 해당 키를 선택하고 삭제한다. 주의해야 할점은 다른 서비스에서 MSSEARCH를 사용하는지 않는 경우 다음 서비스만 삭제한다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSFTPSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSCNTRS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSEARCH
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSGATHERVER
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSGTHRSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSINDEX
만약 SQL 서버 인스턴스가 클러스터되어 있으면, 클러스터 관리자에 남아 있을 수 있는 이 SQL 서버 인스턴스의 클러스터 리소스를 제거한다. 반드시 SQL 서버의 리소스만 제거해야 한다.
Microsoft SQL Server 2000을 다시 설치하고 같은 이름, IP 주소 등을 사용한다.
설치 프로그램을 실행하고 정상적인 제거를 수행하여 설치 실패로 인해 남아 있을 수 있는 구성 문제나 오류를 해결한다.
때로는 폴더 %drive%:"\Program Files\Microsoft SQL Server\80이 삭제되지 않을 수 있으며 이 때는 수동으로 삭제해야 한다.
SQL Server 2000을 제거하면 다음과 같은 오류 메시지가 나타날 수 있다.
설치 시스템에 이전 프로그램 설치 과정에서 생긴 보류된 파일 작업이 있다. 설치를 실행하기 전에 컴퓨터를 다시 시작해야 한다.
오류 메시지가 나타나면 서버를 다시 시작한 다음 설치를 다시 해본다. 서버를 다시 시작한 후에 오류 메시지가 다시 나타나면 삭제하려는 파일이 읽기 전용일 가능성이 있다. 파일이 읽기 전용인지 확인하려면 다음 레지스트리 키를 찾는다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
Posted by 시스템매니아
,
원인 : SQL Server는 내부적으로 Windows 컴퓨터 이름을 사용하는 데 Windows 이름이바뀌더라도 SQL Server가 참조하는 이름 정보를 변경하지 않기 때문입니다.

해결책 : 이 문제를 해결하기 위하여 다음의 두 방법 중에서 선택할 수 있습니다.

첫째, Windows 컴퓨터 이름을 이전 상태로 바꾸는 것입니다.
둘째, SQL Server 원본 CD에서 SQL Server Setup을 수행하는 것입니다.
Setup을 수행하면 실제 설치 작업을 하는 것이 아니라 SQL Server가 참조하는 컴퓨터 이름 정보만 수정하므로 시간이 오래 걸리지 않습니다. 이와 더불어 수행해야 할 작업은 SQL Server가 내부적으로 저장하고 참조하는 SQL Server 이름 정보의 갱신입니다. 이를 수행하지 않을 경우 분산 질의나 Replication 과 같이 로컬 서버 이름을 참조하는 작업을 진행할 수 없습니다. SQL Server의 내부 서버 이름을 변경하기 위하여 다음의 절차를 따릅니다.

1. Query Analyzer에서 다음을 수행합니다.

sp_dropserver 'old_servername'
go
sp_addserver 'new_servername', local
go

2. Service Manager나 Enterprise Manager에서 SQL Server를 중지합니다.
3. SQL Server를 시작합니다.
4. Query Analyzer에서 Server 이름이 갱신되었는지 확인하기 위하여 다음을 수행합니다.

Select @@SERVERNAME
Posted by 시스템매니아
,
Enterprise manager로 사용시
1. 같은 이름의 db를 만든다 (텅빈 db)
2. 빈 db를 그냥 풀 백업 한다.
3. 원본서버에서 가져온 백업본으로 리스토어 한다.
4. 리스토어시 옵션의 강제로 덮어쓰기 하시면 됩니다.
SQL Query Analyzer
쿼리문은 다음과 같습니다.
restore database 데이터베이스 이름 from disk = '백업 파일 경로'
Posted by 시스템매니아
,
mdf, ldf파일을 복사하려하는데 ‘원본이나 대상 파일이 사용중인 것 같습니다’라
는 에러메시지가 뜨면서 복사가 안되는 경우 SQL서비스를 중지하고 복사작업을 하
면되지만 서비스중인 SQL을 중지하기가 난감한 경우엔 다음과 같은 방법으로 데이
터베이스를 분리한뒤 다시 붙이는 식으로 작업을 하면됩니다.

1. 쿼리분석기를 이용하는 방법으로 알려드리겠습니다.
sp_detach_db를 이용해서 Db를 분리해낸 뒤 복사하고
다시 sp_attach_db를 이용해서 DB를 붙이시면 됩니다.
query문
sp_detach_db ‘DB명’
go
쿼리문 실행하고 파일복사후
sp_attach_db ‘DB명’ , ‘ c:\...\DB명_Data.mdf ’ , ‘ c:\...\DB명_Log.ldf ’
go
이렇게 하시면 됩니다.

Posted by 시스템매니아
,
-EM(Enterprise Manager)를 이용한 데이터베이스 분리

1.데이터베이스 위에서 마우스 오른쪽 번튼을 눌러 나타나는 단축메뉴에서 [모든작업(K)] - [데이터베이스 분리(H)] 를 선택합니다.

2.[데이터베이스 분리] 대화창이 표시됩니다. 이 화면에서 "분리 전에 통계 먼저 업데이트[S]"를 선택하시고 [확인] 버튼을 누르시면 데이터베이스가 분리됩니다.

-sp_detach_db 시스템 저장프로시져를 이용한 데이터베이스 분리

1.다음과 같이 sp_detach_db 시스템 저장프로시져를 이용하여 간단하게 데이터베이스를 분리 할 수 있습니다.

USE master
GO
EXEC sp_detach_db test

-EM(Enterprise Manager)를 이용한 데이터베이스 연결

1. 우선 연결할 대상이 되는 *.mdf, *.ldf 파일을 특정한 디렉토리에 위치를 시킵니다. 예로 test.mdf, test_log.ldf 파일을 E:\Data 폴더에 있다고 가정합니다.

2. "데이터베이스" 위에서 마우스 오른쪽 버튼을 눌러 단축메뉴를 표시하면 [모든작업(K)] - [ 데이터베이스 연결(A)]을 선택할 수 있습니다.

3. 데이터베이스 연결을 위한 대화창이 표시됩니다.

4. 찾기 버튼 [...] 을 누르면 연결할 데이터베이스 파일의 위치를 쉽게 찾을 수 있는 탐색창이 뜹니다. 이 화면에서 연결하고자 하는 데이터베이스 파일 *.mdf 을 선택하면 됩니다.

5. 데이터베이스 파일을 선택한 후의 화면입니다. 원하는 경우 "다음 이름으로 연결(A)" 부분에 다른 이름을 주어 기존의 데이터베이스와는 다른 이름을 갖는 데이터베이스로 연결을 할 수 있습니다.

6. [확인] 버튼을 누르면 데이터베이스 연결이 완료됩니다.


-sp_attach_db 또는 sp_attach_single_file_db 시스템 저장프로시져를 이용한 데이터베이스 연결

sp_attach_db의 경우는 데이터베이스 파일이 여러개인 경우(한개의 *.mdf 파일과 여러개의 *.ndf 파일들)에 사용을 하게 되며, sp_attach_single_file_db의데이터베이스 파일이 한개(한개의 *.mdf 파일)인 경우 사용하면 됩니다. 데이터베이스 파일이 한개인 경우는 두가지 방법중 아무거나 사용하시면 됩니다. 그리고 sp_attach_db의 경우는 16개의 데이터베이스 파일까지 한번에 지정이 가능합니다.

만일 위에서 연결했던 test.mdf 파일을 sp_attach_db를 이용해서 연결한다면 다음과 같이 하시면 됩니다.

USE master
GO
EXEC sp_attach_db 'test', 'E:\Data\test.mdf', 'E:\Data\test_log.ldf'

위 연결 방법은 정확히 한다면 다음과 같은 문법에 따라 사용하셔야 합니다. 하지만 변수명 생략이 가능하기 때문에 위와 같이 사용한 것입니다.


USE master
GO
EXEC sp_attach_db @dbname = 'test', @filename1 = 'E:\Data\test.mdf', @filename2 = 'E:\Data\test_log.ldf'

test.mdf 파일을 sp_attach_single_file_db를 이용해서 연결한다면 다음과 같이 하시면 됩니다.

USE master
GO
EXEC sp_attach_single_file_db 'sqlworld', 'E:\Data\sqlworld.mdf'

-- 또는

EXEC sp_attach_single_file_db @dbname = 'test',
@physname = 'E:\Data\test.mdf'

-- 또는

이전 서버와 문자셋 정보(sp_helpsort 명령으로 보실수 있습니다.)가 같고

이전에 사용하던 SQL서버가 정상적인 상태로 종료 되었을때(엔터프라이즈 관리자에

서SQL서버를 스탑 시켰거나.. 정상적으로 윈도우 시스템을 종료시킨 경우 - 해당

mdf 화일과 ldf 화일이 정상적으로 닫혔을 경우) 복구가 가능하며 이때 사용하는 명령은

EXEC sp_attach_db 'pubs'

, 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'

, 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'


명령으로 복구할 수 있습니다.

Posted by 시스템매니아
,
출처 : http://www.sqlworld.pe.kr

SQL Server의 데이터베이스를 다른 서버로 옮기기는 쉽습니다. 항상 문제가 되는 것은 다른 서버 로그인 정보를 옮기는 것입니다.(물론 몇개 안되면 다시 만들면 되지만) Master 데이터베이스를 백업받아 다른 서버에 리스토어 하면 되지만 그리 쉬운 방법은 아닙니다. DTS를 이용해서 로그인 정보를 다른 서버로 옮길 수 있으나 SQL Server 7.0에서는 패스워드를 정확히 옮기지 못하는 걸로 압니다. SQL Server 2000에서는 정확하게 로그인 정보를 옮길 수 있습니다.

이런 이유로 MS에서 SQL Server 7.0 간의 로그인 정보 이동을 위하여 제공하는 스크립트가 있습니다. 이 스크립트를 소개하고자 합니다.


1. 아래 스크립트를 수행하여 시스템 저장프로시져 sp_hexadecimal를 만듭니다.

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(255)
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') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO

CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @xstatus int
DECLARE @binpwd varbinary (255)
DECLARE @txtpwd sysname
DECLARE @tmpstr varchar (255)

IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT name, xstatus, password FROM master..sysxlogins
WHERE srvid IS NULL AND name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT name, xstatus, password FROM master..sysxlogins
WHERE srvid IS NULL AND name = @login_name

OPEN login_curs
FETCH NEXT FROM login_curs INTO @name, @xstatus, @binpwd

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 'DECLARE @pwd sysname'

WHILE (@@fetch_status <> -1)
BEGIN

IF (@@fetch_status <> -2)
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 = 'EXEC master..sp_grantlogin ''' + @name + ''''
PRINT @tmpstr
END

END

ELSE BEGIN -- SQL Server authentication
IF (@binpwd IS NOT NULL)
BEGIN -- Non-null password
EXEC sp_hexadecimal @binpwd, @txtpwd OUT
IF (@xstatus & 2048) = 2048
SET @tmpstr = 'SET @pwd = CONVERT (varchar, ' + @txtpwd + ')'
ELSE
SET @tmpstr = 'SET @pwd = CONVERT (varbinary, ' + @txtpwd + ')'
PRINT @tmpstr
SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
+ ''', @pwd, @encryptopt = '
END

ELSE BEGIN
-- Null password
SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
+ ''', NULL, @encryptopt = '
END

IF (@xstatus & 2048) = 2048
-- login upgraded from 6.5
SET @tmpstr = @tmpstr + '''skip_encryption_old'''
ELSE
SET @tmpstr = @tmpstr + '''skip_encryption'''
PRINT @tmpstr
END

END

FETCH NEXT FROM login_curs INTO @name, @xstatus, @binpwd
END

CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO



2. EXEC master..sp_help_revlogin 를 수행하면 로그인 정보를 만드는 스크립트가 만들어집니다.

3. 이 스크립트를 복사하여 새로운 서버에서 수행합니다.

※ 이 내용는
http://support.microsoft.com/support/kb/articles/Q246/1/33.ASP의 내용을 참고한 것임을 알려드립니다.
Posted by 시스템매니아
,
* 예외가 발생하며 종료되는 프로세스의 .Dmp 파일을 만들려면 다음과 같이 한다.

1. Program Files\Debuggers\Userdump 폴더에서 Userdump 도구에 포함된 Setup.exe 프로그램을 실행한다.
이 프로그램은 커널 모드 드라이브인 Userdump.sys 파일을 설치하고 제어판에 Process Dump 아이콘도 만든다.
2. 제어판에서 Process Dump를 두 번 누른 다음 Exception Monitoring 탭에서 New를 눌러 Monitor 목록에 적절한 프로그램 이름(예: Mtx.exe 또는 Dllhost.exe)을 추가한다. OK를 누른다.
3. Monitor 상자에서 프로그램 이름을 누른 다음 Rules를 누릅니다. 이제 이 프로그램에 대해 Userdump.exe를 시작하는 "액세스 위반(c0000005)"과 같은 오류 유형을 선택할 수 있다.
Mtx.exe 또는 Dllhost.exe가 액세스 위반을 생성할 때 먼저 Userdump.exe가 시작되어 %SystemRoot% 폴더에서 덤프 파일(.dmp)을 만든다. 이 .dmp 파일을 분석하면 Winlogon 액세스 위반 오류의 원인을 찾을 수 있다.

* 응답하지 않는 프로세스에 대해 .Dmp 파일을 만들려면 다음과 같이 한다.

1. Program Files\Debuggers\Userdump 폴더에서 Userdump 도구에 포함된 Setup.exe 프로그램을 실행한다.
2. 프로그램이 응답하지 않을 때 명령 프롬프트에 userdump PID 명령을 입력합니다. 여기에서 PID 는 응답하지 않는 프로그램의 프로세스 ID이다.
프로그램의 PID를 구하려면 작업 관리자를 열고 프로세스 탭을 누른다.
3. userdump PID 명령을 실행하면 WinDBG와 같은 프로그램에서 사후 디버깅을 수행하는 데 사용할 수 있는 .dmp 파일이 생성된다.
Posted by 시스템매니아
,
출처 : http://www.devpia.com
1.Lock의 간단한 이해..

어느 웹팀이 웹페이지 개발을 하고 있는데 하나의 컴퓨터에서 터미날서비스를 이용하여 작업을 하고 있다.

하지만 A 라는 사람이 Default라는 화일을 사용하고 있고 B라는 사람이 이것을 열려고 한다면 어떻게 될것인가??

두사용자가 모두 쓰기를 해버린다면 작업은 엉망이 될것이다. 그것을 방지하기 위해서 VS.NET툴에 소스세이프라는 것을 이용하여

한사람이 작업을 할때는 다른이가 접근을 막아주는 기능을 한다.

이것이 바로 Lock의 개념인것이다.

쉽게 다른사람이 이 파일을 쓸때 다른 사람이 쓰지 못하도록 막는것.

멀티 스레드같은 프로그램에서도 많이 사용하는 개념이기도 하고

DataBase의 데이터 처리 역시 같은 개념인 것이다

2. NoLock과 DeadLock의 이해..

NoLock에 관해서 먼저 이해를 해보도록 하겠다.

Lock을 안걸면 되는거지 NoLock은 또 무엇인가??

이렇게 이해가 와 닿을수 있다. 하지만 ADO에서 지원하는 자동 트랙잭션 처리와 같은 경우가 있기에 NoLock이 필요한 것이다

그럼 왜 Lock을 걸지 않느냐..?? 한가지 예를 들어 설명 하도록 하겠다.

어느 경매사이트에 마감 1분을 남겨두고 있다. 헌데 벤츠가 50원이다.. 사람들이 미친듯이 입찰을 하려고 달려들 것이다.

그 숫자가 만명이라고 가정해보자 입찰을 할때 Update를 시킬텐데..수만명의 사용자가 그것의 처리를 기달려야 한다면..

그 차는 헐갑에 넘어 가고 말것이다.

정말 쉬운 예로 게시판에 글을 읽었을 때 조회수가 update가 된다. 헌데 이글을 수만명의 사람들이 동시에 접근을 한다고 한다.

그럼 한사람 한사람의 업데이트를 기달리게 될 것이고 사이트의 효율성이 떨어질것이다.

등등의 많은 예들이 NoLock의 필요성을 말해준다.


다음은 DeadLock의 관한 이해를 보도록 하겠다.

DeadLock은 쉽게 표현하자면 재귀함수와 같은 무한루프라고 표현에 가깝다. 이것 역시 간단한 예제를 통해 예를 들어 보겠다.

Transaction1 (A ->B)처리

Transaction2 (B ->A)처리

저기서 A와 B에 락이 걸려있다고 가정해보자.. 어떠한가? 서로 잡고 마냥 기달리기만 하지 않겠는가?

1번은 A를 잡고 있는 상태로 2번에서 잡고 있는 상태로 B를 놔주기를 기다릴것이고 2번은 B를 잡고 있는채로 A를 놔주기를

바라고 있을것이다. 이것이 잘 운영되던 사이트가 속도가 느려지고 이유도 모르게 서비스가 중지 되는 가장큰 이유가 된다.

반드시 처리해야할.. 이것이 바로 DeadLock 이라는 것이다.

3.DeadLock의 해결..

데드락을 해결하기 위해서는 3가지의 방법이 존재한다. 첫번째는 타임아웃을 주어 어느 일정시간 동안 락을 기달리다가 반응이 없으면

롤백시키는 즉 타임아웃을 설정하는 것이다.

EX)

-락타임 아웃의 설정

SET LOCK_TIMEOUT 10000

- 락 타임아웃 확인

SELECT @@LOCK_TIMEOUT

- 트랜잭션 코드 추가

데드락을 해결할수 있는 첫번째 방법이였다.

두번째는 프로시저에 우위를 설정해 주는것이다. 이방법은 우위가 낮은 프로시저를 먼저

취소시킨다는 것이다. 우선 순위의 레벨은 Low와 Normal로 나타낼수 있고 Priority라는것을 이용하여 설정 할수가 있다.

EX)

SET DEADLOCK_PRIORITY LOW

go

... 트랜잭션 구문



그리고 세번재 방법은 한 프로시저가 너무 오랫동안 사용하고 있다 의심되는것을 강제로 종료 시키는 방법이다.

이것은 KILL이라는 SQL명령어를 이용하여 사용 할 수 있다.

4.DeadLock 예방하기

데드락 발생시 처리해야 하는것도 중요하지만 데드락을 미리 예방을 하여 락과 블러킹의 횟수를 줄이는것 역시 중요하다.

그럼 데드락을 예방법 첫번재로 트랜잭션안의 구문의 처리 순서를 일치 시킨다는 것이다.

예를들어 보겠다.

트랜잭션1=> A작업->B작업->C작업

트랜잭션2=> C작업->A작업->B작업

이런식으로 처리 되어진다면 둘이 동시에 처리가 된다면 분명 데드락이 발생 할 것이다. 여기서 우리가 트랙잭션2의 작업의

순서를 1과 똑같이 A작업->B작업->C작업 으로 처리를 한다면 데드락의 발생 비율을 줄일수 있을 것이다.

그리고 두번째는 트랙잭션의 처리속도를 최대한 짧게 해준다는 것이다. 짧으면 짧을수록 락 발생 확률도 줄여 들기 때문이다.

이것은 너무 당연한 것일수 있고 가장 중요한것이 된다. 그리고 마지막으로 트랜잭션의 격리 수준을 최대한 낮게 해 주는것이다.

되도록 낮은 격리 수준을 사용하면 데드락은 물론 성능도 보다 향상시 킬수 있기 때문이다.

데드락의 예방은 무엇보다도 가장 기복적으로 락의 유지 시간을 보다 짧게 해주는것이 가장 중요할 것이다.

*TIP(출서: 모사이트였는데-_-)

HOLDLOCK : 필요한 테이블, 행 또는 데이터 페이지가 더 이상 필요 없게 되자마자 해제하지 않고 트랜잭션이 완료될 때까지 공유 잠금을 보유한다. HOLDLOCK은 SERIALIZABLE과 같은 의미.

NOLOCK : 공유 잠금을 실행하거나 단독 잠금을 유지하지 않음. 이 옵션을 적용하면 커밋되지 않은 트랜잭션이나 읽는 중 롤백된 페이지 집합을 읽을 수 있음. 커밋되지 않은 읽기가 가능합니다. SELECT 명령문에만 적용됨..

PAGLOCK 주로 단일 테이블 잠금이 취해지는 곳에서 페이지 잠금을 사용함.

READCOMMITTED : READ COMMITTED 격리 수준에서 실행되는 트랜잭션과 같은 잠금 방법을 사용하여 스캔을 수행함. 기본적으로, SQL Server 2000은 이 격리 수준에서 실행됨

READPAST : 잠겨 있는 행을 건너뜀 이 옵션을 사용하면 다른 트랜잭션이 이러한 행에 대해 잠금을 해제할 때까지 기다리지 않고 다른 트랜잭션에 의해 잠겨 있는 행을 건너뜀. 그렇지 않으면 일반적으로 결과 집합에 나타남. READPAST 잠금 참고는 READ COMMITTED 격리 수준에서 작동하는 트랜잭션에만 적용되며 행 수준 잠금 뒤만 읽음. SELECT 문에만 적용됨

READUNCOMMITTED == NOLOCK

REPEATABLEREAD : REPEATABLE READ 격리 수준에서 실행되는 트랜잭션과 같은 잠금 방법으로 스캔을 수행함.

ROWLOCK : 성긴 페이지 잠금 및 테이블 수준의 잠금 대신 행 수준 잠금을 사용함

RERIALIZABLE : SERIALIZABLE 격리 수준에서 실행되는 트랜잭션과 같은 잠금 방법으로 스캔을 수행함. HOLDLOCK과 같음

TABLOCK : 세부적인 행 또는 페이지 수준 잠금 대신 테이블 잠금을 사용함. SQL Server는 명령문이 끝날 때까지 이 잠금을 보유함. 그러나 HOLDLOCK을 함께 지정했으면 트랜잭션이 끝날 때까지 잠금이 보유됨.

TABLOCKX : 테이블에 대해 단독 잠금을 사용함. 이 잠금을 사용하면 다른 트랜잭션이 테이블을 읽거나 업데이트할 수 없고 명령문이나 트랜잭션이 끝날 때까지 보유됨

UPDLOCK : 테이블을 읽는 중 공유 잠금 대신 업데이트 잠금을 사용하며 명령문이나 트랜잭션이 끝날 때까지 보유됩니다. UPDLOCK을 사용하면 다른 트랜잭션이 읽는 것을 차단하지 않고 데이터를 읽을 수 있고 마지막으로 읽은 후 데이터가 변경되지 않으며 나중에 업데이트할 수 있습니다.

XLOCK : 명령문에 의해 처리되는 모든 데이터에 대해 트랜잭션이 끝날 때까지 보유될 단독 잠금을 사용합니다. 이 잠금은 PAGLOCK 또는 TABLOCK으로 지정할 수 있으며 이 경우 단독 잠금이 해당 세부성 수준에 적용됩니다.

Posted by 시스템매니아
,
RESTORE FILELISTONLY
FROM < backup_device >

위 T - SQL 사용하면 백업파일 안에 들어 있는 내용들이 보입니다.

RESTORE VERIFYONLY
FROM < backup_device >

위 T - SQL은 백업을 확인하지만 백업을 복원하지는 않고, 백업파일에 문제가 있는지 검사합니다.

Posted by 시스템매니아
,
[사용자와 소속 이름 바꾸기]

시스템 등록정보 창에는 운영체제를 깔 때 썼던 이용자와 회사 이름이 적혀있습니다.
레지스트리에서 간단히 고칠수 있고 간단합니다.

시작-> 실행-> regedit-> 레지스트리 편집기가 열립니다

W2K경우 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion로 가서

오른쪽 창에서 registeredowner,registeredorganization 키를 찾는다
registeredowner에는 이용자 이름이,registeredorganization에는 회사 이름이 등록되어 있다.
이름을 바꾸려면 각 키를 마우스 오른쪽 버튼으로 누른뒤 `수정`을 골라 `문자열 편집`창을 띄운 다음
`값 데이터` 칸에 원하는 이름을 쓰고 `확인` 버튼을 누른다

Posted by 시스템매니아
,
1. Windows 기본 서비스

액티브 디렉토리 (LDAP) TCP: 389
액티브 디렉토리 (LDAP-SSL) TCP: 636
브라우징 UDP: 137,138
DHCP 임대 UDP: 67,68
DHCP 관리자 TCP: 135
디렉토리 복제 TCP: 135
UDP: 138
직접 호스트 (SMB,CIFS) TCP: 445
DNS 관리 TCP: 135
DNS 이름분해 TCP: 53
UDP: 53
이벤트 뷰어 TCP: 139
파일공유 TCP: 139
글로벌 카탈로그 (LDAP) TCP: 3268
글로벌 카탈로그 (LDAP-SSL) TCP: 3269
IPSec UDP: 500(IKE)
IP Protocol: 50(ESP), 51(AH)
인터넷 프린팅 프로토콜 (IPP) TCP: 631
커버로스 TCP: 88
UDP: 88
2계층 터널링 프로토콜 (L2TP) UDP: 1701
로그온 시퀀스 TCP: 139
UDP: 137,138
Net Logon UDP: 138
Pass Through Validation TCP: 139
UDP: 137,138
성능모니터 TCP: 139
지점간 터널링 프로토콜 (PPTP) TCP: 1723
IP Protocol: 47(GRE)
인쇄 TCP: 139
UDP: 137,138
레지스트리 편집기 TCP: 139
서버 관리자 TCP: 139
트러스트 TCP: 139
UDP: 137,138
사용자 관리자 TCP: 139
WinNT 진단 TCP: 139
WinNT 보안채널 TCP: 139
UDP: 137,138
WINS 복제 TCP: 42
WINS 관리자 TCP: 135
WINS 등록 TCP: 137

2. Convoy 클러스터링 (WLBS)

Convoy UDP: 1717
Windows NT 로드밸런싱 서비스 (WLBS) UDP: 2504

3. 익스체인지 서버

클라이언트/서버통신 TCP: 135
익스체인지 관리자 TCP: 135
익스체인지 라우팅 TCP: 691
IMAP TCP: 143
IMAP (SSL) TCP: 993
MTA-X.4000 over TCP/IP TCP: 102
POP3 TCP: 110
POP3 (SSL) TCP: 995
RPC TCP: 135
SMTP TCP: 25
NNTP TCP: 119
NNTP (SSL) TCP: 563

4. SQL 서버

SQL연결 (Winsock) TCP: 1433
UDP: 1434

5. 프록시 서버

Winsock 프록시 클라이언트 UDP: 1745

6. 터미널 서버

RDP 클라이언트(마이크로소프트) TCP: 3389
ICA 클라이언트(씨트릭스) TCP: 1494

Posted by 시스템매니아
,
tsshutdn.exe

Windows 명령창(cmd.exe)에서나 실행창에서 실행시키면 되고

tsshutdn 0 /reboot 라는 명령를 내린다면 엔터를 치는과 동시에 컴퓨터가 꺼졌다 다시 부팅됩니다.

여기서 '0'은 대기시간을 의미하며 단위는 '초'(second)이다.

10분후에 리부팅하길 원하면 'tsshutdn 600 /reboot', 30분 후는 'tsshutdn 1800 /reboot' 이런식으로 입력하면 됩니다.
Posted by 시스템매니아
,
Processor:% Processor Time

이 카운터는 CPU가 비유휴 스레드를 처리하는 데 소비하는 시간의 양을 모니터링한다. 카운터 값이 계속 80-90 퍼센트로 나타나면 CPU를 업그레이드하거나 프로세서를 추가해야 합니다.

멀티프로세서 시스템의 경우 각 프로세서에 대해 이 카운터의 개별 인스턴스를 모니터링해야 합니다. 이 값은 특정 프로세서의 프로세서 시간의 합을 나타낸다. 모든 프로세서의 평균을 확인하려면 System: %Total Processor Time 카운터를 이용해야 합니다.


다음 항목들을 통해 다른 정보들을 얻을 수 있다.


Processor: % Privileged Time

이 카운터는 프로세서가 SQL Server I/O 요청 처리와 같은 커널 명령을 실행할 때 걸리는 시간의 비율을 나타냅니다.

Physical Disk 카운터가 높을 때 이 카운터가 같이 높으면 더 빠르고 효율적인 디스크 하위 시스템을 고려해야 합니다.

디스크 컨트롤러가 다르면 커널 처리 시간도 다릅니다. 효율적인 컨트롤러와 드라이버를 사용하면 권한 시간이 짧아져 사용자가 응용 프로그램을 사용할 수 있는 처리 시간을 확보할 수 있기 때문에 전체 처리량을 늘릴 수 있습니다.


Processor: %User Time

이 카운터는 프로세서가 SQL Server와 같은 사용자 프로세스를 실행할 때 걸리는 시간의 비율을 나타냅니다.


System: Processor Queue Length

이 카운터는 프로세서 시간을 기다리는 쓰레드 수를 나타낸다. 프로세스의 쓰레드에 필요한 프로세서 사이클 수가 사용할 수 있는 개수보다 많으면 프로세서 병목 상태가 발생한다. 일부 프로세스가 프로세서 시간 대부분을 소비한다면 속도가 빠른 프로세서나 추가 프로세서(멀티프로세서 시스템을 사용 중이면)를 설치해야 합니다.

프로세서의 사용을 검사할 때는 SQL Server 인스턴스가 수행 중인 작업 유형을 고려해야 한다. SQL Server가 집계에 관한 쿼리나 디스크 I/O가 필요없는 메모리 집중형 쿼리와 같은 계산을 많이 수행한다면 프로세서 시간 전체를 사용할 수 있다. 이런 이유로 다른 응용 프로그램 수행에 어려움이 발생하면 SQL Server만이 설치된 DB서버를 독자적으로 할당하는 방법 등으로 작업량을 줄여야 합니다.


100퍼센트에 가까운 수치로 프로세스가 대기열에 쌓이고 있는 모습이 나타난다면 당연히 프로세서 시간이 길어지고 병목현상이 나타납니다. 이런 부분을 해결하는 방법중의 하나가 프로세서 성능을 향상시키는 일입니다.

Posted by 시스템매니아
,
터미널서비스 접속자 초과로 연결이 안될때 서버에 콘솔은 연결이 됐는데 마우스가 작동하지 않아서

연결끊기가 힘든경우 리부팅을하곤 하는데 명령창(cmd)에서 간단히 연결을 끊을수있습니다.

시작->실행->cmd후

tsdiscon 1 /server:서버ip를 하시면 됩니다.

세션이 두개니까 두번째로 끊으려면

tsdiscon 2 /server:서버ip를 하시면 됩니다.

*띄어쓰기에 주의하셔야합니다.
Posted by 시스템매니아
,
잘사용하던 터미널서비스 접속이 갑자기 "라이센스를 제공할 터미널 서버 라이센스 서버가 없으므로 원격 연결이 끊어졌습니다."

라는 메세지와 함께 연결이 안될때의 해결방법입니다.

터미널 서비스를 설치하실때 응용프로그램모드가 아닌 관리모드로 설치하셔야합니다.

응용프로그램모드는 라이센스가 있어야 사용가능하며 라이센스 없이는 90일 정도만 사용할 수 있습니다.

Windows 2000에서는 설치시 두 모드중 하나를 선택하게 했지만 Windows 2003에서는 응용프로그램모드로 일단 설치가됩니다.

변경하시려면 설치후 제어판-시스템-원격 탭으로 이동한 뒤 원격데스크톱 의"사용자가 이 컴퓨터에 원격으로 연결할수 있음"에

체크를 해주셔야 합니다.체크를 해주셔야 관리모드로 변경됩니다.

일단 연결을 해야하는데 급하실때는 서버의 날짜를 1년전으로 돌리시면 사용가능해집니다.

Posted by 시스템매니아
,
OLEDB나 ODBC와 같이 데이터 연결이 되기위해서는 MDAC이란 콤포넌트가 서버에 설치되있어야합니다.

물론 Windows2000 Server를 설치하면 기본 2.5버전이 설치가 됩니다. 문제는 웹서버에 Ms-Sql2000을

설치하게되면 MDAC이 2.7버전으로 업그레이드됩니다.

웹서버와 DB서버가 같은 서버안에 있을때는 MDAC의 버전이 동일해서

아무문제가 되지않지만 같은서버에서 독립서버로 웹서버를 이전을하게되면 웹서버의 MDAC버전이 2.5버전

으로 되면서 연결이 되지않습니다.

이와같은문제는 웹서버의 MDAC버전을 DB서버와 동일 또는 그이상으로 업그레이드해주면 해결됩니다.

MDAC의 버전을보려면 시작->실행창->regedit 후 아래경로로 이동하시면됩니다.

HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess\Version

현재 Ms-Sql2000의 경우 2.8버전이 최신버전이며 다운경로는 아래와같습니다.

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c
Posted by 시스템매니아
,
일반적으로 mdf파일이 정상적으로 분리됐을때의 DB복구방법은

-EM(Enterprise Manager)를 이용한 데이터베이스 연결

1. 우선 연결할 대상이 되는 *.mdf, *.ldf 파일을 특정한 디렉토리에 위치를 시킵니다. 예로 test.mdf, test_log.ldf 파일을 E:\Data 폴더에 있다고 가정합니다.

2. "데이터베이스" 위에서 마우스 오른쪽 버튼을 눌러 단축메뉴를 표시하면 [모든작업(K)] - [ 데이터베이스 연결(A)]을 선택할 수 있습니다.

3. 데이터베이스 연결을 위한 대화창이 표시됩니다.

4. 찾기 버튼 [...] 을 누르면 연결할 데이터베이스 파일의 위치를 쉽게 찾을 수 있는 탐색창이 뜹니다. 이 화면에서 연결하고자 하는 데이터베이스 파일 *.mdf 을 선택하면 됩니다.

5. 데이터베이스 파일을 선택한 후의 화면입니다. 원하는 경우 "다음 이름으로 연결(A)" 부분에 다른 이름을 주어 기존의 데이터베이스와는 다른 이름을 갖는 데이터베이스로 연결을 할 수 있습니다.

6. [확인] 버튼을 누르면 데이터베이스 연결이 완료됩니다.


-sp_attach_db 또는 sp_attach_single_file_db 시스템 저장프로시져를 이용한 데이터베이스 연결

USE master
GO
EXEC sp_attach_db 'test', 'E:\Data\test.mdf', 'E:\Data\test_log.ldf'

또는 MDF파일만 있을때

EXEC sp_attach_single_file_db @dbname = 'test',
@physname = 'E:\Data\test.mdf'

등의 방법을 사용합니다.

하지만 정상적으로 분리되지않은 MDF파일은 복구시에 자신이 가지고있던 LDF파일만을 찾습니다.

위의 정상적인방법으론 계속되는 에러뿐입니다.

MDF파일을 복구하기위한 방법은

1.MDF파일의 DB명으로 빈 디비생성
2.DB정지후 생성한디비의 MDF파일과 가지고있는 MDF파일 교체
3.DB시작을 하면 suspect모드로 빠짐
이후부터는 suspect모드에서의 복구문서 참조->(파일첨부함)


이렇게 복구가 된다해도 DB의 자료는 거의 복구가되지만 여러 키값, 인덱스까지 제대로 잡히진 않습니다.
DB관리시 철저히 준비를 하여야 하며 제대로된 백업 및 복구방법을 사용하여야 할것입니다.
Posted by 시스템매니아
,
- 윈도우의 도스창을 띄운후 아래와 같이 입력한다.
프롬프트가 떨어지면 IP정보를 알고자하는 도메인이름을 입력한다.
해당 IP가 출력된다.

C:\>nslookup
Default Server: ns.gihc.net
Address: 203.235.122.164

> inet.co.kr
Server: ns.gihc.net
Address: 203.235.122.164

Non-authoritative answer:
Name: inet.co.kr
Address: 210.116.105.166

- 해당 네임서버에서 찾을수 없다면 아래와 같은 메세지가 나온다.
*** ns.gihc.net(해당네임서버의 이름) can't find ilet.co.rk: Non-existent domain

- 타 ISP(인터넷서비스업체)의 서버를 이용하여 내부망이 아닌 외부망에서도 도메인에 대한 IP정보를 알수 있다.
프롬프트가 떨어지면 "server 사용하고자하는네임서버"를 지정해준다.
이후에 도메인을 입력하면 지정한 네임서버에서 정보를 읽어온다.
> server ns.elim.net
Default Server: ns.elim.net
Address: 203.239.130.1

> inet.co.kr
Server: ns.elim.net
Address: 203.239.130.1

Non-authoritative answer:
Name: inet.co.kr
Address: 210.116.105.166

** ISP등의 네임서버명
ns.kt.net - KT
ns.bora.net - 데이콤
ns.elim.net - 엘림넷
Posted by 시스템매니아
,