Ms-Sql 쿼리명령어!

MS-SQL 2005/06/15 13:50
출처 : 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 정의된 번호의 메시지에서 오류메시지를 만든다.
*/
2005/06/15 13:50 2005/06/15 13:50
출처 : http://www.devpia.com

SQL Server 7.0이 C:\Mssql7에 설치되어 있고 모든 데이터베이스 및 로그 파일도
C:\Mssql7\Data에 설치되어 있다고 가정하고, 모든 데이터베이스의 데이터 및 로그 파
일을 E:\Sqldata로 이동합니다.

먼저 모든 데이터베이스, 특히 master 데이터베이스의 백업을 현재 위치에 만듭니다.

사용자에게는 시스템 관리자(sa) 권한이 있어야 합니다 .

데이터베이스의 모든 데이터 파일 및 로그 파일의 이름과 현재 위치를 알고 있어야 합
니다.

참고: sp_helpfile 저장 프로시저(Stored Procedure)로 데이터베이스에서 사용되는 모
든 파일의 이름과 현재 위치를 결정할 수 있습니다.

use
go
sp_helpfile
go

이동하려는 데이터베이스에 대해 단독 액세스 권한이 있어야 합니다.

이 과정 중에 문제가 발생하고 이동한 데이터베이스를 액세스할 수 없거나 또는 SQL
Server를 시작할 수 없으면 SQL Server 오류 로그 및 SQL Server 7.0 온라인 설명서에
서 발생한 오류의 정보를 확인하십시오.


1. 사용자 데이터베이스 이동
Mydb.mdf 데이터 파일과 Mydblog.ldf 로그 파일이 있는 mydb 데이터베이스를 이동
합니다. 이동하려는 데이터베이스에 추가 데이터 또는 로그 파일이 있으면
sp_attach_db 저장 프로시저(Stored Procedure)에 모든 추가 파일의 이름을 쉼표로 구
분하여 명시하십시오. sp_detach_db 프로시저는 데이터베이스에 들어 있는 파일을 나
열하지 않으므로 데이터베이스에 포함되는 파일의 수가 문제가 되지 않습니다.
데이터베이스를 다음과 같이 분리합니다.

use master
go
sp_detach_db "mydb"
go

다음에는 현재 위치(C:\Mssql7\Data)의 데이터 및 로그 파일을 새 위치(E:\Sqldata)
에 복사합니다.

다음과 같이 새 위치로 이동한 파일에 해당하는 데이터베이스를 부착(Attach)합니다.

use master
go
sp_attach_db "mydb","E:\Sqldata\mydbdata.mdf","E:\Sqldata\mydblog.ldf"
go

sp_helpfile을 사용하여 새 위치에 제대로 파일이 이동되었는지 확인합니다.
use mydb
go
sp_helpfile
go

filename 열 값은 새 위치를 반영해야 합니다.

2. MSDB, Pubs 및 Northwind 이동
사용자 데이터베이스를 이동시킬 때 동일한 프로시저를 수행하십시오.MSDB의 경
우 SQL Server 에이전트는 현재 실행되지 않아야 합니다. 그렇지 않으면
sp_detach_db 저장 프로시저(Stored Procedure)는 다음 메시지와 함께 실패합니다.

Server:Msg 3702, Level 16, State 1, Line 0
Cannot drop the database "msdb" because it is currently in use.
DBCC execution completed. If DBCC printed error messages, contact your system
administrator.

3. 마스터 데이터베이스의 이동
SQL Server Enterprise Manager(엔터프라이즈 관리자)에 있는 마스터 데이터 및
로그 파일의 경로를 변경합니다.

참고 : 여기서 오류 로그의 위치도 선택적으로 변경할 수 있습니다.

Enterprise Manager(엔터프라이즈 관리자)에 있는 SQL Server를 마우스 오른쪽 단추
로 누르고 바로 가기 메뉴의 Properties를 누릅니다.

Startup Parameters 단추를 누르면 다음 항목을 볼 수 있습니다.
-dC:\MSSQL7\data\master.mdf
-eC:\MSSQL7\log\ErrorLog
-lC:\MSSQL7\data\mastlog.ldf

-d는 마스터 데이터베이스 데이터 파일의 정식 경로입니다.

-e는 오류 로그 파일의 정식 경로입니다.

-l는 마스터 데이터베이스 로그 파일의 정식 경로입니다.

이러한 값을 다음과 같이 변경합니다.

Master.mdf 및 Mastlog.ldf 파일에 대한 현재 항목을 제거합니다.

새 위치를 지정하는 새 항목을 추가합니다.

-dE:\SQLDATA\master.mdf
-lE:\SQLDATA\mastlog.ldf

SQL Server를 중지합니다.

Master.mdf 및 Mastlog.ldf 파일을 새 위치(E:\Sqldata)에 복사합니다.

SQL Server를 다시 시작합니다.

4. Model 데이터베이스 이동
Model 데이터베이스를 이동하려면 SQL Server는 master 이외의 데이터베이스를
복구하지 않도록 3608 추적 플래그(Trace Flag)와 함께 시작되어야 합니다.

참고 : 이 때 사용자 데이터베이스를 액세스할 수 없습니다. 이 추적 플래그(Trace
Flag)를 사용하는 중에는 다음 단계 외의 작업은 수행하지 말아야 합니다. To add
trace flag 3608 as a SQL Server startup parameter, perform the following steps:
In SQL Server Enterprise Manager, right-click the server name and click
Properties on the shortcut menu.

On the General tab, click Startup Parameters.

Add a new parameter as -T3608.

3608 추적(Trace) 플래그를 추가한 후 다음 단계를 수행합니다.
SQL Server를 중지하고 다시 시작합니다.

다음과 같이 model 데이터베이스를 분리합니다.

use master
go
sp_detach_db "model"
go

C:\Mssql7\Data에서 E:\Sqldata로 Model.mdf 및 Modellog.ldf를 이동합니다.

다음과 같이 model 데이터베이스를 다시 부착합니다.

use master
go
sp_attach_db "model","E:\Sqldata\model.mdf","E:\Sqldata\modellog.ldf"
go

Enterprise Manager(엔터프라이즈 관리자)의 시작 매개 변수 상자에서 _T3608 추적 플
래그(Trace Flag)를 제거합니다.

SQL Server를 중지하고 다시 시작합니다.

sp_helpfile을 사용하여 새 위치에 파일이 제대로 이동되었는지를 확인할 수 있습니
다.
use model
go
sp_helpfile
go

5. Tempdb 이동
ALTER DATABASE 문을 사용하여 tempdb 파일을 이동할 수 있습니다.
다음과 같이 sp_helpfile을 사용하여 tempdb 데이터베이스에 대한 논리 파일 이름을
알아냅니다.

use tempdb
go
sp_helpfile
go

다음과 같이 ALTER DATABASE 문에 논리 파일 이름을 지정합니다.

use master
go
Alter database tempdb modify file (name = tempdev, filename
= "E:\Sqldata\tempdb.mdf")
go
Alter database tempdb modify file (name = templog, filename
= "E:\Sqldata\templog.ldf")
go

변경 내용을 확인하는 다음 메시지가 표시되어야 합니다.
File "tempdev" modified in sysaltfiles. Delete old file after restarting SQL
Server.

File "templog" modified in sysaltfiles. Delete old file after restarting SQL
Server.
tempdb에서 sp_helpfile을 사용하면 SQL Server를 다시 시작할 때까지는 이러한 변경
내용을 확인할 수 없습니다.

SQL Server를 중지하고 다시 시작합니다.

이상이 DB를 새로운 위치로 옮기는 작업이었습니다
2005/06/15 13:49 2005/06/15 13:49
출처 : 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도 없다면, 로그백업을 하더라도 복구할 수가 없
다. 그리고, 로그가 생성되지 않는 옵션을 설정해 놓았다면, 로그가 없으므로 로그백업은 무의미하다.
2005/06/15 13:48 2005/06/15 13:48
Query Analyzer 를 이용한 데이터 추출 시 256 문자가 넘는 필드 값이 잘려 나오는 경우가 발생할 때
다음과 같이 옵션을 바꾸어 줌으로써 해결할 수 있습니다.

Query Analyzer 를 실행 시킨 후 도구 -> 옵션 -> 결과 탭 에서 "열 당 최대 문자 수" 값을 기본 256에서 원하는 값으로 바꿉니다.
2005/06/15 13:40 2005/06/15 13:40
http://www.aspkorea.org

SQL 2000 부터는 트랜잭션 로그를 지우는 명령어가 없다.

트랜잭션 로그는 어떤 작업을 수행하고 있을 때, 만일 그 작업이 중간에 중단된 경우 프로그램은 자동으로 데이터를 원점으로 되돌리기 위해 사용되는 특수한 로그이다. 예를 들어, 데이터의 인덱스를 새로 매기는 등의 작업을 수행할 때, 중간에 컴퓨터의 전원이 꺼졌다면 데이터는 부팅 이후 원점으로 복귀된다. 이러한 기능을 트랜잭션 로그가 수행하는 것이다.

그런데, 트랜잭션 로그는 또한 쓸 데 없이 자리를 차지하는 경우도 많다. 따라서, 주기적으로 로그를 삭제해 주어야 할 필요가 있다. 또한, 방대한 데이터베이스에서 작업을 수행할 경우 한 번 늘어난 데이터베이스 파일, 특히 로그파일이 줄어들지 않고 용량을 잠식하는 경우가 있다. 이러한 때 다음 명령어를 사용하여 로그를 줄인다.

먼저, 트랜잭션 로그를 삭제하는 명령어이다.

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

트랜잭션 로그 등은 백업 명령어로 자동으로 삭제된다. 이 때 백업을 실제 수행하지 않고 로그만을 지우라는 명령어이다.

그러나, 로그의 증가로 인해 파일 자체의 용량이 커졌을 수 있다. 이 때 다음 명령어를 수행하여 파일 자체의 용량을 줄여 준다.

DBCC SHRINKFILE(데이터베이스명_LOG, 1)
--> 로그를 1MB로 줄이라는 명령어이다.

또한, 데이터베이에서 많은 내용을 지워 덜어낸 경우, DB에 할당된 파일의 크기가 실제 사용량보다 커진 경우가 있다 이럴 때는 다음과 같이 용량을 줄여 준다.

DBCC SHRINKFILE(데이터베이스명_DATA, 최종 크기)

그러나, 데이터베이스나 로그가 항상 일정 크기 이상을 사용할 경우, 무턱대고 용량을 줄이는 것은 성능상의 문제를 야기할 수도 있다. 특히 로그의 경우 순차적으로 액세스를 하기 때문에 저장 공간의 조각으로 인한 피해를 볼 수 있다.
2005/06/15 13:39 2005/06/15 13:39
출처 : http://sqler.pe.kr

Windows의 Administrator 또는 Administrators 그룹의 소속원으로 SQL서버 시스템에 로그인 합니다.

쿼리 분석기를 수행하고. 윈도우 인증을 택한후 확인을 눌러 로그인 하십시요.

그후

sp_password null, '바꿀SA암호', 'sa'

로 하시면 sa의 암호를 변경 가능합니다.
2005/06/15 13:39 2005/06/15 13:39
ODBC 추적을 사용 가능하게 설정하면 아래와 같은 두 가지 문제가 발생할 수 있습니다.

* SQL.LOG 파일이 매우 커질 수 있고 이로 인해 해당 파일이 위치한 드라이브의 기존 디스크 공간이 모두 소모될 수 있습니다.

* ODBC 추적과 관련된 입/출력 오버헤드가 많아질 수 있고 이로 인해 ODBC 응용 프로그램 또는 추적을 수행 중인 컴퓨터에 있는 다른 응용 프로그램의 성능에 심각한 영향을 미칠 수 있습니다.


ODBC 추적의 설정을 해제하고 연결된 파일을 제거하려면 아래 단계를 수행합니다.

1. ODBC 추적의 설정을 해제하는 방법

a. Microsoft Windows NT 4.0
시작 메뉴에서 제어판을 누른 다음 ODBC 데이터 원본을 누릅니다.
추적 탭을 누르고 추적 중지를 선택합니다.


b. Microsoft Windows 2000
시작, 제어판, 관리 도구를 차례로 선택한 다음 ODBC 데이터 원본을 누릅니다.
추적 탭을 누르고 추적 중지를 선택합니다.

2. 모든 ODBC 응용 프로그램을 중지하고 SQL Server를 중지합니다. 이 파일을 삭제하기 전에 서버를 다시 부팅하여 파일을 비워야 할 수도 있습니다.

3. ODBC 추적 파일을 삭제합니다. 이 파일의 경로는 대개 "C:\SQL.LOG"입니다.

4. SQL Server를 다시 시작합니다.


출저 - microsoft support 페이지
2005/06/15 13:38 2005/06/15 13:38
DBCC SHRINKFILE을 사용하여 트랜잭션 로그를 축소하는 방법 입니다.


SQL Server 2000에서는 로그를 축소하는 작업이 지연되지 않고 즉시 수행됩니다. 그러나, 일부 상황에서는 먼저 추가 작업을 수행해야 로그 파일을 원하는 크기로 축소할 수 있습니다.


* 로그의 활성 부분을 비우기 위해 BACKUP LOG 문을 실행합니다.

* 로그 파일이 대상 크기로 줄어들 때까지 원하는 대상 크기를 사용하여 DBCC SHRINKFILE을 다시 실행합니다.

아래 예제에서는 pubs 데이터베이스를 사용할 때 이 방법을 사용하여 pubs_log 파일을 2MB로 축소하는 단계를 보여줍니다.

1. DBCC SHRINKFILE(pubs_log, 2)을 실행합니다.

2. 대상 크기로 축소되지 않고 아래와 같은 메시지가 반환됩니다.


모든 논리 로그 파일이 사용 중이므로 로그 파일 2(Pubs_log)을(를) 축소할 수 없습니다.
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
----- ------- ------------ ----------- ------------- ------------------
6........2............3048..............128................3048.................128 <- 여기 있는 모든 값은 변할 수 있습니다.

(1개 행 적용됨)

DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.


3. BACKUP LOG pubs WITH TRUNCATE_ONLY를 실행합니다.

4. DBCC SHRINKFILE(pubs_log,2)을 실행합니다.

5. 이제 트랜잭션 로그가 대상 크기로 줄어듭니다.


출처 - SQL Server 2000 Books Online에서 "Shrinking the Transaction Log"
2005/06/15 13:38 2005/06/15 13:38
출처 : 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) 정리

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

물론 복구할 일이 없는데 제일 좋지만 만일의 경우에 대비해서 연습해 두는 것이 좋습니다. 그리고 백업받은 데이터는 안전하게 보관을 하고 있어야 합니다. 아무리 복구 방법을 잘 안다고 해도 백업받은 데이터가 손상이 된 상태라면 아무 의미가 없기 때문입니다.
2005/06/15 13:38 2005/06/15 13:38
출처 : 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

예제:

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




<% '이소스가 실제를 쓰는 소스일 것이다.
db.open "Driver={SQL Server}; Server=waglnet;Database=blood; UID=zerg; PWD=zerg"
function nullcheck(a)
if trim(a)="" then
%>

<% response.end
else
nullcheck=replace(trim(a),"'","''")
end if
end function
function htmlcheck(b)
htmlcheck=server.htmlencode(b)
end function
%>


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

DNS이용 ODBC연결법 첫번째



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

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

%>


DNS없이 ODBC연결법 두번째



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

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

%>


DNS없이 ODBC연결법 세번째



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

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

%>


DNS없이 ODBC연결법 네번째



<% '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 직접 접근 방법 첫번째



<% '컴퓨터이름으로

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

%>


OLE DB 직접 접근 방법 두번째



<% ' IP로

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

%>


OLE DB 직접 접근 방법 세번째



<% '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 직접 접근 방법



<% 'CNU연결명으로

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

%>




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

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

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



<%

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

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라는 것.

어때요? 쏙쏙 들어오죠???
2005/06/15 13:37 2005/06/15 13:37
출처 : http://www.sqlservercentral.com/

내용 : 10 Steps to Securing your SQL Server

SQL서버의 보안을 높이기 위한 10단계의 글이며 요약 내용은 다음과 같습니다.


가능한 윈도우 인증을 사용한다.

sa계정 사용을 주의한다.

BUILTIN/Administrators 그룹을 제거한다.

서비스 시작 계정을 변경한다.

실패한 로그인과 거부된 로그인을 감사한다.

최신 서비스팩과 핫픽스를 적용하고 유지한다.

확장 저장 프로시져를 보호한다.

SQL서버 포트를 변경하고 보호한다.

저장 프로시져를 통한 접근을 제어한다.

OS를 보호한다.
2005/06/15 13:34 2005/06/15 13:34
1. 저장 프로시져 생성시 SET NOCOUNT ON 옵션을 활성화하라
네트워크 소통량을 줄일수 있다.(DONE_IN_PROC 메시지 발
생이 비활성화 되기 때문에 클라이언트로 결과행 갯수를
알려주는 패킷을 전달할 필요가 없다)

2. 프로시져 호출시 소유자를 지정하는 것이 좋다. 소유자를 생략하면
프로시져 캐시에서 프로시져를 찾을수 없기 때문에 SQL 서버가 그
프로시져에 대해 컴파일 잠금을 수행하게 된다.

3. 동적 T-SQL 을 실행할때는 EXEC() 보다 sp_excutesql 을 사용하는것이
좋다.sp_excutesql을 사용하게 되면 실행계획이 캐시로 저장되어 나중에
재사용 될 수 있는 이점을 가지게 때문이다.

* 실행계획이 캐쉬에 있으면 그 프로시져가 호출될때 실행계획을 새로 만들지
않고 캐시에 있는 것을 재사용할 수 있다. 이렇게 되면 프로시져를
처음 실행할때 행하는 쿼리 트리구성과 계획 생성 작업을 수행하지 않아도 되며.
이것이 T-SQL 일괄 처리 보다 뛰어난 성능상의 장점이다.

4. RPC 요청은 SQL Server의 많은 명령문 구문 분석과 매개 변수 처리를 무시하며
Transact-SQL EXECUTE 문을 사용하는 것보다 빠르게 진행됩니다

5. 오브젝트 이름에 소유자를 지정하는 것이 성능향상에 도움이된다.
프로시져의 경우 소유자를 지정하지 않으면 SQL 서버는 그 프로시져에 대해
컴파일 잠금을 필요로 하는데 결국은 SQL서버가 실행계획이 필요하지 않다는
판단을 하게 되어 불필요한 잠금을 하게 되는것이다.이렇게 되면 블로킹 경합을
유발할수 있게 때문에 프로시져 호출시 DB.DBO.proc 의 형태로 호출을 하는것이
성능향상에 유리하다.

6. 임시 테이블을 사용하지 않는것이 유리하다.TEMPDB 에서 리소스 경합이 발생하여
뜻하지 않은 저장 프로시져 재 컴파일과 같은 결과를 가져올 수 있다. table 변수를
사용하게 되면 임시 테이블을 사용하는 것과 같은 일들을 할 수 있다.임시 테이블을
사용했다면 그 사용이 끝났을 경우 꼭 임시 테이블을 삭제한다. 시스템 리소스를 잡아
먹을수 있다.

7. HAVING 절 보단 WHERE 을 사용하라. HAVING 을 인덱스 스캔을 하고 where 는 인덱스
seek를 한다. HAVING을 사용한 경우에는 내부적으로 필터링 방식으로 변환해 주지만
인덱스 사용방식이 비효율적인 방식으로 남아 있기 때문에 where 절을 이용하는것이
더 좋다.
2005/06/15 13:34 2005/06/15 13:34
1. Data Fragmentation 정리 작업 이유 및 효과: Index Rebuild를 하게 되면 분산된 데이터를 모을 수 있습니다. 따라서, 적은 수의 IO로 동일한 데이터를 가져오게 됨에 따라 성능이 개선이 됩니다.

방법: 각 데이터베이스내에서 테이블 혹은 개별적인 Index에 대하여 수행할 수 있으며 Index Rebuid란 Index를 생성하는 작업이므로 데이터 량에 따라 수행시간이 오래 걸릴수 있습니다. 또한 Index의 종류에 따라서 Select만 허용하거나 모든 요청을 거부할 수 있으므로 사용자가 Access하지 않는 시간에 수행을 하시기 바랍니다.

ex 1. 테이블에 있는 모든 Index를 Rebuild하고자 하는 경우

DBCC DBREINDEX(table 명)

ex 2. 테이블에 있는 특정 Index를 Rebuild 하고자 하는 경우

DBCC DBREINDEX(table 명, index 명)

수행 주기: DBCC Showcontig를 수행하였을 때 Scan Density가 100%로 표시되면 데이터가 연속적으로 저장되었다는 의미이므로 이 수치가 낮을 경우 성능이 저하가 됩니다. 따라서, 이 문장을 수시로 수행하여서 해당 값이 낮을 경우 수행합니다.

2. Data Consistency Check 작업 이유 및 효과: SQL Server가 자체적으로 데이터 관리를 하기는 가끔 데이터의 일관성에 문제가 발생할 수 있습니다. 이러한 문제가 발생하면 성능이 저하되거나 timeout 오류가 발생하게 되므로 정기적으로 일관성 체크를 해야 됩니다.DBCC (Database Consistency Checker)를 사용하여, Database와 Object의 integrity를 monitoring 하여 오류를 점검합니다. DBCC를 수행하지 않고 DB backup을 받게 되면, 문제가 발생한 (예: table corrupt, …) 데이터를 그대로 backup 받을 수 있는 위험성을 내포하고 있고, 제대로 backup이 되지 않아서 문제 발생시에 복구가 불가능해 질 수 있습니다.

방법: 각 데이터베이스에 대해 수행하며, 데이터베이스 전체 혹은 테이블 단위로 수행할 수있습니다.

ex 1. 임의의 데이터베이스 전체에 대하여 수행하고자 하는 경우

DBCC CHECKDB(db 명)

ex2. 임의의 데이터베이스 내의 한 테이블에 대하여 수행하고자 하는 경우

DBCC CHECKTABLE( table 명)

위 수행 결과를 반드시 확인하시어 오류가 발생할 경우 오류 메시지에 지시된 대로 작업을 하시기 바랍니다.

또는 마이크로소프트 고객기술지원부로 연락 주시기 바랍니다.

수행 주기: 위 DBCC 작업은 최소한 주 1회 수행을 해주시기 바랍니다

3. SQL Server Errorlog 내용 확인

- 매일 errorlog file의 내용을 확인하여, 문제를 조기에 발견하고 조치를 취해야 합니다.

- Errorlog file 위치 : Microsoft SQL Server 가 설치되어 있는 위치가 C:\MSSQL 이라고 가정하면 C:\MSSQL\LOG 의 ERRORLOG 라는 이름의 파일이 존재하게 됩니다. - ERRORLOG file 은 마지막으로 SQL Server가 start된 이후부터 지금까지의 errorlog내용을 가지고 있으며, 이외에 ERRORLOG.1, ERRORLOG.2, ... 등의 파일이 존재하는데, 이 파일들은 그 이전의 errorlog file들을 history관리를 위해 backup해 두는 파일입니다. - 문제 발생시에 문제발생시점 및 원인을 정확하게 판단하는데 있어서, 이전의 errorlog file이 필요한 경우도 있으므로 errorlog.* 파일들도 가능한 한 삭제하지 말고 유지하시기 바랍니다.

- Errorlog file에는 심각한 error, SQL Server관리와 관련되는 작업에 대한 내용 등이 기록되므로, 가능한 한 자주 Monitoring해야 하며 일반적인 Database 문제 발생시에도 일차적으로 errorlog 를 확인하는 것이 도움이 됩니다.

- ERRORLOG file에는 Error에 대한 Error Number, Severity Level, Error Message 등이 기록됩니다

4. 계획적인 Database Full Backup 및 Transaction Backup

DB 에 문제가 발생하는 경우에 복구가 가능하도록, backup을 받아야 합니다.

- 주기적으로 아래의 데이터베이스들을 backup해야 합니다.

Master database, Msdb database, 모든 user database들, Distribution database

- Database backup 전략을 수립하여, scripts를 작성하고, SQL Server 7.0 에서 제공되는 "Scheduled Tasks" 기능을 이용하여 주기적으로 수행되도록 작업할 수 있습니다.

- Backup 방법은 아래 두가지로 나누어 집니다.

1) Database 전체를 backup 하는 작업 (Full Backup)

Data 와 Transaction log를 모두 backup 받습니다.

이 방법은 Transaction log를 삭제하지는 않기 때문에, 추가적으로 Database backup 하기 전에 Transaction log를 삭제하는 작업을 수행시켜 주는 것이 필요.

2) Transaction log 만 backup 하는 작업 (Transaction Log Backup)

Transaction log를 backup받고 삭제해 줍니다.

- 데이터베이스를 사용자들이 사용하는 동안에도 backup이 가능합니다.

Backup을 수행하면 SQL Server가 다소 느려질 수 있으므로, SQL Server를 많이 사용하지 않을 때 작업하시는 것이 좋습니다.

- Backup 에 대한 책임은 기본적으로 SA 와 Database Owner 에게 부여되며, Database Owner가 다른 사용자(user)에게 권한을 부여할 수도 있다.

- <주의> 다른 Character set과 Sort order를 사용하는 SQL Server에서 backup(dump database) 받은 데이터베이스는 Restore (Load Database)할 수 없습니다.

- 정기적으로 데이터베이스전체를 backup 받습니다.

backup database to

는 Disk, Tape 모두 가능합니다.

- Transaction Log full이 발생하지 않도록 짧은 기간 단위로 Log를 backup 받습니다.

(매우 중요합니다. 소홀히 하면 Log가 가득 차게 되어 그 데이터베이스에 대해서는 데이터에 대한변경작업을 할 수가 없게 됩니다.)

backup transaction to

- DB 의 Log 가 full 된 경우에는, 다음과 같이 Log 를 비워 줍니다.

backup transaction with truncate_only

위 작업 수행후에도 Log 가 회수되지 않으면, 아래와 같이 수행해 줍니다.

backup transaction with no_log

- Master DB 및 주요 System Table backup

- master database 도 주기적으로 backup (dump database)을 받아야 하며, 특히, master database 에 변경이 발생하는 작업 (create database, sp_addlogin, sp_addserver, ...)을 수행한 후에는 즉시 Backup을 받아야 합니다.

<예> backup database master to disk='C:\MSSQL\BACKUP\master_0820.bak'

6. 정기적인 Bulk-copy로 SAM File 확보

- 모든 DB, Obj- master database의 주요 system table들에 대해서는 주기적으로 bcp out을 받습니다. (sysdatabases, sysdevices, sysusages table은 데이터베이스들에 대한 정보를 관리하므로 특히 주의해서 변동이 발생할 때마다 bcp out 을 받아 두시는 것이 좋습니다.) 명령프롬프트에서 bcp Utility를 사용하여 파일로 받으시면 됩니다.

Bcp master.. out -Usa -P -S -c

<예> C:\MSSQL\BACKUP> mkdir bcpout C:\MSSQL\BACKUP> cd bcpout C:\MSSQL\BACKUP\bcpout> bcp master..sysdatabases out sysdatabases.csv -Usa -P -c

C:\MSSQL\BACKUP\bcpout> bcp master..sysusages out sysusages.csv -Usa -P -c C:\MSSQL\BACKUP\bcpout> bcp master..sysdevices out sysdevices.csv -Usa -P -c - 이 작업을 batch file (*.bat) 로 작성해서 필요할 때 그 batch file을 수행하면 편리합니다.

- 주요 데이터를 저장하고 있는 Table인 경우에는, bcp 를 사용하여 주기적으로 backup 을 받아 두는 것이 좋습니다.

7. 모든 DB, Objects에 대한 Scripts 유지, 관리

- 모든 데이터베이스구축과정에서 작성한 모든 Scripts들에 대하여 최신Version을 관리합니다.

- 주기적으로 DB관리자는 SQL Enterprise Manager 를 사용하여 Scripts 들을 파일로 받아서 관리합니다.

- SQL Enterprise Manager 에서 SQL Server 를 선택하고 Databases에서 데이터베이스를 선택한 다음 Object 메뉴를 선택하고 Generate SQL Scripts 를 선택하면 Scripts를 파일로 받을 수 있습니다.

8. DB free space 확인

- 주기적으로 데이터베이스별로 free space를 확인해서 여유공간이 부족한 경우에는, 미리 영역을 확보해줍니다.

- 데이터영역에 free space가 없는 경우 : 데이터베이스의 Data영역을 확장하거나 불필요한 데이터를 삭제하는 작업을 통해 free space를 확보합니다.

(SQL Enterprise Manager 또는 ALTER DATABASE command를 사용함.) Alter database on =

- Log영역에 free space가 없는 경우 : Transaction Log 정보를 backup 받거나 Transaction Log 를 삭제합니다.

backup tran to 또는 backup tran with truncate_only 또는 backup tran with no_log go
2005/06/15 13:33 2005/06/15 13:33
-- 다중 볼륨 백업
backup database test to disk='d:\north.bak' , disk= 'd:\north2.bak'

-- format missing
backup database test to disk='d:\north.bak' , disk= 'd:\north2.bak' , disk= 'd:\north3.bak'

-- format 지정
backup database test to disk='d:\north.bak' , disk= 'd:\north2.bak' , disk= 'd:\north3.bak' with format
2005/06/15 13:32 2005/06/15 13:32
Process를 kill하는 방법 대신 아래의 command를 사용합니다.

지정한 초 수가 경과한 후 롤백할 것인지 또는 즉시 롤백할 것인지를 지정할 수 있습니다.

예>
-- 10초 후에 single_user 모드로 변경하는 alter database를 수행한 프로세스를 제외한
-- 다른 프로세스(DB명에 연결되어 있는)는 rollback 됩니다.
alter database DB명 set single_user with ROLLBACK AFTER 10

-- 다른 프로세스는 즉시 rollback 됩니다.
alter database DB명 set single_user with ROLLBACK IMMEDIATE

-- 멀티 유저로 데이터베이스 변경
alter database DB명
set multi_user with rollback immediate
go
2005/06/15 13:06 2005/06/15 13:06
1. 로컬하드디스크에 먼저 백업한 후 그 파일을 테잎장치로 옮긴다.

여러분이 백업을 수행할때 몇몇 SQL 명령어는 작동하지 않는다. 예로 백업을 수행하고있는 동안에는 Add File이나 Remove File과 함께 Alter Database를 사용할 수 없고 데이터베이스를 축소시킬수도 없다. 또한 Create Index문등 여러가지 명령어는 사용 불가능하다. 따라서 백업 수행시간을 줄이기 위해서 로컬 하드디스크에 먼저 백업을 한 후 이를 테잎장치로 옮기는 것이 좋다. 테잎 장치는 일반적으로 하드디스크보다 굉장히 느리기 때문이다. 가능한한 백업 수행시간을 줄여서 그 여파를 줄이는 것이 좋다.


2. 여러 백업 디바이스에 백업을 수행한다.

SQL Server는 각각의 백업 디바이스에 대해서 개별의 백업 스레드를 할당하기 때문에 백업을 병렬로 처리할 수 있다.
여러 물리적 디스크로 배열이된 곳에 백업을 수행한다.
역시 각각 개별 디스크의 개별 백업 디바이스에 스레드가 할당된다.


3. 데이터베이스 사용이 적을때 백업을 수행한다.

백업작업은 확보된 리소스가 많을수록 좋은 성능을 내기 때문에 CPU 사용이 적은 시간대에 작동하도록 스케쥴 작업으로 만드는 것이 좋다.


4. 복원시간의 축소가 중요할 경우 전체 백업을 사용한다.

전체 백업은 차등 백업이나 트랜잭션 로그 백업에 비해 시간이 더 오래걸리나 복원시는 가장 빠르다.


5. 백업시간의 축소가 중요할 경우 트랜잭션 로그 백업을 사용한다.

트랜잭션 로그 백업은 전체 백업이나 차등 백업에 비해 백업속도는 빠르나 복원시 가장 오래 걸린다.


6. 사용자가 정기적으로 동일한 데이터를 업데이트한다면 트랜잭션 로그 백업 대신 차등 백업을 사용한다.

차등 백업은 마지막 데이터베이스 백업 이후의 변경된 데이터 페이지만 백업하기 때문에 트랜잭션 로그 백업으로부터 트랜잭션 로그를 복원할시 처음 로그부터 롤포워드되는 시간을 절약할 수 있다.


7. 데이터베이스가 개별 파일이나 파일그룹에 나누어져 있다면 파일/파일그룹 백업을 고려한다.

각 개별 파일/파일그룹 백업의 경우 백업작업을 빨리 끝낼수 있기 때문에 백업 때문에 서버에 주는 영향을 줄일 수 있다.


8. 성능모니터를 사용하여 백업에 전체 시스템에 미치는 영향을 측정한다.

다음과 같은 측정치를 확인한다.
1. SQL Server Backup Device: Device Throughput Bytes/sec - 특정 백업 디바이스의 작업량을 나타낸다.
2. SQL Server Databases: Backup/Restore Throughput/sec - 전체 데이터베이스의 백업, 복원 작업량을 나타낸다.
3. Physical Disk: %Disk Time - 읽기쓰기 작업에 의해 디스크가 얼마나 작동하는지 퍼센티지로 알려준다.
4. Physical Disk Object: Avg.Disk Queue Length - 디스크 액세스를 위해서 평균적으로 시스템이 얼마나 요청하는지 알려준다.


9. 백업작업에 소요되는 시간을 줄이기 위해서 자주 백업하는 것을 고려해본다.

자주 백업을 할수록 그 크기는 작기 때문에 서버에 적은 영향을 미친다. 또 다른 이점으로는 데이터베이스에 장애가 일어났을시 손실될 수 있는 데이터의 양도 작아진다.


10. 테잎 장치는 다른 디스크나 CD롬 드라이브와 다른 SCSI버스에 위치시킨다.

테잎 장치의 SCSI버스를 독립적으로 두면 다른 드라이브와의 액세스 충돌을 피할 수 있기 때문에 최상의 백업 성능을 낼 수 있다. 마이크로소프트에서는 개별 SCSI버스에 테잎 장치를 위치시킬 경우 전송율이 원래 SCSI버스 속도의 50% 이상을 낸다고 한다.


11. 매우 큰 데이터베이스의 경우 SQL Server 2000 스냅샷 백업을 사용한다.

SQL Server 2000 스냅샷 백업과 복원 기술은 서드파티 하드웨어 또는 소프트웨어 공급업체를 필요로 한다. 스냅샷 백업/복원의 가장 큰 장점은 매우 짧은 시간안에 이를 수행할 수 있기 때문에(일반적으로 초단위로 수행된다.) 서버에 주는 영향을 극소화시킬 수 있다. 스냅샷 백업은 미러된 디스크를 짤라내던가 디스크의 블럭을 복사하는 방식으로 이루어지며 특정한 하드웨어와 소프트웨어를 필요로 한다
2005/06/15 13:05 2005/06/15 13:05
SQL Server 2000에서는 서버 단위 라이센스 모드가 사라지고, 프로세서 단위 라이센스 모드가 추가되었습니다. SQL Server 2000에서 허용되는 라이센스 모드는 다음과 같습니다.
사용자 단위 라이센스

1. 사용자 단위 모드에서는 SQL Server 2000 Server에 액세스할 각 장치마다 클라이언트 액세스 라이센스가 필요합니다. 사용자 단위는 클라이언트가 두 대 이상의 서버에 연결하는 네트워크에서 더 경제적입니다.


프로세서 라이센스

1. 프로세서 라이센스 모드에서는 SQL Server를 실행하는 각 컴퓨터의 프로세서마다 라이센스가 필요합니다. 프로세서 라이센스를 사용하면 장치 수에 관계 없이 인터넷이나 인트라넷을 통해 서버에 액세스할 수 있습니다.

2. 프로세서 라이센스를 사용할 때는 SQL Server 2000이 설치된 각 프로세서를 사용할 수 있으며 클라이언트 장치를 수에 제한 없이 지원합니다. 인터넷을 통해 SQL Server 데이터베이스에 대한 액세스를 제공하거나 많은 사용자가 있는 고객은 일반적으로 프로세서 라이센스를 선택합니다.
2005/06/15 13:02 2005/06/15 13:02
1. SQL의 DTS WIzzard(데이타 가져오기/내보내기)를 실행합니다.

2. 데이타 원본선택란을 클릭하여 변환을 원하는 소스타입을 선택한다.
ex) Micosoft Access,Microsoft Excel등을 선택

3. 소스 타입 선택후 버튼을 클릭하여 변경을 원하는 파일을 선택한다.

4. 변환할 파일 선택 합니다.

5. 선택후 다음을 클릭합니다. Access DB의 경우 사용자 ID와 암호가 있을 경우 입력합니다 .

6. Transfer할 대상을 선택합니다. (다이렉트 웹 호스팅 DB 서버)
서버와 사용자 이름,암호 입력후 데이타 베이스를 선택합니다.
데이타 베이스선택 완료후 다음을 클릭합니다.

7. Transfer할 방법을 선택합니다.
* DB서버에 테이블로 변환시 첫번째 '원본 데이터 베이스에서 테이블 및 뷰 복사'를 선택합니다.

8. 변환할 테이블을 선택합니다. 특별한 경우 외에는 기본 옵션을 사용십시요.

9. 실행 시기를 결정합니다. 기본값은 즉시 실행입니다.

10. 확인을 눌러 변환을 실행합니다.

11. Transfer중 진행률과 현재 상태가 표시 됩니다.

12. 정상적으로 완료될 경우 이와 같은 메시지를 확인할 수 있습니다.
ex)새창에 1개의 테이블을 Microsoft Access에서 Microsoft SQL Server(으)로 복사했습니다.

13. 변환 완료 후 해당 DB서버에 접속하여 정상적으로 테이블이 생성되었는지 확인합니다.
2005/06/15 12:52 2005/06/15 12:52
1. SQL Server 그룹에서 마우스 오른쪽 버튼을 누르고 새 SQL Server 등록을 선택합니다.

2. 새 SQL Server 등록을 클릭하면 서버 등록 마법사가 뜹니다. 다음 버튼을 클릭합니다.

3. 사용 가능한 서버에 클라이언트 네트워크 유틸리티에서 등록한 서버 별칭이 표시됩니다.

4. 여기에서 등록된 서버 별칭을 더블클릭하거나 선택한 후 추가버튼을 클릭하면 추가된 서버로 항목이 이동합니다.

5. 시스템 관리자가 할당한 SQL Server 로그인 정보[SQL Server 인증]을 선택합니다.

6. 로그인 이름과 암호를 입력합니다. SQL의 로그인 이름은 암호는 설치완료 메일을 확인해 보시기 바랍니다.

7. 서버 등록을 원하는 그룹을 선택합니다.

8. 서버 등록이 완료되었습니다.
2005/06/15 12:52 2005/06/15 12:52
*MS SQL Server 를 이용 할 때의 OLEDB connection 방법입니다.

strConnect="Provider=sqloledb;Data Source=DB서버 주소;Initial Catalog=DB명;User ID=계정;Password=암호;"
Set Db = Server.CreateObject("ADODB.Connection")
Db.Open strConnect


태그를 사용해서 DB를 연결하는 경우 예기치 않은 오류로 인해 홈페이지 접속에 문제가 있을 수 있고
서버에 많은 부하를 줄 수 있으니 사용하지 마시길 바랍니다.

※ MS SQL Server를 이용 할 때에는 서버명에 DB서버 주소(IP address로 입력), DB명, 유저 아이디, 비밀번호등을
기입하고 Db.Provider 부분에 "SQLOLEDB"라고 입력해야 합니다.
에러가 날 경우 대부분은 글자가 틀린경우 입니다. 한번 더 주의해서 확인하여 주시기 바랍니다.
2005/06/15 12:51 2005/06/15 12:51