오늘 SQL 2000에서 생성한 BAK을 SQL 2005 SSMS를 사용하여 복원을 하려고 했는데 실행이 되지 않았다.

알아본 결과, SQL 2000 파일을 바로 복원 할 수 없고 T-SQL을 사용하여 복원 시켜야 한다.

그럼 오늘은 그 방법을 알아보자.

우선 과정을 나누어 보면 3 단계이다.


  1. BAK 파일에 포함된 데이터베이스와 로그 파일의 목록을 확인한다.
  2. 데이터베이스를 복원한다.
  3. 특정 데이터베이스 동작이 지정된 버전의 SQL Server와 호환되도록 설정한다.

쿼리문은 다음과 같다.

--1단계
Restore FileListOnly
from Disk = 'c:\GOSLDW'
go

--2단계
restore database GOSLDW
from disk = 'c:\GOSLDW'
with move 'GOSLDW_Data' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\GOSLDW_Data.MDF',
MOVE 'GOSLDW_Log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\GOSLDW_Log.ldf',
stats = 10
go


--3단계
sp_helpdb GOSLDW
go
EXEC sp_dbcmptlevel 'GOSLDW', '90'
go
sp_helpdb GOSLDW
go

위의 쿼리를 실행시키면 아래와 같은 결과값을 볼 수 있다.
사용자 삽입 이미지

참고 : http://kwonsoonjong.com
Posted by leebaro
,

MSX 서버에서 온 작업이나 그단계 또는 일정을 추가 업데이트 삭제할 수 없습니다

해결


/*srvid = 0 srvname='LEETEST'*/
use master
select * from sysservers

/*originating_server='WEBTEST' 를 'LEETEST'로 수정해서 해결함.' */
use msdb
select * from sysjobs


EXEC sp_configure 'allow updates', 1

Update sysjobs
set originating_server = 'LEETEST'

EXEC sp_configure 'allow updates', 0



이러한 메시지가 뜰 것입니다.
"MAX 서버에서 온 작업 이나 그단계 또는 일정을 추가 업데이트 삭제할 수 없습니다."
"DEVPIA에서 찾은 QNA를 발췌하겠습니다.

========================================================
이 문제는 SQL2000의 특성으로 인해 발생하는 문제입니다.

모든 scheduling job들은 ‘msdb..sysjobs’ 시스템 테이블에 저장됩니다.
sysjobs 테이블에는 ‘originating_server’ 칼럼이 존재하고 이 칼럼에는 job이 생성된 server의 이름이 저장됩니다.
SQL7.0에서는 ‘originating_server’ 칼럼에 항상 ‘(local)’ 값이 저장되기 때문에 Server의 이름을 변경해도 영향을 받지 않습니다. 하지만, SQL2000에서는 Multiple Instance가 지원되기 때문에 ‘originating_server’ 칼럼에 실제 SQL Server의 instance명이 저장되게 됩니다.
만일, Server의 이름이 변경되면 현재의 Server명과 msdb..sysjobs’ 테이블에 저장된 ‘originating_server’의 값이 다르기 때문에 job 변경/삭제시 14274에러가 발생하게 됩니다.



다음의 쿼리를 실행하여 jon 변경/삭제시 발생하는 에러를 없앨 수 있습니다.


update msdb..sysjobs set originating_server = ‘<new server>’
where originating_server = ‘<old server>’


만일, Named Instance를 사용하는 job이라면 다음의 쿼리를 실행합니다.

update msdb..sysjobs set originating_server = ‘<new server>\<instance>’
where originating_server = ‘<old server>\<instance>’


참고적으로 ‘select * from msdb..sysjobs’ 쿼리를 실행한 다음 originating_server 칼럼을 확인하여 모든 job들에 대해 설정되어 있는 SQL Server명을 확인할 수 있습니다.
========================================================

이렇게 수행하셔도 되고
EM을 열고 직접 msdb 가셔서 모든 행 반환해서 수정하셔도 같은 결과가 나올겁니다.



출처 : http://inetinfo.org/tag/max%20%EC%84%9C%EB%B2%84

Posted by leebaro
,

MSDN을 참고하면 SQL 백업/복구를 위한 많은 정보들을 찾을 수 있다.

그 중에 몇 가지들을 살펴 보자.

SQL Server에서의 백업 개요

http://msdn2.microsoft.com/ko-kr/library/ms175477.aspx


SQL Server에서의 백업 복원 및 복구 작동 방법 이해

http://msdn2.microsoft.com/ko-kr/library/ms191455.aspx


SQL Server의 백업 및 복원 성능 최적화

http://msdn2.microsoft.com/ko-kr/library/ms190954.aspx


SQL Server의 백업 및 복원 전략 소개

http://msdn2.microsoft.com/ko-kr/library/ms191239.aspx


백업 및 복원 방법 도움말 항목(Transact-SQL)

http://msdn2.microsoft.com/ko-kr/library/aa337534.aspx


SQL Server의 데이터베이스 백업 및 복원

http://msdn2.microsoft.com/ko-kr/library/ms187048.aspx

Posted by leebaro
,
방화벽이 설정된 서버에 있는 SQL Server 또는 SSAS에 붙기 위해서는

해당 프로그램과 연결하는 포트를 방화벽에서 접근 가능하게 변경 해야 한다.

포트 번호는

SQL Server  : 1433 - TCP
S   S   A   S : 2725 - TCP

사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지


위와 같이 설정 하면 접속이 가능하다.

한가지 더 유의 할 점은 원격 SSAS또는 Analysis Serviecs2000에 접속 할 시에는 Client 를 설치 해야한다. 이것은 Setup시 추가 가능하다 SQL2005에서 Analysis Services 2000 에 접속 할 때는, Native Client를 설시하면 된다.
Posted by leebaro
,
db테이블에 한 차량의 1년치 내용별 데이터가 들어있습니다.


차종,    날짜,          내용,     금액

마티즈, 2007-10-01, 주유비, 10000원

마티즈, 2007-10-02, 주유비,  5000원

마티즈, 2007-10-03, 정비비, 25000원

아반떼, 2007-10-03, 보험료, 30000원    
.
.
.

위와 같이 차량도 종류별로 있고.. 내용도 종류별로 있다. 크게보면 6가지로 구분된다.
이걸 아래처럼 만들 것이다.


 월 | 비용합계 |  주유비 | 정비비 |  ... |  기타  |  합계 |

1월          00원        00원       00원    ...     00원     000원

2월          00원        00원       00원    ...     00원     000원

3월          00원        00원       00원    ...     00원     000원     

'

'

'

12월        00원        00원       00원    ...     00원     000원

합계      000원       000원     000원    ...    000원   0000원


방법.

날짜 중에 월과 내용을 기준으로 Group by를 해주시면 월별 합계가 나온다.
마찬가지로 년과 내용을 기준으로 Group by를 사용해보시면 년별 값계가 나온다.


우선 날짜를 월별로 그룹화 하시려면 뒤에 일자를 잘라 주어야 한다.

char 형식으로 되어 있다면

Select Left(날짜,7) from 테이블 이런식으로 자르시면 된다.

그룹화 하시는 더 자세한 내용을 보시려면 http://sqler.pe.kr/sql2k/28.asp 링크를 참고해 주세요

결과적으로 아래와 같은 쿼리를 사용하여 차종, 월별, 내용 별로 합계를 구할 수 있다.
SELECT 차종, 날짜, 내용, SUM(금액) FROM 테이블 Group by 차종, LEFT(날짜,7),내용


Posted by leebaro
,

하나의 테이블에 부모와 자식 값이 있다. 이것을 조인을 사용하여 부모와 자식 값을 연결 해준다. 그리고 결과값은 아래와 같이 나와야 한다.

--------------------------------------
PIDX          |    LORDER         |  TITLE
---------------------------------------
    null                  1                     T1
      1                    1                     T1-1
      1                    2                     T1-2
      1                    3                     T1-3
    null                  2                     T2
      2                    1                     T2-1
      2                    2                     T2-2
그럼 PIDX와 LORDER을 기준으로 정렬을 하고 가상의 컬럼을 하나 추가해 PIDX와 같은 겂으로 넣어주고 NULL일때만 LORDER 값을 넣어 주면 된다.


CREATE TABLE TEST1 (
[IDX] [int] IDENTITY (1, 1) NOT NULL primary key clustered,
[PIDX] [INT]NULL ,                ------ 부모 IDX
[LORDER] [TINYINT] NOT NULL ,   ----------- 동일 부모의 자식들간의 출력순서
[TITLE] [varchar] (50) NOT NULL
)
go

INSERT INTO TEST1 values(null, 1, 'T1')
INSERT INTO TEST1 values(null, 2, 'T2')
INSERT INTO TEST1 values(1, 1, 'T1-1')
INSERT INTO TEST1 values(1, 2, 'T1-2')
INSERT INTO TEST1 values(1, 3, 'T1-3')
INSERT INTO TEST1 values(2, 1, 'T2-1')
INSERT INTO TEST1 values(2, 2, 'T2-2')
go

방법

select distinct a.pidx , a.lorder, a.title, order_IDX = case a.pidx when null then a.lorder else a.pidx end
from test a
left outer join test b on b.pidx = a.lorder
order by order_idx , lorder asc



Posted by leebaro
,
create table test(URL varchar(50))
insert test
select 'http://blog.rss.naver.com/pjh0001.xml' union all
select 'http://blog.rss.naver.com/pjh0002.xml' union all
select 'http://blog.rss.naver.com/pjh0003.xml' union all
select 'http://www.naver.com/image/images/pjh0004.xml'

------------------------------------
select reverse(parsename(left(reverse(URL),charindex('/',reverse(URL),1)-1),1)) URL from test
/*
URL
---------------
pjh0001
pjh0002
pjh0003
pjh0004

출처 : SQLER
Posted by leebaro
,

그래픽 실행 계획 표시

http://technet.microsoft.com/ko-kr/library/ms178071.aspx


실행 계획을 만드는 T-SQL

http://technet.microsoft.com/ko-kr/library/ms187886.aspx

웹캐스트: Microsoft SQL Server 2000: SQL Server 2000에서 실행 계획 읽기

http://support.microsoft.com/kb/815337/ko

Posted by leebaro
,
Posted by leebaro
,

테이블을 만들다 보면 똑같은 키 값이지만 입력된 날짜 순으로 데이터가 들어 갈 수 있다. 나중에 다른 테이블과 조인을 하려고 하는데 중복되는 최신 값 중에 최신 값을 기준으로 하고 싶다면 아래와 같은 쿼리를 사용하여 max와 Group by를 이용하면 된다.

select B.stitle,A.sdate,sflag from (select stitle,max(sdate) sdate from test01  group by
stitle) A  inner join
test02 B ON A.stitle = B.stitle

Posted by leebaro
,