블로그 이미지
불쥐의 눈으로 본세상 ㏈ª ☞ β┖υΕJini.κR

카테고리

분류 전체보기 (234)
By β┖υΕJini (131)
㏈ª By β┖υΕJini (103)
Total271,801
Today15
Yesterday27

 

 

RECOVERY PENDING

  • The database will be in this state if SQL Server knows that recovery needs to be run on the database but something is preventing recovery from starting. This is different from SUSPECT because there's nothing to say that recovery is going to fail - it just hasn't started yet.
  • An example of this is when the database wasn't cleanly shut down (i.e. there was at least one uncommitted transaction active at the time the database was shut down) and the log file has been deleted

RECOVERY PENDING 상태는  트랜잭션 로그 파일의 변형이나 손상으로 발생 한다고 합니다. 이런 일이 어제 발생하고 말았네요. 선거를 무사히 마치고 출근을 위해 잘려고 하는데 미국 본사에 급하게 연락와 DB 상태 확인해보니 RECOVERY PENDING 상태 였습니다. 것도 2개의 DB 가 ^^

 


시스템 환경
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600 Enterprise Edition (64-bit)

해결 방법

1. 트랜잭션 로그 리빌드 (기존 Log 파일을 다른 이름으로 변경하거나 복사 해놓았아야 합니다.)

ALTER DATABASE COFE REBUILD LOG ON (NAME=COFE_Log, FILENAME='D:\SQLDATA\COFE_log.ldf') 

Warning: The log for database 'COFE' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.

경고: 데이터베이스 'COFE'의 로그가 다시 작성되었습니다. 트랜잭션에 일관성이 없습니다. RESTORE 체인이 끊어져 서버에 이전 로그 파일에 대한 컨텍스트가 더 이상 없으므로 해당 로그 파일이 어떤 파일인지 알아야 합니다. DBCC CHECKDB를 실행하여 물리적 일관성을 확인해야 합니다. 데이터베이스가 dbo 전용 모드로 전환되었습니다. 데이터베이스를 사용할 수 있는 준비가 되면 데이터베이스 옵션을 다시 설정하고 모든 추가 로그 파일을 삭제하십시오.

트랜잭션 로그 리빌드 후 Restricted User 로 변경 된 것을 볼수 있다.

2. 데이터베이스 CHECKDB 를 통한 일관성 오류 검사

DBCC CHECKDB('COFE')

3. Mode 변경 

ALTER DATABASE COFE SET MULTI_USER

2번에서 일관성 오류가 난다면  문제의 Object_ID 나 에러 발생 난 곳에 테이블 명을 알수 있을 것이다. 

SELECT
  OBJECT_NAME(12313214) 

테이블 확인 후

DBCC
checktable(table)

checktable 을 통해 에러를 재확인 한다.

데이터베이스 유저 모드를 싱글로 변경 하고

ALTER DATABASE COFE SET SINGLE_USER

go

DBCC checktable(table, repair_rebuild)

go

 

후에도 계속 에러나 난다면 아래를 실행을 고려해야 합니다.

DBCC checktable(table, repair_allow_data_loss)

go


DBCC checktable 의 옵션에 REPAIR_FAST ,REPAIR_REBUILD ,REPAIR_ALLOW_DATA_LOSS
3가지 있습니다.

REPAIR_FAST or REPAIR_REBUILD 먼저 해보고 REPAIR_ALLOW_DATA_LOSS 로 하십시오.

그리고 REPAIR_ALLOW_DATA_LOSS 는 데이터 손실이 일어 날수 있음을 인지하고 계셔야 합니다.

 

 

Posted by ㏈ª ☞ β┖υΕJini.κR

증상

전세계 여러매장에서 대략 5000여대의 POS 를 사용하고 있다.

각각의 POS 는 SQL Server 2000 Personal Edition 설치 되어 있다. 각 매장마다 판매 및 상품의 데이터를 공유하기 위해 매장 별로 Merge Replication 을 사용하고 있는 구조다.

이렇게 많은 POS 의 재설치시 설치 시간을 단축하기 위해 Ghost 를 사용한다. 기본 Base Server 가 아니라 이미 사용중인 특정 서버를 Ghost 로 떠서 기존에 사용중인 Replication 정보가 저장 되어 있다.  Merge Replication 를 재구성 할려고 하거나 EM 게시자에서 DELETE 를 통해 Replication 를 제거 할려고 하면 Error 가 발생한다. 그리고 Replication 으로 인해 Services Pack 업데이트로 안되는 상황 이었다.  이런 경우 Merge  Replication 정보를 어떻게 지워야 할까?

EM 을 통한 Replication 제거 시도

 

 

위와 같은 Error 로 인해 제거가 되지 않는다. 이 오류는 Server HostName 이 실제 서버 이름과 틀려 발생하는 문제이다.

그럼 서버의 Hostname 은 어떻게 되어있는지 확인해 보자.

--만약 cmdshell 이 실행이 안될때 아래 명령을 통해 활성화 해야 한다.   
--EXEC sp_configure 'show advanced options', 1
--GO
--RECONFIGURE
--GO

--서버이름가져오기
EXEC master.dbo.xp_cmdshell 'hostname'

실행 결과를 통해 이서버의 HostName XXX22  라는걸 알수 있다.

 
그럼 실제로 SQL Server 에 설정되어 있는 HostName 은 어떻게 되어 있을까?

SP_HELPSERVER

 

위 결과와 같이 XXXUK01 로 HostName 이 설정 되어 있는 있는걸 볼수 있다.

그리고 Base Server 가 아닌 다른 서버의 Ghost 정보로 복원을 하여 XXXUK02~04 , 그리고 repl_distributor 도 등록되어 있는걸 볼수 있다.

이럼 이걸 어떻게 제거 할까?

우선 서버 Hostname 변경으로 잘못된 서버를 가리키고 있는 JOB 을 비롯한  Replication 관련 JOB 의 서버 정보를 변경 한다.

USE msdb

GO

DECLARE @server sysname

SET @server = CAST(SERVERPROPERTY('ServerName')AS sysname)

UPDATE sysjobs

SET originating_server = @server

WHERE originating_server <> CAST(SERVERPROPERTY('ServerName')AS sysname)

그럼 이제 잘못 구성되어 있는 복제를 제거 하도록 해보자 ..

EM 에서 제거시 이전 처럼 Error 화면이 발생하지 않지만 게시자 DB 는 아직 Replication 으 구성되어 있다고 나온다.

그래서 아래 쿼리를 통해 게시자를 제거 하도록 한다.
sp_removedbreplication 'A디비'


다음으로 배포를 해제 합니다.
sp_dropdistributor @no_checks=1, @ignore_distributor=1


The Subscriber was dropped.

The Subscriber was dropped.

The Subscriber was dropped.

Deleting database file 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\distribution.LDF'.

Deleting database file 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\distribution.MDF'.

Login dropped.

Msg 15009, Level 16, State 1, Procedure sp_procoption, Line 47

The object 'sp_MSrepl_startup' does not exist in database 'msdb'.

위와 같은  에러가 발생 하지만 Replication 관련 인듯 하여 무시 하였다.

DM 에서 확인해보면 이렇게 적용 후 게시 관련 DB 에 Replication 구성이 되어 있다는 손 모양이나 배포자 DB 가 제거 된것을 확인 할수 있다.

Replication 재구성을 위해 잘못된 서버 이름들을 제거 하고 이서버에 맞게 서버 이름을 변경 하도록 한다.

sp_dropserver 'XXXUK01'

GO

sp_addserver XXX22,LOCAL

 

sp_dropserver 'XXXUK02'

GO

sp_dropserver 'XXXUK03'

GO

sp_dropserver 'XXXUK04'

GO

위와 같은 형식으로 제거 한다. repl_distributor 의 경우 sp_dropdistributor 를 통해 배포자 DB 와 함께 제거 되었다.

그리고 다시

SP_HELPSERVER 해보면

잘못된 서버명이 정상적으로 변경 된것을 확인 할수 있다.


 



 

Posted by ㏈ª ☞ β┖υΕJini.κR


[원문] http://www.sqlservercentral.com/articles/.Net/94922/

해외 사이트에서 다이나믹 피벗을 CLR 로 만든걸 보고 한번 테스트 해보았습니다. 피벗을 좀더 쉽게 사용 할수 있습니다.

성능은 장담 못하지만 ^^

소스 파일

DynamicPivot.cs

컴파일 한 DLL 파일

DynamicPivot.dll



DynamicPivot.cs

using System;

using System.Collections;

using System.Collections.Generic;

using System.Data.SqlClient;

using System.Data;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

 

namespace Syx.Functions

{

    public partial class UserDefindedFunctions

    {

        [Microsoft.SqlServer.Server.SqlProcedure(Name="clrDynamicPivot")]

        public static void clrDynamicPivot(SqlString query, SqlString pivotColumn, SqlString selectCols, SqlString aggCols, SqlString orderBy)

        {

            string stmt = string.Empty;

            try

            {

                CreateTempTable(query);

                string pivot = GetPivotData(pivotColumn.ToString());

                stmt = string.Format("select * from ( select {0} from #temp ) as t pivot ( {1} for {2} in ( {3} )) as p {4}",

                    selectCols.ToString(),

                    aggCols.ToString(),

                    pivotColumn.ToString(),

                    pivot,

                    orderBy.ToString());

                using (SqlConnection cn = new SqlConnection("Context Connection=True"))

                {

                    SqlCommand cmd = cn.CreateCommand();

                    cmd.CommandText = stmt;

                    cn.Open();

                    SqlDataReader reader = cmd.ExecuteReader();

                    SqlContext.Pipe.Send(reader);

                }

 

            }

            catch (Exception ex)

            {

                throw new Exception(string.Format("clrDynamicPivot Error stmt:{0}", stmt), ex);

            }

        }

 

        public static void CreateTempTable(SqlString query)

        {

            using (SqlConnection sqlconn = new SqlConnection("Context Connection=True"))

            {

                SqlCommand sqlCmd = sqlconn.CreateCommand();

                sqlCmd.CommandText = query.ToString();

                sqlconn.Open();

                sqlCmd.ExecuteNonQuery();

            }

        }

 

        public static string GetPivotData(string pivotColumn)

        {

            string stmt = string.Format("select distinct {0} from #temp", pivotColumn);

            string pivotCols = string.Empty;

 

            using (SqlConnection cn = new SqlConnection("Context Connection=True"))

            {

                SqlCommand cmd = cn.CreateCommand();

                cmd.CommandText = stmt;

                cn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())

                {

                    while (dr.Read())

                    {

                        if (dr.GetFieldType(0) == typeof(System.Int32))

                            pivotCols += "[" + dr.GetInt32(0) + "],";

                        if (dr.GetFieldType(0) == typeof(System.Decimal))

                            pivotCols += "[" + dr.GetDecimal(0) + "],";

                        if (dr.GetFieldType(0) == typeof(System.String))

                            pivotCols += "[" + dr.GetString(0) + "],";

                    }

                }

            }

            return pivotCols.Remove(pivotCols.Length - 1);

        }

    }

}

 

 

DynamicPivot.cs C# 소스를 컴파일하여 DynamicPivot.dll 로 만듭니다.

생성된 DynamicPivot.dll  SSMS 에서 실행 합니다.

1. CLR 활성화 및 ASSEMBLY 등록 합니다.


SET NOCOUNT ON
;
USE master;
EXEC sp_configure 'clr enabled', 1
;
RECONFIGURE;
GO

USE TEST

GO

 

CREATE ASSEMBLY DynamicPivot  FROM 'D:\DynamicPivot.dll'

WITH PERMISSION_SET = SAFE

 

go


2. 프로시저를 만듭니다.

CREATE PROC usp_clrDynamicPivot

    @query AS NVARCHAR(4000) ,

    @pivotColumn AS NVARCHAR(4000) ,

    @selectCols AS NVARCHAR(4000) ,

    @aggCols AS NVARCHAR(4000) ,

    @orderBy AS NVARCHAR(4000)

AS EXTERNAL NAME

    DynamicPivot.[Syx.Functions.UserDefindedFunctions].clrDynamicPivot

 

3. 테스트 데이터 생성 합니다.

CREATE TABLE [dbo].[Orders]

    (

      [OrderID] [int] NOT NULL ,

      [ProductID] [int] NOT NULL ,

      [Quantity] [int] NOT NULL ,

      [OriginState] [nvarchar](2) NOT NULL

    )

GO

 

4. 데이터 입력 TEST #첫번째

INSERT INTO Orders VALUES (1, 10, 2, 'AA')

INSERT INTO Orders VALUES (2, 11, 1, 'BB')

INSERT INTO Orders VALUES (3, 12, 5, 'CC')

INSERT INTO Orders VALUES (3, 13, 10, 'DD')

INSERT INTO Orders VALUES (4, 14, 4, 'EE')

실행

DECLARE @query NVARCHAR(4000)

DECLARE @pivotColumn NVARCHAR(4000)

DECLARE @selectCols NVARCHAR(4000)

DECLARE @aggCols NVARCHAR(4000)

DECLARE @orderBy NVARCHAR(4000)

SET @query = 'select OriginState,ProductID, Quantity into #temp from dbo.Orders'

SET @pivotColumn = 'OriginState'

SET @selectCols = 'OriginState, ProductID, Quantity'

SET @aggCols = 'sum(Quantity)'

SET @orderBy = ''

 

EXECUTE usp_clrDynamicPivot @query, @pivotColumn, @selectCols, @aggCols,

    @orderBy

GO


결과값

5 데이터 입력 TEST #두번째

INSERT INTO Orders VALUES (2, 1, 1, 'BB')

INSERT INTO Orders VALUES (2, 2, 2, 'BB')

INSERT INTO Orders VALUES (2, 3, 3, 'BB')

INSERT INTO Orders VALUES (2, 4, 4, 'BB')

INSERT INTO Orders VALUES (2, 5, 5, 'BB')

 

INSERT INTO Orders VALUES (3, 1, 1, 'CC')

INSERT INTO Orders VALUES (3, 2, 2, 'CC')

INSERT INTO Orders VALUES (3, 3, 3, 'CC')

INSERT INTO Orders VALUES (3, 4, 4, 'CC')

INSERT INTO Orders VALUES (3, 5, 5, 'CC')

 

 

INSERT INTO Orders VALUES (4, 1, 1, 'DD')

INSERT INTO Orders VALUES (4, 2, 2, 'DD')

INSERT INTO Orders VALUES (4, 3, 3, 'DD')

INSERT INTO Orders VALUES (4, 4, 4, 'DD')

INSERT INTO Orders VALUES (4, 5, 5, 'DD')

실행

DECLARE @query NVARCHAR(4000)

DECLARE @pivotColumn NVARCHAR(4000)

DECLARE @selectCols NVARCHAR(4000)

DECLARE @aggCols NVARCHAR(4000)

DECLARE @orderBy NVARCHAR(4000)

SET @query = 'select OriginState,ProductID, Quantity into #temp from dbo.Orders'

SET @pivotColumn = 'OriginState'

SET @selectCols = 'OriginState, ProductID, Quantity'

SET @aggCols = 'sum(Quantity)'

SET @orderBy = ''

EXECUTE usp_clrDynamicPivot @query, @pivotColumn, @selectCols, @aggCols,

@orderBy

GO


결과값



pivotColumn  컬럼으로 지정 한 'OriginState' 값에 따라 컬럼이 동적으로 피벗 된다.


 

 

Posted by ㏈ª ☞ β┖υΕJini.κR

독일 하이덴베르그를 거치 이탈리아로 가기전 잠깐 들른 인스부르크~~

가는길이 동화속 풍경을 생각 나게 하는 곳이었다.

세상에 이런곳이 있나 싶고, 산자락 초록색 숲위에 조그만한 집들을 뒤로 하고 도착한곳 , 동계 올림픽 개최지로도 유명 한곳 이다.

 

 

Canon | Canon EOS 550D | Aperture priority | Pattern | 1/20sec | F/5.6 | -1.00 EV | 29.0mm | ISO-1600 | Flash fired, compulsory flash mode | 2011:11:03 02:55:01

인스브루크 구 시가지에 있는 후기 고딕양식의 건물의 발코니를 덮고 있는 지붕이다. 이 지붕은 2,738개의 도금된 동판으로 되어있다. 1420년 티롤 군주의 성으로 지어진 이 건물에 1497년 황제 막시밀리안 1세(Maximilian I)의 지시로 발코니가 만들어졌고 그 위에 황금지붕이 얹히게 되었다. 막시밀리안 1세가 건물 바로 앞의 광장에서 행해 지는 행사를 관람하기 위해 만든 이 건물 발코니에는 막시밀리안 1세와 그의 두 아내들, 재상, 궁중의 광대,  무희들의 모습과 문장이 부조로 새겨져 있다. 황금 지붕이 얹힌 발코니를 제외하고는 건물 전체에 아기자기하고 조그만 창들이 나 있다. Canon | Canon EOS 550D | Aperture priority | Pattern | 1/20sec | F/7.1 | -0.33 EV | 18.0mm | ISO-200 | Flash fired, compulsory flash mode | 2011:11:03 15:24:33

숙소 베란다에서 본 풍경~~~

Canon | Canon EOS 5D | Manual | Pattern | 30sec | F/5.6 | 0.00 EV | 28.0mm | ISO-3200 | Off Compulsory | 2011:11:03 13:03:13

 오스트리아 인스부르크에 도착해 알프스 중턱의 산장에서 하루밤을 지냈다. 삼각대을 가져가지 않아 잘찍지는 못했지만

별이 쏟아 진다고 해야 하나 그런 느낌 ~~~ 너무도 기억이 많이 나는 오스트리아의 밤 하늘 별빛~~~

 

 


 

Posted by ㏈ª ☞ β┖υΕJini.κR

전날 한국에서 비행기를 타고 오전에 출발하여 영국에 도착하니 가을비가 내리고 있었다. 공항 근처에 에어텔이 숙소여서

영국의 정취를 많이 느끼지 못하고 숙소에서 휴식을 취했다.  다음날 아침 이른 아침을 먹고 빠듯한 하루 일정 탓에 바쁘게

움직였다.  영국 하루 일정 여러 곳을 구경할려니 지치기도 하고 좀더 시간을 가지고 여행을 왔으면 좋았을꺼 라는 생각이

앞서는 하루 였다.

 

Canon | Canon EOS 550D | Aperture priority | Pattern | 1/200sec | F/5.6 | 0.00 EV | 30.0mm | ISO-100 | Flash fired, compulsory flash mode | 2011:11:01 20:33:37

 템즈강의 배경으로 영국의 런던 브릿지 , 국회의사당 , 빅벤 시계탑에서~~~

Canon | Canon EOS 550D | Aperture priority | Pattern | 1/400sec | F/6.3 | 0.00 EV | 23.0mm | ISO-100 | Off Compulsory | 2011:11:01 23:12:50

영국의 가을이 느낄수 있었던 런던 하이드 파크 - 와이프와 여기서 몇시간 걷고 산책하고 싶었지만 일정 탓~~~ 으로 너무 짧게 머물러 와이프가 많이 아쉬워 했던 곳이기도 하네요.

Canon | Canon EOS 550D | Aperture priority | Pattern | 1/125sec | F/6.3 | 0.00 EV | 40.0mm | ISO-100 | Off Compulsory | 2011:11:01 21:10:08

 버킹엄 궁 근위 교대식 사람이 너무 많아 버킹엄 궁 근처는 가보지고 못하고 먼 발치에서 촬영.... 그래더 근위 교대식 후 이

동하는 근위대들은 보았답니다.

Canon | Canon EOS 550D | Aperture priority | Pattern | 1/100sec | F/6.3 | 0.00 EV | 18.0mm | ISO-100 | Flash fired, compulsory flash mode | 2011:11:01 21:40:38

여긴 무슨 성당 앞이었는데 ㅎㅎㅎ  잘 모르겠느네요.

Canon | Canon EOS 550D | Aperture priority | Pattern | 1/500sec | F/6.3 | 0.00 EV | 24.0mm | ISO-100 | Off Compulsory | 2011:11:01 23:06:28

하이드 파크에 있는 앨버트 기념비 앞에서 ~~ 빅토리아 여왕이 먼저 떤 남편을 위해 만들었다고 하네요. 매우 화려한 고딕 양식으로 지붕위에는 빅토리아여왕이 , 그 아래에는 앨버트경의 황금 동상이 그리고 이 기념비를 둘러싸고 있는 4개의 동상은 4대륙을 상징한다고 하네요.

Canon | Canon EOS 5D | Aperture priority | Pattern | 1/25sec | F/10.0 | +0.67 EV | 28.0mm | ISO-200 | Off Compulsory | 2011:11:01 19:50:54

런던의 빨간 버스와 빨간 전화 ㅎㅎㅎ

그러고 보니 대영박물관 사진이 없네요. 대영 박물관은 사진 찍는것보다 구경을 더 많이 해서 없는듯... 한번 다시 찾아 봐야 겠네요...

 

Posted by ㏈ª ☞ β┖υΕJini.κR

요즘 대부분의 사람들이 스마트폰을 사용 하고 있죠^^

2012 SQL Unplugged 에서 어떤 분이 마이피플을 활용해서 모니터링 메세지를 받는다고 해서

저도 한번 찾아 보고 테스트 해보았습니다.

첫번째, 마이피플의 메세지를 보내기 위해
우선 환경은 PHP 구동할수 있어야 합니다. (참고로 IIS에서  dll 등록이해 사용하거나 윈도우 아파치 설치 해서 구동 할수 있습니다. )

두번째, 간단하게 ASP 웹페이지를 이용해서 메세지를 보낼수 있게 구현해보았습니다.

우선 첫번째 PHP 서버에  MyPeople.php 를 자신이 원하는 위치에 넣어

MyPeople.php  (http://bluejini.kr/MyPeople.php )

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-kr">
<?php
// MyPeople widgetMessage Send Function
function MyPeople_send($key='', $from, $msg) {
 if($key=='') $key= 'safdsafdsadfsafdsafdsa';
 $msg = urlencode($msg);
 $url="http://air21.daum.net/air21/widget/sendMessage.daum";
 $t_data="key=".$key."&content=".$msg."&from=".$from;
 $result=trans_sock($url, $t_data);
}
// Web Soket
function trans_sock($url, $t_data) {
 $uinfo = parse_url($url);
 if($uinfo[query]) $t_data .= "&".$uinfo[query];
 if(!$uinfo[port]) $uinfo[port] = "80";
 //Last Submit Info
 $send_str = "POST ".$uinfo[path]." HTTP/1.1\r\n".
 "Host: 80\r\n".
 "User-Agent: MTools\r\n".
 "Content-Type: application/x-www-form-urlencoded\r\n".
 "Content-length: ".strlen($t_data)."\r\n".
 "Connection: close\r\n\r\n".
 $t_data;
 //Submit
 $fp = fsockopen($uinfo[host],$uinfo[port]);
 fputs($fp,$send_str);
 //Request
 while(!feof($fp)) $response .= fgets($fp,128);
 fclose($fp);
 $value=explode("[[",$response);
 $value=explode("]]",$value[1]);
 return $value[0];
}
$key=$_REQUEST["key"];
$from=$_REQUEST["from"];
$msg= $_REQUEST["message"];
MyPeople_send($key, $from, $msg) ;
?>

그럼 두번째 http://bluejini.kr/MyPeople.php 에 GET 방식으로 from,key,message 값을 보내면 메세지를 보낼수 있게
웹페이지를 하나 만듭니다.
이페이지의 역활은 페이지를 띄워 놓았을때 10분 간격으로 Refresh 하여 디비에서 메세지 보낼 정보(모니터링된 결과를 특정 테이블에 넣는 잡을 수행)을 가져와 데이터가 있으면 메세지를 보내게 됩니다.


DBCHECK.asp  (http://bluejini.kr/DBCHECK.asp )

<meta http-equiv='Refresh' content='600; URL=DBCHECK.asp'>
<%
Dim Dbcon,SQL, Rs
Set Dbcon = Server.CreateObject("ADODB.Connection")
Dbcon.Open "Provider=sqloledb;Data Source=MIS010; Initial catalog=ADMIN; User ID=ReplAdmin; Password=21DataSyncAdmin"
Set Rs = Server.CreateObject("ADODB.RecordSet")
SQL = "SELECT * FROM ADMIN.DBO.DISKSize_Check"
Rs.Open SQL,DBcon
if not (rs.eof or rs.bof) then
do until Rs.eof
 response.WRite "<BR>"
 response.WRite "["&rs(0)&"]|["&rs(1)&"]|["&rs(2)&"]|["&rs(3)&"]|["&rs(4)&"]"
 response.WRite "<BR>"
 response.WRite "<BR>"
 %>
 <iframe src="http://bluet798.cafe24.com/MyPeople.php?from=01045647117&key=7L6qZQCJ6WJDIuyPLo834g%3D%3D&message=MIS010:<%=rs(0)%>|<%=rs(1)%>|<%=rs(2)%>|<%=rs(3)%>|<%=rs(4)%>" frameborder=1  height=100 width=100></iframe>
 <%
 rs.movenext
 loop
else
end if
rs.close
DBcon.close
set rs = nothing
set DBcon = nothing
%>


그럼 GET 방식 값은?

from : 핸드폰번호
key : 메세지 보낼 사람 키값
message : 보내고 싶은 메시지 

1.  다음 로그인 : http://widgetbank.daum.net/widget/view/966 
2. "HTML소스" 선택하시고 [퍼가기]버튼을 클릭
3. 출력되는 스크립트 소스를 복사하여 임의의 곳에 붙여넣은 후 key 값

 아래는 출력되는 소스코드의 일부분중 아래의 부분을 찾아 키를 복사(굵은 부분이 키 부분)
c50da94330a.xml&up_mypeople_key=safdsafdsafasfd%3D%3D&up_display 

http://bluejini.kr/DBCHECK.asp 역활은 데이터베이스에 기록되어 있는 10분에 한번씩 리플래시를 통해 실행 되고 메세지 정보를 가져와 메세지를 보내게 됩니다. 아래 처럼 IFRAME 으로 값을 넘기게 되는거죠. 전 웹으로 했지만 실제로 사용 할려면 아래처럼 실행되는 서버를 하나 만드는게 좋을 듯 하네요.

 

 



그럼 이렇게 메세지가 오게 됩니다. 

간단하게 원리를 설명하고자 만들어 보았어요..^^

 


 

Posted by ㏈ª ☞ β┖υΕJini.κR

1. SQL Error Log 발생한 에러

2012-11-27 17:16:55.590 spid3477     Error: 7886, Severity: 20, State: 1.2012-11-27 17:16:55.590 spid3477     A read operation on a large object failed while sending data to the client. A common cause for this is if the application is running in READ UNCOMMITTED isolation level. This connection will be terminated.

 


[그림 1-1]


- 어떤 쿼리(프로시저) 에서 발생하는 에러 인지를 찾기 에러가 주로 발생하는 시간 주기적 (15분 ~ 20분 사이) 발생하여
   발생 후 10분 뒤부터 10분 동안 sp_trace_create 를 사용하여  Trace 수집

-  SQL Error Log 시간대의 TRC 파일 비교 분석 하여 에러 원인 분석



- 원인 및 해결 방법  


[그림 1-2]

이 프로저의 에서 호출하는 1개의 ROW  Image 데이터 형식으로 라는 marshaled_data 필드를 가지고 있다. [그림 1-1] 601 에러가 먼저 발생 Error: 7886, Severity: 20, State: 1 가 발생한것을 알수 있다. [그림 1-2] SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 으로 인해 테이블 접근시 NOLOCK 로 커밋되지 않는 읽기르 우선 데이터를 읽어서 LOB 영역의 marshaled_data 데이터를 읽으려고 했으나 실제 marshaled_data 필드에 접근해 보니 일부 데이터의 위치가 변경되어 데이터를 찾지 못하게 되어  클라이언트에 데이터를 보내는 동안 큰 개체에서 읽기 작업이 실패 하게 되었고 클라이언트와 연결이 종료 된것으로 에러가 SQL LOG 에 찍히게 된것이다.

해결 방법은 프로시저에 적용 하였던 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 를 제거 후 해결 되었다.



Posted by ㏈ª ☞ β┖υΕJini.κR