SQL Server에 'n'일간의 웹 서버 로그를 저장하는 방법은 무엇입니까?


18

보다 빠른보고 및 성능 분석을 위해 웹 서버 로그를 Sql Server에 삽입하려고합니다. 이를 통해 거의 실시간으로 교통 패턴, 문제, 속도 저하를 확인할 수 있습니다.

로드 밸런서의 요청 / 응답 이벤트를 수신하고 데이터베이스에 대량 삽입하는 데몬이 있습니다.

그러나 하루에 약 1GB의 로그가 생성되며 약 1 주일 정도 (적어도이 원시 형식으로) 유지하면됩니다.

이 데이터를 저장하는 가장 좋은 방법과 오래된 항목을 삭제하는 가장 좋은 방법은 무엇입니까?

우리는 매일의 데이터를 자체 테이블에 저장하는 것에 대해 이야기했습니다. 예를 들어 그 날의 Log_2011_04_07모든 항목을 가지고 가장 오래된 테이블을 삭제하는 것과 같습니다. 쉽게 조회 할 수 있도록 하루 종일 테이블에 걸쳐보기를 작성할 수 있습니다. 실현 가능합니까?


이것은 매우 유사한 질문이지만 Oracle에게는 있습니다. 문법은 다를 것이지만 이것은 날짜 별 파티셔닝의 전형적인 응용 프로그램입니다. 바퀴를 재발 명할 필요가 없습니다 :-)
Gaius

답변:


17

파티셔닝을 살펴 봐야합니다.

http://technet.microsoft.com/en-us/library/dd578580%28SQL.100%29.aspx

파티셔닝에 대한 멋진 점은 다중 테이블 접근 방식과 달리 테이블 이름이 하나뿐이므로 삽입 명령문이 정적 상태로 유지된다는 것입니다. 모든 응용 프로그램에서 작동하며 쿼리에 완전히 투명합니다. 각 테이블에 대해 다른 인덱스 또는 통계로 끝날 경우 어떻게 될지 걱정할 필요가 없습니다.

테이블을 장면 뒤의 여러 테이블로 나누는 방법을 결정하는 파티션 함수를 만듭니다. 이 함수는 하나의 입력 매개 변수 / 필드 만 취할 수 있으며 귀하의 경우 날짜 필드가됩니다. 이 기능은 날짜, 주, 월 또는 연도별로 테이블을 나눌 수 있습니다. 귀하의 경우 날짜, 24 시간 기간을 원할 것입니다.

그런 다음 T-SQL을 사용하여 매일 마지막 파티션을 교체하는 SQL Server 에이전트 작업을 작성하십시오. 삭제는 메타 데이터 작업이되어 매우 빨라집니다. 파티션을 교환 한 다음 이전 파티션을 제거하십시오.


이것으로 살펴볼 것입니다-개별 파티션을 삭제할 수 있습니까? 그래서 삭제가 빨리 진행될 수 있습니까?
Jarrod Dixon

3
예, "자동 슬라이딩 창 파티션"개념을 구체적으로 살펴 봐야합니다. SQLServerCentral에서 찾을 수있는 훌륭한 기사 시리즈 : part1 , part2part3 .
Marian

7

우리는 6 년 전에 방문한 사용자의 모든 클릭을 추적 할 수있는 웹 통계 로깅 제품을 개발했습니다.

우리가 한 일은 방문 할 때마다 기록을 작성하고 예약 된 데몬이 로그를 구문 분석하고 나중에 추가 조회를 위해 데이터를 정규화하도록하는 것입니다. 데이터 / 레코드가 구문 분석되는 즉시 데이터 구조를 낮게 유지하기 위해 제거되었습니다.

다음 버전의 제품에서는 대량 수집기를 웹 사이트에 별도로 배포 한 다음 데몬을 사용하여 데이터를 수집하고 이후 대량 서비스에 명령을 실행하여 정리합니다.

이런 식으로 데이터를 잃지 않고 "스케줄 된 유지 관리"를 처리 할 수 ​​있습니다.

센터 서버의 정리 문제와 관련하여 현재 계획은 예를 들어 데이터를 아카이브 할 수 있도록 "타임 스탬프"를 추가하는 것입니다. 3 개월.

우리는 이것을 3D 게임 / 렌더링의 MIP-MAP 텍스처와 같이 생각했습니다. 가까울수록 더 자세한 데이터, 더 멀리 갈수록 "그룹화"되고 덜 상세 해집니다.

따라서 매일 매일 방문자 패턴을 관찰 할 수 있지만 3 개월이 지나면 이러한 데이터는 실제로 관련이 없으며 데이터를 더 적은 세부 정보로 압축합니다.

우리는 이것을 "상세한 수준"을 분리 된 PR로 유지하기 위해 데이터베이스를 청크로 분할할지 여부를 결정하지 않았습니다. 데이터 베이스. 그러나 동일한 데이터베이스에 다른 수준을 저장하면 일부 이름 지정 문제가 발생할 수 있습니다.

이것을 당신이 무언가를 위해 사용할 수 있기를 바랍니다? 회사 제품의 일부로 예제 코드를 제공 할 수 없습니다.


1

Table_name 및 Date_table_created라는 두 개의 열이있는 다른 테이블 Daily_tables를 만듭니다. 웹 로그를로드하는 새 일일 테이블을 생성하는 코드에서 Daily_tables 테이블을 생성 된 테이블 이름과 타임 스탬프 (현재 날짜 시간)로 채우려면 다른 항목을 추가하십시오. 매주 TSQL 스크립트를 실행할 SQL 에이전트 작업을 작성하십시오. TSQL은 Daily_tables에서 모든 테이블 이름 (Table_name)을 7 일보다 오래된 Date_table_created 타임 스탬프와 함께 삭제해야합니다.

희망이 당신이 찾고있는 것입니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.