Openfiler는 LInux 기반의 iSCSI Storage Appliance Software이다.
일반적으로 스토리지 업체에서 제공하는 하드웨어 기반 iSCSI 솔루션에 비해 부족함이 없지 않겠지만, 상대적으로 굉장히 저렴한 비용과 편리한 설정과 관리가 가능하다는 장점이 있다.
물론 찾아 보면 다른 솔루션들도 많이 있지만 테스트 해본 것들 중 가장 안정적인 것 같다.
While Loop를 사용하는 아래와 같은 쿼리가 있다.
(원래 Cursor를 사용 하던 쿼리였다.)
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRAN -- 트랜잭션 시작
DECLARE @RegUser CHAR(8)
SET @RegUser='20070073'
DECLARE @iCnt INT -- Loop 변수
, @iTotalCnt INT -- 전체 데이터 수
, @sPrevColGrp VARCHAR(30)
SELECT @iCnt=0, @iTotalCnt=0, @sPrevColGrp=''
-- 임시 테이블 선언
DECLARE @tbTmp TABLE (
Idx INT IDENTITY(1,1)
,ColGrp INT
,Col01 VARCHAR(30)
,Col02 VARCHAR(30)
,Col03 VARCHAR(30)
,RegDate DATETIME DEFAULT(GETDATE())
)
DECLARE @tbTmp2 TABLE (
ColGrp INT
,ColGrpSeq INT
,RegDate DATETIME DEFAULT(GETDATE())
)
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('1', 5477)
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('2', 8901)
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('3', 9901)
INSERT INTO @tbTmp (ColGrp, Col01, Col02, Col03)
SELECT *
FROM (
SELECT '1' AS ColGrp, 'Col01_1' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '2' AS ColGrp, 'Col01_2' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '2' AS ColGrp, 'Col01_3' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '3' AS ColGrp, 'Col01_4' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '3' AS ColGrp, 'Col01_5' AS Col01, '' AS Col02, '' AS Col03
) A
SELECT @iTotalCnt=COUNT(*) FROM @tbTmp -- 선택된 항목의 COUNT
WHILE (@iTotalCnt>@iCnt) -- Loop 시작
BEGIN
SET @iCnt = @iCnt+1 -- Loop count 증가
PRINT ('@iTotalCnt is ' + CAST(@iTotalCnt AS VARCHAR) + ', @iCnt is ' + CAST(@iCnt AS VARCHAR))
IF (((SELECT ColGrp FROM @tbTmp WHERE Idx=@iCnt) <> @sPrevColGrp) OR (@sPrevColGrp = ''))
BEGIN
SELECT @sPrevColGrp = ColGrp FROM @tbTmp WHERE Idx=@iCnt
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq)
SELECT A.ColGrp, (MAX(B.ColGrpSeq)+1) AS ColGrpSeq
FROM @tbTmp A
JOIN @tbTmp2 B
ON A.ColGrp = B.ColGrp
WHERE A.Idx =@iCnt
GROUP BY A.ColGrp
UPDATE @tbTmp
SET Col02 = A.Col01 + '_' + CAST(ISNULL( (SELECT MAX(ColGrpSeq) FROM @tbTmp2 WHERE ColGrp = A.ColGrp) , 1) AS VARCHAR)
FROM @tbTmp A
WHERE A.Idx>=@iCnt
END
UPDATE @tbTmp
SET Col03 = (
A.Col01 + '_' + Col02 +'_' + CAST(Idx AS VARCHAR)
)
FROM @tbTmp A
WHERE A.Idx=@iCnt
END
SELECT * FROM @tbTmp
SELECT * FROM @tbTmp2
ROLLBACK TRAN
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRAN
DECLARE @RegUser CHAR(8)
SET @RegUser='20070073'
DECLARE @iCnt INT -- Loop 변수
, @iTotalCnt INT -- 전체 데이터 수
, @sPrevColGrp VARCHAR(30)
SELECT @iCnt=0, @iTotalCnt=0, @sPrevColGrp=''
-- 임시 테이블 선언
DECLARE @tbTmp TABLE (
Idx INT IDENTITY(1,1)
,ColGrp INT
,Col01 VARCHAR(30)
,Col02 VARCHAR(30)
,Col03 VARCHAR(30)
,RegDate DATETIME DEFAULT(GETDATE())
)
DECLARE @tbTmp2 TABLE (
ColGrp INT
,ColGrpSeq INT
,RegDate DATETIME DEFAULT(GETDATE())
)
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('1', 5477)
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('2', 8901)
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('3', 9901)
INSERT INTO @tbTmp (ColGrp, Col01, Col02, Col03)
SELECT *
FROM (
SELECT '1' AS ColGrp, 'Col01_1' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '2' AS ColGrp, 'Col01_2' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '2' AS ColGrp, 'Col01_3' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '3' AS ColGrp, 'Col01_4' AS Col01, '' AS Col02, '' AS Col03
UNION
SELECT '3' AS ColGrp, 'Col01_5' AS Col01, '' AS Col02, '' AS Col03
) A
SELECT @iTotalCnt=COUNT(*) FROM @tbTmp -- 선택된 항목의 COUNT
INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq)
SELECT A.ColGrp, (MAX(B.ColGrpSeq)+1) AS ColGrpSeq
FROM @tbTmp A
JOIN @tbTmp2 B
ON A.ColGrp = B.ColGrp
GROUP BY A.ColGrp
UPDATE @tbTmp
SET Col02 = A.Col01 + '_' + CAST(ISNULL( (SELECT MAX(ColGrpSeq) FROM @tbTmp2 WHERE ColGrp = A.ColGrp) , 1) AS VARCHAR)
FROM @tbTmp A
WHERE A.Idx>=@iCnt
UPDATE @tbTmp
SET Col03 = (
A.Col01 + '_' + Col02 +'_' + CAST(Idx AS VARCHAR)
)
FROM @tbTmp A
SELECT * FROM @tbTmp
SELECT * FROM @tbTmp2
ROLLBACK TRAN
The prompt code on profile file (ex: .profile or .bash_profile): export PS1='\n\[\033[01;32m\]\# of \! @ `date +'%Y-%m-%d'` `date +'%H:%M:%S'`\[\033[00m\]\n[\u@`hostname`] \w$'
/* tempdb 데이터베이스 이동 tempdb 데이터베이스의 크기와 물리적인 배치가 시스템의 성능에 영향을 미칠 수 있으므로 tempdb를 확장하거나 이동하는 작업을 수행하는 경우가 종종 발생한다.
다음에 나오는 일련의 작업은 동일한 SQL Server 인스턴스에서 tempdb를 다른 위치로 이동하는 방법을 보여준다.
본 작업은 반드시 서비스가 중지된, 서버 점검 시간에 이루어져야 한다.
화일을 이동하는 위치는 반드시 디스크 드라이브 및 타겟 폴더가 존재해야 한다. */ --<<<tempdb를 디스크상의 다른 위치로 이동하기>>> USE master GO --1.tempdb의 논리파일 이름 확인 SELECT name, physical_name, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'tempdb') GO
--2.ALTER DATABASE 사용하여 파일 위치 변경 ALTER DATABASE tempdb MODIFY FILE(NAME = tempdev, FILENAME = 'G:\Data\tempdb.mdf') ALTER DATABASE tempdb MODIFY FILE(NAME = templog, FILENAME = 'H:\Log\templog.ldf') GO --3.SQL Server를 중지하고 다시 시작한다.
--4.SQL Server 서비슥가 시작된것을 확인후, 제대로 이동이 되었는지 확인 SELECT name, physical_name, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'tempdb') GO --5.기존 위치에 존재하는 tempdb 파일을 삭제한다. /* tempdb는 SQL Server가 재시작할때마다 재생성을 거치므로 기존의 tempdb 파일들을 새로운 위치로 이동할 필요없다.
같은 방법으로 사용자 생성한 Database의 화일들도 이동시킬 수 있으나 사용자가 생성한 Database는 기존화일을 복사하여 새로운 위치에 붙여넣은 후 이동이 끝나면 기존화일을 삭제하여 준다. */
Example: DECLARE @Quarter VARCHAR(5) SET @Quarter = CAST(DATEPART(Year, GETDATE()) AS VARCHAR) + CAST(DATEPART(Quarter, GETDATE()) AS VARCHAR) SELECT @Quarter AS Q
얼마전 사무실에 개발용 서버(?)를 새로들여 놓으면서... Windows Server 2008 Enterprise with Hyper-V로 OS를 설치하고... 그위에 VM으로 개발및 테스트를 위한 환경을 구축했다.
그리 어렵지 않게 환경을 구성하였고... 생각한것 이상으로 성능이 잘 나와 주고 있어 다행이라고 생각 하고 있다.. (클릭 잘못해서 중간에 서정 다 날려먹고.. 다시 구성한건 논외로 치고...;;;)
문제는 어쨌든 서버인지라 원격(RDP(mstsc.exe))으로 붙어서 사용하는데... 터미널로 붙어서 게스트 OS을 사용하면 마우스가 안먹는다..;;;; 물론 Windows Server 2003 SP2 이상이면 잘 된다... 안되는 것은 리눅스나 윈도 XP이하의 XP, 2000등의 OS뿐이지만 테스트용인지라 이녀석들도 꼭 필요하다.
윈도우즈 시스템들은 어찌저찌 해서 터미널로 접속해서 사용하는데... 리눅스시스템들은 방법이 없다.. 아래 그림 처럼 멍청한 화면만 보고 있다.
게스트 OS중 Ubuntu Desktop 7.10 : 마우스 포인터는 엄한데 가있고... 키보드는 멀 눌러야 할지 모르는 대략난감한 상황.
혹시 Hyper-V 관리를 위한 x86 클라이언트를 알고 계시거나 우분투를 키보드만으로 제어 가능하신 분은 재보좀....;;
덧. x64 클라이언트는 Hyper-V가 설치된 서버의 %Program File%s\Hyper-V(기본적으로 C:\Program Files\Hyper-V 임)폴더의 화일들을 클라이언트로 복사한 후 vmconnect.exe를 사용하여 접속할 수 있다.
IIS7+FastCGI를 구성하고 테스트하면서 느낀것.. 1. 일반적인 PHP Application은 문제 없이 IIS로 포팅 된다는것...
2. 권한문제는 IIS7의 권한 부여 규칙을 이용하여 해결 하면 쫌더 편함. -> 전통적인 방법으로 윈도우즈 폴더의 보안 탭을 이용해도 됨.
3. mod_rewrite등을 사용한 경우 다른 방법으로 바꾸어줘야 함. -> ASP.NET의 Generic Handler(.ashx)를 사용하는 방법. -> IIS에서 가상디렉토리를 이용하여 처리하는 방법등.
4. 생각보나는(?) 성능이 잘 나와 주어서 서버를 통합하고 한가지 서버군으로 갈수 있겠더라는거..
5. WIndows용 MySQL 설치하고 구성할때는 특별히 권한 문제에 신경을 많이 써야 삽질을 덜 한다는거.
그외 이런 저런 것들....
넉두리...
사실 회사가 작고... 특별히 IT 인프라에 대한 관리 인력이 없는 상황에서 개발자들(서버에 대한 전문지식이 없는.. 나를 비롯한 대부분의 개발자들이 자기도 서버 관리 한다고 버럭 할테지만... 사실인걸...)이 서버 관리를 하게 되고 회사에 그런 개발들이 많이 들락거리면서 자기들 편한 대로만 개발하고 관리하려 하다보니 시스템 구성이 엉망이다. 내가 없는 사이에 버러진 일이고.. 회사 사정이 그러니 머라 하잔 못하겠지만 기본 적인 개념은 좀 가지고 살았으면 한다. 모르면 배우고.. 안되면 되게 해야 할 것 아닌가? 물론 시간에 쫒기고 일에 채이는 것이 개발자이고, 우리내 IT쟁이들의 삶이라지만 그래도 개발자고인데... 무조건 시스템을 뒤집는것은 아니라고 생각한다. 아니 뒤집을때 뒤집더라도 기본은 지켜줘야 하지 않나 한다. 더 말해봐야 머리만 아프고 다만 한가지 이제라도 시스템을 통합 운영하게 됨으로써(비록 반쪽 짜리 일지라도...) 관리비용을 줄이고, 추후 통합 개발이 가능하게 됨을 감사히 생각할 따름이다. 또한 그런면에서 MS 빠순이는 아니지만 FastCGI 기술을 제공해준 MS에도 감사한다.
SELECT A.*, B.code, B.code_nm AS itemname FROM #CYTB_TestResult A, #CYTB_CodeItem B WHERE A.cheyon_gb_cd='N' AND A.cheyon_yr='2007' AND A.cheyon_cs='A' AND A.cheyon_seq =12345 AND A.gubun_cd='GA51' AND B.gubun_cd='GA51' AND B.code > '0000' AND A.gubun_cd =* B.gubun_cd AND A.code =* B.code ORDER BY B.code asc
위와같은 T-SQL쿼리를 ANSI SQL로 변환 하려고 하는데... 그림1의 실행 결과와 같이 Empty Set이 변환되었다. 어케 하면 좋을까?
추가: RIGHT JOIN으로는 해결하였으나 LEFT JOIN으로는 안된다. 왜 안될까...? 테스트 데이터를 포함하는 전체 쿼리화일을 첨부한다.
CREATE TABLE #a( q1 VARCHAR(5000) ); INSERT INTO #a VALUES('SELECT GETDATE()'); INSERT INTO #a VALUES('SELECT GETDATE()'); INSERT INTO #a VALUES('SELECT GETDATE()'); INSERT INTO #a VALUES('SELECT GETDATE()'); INSERT INTO #a VALUES('SELECT GETDATE()'); DECLARE @query VARCHAR(5000) DECLARE CurQuery CURSOR FOR SELECT * FROM #a OPEN CurQuery FETCH NEXT FROM CurQuery INTO @query WHILE @@FETCH_STATUS = 0 BEGIN EXEC(@query) FETCH NEXT FROM CurQuery INTO @query END --end of while CLOSE CurQuery DEALLOCATE CurQuery
MS에서 제공하는 핫픽스(보안 업데이트, 서비스팩등)는 EXE형식으로 제공되며, 제공되는 화일을 실행하여 간단히 설치 할 수 있다. 하지만 Slipstream CD를 제작하거나 할때는 아무래도 불편한 부분이 있다.
아래 명령어를 사용하면 Hotfix를 설치하지 않고 압축만을 풀 수 있다. hotfixname.exe -x
Command Line에서 위의 명령어를 사용하면 좌측 이미지와 같이 압축을 해제 할 경로를 묻는 대화상자가 나타나고, 그곳에 적절한 경로를 입력하면 아래 이미지와 같이 압축이 풀린 설치 화일을 볼 수 있다.
아래는 Hotfix설치시 사용할 수 있는 추가 옵션이다. --------------------------- Hotfix 설치 관리자 사용 --------------------------- 다음은 명령줄 옵션입니다. /? - 도움말 /quiet - 자동 모드 /reportonly - 인스턴스 보고만 /allinstances - 기본적으로 모든 제품 인스턴스에 패치 적용 /instancename - 패치할 제품 인스턴스 이름 /SAPWD - SQL SA 암호 /user - 원격 관리자 도메인 및 계정 /password - 원격 관리자 암호