세이박스

'db'에 해당되는 글 23건

  1. 안드로이드 앱과 연동하는 웹서버프로그래밍 개발 교육 1일차 모임 후기
  2. [강의] 서버프로그래밍 관리페이지 제작 + JSON 출력 + 안드로이드앱 연동 교육 (부산)
  3. 2013 DB 매쉬업 공모전
  4. [MYSQL] Starting MySQL. ERROR! Manager of pid-file quit without updating file.
  5. Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)
  6. MySQL 5.x 설치후 기존 utf8 자료 이전시 한글 깨짐 증상 해결 my.cnf 수정
  7. [클래스] MySQL 테이블 복구 repair 명령어, SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)
  8. php DB 인젝션 공격 방어
  9. SQL 2000 Server 서비스 팩3,4 설치시 '스크립트 실행 중 오류 발생'
  10. 우편번호 최신 DB 2009.2.23
  11. MSSQL2005 [DBNETLIB][ConnectionOpen (Connect()).]SQL Server가 없거나 액세스할 수 없습니다.
  12. addslashes() stripslashes() DB 저정시 '홀따옴표에 \백슬러시 붙였다 빼주는 함수
  13. DB injection script 스크립트 공격 복구 및 보안
  14. SQL Injection 공격과 방어 방법 - php, asp 등
  15. PHP 파일 내용 DB로 넣기
  16. PHP DB에 데이타 한꺼번에 밀어넣기 예제
  17. MYSQL DB 사용자 추가
  18. MYSQL DB 원격 접속
  19. 트랜잭션 로그 파일 삭제 방법
  20. SQL Server의 Procedure cache를 지우고 싶은데..
  21. dat 만 가지고 데이터베이스를 복구할 수 있습니까?
  22. SQL7 에서 미처 백업(.mdf)을 받지 못 하고 날려버린 DB를 살리기
  23. mdf화일만 또는 mdf와 ldf 화일만 남았을때...

안드로이드 앱과 연동하는 웹서버프로그래밍 개발 교육 1일차 모임 후기

모바일앱개발

 

 

 

 

 

부산에서 2016년3월15일 화요일 저녁 7시~10시까지 3시간 동안 부산모바일앱개발센터 교육장에서 1차 모임을 가졌습니다.

 

스마트폰의 모바일 앱 개발은 이제 웹서버프로그래밍을 통한 Data 관리 환경의 필요성을 많은 분들이 필요성을 느끼셔서 본 강의를 요청하셔서 개설하게 되었습니다.

 

총 10분이 참여하셨구요. 끝까지 열공하셔서 좋은 결실 맺기를 바랍니다.

 

관리자 로그인, 회원관리, 게시판 및 자료실, 상품 관리 등의 관리 페이지 개발과 JSON 통신을 위한 DB 출력까지 진행합니다.

 

JSON Data를 앱에서 받아서 출력만하면 끝! ^^

 

출처 : http://www.androidstudy.co.kr/bbs/board.php?bo_table=B53&wr_id=127

 

 

[강의] 서버프로그래밍 관리페이지 제작 + JSON 출력 + 안드로이드앱 연동 교육 (부산)

웹프로그램

안녕하세요! 안드로이드스터디 운영자 이경용 입니다.

요즘 개발하는 대부분은 앱들이 서버와의 통신을 기본으로 개발되고 있습니다.
하지만 대부분 모바일 앱 개발 관련 교육만 있으며, 서버 중심의 관리페이지 개발에 대해서는 잘 없기에 준비했습니다.
"요기요", "배달의민족", "쿠팡"와 같은 앱의 업소 정보는 매번 바뀔때 마다 앱을 어떻게 업데이트 할까요?
업소 정보는 별도의 웹 환경에서 관리페이지를 만들고 DB와 이미지를 관리하며, JSON으로 앱과 자료를 주고 받습니다.
이러한 관리페이지를 만드는 기본 과정을 학습하고 실습을 통해 만들어 보고자 합니다.
관리페이지를 만드는 언어는 html , css, javascript, php, mysql 를 이용해서 만들니다.
해당 언어의 기초 지식이 있으면 좋지만, 전체 구성을 이해하는것 만으로도 큰 도움이 되실 겁니다.

교육목표 :
- PHP, MySQL을 이용해서 관리페이지를 만들고 JSON으로 출력해서 모바일 앱에서 서버의 자료를 받을 수 있는 관리 시스템을 개발하는 교육과정이다. (안드로이드 JSON 파싱 연동)


교육내용 :
1일차 : 관리페이지와 JSON 통신 구축 소개 및 개발환경 구축
2일차 : 제어문, 반복문, 배열, 함수
3일차 : MySQL 데이터베이스, MySQL 명령
4일차 : PHP와 MySQL의 연동
5일차 : 쿠키와 세션, 관리페이지 로그인 기능 구현
6일차 : 게시판 만들기
7일차 : 자료실 만들기
8일차 : JSON 출력 및 안드로이드 앱 연동
* 교육 내용은 수강생 구성에 따라 내용이 다소 변경될 수도 있습니다.


교육안내 :
1.일시 : 2016년 3월 15일 ~ 4월 7일
2.시간 : 매주 화,목 저녁 7시~10시 (3시간) / 총 8일 (24시간)  * 일정은 강사의 사정에 따라 일부 변동될 수도 있습니다.
3.장소 : 해운대 센텀시티 (구체적인 장소는 별도 안내)
4.준비 : 노트북 사양무관 (* 노트북이 없는 경우 문의)
5.비용 : 유료 20만원, 시간당 9천원 정도 입니다. (입금문의 : 010-2694-8424)
6.신청 : 아래 게시글에 코멘트에 비밀글 체크후 연락처, 노트북 유무, 자바실력, 간단소개글 정도 남겨 주시기 바랍니다.
http://www.androidstudy.co.kr/bbs/board.php?bo_table=B11&wr_id=3033
8.접수 : 2016년 3월 14일 까지



* 아래 게시글에 코멘트로 "비밀글" 체크후 이름과 연락처, 서버프로그래밍 및 홈페이지 개발 경험, 참가 이유 등을 남겨 주세요! (접수 확인후 개별 연락 드립니다.)
http://www.androidstudy.co.kr/bbs/board.php?bo_table=B11&wr_id=3033



2013 DB 매쉬업 공모전

기타

 

 

공모주제 

DB·API를 매쉬업 하라!
 
공모내용
개발부분 : DB·API를 매쉬업 하여 개발한 서비스
기획부문 : DB·API를 매쉬업 하여 제안한 서비스 아이디어
 
공모기간
2013. 5. 27. ~ 7. 24. 16:00까지

참가대상
개인 또는 팀 단위
학생(초·중·고·대학 및 대학원생), 개발자, 일반직장인 등 누구나 참여 가능
 
접수방법
공모전 홈페이지를 통한 온라인 접수 (http://www.dbstore.or.kr/mashup2013/apply.do)
DB·API를 2개 이상 매쉬업 한 웹서비스, 모바일 앱 등의 창의적인 서비스를 기획·개발하여 서비스 확인이 가능한
파일 또는 URL 제출 ※ 서비스 개발언어 및 플랫폼 제한없음
참가신청서 1부 당 기획서 및 개발작품 1건을 원칙으로 함
1인(팀)이 부문별 중복 참여 및 여러 개의 기획 ·개발 작품 제출 가능
단, 수상작 선정시 여러 출품작 중 최고점을 받은 한 작품에 대하여만 시상하며
동일내용으로 기획부문과 개발부문 동시 수상후보인 경우 개발부문으로 시상

제출서류
개발부문 : 참가신청서(온라인양식), 개발계획서(공모전 양식 다운로드), 서비스 개발물(서비스 확인이 가능한 파일 및 URL 제출)
기획부문 : 참가신청서(온라인양식), 기획서(공모전양식 다운로드), 스토리보드
 
심사방법
1, 2차 전문가 심사 ※ 공모전공개용 DB·API 사용시 가산점(5점 이내) 부여
개발부문 : DB활용여부, 창의성, 유용성, 시장성, 기술성
기획부문 : DB활용여부, 창의성, 유용성, 구현가능성
 
시상규모
1) 대상 (미래부장관상)
- 개발부분 : 1종 1,5000만원
- 기획부문 : 1종 300만원
2) 최우수상 (공동주관기관장상)
- 개발부문 : 3종 각 500만원
- 기획부문 : 2종 각 200만원
3) 후원기관장상
- 개발부문 : 5종 각 300만원
- 기획부문 : 3종 각 100만원
4) DB제공부문
- 5종 각 100만원
※ 상금의 제세공과금은 수상자 본인 부담
※ 특별부문 : DB제공부문은 공모전공개용DB 제공자 대상으로 활용도가 높은 DB를 선정·시상
 
유의사항
주관기관은 공모전공개용 DB·API 목록 외에는 매쉬업서비스 개발을 위한 DB·API 중개를 하지 않으므로 개별적으로 DB·API를 입수하여 개발해야 함
출품작은 미발표된 신규 창작물이어야 함
상품광고, 음란물, 미풍양속을 해치는 작품, 대리작, 중복작 및 타 공모전 수상작은 심사에서 제외되며, 입상 후 타 공모전 수상작, 대리작 또는 표절로 확인 시 수상 취소 및 상금 회수 조치함
부문별 수상작에 대한 저작권은 공모전 참가자에게 있음
출품작은 제3자의 저작권(음원, 영상, 사진, 이미지, 캐릭터 등), 상표권 등 일체의 법적 문제가 없어야 하며, DB·API의 무단사용 등으로 발생하는 법적 제반 문제에 대한 책임은 공모전 참가자에게 있음. 추후 법적인 문제 발생시에는 접수 및 수상이 취소됨
출품작은 일체 반환하지 않으며, 상금에 대한 제세공과금은 수상자 본인이 부담
 
공모전 일정
접수마감 : 2013.7.24
1차심사 : 2013.7.29~8.9
멘토링데이 : 2013.8.12~8.16
2차심사 : 2013.8.26~9.6
시상식개최 : 2013.9월말
※ 일정은 추후변동 가능하며, 멘토링데이 및 시상식 개최일은 확정시 공지함
 
참가자 특전 1 
멘토링데이란?
본 공모전은 1차 심사를 통과한 기획 및 개발부문 참가자들을 대상으로 공동주관사인 KTH와 SKT의 기획 및 기술전문가가
개별 멘토링 서비스를 제공
 
참가자 특전 2 (http://topenlab.sktelecom.com/Equipment/EquipmentAnn.aspx)
본 공모전 참여자들은 공동주관사인 SKT의 에서 다양한 개발환경 이용 가능
단말기 : WCDMA, LTE용 스마트폰, 태블릿 등
계측기 : 개발, 시험에 필요한 다양한 계측기 구비
프로젝트룸 : 테스트룸, 쉴드룸 등 개발/검증시험이 가능한 공간
세미나/회의실 : 아이디어 기획 등 자유롭게 토론·공유가 가능한 공간
 
 

[MYSQL] Starting MySQL. ERROR! Manager of pid-file quit without updating file.

컴활용

MySQL 설치후 /etc/my.cnf 수정후 MySQL을 실행 했는데, Starting MySQL. ERROR! Manager of pid-file quit without updating file. 와 같은 오류가 떠드군요.

# /etc/rc.d/mysqld start
# Starting MySQL. ERROR! Manager of pid-file quit without updating file.

이유는 my.cnf를 잘못 수정한 원인이었습니다.
그래서 /etc/my.cnf를 삭제하고

# /usr/local/mysql/bin/mysql_install_db --user=mysql

실행해서 데이타베이스를 새로 생성하니 잘 되더군요.
아님 my.cnf를 수정하시기 전에 백업을 하신다면 다시 원복해서 실행하면 정상 동작할 겁니다.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드...

Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)

데이타베이스
Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)

Character set '#192' is not a compiled character set and is not specified in the '/usr/local/mysql/share/mysql/charsets/Index' file

PHP + MySQL 연동시 자주 발생하는 오류로써 MySQL에 문자셋 설정 오류 입니다.
오류 메시지 내용만 보면 ?.conf 문자셋 파일이 없다 그런 내용입니다.
해결 방법을 찾아서 이것저것 해보았지만 해결되지 않더군요.

그래서 오류 메시지가 알려준데로 MySQL에서 이용하는 문자셋중 latin1.xml 파일을 ?.conf 파일로 복사 해줬더니 더이상 오류가 나지 않더군요

일단 MySQL 소스 설치를 /usr/local/mysql 에 하셨다면

cd /usr/lcoal/mysql/share/mysql/charsets/
cp latin1.xml ?.conf

이렇게 하니 더이상 오류가 뜨지 않더군요.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

MySQL 5.x 설치후 기존 utf8 자료 이전시 한글 깨짐 증상 해결 my.cnf 수정

데이타베이스

Aapache 2.x, PHP 5.x, MySQL 5.x 설치후 서버 이전을 끝내고 사이트 접속해보니 한글이 모두 ㅁㅁㅁ 특수기호들로 깨져 버리더군요.
원인을 알아 보니 mysql 기본 설치시 기본 문자셋이 utf8이 아니라서 생긴 문제 이더군요.
웹소스는 utf8 이며 기존 DB 자료 역시 utf8인데 mysql 기본 문자셋은 다른 문자로 되어 있어서 생긴 문제 였습니다.
다행이도 해결 방법이 mysql 다시 설치 하는 것이 아니라 /etc/my.cnf MySQL 설정 파일만 수정해 주면되었습니다.


자신의 기본 문자셋이 어떻게 되어 있는지 확인 해 보실려면 mysql 접속후 다음과 같이 확인 해 보세요!

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |

이와 같이 latin1 등의 문자셋으로 설정 되어 있음을 확인하실 수 있습니다.

설정파일 수정은 /etc/my.cnf 파일을 수정 하시면 되며, 각 [항목] 바로 아래에 문자셋 설정을 추가 해주시면 됩니다.

# vi /etc/my.cnf

[client]
default-character-set=utf8

[mysqld]
init_connect='set names utf8'
character-set-server=utf8
default-collation=utf8_unicode_ci
skip-character-set-client-handshake
character-set-filesystem=utf8
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

위와 같이 추가하고 저장후 mysql 데몬을 다시 실행 해 보시면 아래와 같이 문자 기본셋이 변경 되었음을 확인 하실 수 있습니다.

+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+

사이트 접속해보니 이제 정상으로 한글이 보이는 군요.
등록 및 수정 등 쿼리 전송시 한글 처리는 잘되는지 아직 안해봤음 ^^


 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

[클래스] MySQL 테이블 복구 repair 명령어, SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)

데이타베이스

어느날 갑자기 MySQL 테이블 하나를 읽을려고 할때 다음과 같은 메시지가 나타날 경우

SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)

테이블이 오류가 난것입니다.
원인은 하나의 테이블에 지속적으로 접속자가 너무 많이 connection이 된 경우 혹은 MySQL 기록중에 DB서버가 강제 종료 혹은 리부팅 되는 경우 깨지는 경우가 종종 발생 합니다.

이처럼 비정상적으로 종료된 테이블인 경우 마지막 처리 과정을 복구해서 정상 동작 하도록 하는 명령어가 있습니다.

먼저 해당 테이블 DB에 접속합니다.

mysql -u아이디 -p db이름
비번 :
repair table tablename; 입력 혹은 그냥 엔터

또는 간단하게 한줄로

mysql -u아이디 -p비번 db이름 repair table 테이블명


  최신영화 보러가기... 


php DB 인젝션 공격 방어

웹프로그램
인젝션 방어를 위한 처리를 하기 위해선
get, post 로 넘어오는 모든 변수중에서 DB에 사용될 변수에 대해 검수를 거친뒤에 DB에서 사용하도록 해야하나 이미 구축된 사이트에 일일이 적용하기엔 힘들 경우 아예 get, post 데이터 전체를 검사하도록 다음과 같이 구현해 봤습니다.

//인젝션 공격 막기 넘어오는 변수들 모두 검사

//GET
while(list($fildn1,$fildv1) = each($_GET)) {
  if(eregi("--",$fildv1)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

//POST
while(list($fildn2,$fildv2) = each($_POST)) {
  if(eregi("--",$fildv2)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

일단 인젝션 공격에 대표적인 문구인 "--" 하나 넣어 봤는데 필요시 "--|;|\.js" 처럼 "|"로 구분해서 추가 하면 되겠죠!
물론, 정상적인 값들까지 차단 될 수 있다는 문제가 있긴 합니다.
따라서, 차단할 패턴은 잘 선택해서 입력하세요.
그리고, ".js" 앞에 "\" 표시 붙인 이유는 "." 점이 정규식 예약어라서 무시하도록 하기 위해 "\"원화 표시를 붙여 줍니다.
정규식 예약어는 세이박스에서 조회 해서 확인 하세요!

하지만, 효율성을 위해서 사이트 구축시 처음부터 인젝션 공격을 고려해서 코딩 하세요!
이게 정답이다 할만한건 없지만 자신의 사이트에 맞는 최적화 방법이 최고 입니다.

예로 들자면 $num 이라는 변수에는 단순 숫자만 넘어와야한다면
if(eregi("[^0-9]",$num)) echo "접속차단";

이런식으로 필요하지 않는 값을 원천적으로 차단 해주는게 가장 좋습니다.
이유인즉, 최근에는 Ascii 코드 값으로 문자를 만들어 공격 하기도 합니다.
이럴경우 제가 만든 소스로는 좀 힘들겠죠...

그럼, 여러분들이 만들어 두신 좋은 차단 방법 좀 있으면 올려주세요~
화이팅!!

SQL 2000 Server 서비스 팩3,4 설치시 '스크립트 실행 중 오류 발생'

데이타베이스

SQL 2000 Server 서비스 팩3,4 설치시 오류 대처방법

스크립트 실행 중 오류 발생 '80sp1-tools.sql (1)'



1. 쿼리분석기로 SQL Server 에 접속한다.


2. DBCC CHECKDB('dbname', NOINDEX) 로 지정한 데이터베이스에서 모든 개체의 할당과 구조적 무결성을 검사한다.

NOINDEX - 시스템 테이블이 아닌 테이블의 클러스터되지 않은 인덱스를 검사하지 않도록 지정한다. NOINDEX는 사용자 정의 테이블의 클러스터되지 않은 인덱스를 검사하지 않으므로 전체 실행 시간이 줄어든다. DBCC CHECKDB에서 모든 시스템 테이블 인덱스를 검사하므로 NOINDEX는 시스템 테이블에 어떤 영향도 주지 않는다.

-------------------------------------
NOINDEX 에 쓰일 수 있는 다른 옵션들 ↓

REPAIR_ALLOW_DATA_LOSS - REPAIR_REBUILD에서 수행하는 모든 복구 작업을 수행하며 할당 오류, 구조적 행 오류나 페이지 오류, 손상된 텍스트 개체 삭제를 수정하기 위한 행과 페이지의 할당 및 할당 취소가 포함된다. 이러한 복구를 할 경우 일부 데이터가 손실될 수 있다. 복구 작업은 사용자가 변경 사항을 롤백할 수 있도록 사용자 트랜잭션 내에서 수행된다. 복구가 롤백되어도 데이터베이스에는 오류가 그대로 포함되므로 백업에서 데이터베이스를 복원해야 한다. 제공된 복구 수준 때문에 오류 복구를 생략한 경우 해당 복구에 종속적인 모든 복구도 생략된다. 복구를 완료한 후 데이터베이스를 백업한다.

REPAIR_FAST - 클러스터되지 않은 인덱스의 별도 키를 복구하는 것과 같이 사소하고 시간이 소요되지 않는 복구 작업을 수행한다. 이러한 복구는 데이터 손실의 위험 없이 빨리 실행할 수 있다.

REPAIR_REBUILD - REPAIR_FAST에서 이루어지는 모든 복구 작업을 수행하고 인덱스 다시 작성과 같이 시간이 소요되는 복구를 포함한다. 이러한 복구는 데이터 손실의 위험 없이 실행할 수 있다.
-------------------------------------


3. 검사하여 오류가 발생하는 데이터베이스를 위의 옵션으로 적절히 사용하여 복구한다.


4. 이때 단일사용자 모드로 설정해야 한다.


sp_dboption dbname, single, true


5. 복구되면 단일사용자 모드 해제한다.


sp_dboption dbname, single, false


6. 서비스 팩을 다시 설치한다.

우편번호 최신 DB 2009.2.23

데이타베이스
우체국 사업 본부 사이트인 koreapost.go.kr 에서 제공하는 우편번호 파일을 엑셀로 받아서 DB에 저장 할 수 있도록 insert 문으로 벼경 하였습니다.

http://www.koreapost.go.kr/woopuns/domestic_post3_3.jsp?sc_displayflag=true


위 URL로 직접 가셔서 사용하고자 하는 용도에 맞게 이용하시면 됩니다.

제가 만든 쿼리는 제 사이트에 맞게 받은것으로 자신의 사이트에 맞는 필드로 변경해서 이용하시기 바랍니다.

우편번호는 2009년 2월 23일자 현재 최신 자료 입니다. 

MSSQL2005 [DBNETLIB][ConnectionOpen (Connect()).]SQL Server가 없거나 액세스할 수 없습니다.

데이타베이스
MSSQL2000을 이용하다가 MSSQL2005로 업그레이드 하고 ASP소스는 DB가 이전에 웹서버와 분리 되어 있어서 DB에 접속하는 IP가 고정으로 되어 있었다.
그런데, 다음과 같은 오류가 발생하면서 DB에 접속할 수 없다는 오류가 나는 것이다.

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server가 없거나 액세스할 수 없습니다.

sql 재시작해도 안되는것이었다.
새로 설치한 서버는 웹과 DB를 하나의 서버에 설치 했기에
혹시나해서 sql 연결구문에서 ip를 127.0.0.1 로 바꿨더니 접속이 된다.

OTL 헐..

MSSQL2008이 나왔는데 MSSQL2005를 붙잡고 고생하고 있다. ㅋㅋ

addslashes() stripslashes() DB 저정시 '홀따옴표에 \백슬러시 붙였다 빼주는 함수

웹프로그램
 
addslashes()
DB에 데이터를 입력할 때 ' 홀따옴표가 들어가는경우 오류가 나는걸 방지 하기위해 ' 앞에 \ 백슬러시를 붙이는 역할을 합니다. \' 처럼...
 
stripslashes()
addslashes() 반대 되는 역할로써 ' 홀따옴표에 \붙여진걸 제거 해주는 역할을 합니다.
 
게시판등 사용자의 입력내용을 받을때 유용하게 활용 하면 str_replace 등으로 굳이 변환하지 않고 DB에 바로 저장 가능합니다.

DB injection script 스크립트 공격 복구 및 보안

데이타베이스

DB injection 공격?
구글에서 <script src= 0.js 라고 검색하면 놀랄 정도로 많은 사이트들이 DB 공격을 받았음을 확인 하실 수 있을겁니다.
제가 관리하는 사이트 또한 위와같은 스크립트 삽입되어 수많은 사이트를 찾아 다니며 복구하고 나름대로 보안하는 방법을 접하게 된 것을 올려 봅니다.


1. 공격 유형 :
SQL injection 홈페이지 상의 DB사용하는 페이지를 공격 즉, 웹소스 취약한 곳을 통해 DB를 공격.
특수 코드 삽입해서 DB에 스크립트를 삽입하여 접속하는 사용자에게 악성코드를 설치하는 유형.


2. 조치 시 주의 사항
참조 : http://swbae.egloos.com/1747128
1) 홈페이지 변조를 통해 악성코드 링크를 삽입한게 아니라, SQL injection 기법을 이용해 DB 컨텐츠에 삽입한 것입니다.
2) 조치 시 DBA 의 도움을 받는게 좋습니다.
3) 공격 때문에 기존의 데이터가 일부 덧씌워져 변경되었을 수 있습니다. 이럴 땐 백업의 도움을 받아야 겠지만, 일부 데이터의 유실은 어쩔 수 없을 듯...
4) 근본 원인은 사이트가 SQL injection 공격에 취약하게 개발되어 있어서 그렇습니다. 공격 포인트를 파악해서 외주개발 업체, 혹은 내부개발팀을 통해 소스를 수정하세요.
5) 소스를 수정할 수 없는 경우 웹 방화벽이 도움이 될 수도 있습니다. 그러나, 제품 도입시 면밀히 검토하실 필요가 있습니다. 단순 패턴 매칭 형태를 사용해서, 보유패턴과 1byte 만 틀려도 탐지 못하는 제품이 몇 개 있더군요.


3. 공격으로 생긴 DB table 삭제
comd_list 테이블 삭제
ahcmd 테이블 삭제
foofoofoo 테이블 삭제
Reg_Arrt 테이블 삭제
comd_list 테이블 삭제
D99_CMD 테이블 삭제
D99_TMP 테이블 삭제
Kill_kk 테이블 삭제
jiaozhu 테이블 삭제


4. 삽입 스크립트 제거 복구
DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://s.ardoshanghai.com/s.js></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;

'스크립트 부분은 삽입된 스크립트를 입력


5. 보안 적용 1 - MSSQL 메모리에서 위험한 sp들을 내린다.
보안상 위협이 될 수 있는 개체들에 대하여 일반 사용자 그룹의 사용권한을 제한한다.
참조: http://blahblah.springnote.com/pages/351077
SP 등록해제는 위험을 감안해야 하므로 메모리에서만 내린다. 단점, 재부팅되거나 DB 재시작시 다시 아래 쿼리 실행 할것!

dbcc xp_cmdshell(free)
dbcc xp_dirtree(free)
dbcc xp_regdeletekey(free)
dbcc xp_regenumvalues(free)
dbcc xp_regread(free)
dbcc xp_regwrite(free)
dbcc sp_makewebtask(free)


6. 보안 적용 2
무엇보다 DB 인젝션이 발생한 원인인 로그인, 회원가입, 게시판 등 사용자가 DB를 접하게 되는 소스 개발시 특수 문자 보안 적용 안된 경우가 가장 유력하다.
로그인, 회원가입, 아이디 비번찾기, 게시판 등이 개발자가 개발하면서 DB를 공격할만한 특수 문자에 대한 차단 기능을 적용하지 않은 문제로 판단됨. 소스를 모두 개선 해야함.
보안참조 : http://magic.littleworld.net/ai/kmod.asp?no=327&amp;isn=&amp;mymsg


위 글은 세이박스에서 작성한 글입니다.
출처를 적어 주시고 많은 국내 사이트들이 공격을 받고 있으니 도움이 되기 위해 많이 많이 올려주세요! ^^
출처 : 세이박스  http://saybox.tistory.com/453

SQL Injection 공격과 방어 방법 - php, asp 등

서버,보안

사용자 입력값이 SQL injection 발생시키지 않도록 수정

다수 사이트, SQL Injection 취약점 공격에 무방비 상태


웹 취약점을 이용한 공격이 식을 줄 모르고 있다. 공격의 목적은 게임정보 탈취와 궁극적으로는 이를 이용한 게임아이템 거래로 돈을 벌기 위한 것이다.


정보통신부와 KISA는 이에 대한 대책으로 중국에서 들어오는 IP들을 차단하고 있고 자금 여력이 없는 중소기업의 웹사이트 관리자에게 공개 웹방화벽 구축을 권유하고 있으며 개인 PC의 보안패치율을 높이기 위해 각종 캠패인을 벌이고 있다.


KISA에서 운영하는 ‘보호나라’에서는 대국민 서비스로 원격 PC점검을 해주고 있고 대기업을 중심으로 보안솔루션 도입과 시스템 구축이 한창이다. 하지만 이러한 노력에도 불구하고 해킹 관제 서비스를 실시하고 있는 업체에서는 하루에도 2백~3백건의 해킹이 이루어지고 있고 이를 통한 악성코드 유포가 지속적으로 이루어지고 있다고 지적하고 있다.


KISA 관계자는 “지난해 정부기관 사이트와 주요 웹사이트를 대상으로 대대적인 웹사이트 모의 해킹을 실시한 결과 대부분의 사이트들이 SQL Injection 취약점 공격에 맥없이 뚫렸다”며 “SQL Injection 취약점 공격에 대한 대비책을 개발자들이 기본적으로 알고 있어야한다”고 강조했다.


<보안뉴스>는 얼마전부터 웹개발자들이 기술,정신적으로 보안강화에 더욱 노력해야 한다는 기사와 관련정보를 제공해 오고 있다. 이번에는 SQL Injection 취약점에 대해 알아보자. 자료 제공은 KISA 해킹대응팀이다. 


<기획3> 악의적인 명령어 주입 공격(SQL Injection)


현재 대부분의 웹 사이트들은 사용자로부터 입력받은 값을 이용해 데이터 베이스 접근을 위한 SQL Query를 만들고 있다. 사용자 로그인 과정을 예로 들면, 사용자가 유효한 계정과 패스워드를 입력했는지 확인하기 위해 사용자 계정과 패스워드에 관한 SQL Query문을 만든다. 이때 SQL injection 기법을 통해서 정상적인 SQL query를 변조할 수 있도록 조작된 사용자 이름과 패스워드를 보내 정상적인 동작을 방해할 수 있다. 이러한 비정상적인 SQL Query를 이용해 다음과 같은 공격이 가능하다.


-사용자 인증을 비정상적으로 통과할 수 있다.

-데이터베이스에 저장된 데이터를 임의로 열람할 수 있다.

-데이터베이스의 시스템 명령을 이용하여 시스템 조작이 가능하다.


이러한 취약점을 ‘SQL Injection 취약점’이라고 하며, 사용자가 데이터 입력이 가능한 수많은 웹 페이지 상에 이러한 취약점이 존재할 수 있다.


■위협 사례


(1) 사용자 인증 공격


아래의 그림과 같이 인증을 처리하는 모듈이 입력 값에 대해 적절히 검사하지 않았을 때 공격자는 비정상적인 SQL Query를 삽입 할 수 있고 이를 이용해 사용중인 데이터베이스에 영향을 줄 수 있다.



다음은 SQL 구문을 이용하여 인증을 처리하는 일반적인 웹 페이지 구조를 나타낸다.

$row = mysql_query (" SELECT 신청인명, 접수번호 from USER_TABLE where 신청인명='첫번째입력값' and 접수번호='두번째입력값' ");

if ( $row == 1 )

// 인증 성공 루틴

else 

  // 인증 실패 루틴


이 스크립트에 공격자가 test라는 신청인명을 입력하고 인터넷접수번호 대신 A' or 'A'='A 이란 값을 입력하면 아래와 같은 SQL Query가 완성된다.


SELECT 신청인명,접수번호 FROM user_table WHERE 신청인명=‘test?? AND 접수번호=??A' OR 'A'='A'


이 경우 구문의 WHERE 절은 ??참 AND 거짓 OR 참??의 WHERE 절이 생성되며 무조건 참이 되어 SQL 구문은 올바른 입력 값으로 처리하게 되며 공격자는 웹 인증 페이지를 쉽게 통과할 수 있게 된다.


(2) MS-SQL상에서의 시스템 명령어 실행


MS-SQL 데이터베이스를 사용하는 경우를 예를 들어 보자. 만약 데이터베이스 접근 권한이 시스템 권한을 사용하고 있다면 MS-SQL에서 기본적으로 제공하고 있는 xp_cmdshell이라는 Stored Procedure를 이용하여  시스템 명령어를 실행할 수 있다.


예로 위의 인증 페이지에서 신청인명에 test, 접수번호에 ??; exec master..xp_cmdshell ??ping 10.10.1.2'-- 값을 입력했다고 가정하면 SQL Query는 다음과 같이 완성될 것이다.


SELECT 신청인명, 접수번호 from USER_TABLE where 신청인명='test' and 접수번호='; exec master..xp_cmdshell 'ping 10.10.1.2'--


이 SQL Query는 SELECT Query와 xp_cmdshell Query를  SQL Query가 순차적으로 실행되게 되며, 마지막의 -- 문자는 이후의 모든 문자열을 주석 처리하여 문장을 완성시켜 준다.


(3) 취약성 판단


-검색어 필드 및 로그인ID, PASSWD 필드에 큰따옴표("), 작은따옴표('), 세미콜론(;) 등을 입력한 후, DB error가 일어나는지 확인하자.


-로그인 모듈 점검

MS SQL인 경우: ID 필드에 ['or 1=1 ;--], 비밀번호 필드에는 아무 값이나 입력한 후 로그인을 시도한다.

Oracle인 경우: ID 필드에 ['or 1=1 --], 비밀번호 필드에는 아무 값이나 입력한 후 로그인을 시도한다.


-기타

ID 필드에 ['or ''='], 비밀번호 필드에 ['or ''=']을 입력한 후 로그인을 시도한다.


※ 위 예제 이외에도 다양한 방법이 가능하기 때문에, 로그인 및 사용자 입력 값을 사용하는 소스에서 DB Query 생성 방식을 직접 점검해야 한다.


■ 보호 대책


(1) 일반 대책

-데이터베이스와 연동을 하는 스크립트의 모든 파라미터들을 점검하여 사용자의 입력 값이 SQL injection을 발생시키지 않도록 수정한다.


-사용자 입력이 SQL injection을 발생시키지 않도록 사용자 입력 시 특수문자(' " / \ ; : Space -- +등)가 포함되어 있는지 검사하여 허용되지 않은 문자열이나 문자가 포함된 경우에는 에러로 처리한다.


-SQL 서버의 에러 메시지를 사용자에게 보여주지 않도록 설정한다. 공격자는 리턴 되는 에러 메시지에 대한 분석을 통하여 공격에 성공할 수 있는 SQL Injection 스트링을 알아낼 수 있다. 따라서 SQL 서버의 에러 메시지를 외부에 제공하지 않도록 한다.


-웹 애플리케이션이 사용하는 데이터베이스 사용자의 권한을 제한한다. 가능하면 일반 사용자 권한으로는 모든 system stored procedures에 접근하지 못하도록 하여 웹 애플리케이션의 SQL Injection 취약점을 이용하여 데이터베이스 전체에 대한 제어권을 얻거나 데이터베이스를 운용중인 서버에 대한 접근이 불가능하도록 한다.


-php.ini 설정 변경

  : php.ini 설정 중 magic_quotes_gpc 값을 On으로 설정한다.


; Magic quotes

;

; Magic quotes for incoming GET/POST/Cookie data.

magic_quotes_gpc = On  ; Off에서 On으로 변경한다.

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.

magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').

magic_quotes_sybase = Off


■ 개발 언어별 대책

-사용자로부터 입력받은 변수로 SQL 쿼리 구문을 생성하는 CGI는 입력받은 변수를 체크하거나 변경하는 로직을 포함하고 있어야 한다.


-입력받은 변수와 데이터 베이스 필드의 데이터형을 일치 시켜야 하고, 사용 중인 SQL 구문을 변경시킬 수 있는 특수문자가 포함되어 있는지 체크해야 한다.


-검색 부분과 같이 클라이언트로부터 생성된 SQL 구문을 받는 부분이 있다면 이를 제거해야 한다.


□ ASP

-취약한 SQL Injection 예제

prodId = Request.QueryString("productId")

Set conn = server.createObject("ADODB.Connection")

Set rs = server.createObject("ADODB.Recordset")

query = "select prodName from products where id = " & prodId

conn.Open "Provider=SQLOLEDB; Data Source=(local);

Initial Catalog=productDB; User Id=dbid; Password="

rs.activeConnection = conn

rs.open query

If not rs.eof Then

response.write "제품명" & rs.fields("prodName").value

Else

response.write "제품이 없습니다"

End If


-안전한 SQL Injection 예제

prodId = Request.QueryString("productId")

prodId = replace(prodId, "'", "''")' 특수문자 제거

prodId = replace(prodId, ";", "")

set conn = server.createObject("ADODB.Connection")

set rs = server.createObject("ADODB.Recordset")

query = "select prodName from products where id = " & prodId

conn.Open "Provider=SQLOLEDB; Data Source=(local);

Initial Catalog=productDB; User Id=dbid; Password="

rs.activeConnection = conn

rs.open query

If not rs.eof Then

response.write "제품명" & rs.fields("prodName").value

Else

response.write "제품이 없습니다"

End If


□ PHP

-addslashes() 함수 사용

  : 사용자가 입력하는 값들($_GET, $_POST)을 모두 addslashes() 함수를 이용하여 처리하여 준다.

addslashes()

용도 : DB Query와 같이 인용된 부분앞에 역슬래쉬를 붙여서 반환한다. 해당 문자에는 작은 따옴표, 큰 따옴표, 역슬래쉬, NULL이 있다. SQL Injection 공격을 위해서 사용한다.

- 적용 가능한 PHP : PHP 3 이상


-취약한 SQL Injection 예제

$query = "SELECT id, password, username FROM user_table WHERE id='$id'";// 사용자로부터 입력받은 id 값을 사용자 table에서 조회

$result = OCIParse($conn, $query);

if (!OCIExecute($result))

echo "<META http-equiv=\"refresh\" content=\"0;URL=http://victim.com\">";// 메인 페이지로 redirect

OCIFetchInto($result, &$rows);

... 중략 ...


-안전한 SQL Injection 예제

$query = sprintf("SELECT id,password,username FROM user_table WHERE id='%s';",addslashes($id));

// id변수를 문자형으로 받고, id변수의 특수문자를 일반문자로 변환한다.

// @ 로 php 에러 메시지를 막는다.

$result = @OCIParse($conn, $query);

if (!@OCIExecute($result))

error("SQL 구문 에러");

exit;

@OCIFetchInto($result,&$rows);

... 중략 ...


□ JSP

-취약한 SQL Injection 예제

String sql="SELECT*FROM user_table"+"WHERE id=" + response.getParameter("id")

+ " AND password = " + response.getParameter("password");

Class.forName("org.gjt.mm.mysql.Driver");

conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);

stmt = conn.createStatement();

rs = stmt.executeQuery(query);

while(rs.next())


-안전한 SQL Injection 예제

String sql = "SELECT*FROM user_table"+"WHERE id = ?"+"AND password = ?";

ResultSet rs = null;

PreparedStatement pstmt = null;

try

conn = DBManager.getConnection();

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, request.getParameter("id"));

pstmt.setString(2, request.getParameter("password"));

rs = pstmt.executeQuery();

[길민권 기자(boannews@infothe.com)]

출처 : http://www.superuser.biz/tag/sql%20%C0%CE%C1%A7%BC%C7

PHP 파일 내용 DB로 넣기

웹프로그램
<?
include "$DOCUMENT_ROOT/php/common.php";
if(!$conn) $conn=dbConn();

$fp=fopen("kkk.txt",'r');

while(!feof($fp)){
$line=fgets($fp, 512);

$aa=explode(",",$line);

$name=Trim($aa[0]);
$email=Trim($aa[1]);
$phone=Trim($aa[2]);

$qry="INSERT INTO beta_tester VALUES ('$name','$email','$phone')" or die(mysql_error()."->");
//echo $qry.'<br>';
mysql_query($qry);
}

fclose($fp);

if($conn)$conn=dbClose($conn);
?>

PHP DB에 데이타 한꺼번에 밀어넣기 예제

웹프로그램
보통 데이타를 DB에 집어 넣을 때 load data infile 을 이용해서 화일로 부터 집어 넣습니다.
이런 방법도 무쟈게 빠름니다.

하지만 insert를 써서 데이타를 집어넣는 방법도 빠르게 할 수 있습니다.
예 1)
for($i=0;$i<4000;$++){
$j=$j+1;
$query=mysql_query("insert into table_name values('',$i,$j)");
}
예 1같은 경우는 insert를 4000번 이나 계속합니다. 좀 무리가 가겠죠..

예 2)
for($i=0;$i<4000;$++){
$j=$j+1;
$query_insert .="('',$i,$j),";
}
$query_insert=eregi_replace("[,]$","",$query_insert);//마지막에 붙는 ,를 제거합니다.
$query=mysql_query("insert into table_name values $query_insert");//한꺼번에 집어넣습니다.
예제 2와 같이하면 순식간에 데이타가 들어갑니다.
이렇게 하면 10만 집어넣는것도 몇분이면 끝납니다.
주의할점은 메모리에 따라서 인서트할 수 있는 수가 결정되는 거 같더라구요!..

이상 허접팁이었습니다.

MYSQL DB 사용자 추가

데이타베이스
mysql> insert into db values ('%','databaseName','Y','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `user` ( `Host` , `User` , `password` , `Select_priv` , `Insert_priv` , `Update_priv` , `Delete_priv` , `Create_priv` , `Drop_priv` , `Reload_priv` , `Shutdown_priv` , `Process_priv` , `File_priv` , `Grant_priv` , `References_priv` , `Index_priv` , `Alter_priv` , `Show_db_priv` , `Super_priv` , `Create_tmp_table_priv` , `Lock_tables_priv` , `Execute_priv` , `Repl_slave_priv` , `Repl_client_priv` , `ssl_type` , `ssl_cipher` , `x509_issuer` , `x509_subject` , `max_questions` , `max_updates` , `max_connections` )
VALUES (
'localhost', 'partner', PASSWORD( 'partner' ) , 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', '0', '0', '0'
);
Query OK, 1 row affected (0.00 sec)

MYSQL DB 원격 접속

데이타베이스
1. db 테이블의 host란에 '%'로 표시, 아니면 특정 IP.

2. user 테이블의 host란에 '%'로 표시, 아니면 특정 IP.

트랜잭션 로그 파일 삭제 방법

데이타베이스
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]'WordGame' 데이터베이스의 로그 파일이 꽉 찼습니다. 데이터베이스의 트랜잭션 로그를 백업하여 사용 가능한 일부 로그 공간을 확보하십시오.
 
라는 오류 메시지가 나타나는 경우 해당 싸이트에서 DB를 SQL Server를 사용하는데.. 그 DB서버의 문제가 생긴 것입니다.
말 그대로 데이터베이스의 로그 공간을 확보 하면 되는데..
 
로그파일 용량을 늘여주는 방법이 있구요..
하드용량이 꽉차서 더이상 로그를 늘릴수 없다면 기존 로그를 삭제 하는 방법이 있어요.
기존 로그를 삭제하는 방법은 쿼리분석기에서
backup log 디비이름 with no_log
이렇게 실행시킨 후 엔터프라이즈관리자에서 해당 디비의 용량 축소를 하시면 됩니다.
 
주기적인 관리가 가능하다면
엔터프라이즈관리자 > 해당 DB의 등록정보 > 트랜잭션 로그 > 최대 파일 크기 > 파일 무제한 증가 로 체크를 하면 적어도 서비스가 중지되진 않음 하지만 용량이 커질수록 느려지는 문제가 생길수도 있음 따라서 필히 주기적으로 관리가 되어야함 ^^;
 
역시,,주기적인 모니터링이 최선인듯...ㅡㅡ;

SQL Server의 Procedure cache를 지우고 싶은데..

데이타베이스

Q . SQL Server의 Procedure cache를 지우고 싶은데요?
Tuesday, November 14, 2000

A . SQL Server 6.5 에서 유일한 방법은 SQL Server를 재시동하는 것입니다.
SQL 7.0 에서는 DBCC FREEPROCCACHE라는 명령어가 있습니다. DBCC FREEPROCCACHE의 권한은 sysadmin과 serveradmin 고정 서버 역할의 구성원에게만 기본적으로 부여되며, 양도할 수 없습니다

dat 만 가지고 데이터베이스를 복구할 수 있습니까?

데이타베이스
Q . .dat 만 가지고 데이터베이스를 복구할 수 있습니까?
Friday, November 24, 2000

A . 일반적으로 6.5 이하 버전에서는 백업을 받아 놓지 않고 자주 발생을 하는 일이다.
아래 글은 정원혁씨 사이트 참조

DISK REINIT, DISK REFIT을 수행하십시오.

1 SQL 서버를 single user mode 로 시작합니다. 옵션만 /f 대신 /m을 사용하면 됩니다.

C:MSSQLBINNSQLSERVR /m
2 ISQL/w를 수행하고 DISK REINIT을 수행합니다. 예를 들어 두 디바이스 파일로 구성되어 있었다면 다음과 같이 합니다.
DISK REINIT
NAME = 'dist' -- 이름은 종전과 똑같지 않아도 됩니다.
, PHYSNAME = 'd:mssqldatadist.dat'
-- 정확한 디바이스 파일의 path를 적어줍니다.
, SIZE = 2560
-- 파일의 크기를 근거하여 page 로 환산한 크기를 적어 줍니다.
-- 예를 들면 5MB * 512 = 2560 page 입니다.
, VDEVNO = 10
-- SQL 서버 안에서 유일한 디바이스 번호를 적어 줍니다.
--자세한 것은 Books Online/ DISK INIT 명령을 참조합니다.
--결과: This command did not return data, and it did not return any rows
GO
DISK REFIT
-- 결과: Warning: Disk Refit may not have the correct segment map information in Sysusages. Please review these after the command completes to verify their accuracy.
GO

-- 다시 이 작업을 남은 디바이스에 대해서도 수행합니다.
DISK REINIT
NAME = 'myDev'
, PHYSNAME = 'd:mssqldatamyDev.dat'
, SIZE = 1536
, VDEVNO = 11
GO
DISK REFIT
3 1 에서 사용한 프롬프트에서 Control + C를 눌르고 나타나는 질문에 Y를 입력합니다.
4 다시 정상적으로 SQL 서버를 시작합니다.

만약 이 방법으로 복구가 안 된다면 다음의 방법으로 검증을 해 보십시요.
1 testpubs라는 데이터베이스를 임의로 만듭니다.

SQL7 에서 미처 백업(.mdf)을 받지 못 하고 날려버린 DB를 살리기

데이타베이스

Q . SQL7 에서 미처 백업(.mdf)을 받지 못 하고 날려버린 DB를 살리는 법은?
Friday, November 24, 2000

A . 아래 내용은 정원혁씨 사이트에 참조한 글입니다. 저도 이러한 경우가 발생 해서 복구한적이이 있네요. 어려울때는 Books Online 을 참조 하시면 많은 도움이 됩니다.

1. *.mdf 를 비롯한 파일을 날렸다면 전혀 방법이 없습니다.
2. drop database 를 실행했거나 EM에서 database를 삭제했다면 역시 전혀 방법이 없습니다.
3. SQL 서버를 Uninstall 했다면 가능합니다. 이때는 *.mdf, *.ndf, *.ldf 등이 남아 있기 때문입니다.이 때는 바로 아래에 있는 스크립트를 참고하여 디비를 하나씩 살려내면 됩니다.
pubs 디비를 가지고 먼저 연습을 하고 하십시요.

sp_helpdb pubs
select * from pubs..titles
sp_detach_db pubs

sp_attach_db pubs, 'c:temppubs.mdf','c:temppubs_log.ldf'

sp_attach_single_file_db pubs, 'c:temppubs.mdf'
-----------
sp_helpdb mydb2
sp_detach_db mydb2

sp_attach_single_file_db mydb2, 'f:mssql7datamydb2.mdf'
,'f:mssql7datad2.ndf'
,'f:mssql7datamydb2_log.ldf'

mdf화일만 또는 mdf와 ldf 화일만 남았을때...

데이타베이스

10. 백업과 복구 - 4. mdf화일만 또는 mdf와 ldf 화일만 남았을때..
이번에 소개해드릴 내용은 약간은 쉬운? ^_^;;
간단한 내용 입니다.
앞에서 설명드린 FAQ들에 대해서 실질적인 내용을 답변 드리지요.
또한 하도 많이 받는 질문이라 아예 페이지를 만들었으니 참고 하시길 바랍니다.

Q. 풀백업과 로그백업을 혼용해 지속적으로 백업하고 있습니다.
개발자의 실수로 update 회원테이블 set 이름 = '아무개'
로 WHERE절 없이 update를 해 버렸습니다. 복구할 방법이 없을까요?

A. 가능합니다.
1. 복구 모델이 전체 모델일것(DB를 생성하면 기본입니다.)
2. 문제 발생후 풀백업이나 로그에 쓰지 않는 작업을 하지 않았을것
이 두 조건이 맞다면 즉시 로그를 with no_truncate 옵션으로 백업하신후..
Stop at 명령으로 복구할 수 있습니다.
 
Q. 지속적으로 전체 백업만을 받아 왔습니다.
개발자의 실수로 update 회원테이블 set 이름 = '아무개'
로 WHERE절 없이 update를 해 버렸습니다. 복구할 방법이 없을까요?

A. 제약 조건이 있습니다.
1. 복구 모델이 전체 모델일것(DB를 생성하면 기본입니다.)
2. 문제 발생후 풀백업이나 로그에 쓰지 않는 작업을 하지 않았을것
3. 로그 백업이 가능할것 입니다.
만약 이 세 조건이 맞다면 바로 로그를 with no_truncate 옵션으로 백업하신후..
Stop at 명령으로 복구할 수 있습니다.

Q. 풀백업과 로그백업을 혼용해 지속적으로 백업하고 있습니다.
개발자의 실수로 update 회원테이블 set 이름 = '아무개'
로 WHERE절 없이 update를 해 버렸습니다. 복구할 방법이 없을까요?

A. 가능합니다.
1. 복구 모델이 전체 모델일것(DB를 생성하면 기본입니다.)
2. 문제 발생후 풀백업이나 로그에 쓰지 않는 작업을 하지 않았을것
이 두 조건이 맞다면 즉시 로그를 with no_truncate 옵션으로 백업하신후..
Stop at 명령으로 복구할 수 있습니다.

Q. 이전 서버에서 사용하던 시스템의 문제로 해당하는 데이터베이스의
mdf 화일과 ldf 화일만 남았습니다. 새로 설치하는 시스템에 복구가 가능할까요?

A. 이전 서버와 문자셋 정보(sp_helpsort 명령으로 보실수 있습니다.)가 같고
이전에 사용하던 SQL서버가 정상적인 상태로 종료 되었을때(엔터프라이즈 관리자에서
SQL서버를 스탑 시켰거나.. 정상적으로 윈도우 시스템을 종료시킨 경우 - 해당
mdf 화일과 ldf 화일이 정상적으로 닫혔을 경우) 복구가 가능하며 이때 사용하는 명령은

EXEC sp_attach_db 'pubs'
, 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
, 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs_log.ldf'

명령으로 복구할 수 있습니다.

Q. 이전 서버에서 사용하던 시스템의 문제로 해당하는 데이터베이스의
mdf 화일만 남았습니다. 새로 설치하는 시스템에 복구가 가능할까요?

A. 가능합니다.
이전 서버와 문자셋 정보(sp_helpsort 명령으로 보실수 있습니다.)가 같고
이전에 사용하던 SQL서버가 정상적인 상태로 종료 되었을때(엔터프라이즈 관리자에서
SQL서버를 스탑 시켰거나.. 정상적으로 윈도우 시스템을 종료시킨 경우 - 해당
mdf 화일이 정상적으로 닫혔을 경우) 복구가 가능하며 이때 사용하는 명령은

EXEC sp_attach_single_file_db 'pubs'
, 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
 
명령으로 복구하실 수 있습니다.

Q. 이전시스템에서 사용하던 풀 백업본이 있습니다.
새로 시스템을 설치한후 이 풀 백업본을 복구하려 하는데 방법이 없을까요?

A. 가능합니다.
약간 다른 방식으로 아래처럼 하심 됩니다.
1. 같은 이름의 db를 만든다 (텅빈 db)
2. 빈 db를 그냥 풀 백업 한다.
3. 원본서버에서 가져온 백업본으로 리스토어 한다.
4. 리스토어시 옵션의 강제로 덮어쓰기 하시면 됩니다.
의 순서로 진행하시면 무리없이 하실 수 있습니다.