세이박스

[클래스] 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 테이블명


  최신영화 보러가기... 


윈도우 익스플로러 브라우저에서 네이버, 다음 툴바 들이 나타나지 않는 원인과 해결 방법

컴활용
사용자 삽입 이미지


어느날 갑자기 잘 이용하던 네이버툴바, 다음툴바, 랭키툴바 3개의 툴바들이 사라졌습니다.
어떤 분들은 악성 툴바를 지우기 위해 많이 애를 쓰실 겁니다.
하지만, 툴바들 중에는 나름 유용한 툴바들도 있어서 저처럼 꼭 이용해야 하는 분들도 있을 겁니다.
어느날 갑자기 사라진 툴바의 원인을 찾아 보니 브라우저 옵션에 "타사의 브라우저 확장 기능 사용" 이라는 항목 옵션에 체크가 꺼져 있더군요.
즉, 누군가 이 항목을 어느날 갑자기 체크를 제거 했다는 것인데...
가만 생각해보니 툴바들이 사라진 시점에 X같은 어떤 사이트로 부터 프로그램을 하나 설치 했는데 계속해서 이상한 프로그램을 설치 하길래 지운다고 고생좀 했었던 시기부터 나타난 증상이더군요.
혹시나 해서 다시 해당 프로그램을 설치 해봤더니 역시나 이 문제의 프로그램이 제가 이용하던 툴바를 맘데로 사라지게 하더군요.
툴바 시장이 워낙 돈이 되다 보니 타사의 툴바들을 모두 숨겨 버리고 자신들의 프로그램만 동작하도록 하기 위한 경쟁인건 알겠는데 이건 사용자 PC를 임의로 건드리는 불법에 해당 하는게 아닌가 하는 생각이 듭니다.
따라서, 어느날 갑자기 해당 체크가 꺼져 있다면 악성 프로그램을 의심 해 보시기 바랍니다.
어떤 분은 체크를 켜도 계속 다시 원래되로 돌아 온다고 합니다.
문제의 프로그램을 지우지 않는한 해당 프로그램이 실행 될때 마다 체크를 꺼버린다고 보시면 됩니다.

옵션 설정 방법
브라우저 도구 > 인터넷 옵션 > 고급 > "타사의 브라우저 확장 기능 사용" 체크시 사용
체크후 브라우저를 재실행하면 적용 됩니다.

[주의사항] MS-SQL 2005 MDF >>> 2000 MDF 변환 불가

데이타베이스
Database Server 를 재설치 할 일은 종종 있는 일이다.
재설치할때 대부분 MDF, LDF 파일을 다른 곳에다가 백업 해두고
재 설치후 Attach 를 통해서 쉽게 같다 붙이면 예전 상태로 사용가능하다.
주의 해야할 것은 Attach 되는 MDF 가 SQL의 버전을 탄다는 것이다.
경험 한 것은 MS-SQL 2000으로 사용한 MDF 파일을 잠시 해당 서버가 복구해야할
필요가 있어서 임시로 MS-SQL 2005 서버에 Attach 시켜서 사용했다.
복구가 끝나고 난뒤에 다시 MS-SQL 2000 에 Attach 를 시키려고 하니
Error 602: Could not find row in sysindexes for database ID 9, object ID 1, index ID 1. Run DBCC CHECKTABLE on sysindexes
오류가 발생하면서 Attach 에 실패했다는 썰렁한 메세지 박스와 함께 끝나버렸다. ㅠ.ㅠ
덕분에 Database 새로 만들고 2005 로부터 Database Import 시켜 오는 등
난리를 치며 복구를 진행중이다. ㅠ.ㅠ
혹시나 이런 분이 계실까 해서 이 글을 씁니다.

[mysql] ERROR 1016: Can't open file: '테이블명.MYD'. (errno: 145) 복구

데이타베이스

에러 메세지

Error 1016 : Can't open file: '테이블.MYI'. (errno: 145)


복구 방법

명령어 : mysqlcheck -u계정명 -p --auto-repair -B DB명

Enter password : 비밀번호

 
또는 mysql에 접속후 repair 테이블명; 을 해주셔도 됩니다.

mysql> repair table 테이블명;
+---------------------+--------+----------+----------+
| Table               | Op     | Msg_type | Msg_text |
+---------------------+--------+----------+----------+
| 테이블명           | repair | status      | OK          |
+---------------------+--------+----------+----------+
1 row in set (34.24 sec)

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

ERROR 1016: Can''t open file: ''테이블명.MYD''. (errno: 145) - 복구하기

데이타베이스
[MySQL 테이블 오류]
ERROR 1016: Can't open file: '테이블이름.MYI'. (errno: 145)
 
(복구하기)
# 테이블명.MYI 파일이 있는곳에서 실행해야한다.(ex : 테이블명 - test)
# DB명 : testtest
# Table명 : test
ex)
1. 에러난 파일 : 테이블명.MYI
2. 아래 명령어 실행위치는 /usr/local/mysql/data/testtest(오류난 테이블 DB명)
3. 명령어 실행
[root@localhost root]# /usr/local/mysql/bin/myisamchk -r 테이블명.*
myisamchk: error: '테이블명.frm' is not a MyISAM-table
---------
myisamchk: error: '테이블명.MYD' is not a MyISAM-table
---------
- recovering (with sort) MyISAM-table '테이블명.MYI'
Data records: 7
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
- Fixing index 5
- Fixing index 6

MySQL의 root패스워드를 잊어버렸을 때 복구하기

데이타베이스

mysqld_safe 으로 MySQL을 시작할 때에 --skip-grant-table 옵션을 사용하요 MySQL의 사용자인증과정을 생략하여 실행한 후에 MySQL의 root계정으로 패스워드 없이 접속하여 원하는 패스워드로 변경하는 방법이다. 즉, MySQL의 root 계정 패스워드를 잊어버렸을 경우의 복구절차는 아래와 같다.

1. 실행중인 MySQL을 종료한다.
 # killall mysqld

2. "./mysqld_safe --skip-grant-table &" 로 사용자 인증과정 없이 MySQL를 실행한다.
 # ./mysqld_safe --skip-grant-table &

3. 패스워드 없이 MySQL root 계정으로 MySQL에 접속한다.
 # ./mysql -u root mysql

4. update문으로 MySQL 데이터베이스의 user 테이블에 있는 MySQL root사용자의 패스워드를 변경한다.
 mysql> update user set password=password('1111') where user = 'root';

5. "flush privileges" 명령어로 변경된 MySQL 권한테이블(db, user 테이블들)들에 변경된 권한설정들을 적용한다.
 mysql> flush privileges;

6. MySQL을 빠져나와서 실행했던 MySQL을 종료한다.
 mysql> exit
 # killall mysqld

7. 일반적인 방법으로 MySQL을 실행한다.
 
# ./mysqld_safe &

8. 정상적인 방법으로 패스워드를 사용하여 MySQL의 root계정으로 접속하여 확인한다.
 
# ./mysql -u root -p mysql

테이블 검사 및 복구하기 - myisamchk

데이타베이스
[ myisamchk 란 ? ]

- DB 테이블에대한 오류 검사 및 오류 복구 유틸리티
- 버전 3.22.x : isamchk 유틸리티 사용
3.23.x : myisamchk 유틸리티 사용

[ myisamchk 사용전 주의사항 ]

- mysql 데몬을 stop 시킨후 이 유틸리티를 사용해야한다.
- mysql 데몬을 중지시킬수 없는 사항이라면 검사할 테이블에대한 rock을 걸고
검사를 수행하여야만 검사도중에 발생할수있는 오류를 막을수있다.
- 모든작업이 그렇듯이 항상 백업을 한후 작성을 수행하는것이 좋을것이다.

[ myisamchk 사용법 및 옵션 ]

- 해당 테이블이있는 디렉토리로 이동 ( 일반적으로 /usr/local/mysql/var 밑에
위치함 )

1.일반적인 검사

[root@angelsoma var]myisamchk [table 명]

Checking MYISAM file: [table 명]
Data records: 271 Deleted blocks: 0
- check file-size
- check delete-chain
- check index reference
- check record links
에러메시지가 없으면 테이블에 오류가 없다는것이다.

2.Global 옵션

[root@angelsoma var]myisamchk -s,--silent [table 명]

에러만 출력한다.

[root@angelsoma var]myisamchk -v,--verbose [table 명]

-s 옵션보다 많은 정보를 출력한다.

[root@angelsoma var]myisamchk -V

myisamchk 버젼을 표시한다.

3.Check 옵션

[root@angelsoma var]myisamchk -c,--check [table 명]

테이블의 에러를 check 한다.

[root@angelsoma var]myisamchk -e,--extend-check [table 명]

테이블을 좀더 세밀하게 check 한다. 일반적인 방법으로 error를 찾을수없
경우 사용하는 옵션이다.

[root@angelsoma var]myisamchk -F,--fast [table 명]

빠른게 테이블 check 한다.정교한 체크는 하지않느다.

[root@angelsoma var]myisamchk -C,--check-only-changed [table 명]

테이블을 check 하고,테이블을 check 이후의 상태로 변경한다.

[root@angelsoma var]myisamchk -f,--force [table 명]

테이블에 error에 있을경우 강재로 check 한다.

[root@angelsoma var]myisamchk -i,--information [table 명]

check한 결과의 정보를 통계화하여 보여준다.

Checking MyISAM file: insertdb
Data records: 8962 Deleted blocks: 0
- check file-size
- check key delete-chain
- check record delete-chain
- check index reference
- check data record references index: 1
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 2
Total: Keyblocks used: 97% Packed: 0%

- check record links
Records: 8962 M.recordlength: 241 Packed: 0%
Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00
Record blocks: 8962 Delete blocks: 0
Record data: 2166962 Deleted data: 0
Lost space: 6796 Linkdata: 33634

User time 0.21, System time 0.02
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 92, Physical pagefaults 198, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 0, Involuntary context switches 0

[root@angelsoma var]myisamchk -m,--medium-check [table 명]

extend-check 옵션보다 check 속도가빠르며,99.9 % 의 에러을 찾을수있다.

4.Repair 옵션

[root@angelsoma var]myisamchk -o -B,--backup [table 명]

- recovering (with sort) MyISAM-table 'insertdb.MYI'
Data records: 8962
- Fixing index 1

MYD파일을 백업한다. 형식은 [filename-time.BAK]의 파일이 생긴다.

[root@angelsoma var]myisamchk -e,--extend-check [table 명]

세부적인 파일까지 복구를해준다.일반적으로 아주 하찮은 에러까지 찾을수
있다.하지만 자포자기의 상태가 아니고서는 이옵션을 사용하지 않는게 좋다.

[root@angelsoma var]myisamchk -f,-force [table 명]

이전것의 temporary file을 덥어쒸운다.

[root@angelsoma var]myisamchk -l,--no-symlinks [table 명]

심복릭 링크를 따르지않겠다는 옵션이다. 일반적으로 myisamchk 는symlink
points를 복구한다.

[root@angelsoma var]myisamchk -r,--recover [table 명]

unique key를 제외한 대부분를 복구한다.

[root@angelsoma var]myisamchk -n,--sort-recover [table 명]

sorting하면서 테이블을 복구한다. 심지어 temporary 파일과 같은 아주 큰
파일역시 sorting하면서 복구한다.

[root@angelsoma var]myisamchk -o,--safe-recover [table 명]

-r 옵션보다 느리게 복구한다.그러나 좀더 섬세한 복구를 지원한다.

[root@angelsoma var]myisamchk -q,--quick [table 명]

테이터 파일의 수정없이 복구한다.

5.기타 옵션

[root@angelsoma var]myisamchk -a,--analyze [table 명]

key의 distribution 을 분석한다.
만약, distribution 을 산출하고 싶을경우에는 --verbose 나 --describe 라
는 옵션과 동행해서 확인할수있다.

[root@angelsoma var]myisamchk -d,--descript-xion [table 명]

테이블에 대한 정보를 출력한다.

[root@angelsoma var]myisamchk -S,--sort-index [table 명]

index 블록을 sort한다.

[root@angelsoma var]myisamchk -R[index번호],--sort-records [table 명]

index 번호를 기준으로 인덱스를 정렬해준다.



6.검사중 아래의 메시지가출력되면 해당테이블을 사용중이라는 의미이므로 테
이블에 LOCK을 걸든가 데몬을 죽이고 나서 검사 및 복구를해야함.

myisamchk: warning: 1 clients is using or hasn't closed the table
properly

7.LOCK 걸기

myisamchk 는 테이블에대한 read 만 할수있으면 되기때문데 read 를 제외한
모든것에 lock을 걸면된다.

mysql> lock tables [table 명] READ ;
mysql> flush tables ;

flush tables 는 mysql이 테이블의 내용을 메모리에만 보관하고 실제 테이
블파일에 기록을하지 않았을경우 실제 테이블파일에 기록하라는 의미이다

8.LOCK 풀기

mysql> unlock talbe;

9.Myisamchk 로 복구를 위한 LOCK 걸기

서비스를 죽이지않고 복구를 해야할경우는 write lock를 걸어주면된다.
복구는 write 를 해야하기때문에 write lock를 걸어줘야한다.

mysql>lock tables [table명] write;
mysql>flush tables;

10.LOCK 풀기

mysql> unlock table;

MYSQL 백업과 복구 상세 설명

데이타베이스

[MySQL 접속]
mysql -hDB서버명 -uMySQL아이디 -pMySQL패스워드 데이타베이스명

[MySQL 백업하기]
MySQL 명령어로 백업받기 :
mysqldump -hDB서버명 -u유저명 -p패스워드 [백업할 테이터베이스명] > [외부로 저장할 파일명]
ex) mysqldump -hdb1.guideline.co.kr -uDBuser -pPassword MyDB > MyDB.sql

특정 테이블만 백업 할 경우 :
mysqldump -hDB서버명 -u유저명 -p패스워드 [테이타베이스명] [특정테이블명] > [외부로 저장할 파일명]
ex) mysqldump -hdb1.guideline.co.kr -uDBuser -pPassword MyDB MyTable > MyDB_MyTable.sql

[MySQL 복구하기]
mysql -hDB서버명 -u유저명 -p패스워드 [복구할 테이터베이스명] < [외부로 저장된 파일명]
ex) mysql -hdb1.guideline.co.kr -uDBuser -pPassword MyDB < MyDB.sql

MYSQL 테이블을 화일로 백업 및 복구

데이타베이스
1. 테이블을 화일로 백업 및 복구

-. 테이블 내용을 화일로 만들기

mysql> select * from test into outfile '/root/test.txt';  꼭 경로를 지정해야함

결과 :
2 이주상 02-504-xxxx 과천시 m 1971-02-02
3 임정남 02-420-xxxx 송파구 f 1971-03-03
4 강행모 02-856-xxxx 관악구 f 1971-04-04
5 이현영 0342-718-xxxx 분당구 m 1971-05-05
6 이병환 02-891-xxxx 하안동 m 1980-06-06
1 남상욱 333-4444 동작구 m 1971-01-01


-. 테이블 내용을 화일로 만들때 |로 구분하기

terminated 문을 쓴다.
mysql> select * from test into outfile '/root/test.txt' fields terminated by '|';

결과 :
2|이주상|02-504-xxxx|과천시|m|1971-02-02
3|임정남|02-420-xxxx|송파구|f|1971-03-03
4|강행모|02-856-xxxx|관악구|f|1971-04-04
5|이현영|0342-718-xxxx|분당구|m|1971-05-05
6|이병환|02-891-xxxx|하안동|m|1980-06-06
1|남상욱|333-4444|동작구|m|1971-01-01


-. 화일을 불러오기
load 명령어를 쓴다.
mysql> load data infile '/root/test.txt' replace into table test fields terminated by '|';

결과 :
mysql> select * from test;
+------+--------+---------------+--------+------+------------+
| no | name | tel | addr | sex | birth |
+------+--------+---------------+--------+------+------------+
| 2 |이주상 | 02-504-xxxx | 과천시 | m | 1971-02-02 |
| 3 | 임정남 | 02-420-xxxx | 송파구 | f | 1971-03-03 |
| 4 | 강행모 | 02-856-xxxx | 관악구| f | 1971-04-04 |
| 5 | 이현영 | 0342-718-xxxx | 분당구 | m | 1971-05-05 |
| 6 | 이병환 | 02-891-xxxx | 하안동 | m | 1980-06-06 |
| 1 |남상욱 | 333-4444 | 동작구 | m | 1971-01-01 |
+------+--------+---------------+--------+------+------------+

MYSQL 백업과 복구

데이타베이스
1. 간단한 백업과 복구

-. 파일로 백업
# mysqldump DBName TableName > FildName
예) # mysqldump kornec sub01 > sub01.sql

-. 데이터 복구
# mysql DBName < FildName
예) # mysqldump kornec < sub01.sql



2. 주기적으로 백업하기

-. myhome_bakcup 셀스크립트

#!/bin/bash

T=$(echo `date +%Y%m%d%H%M`)
MY=$(echo /home/nalabi/backup)

echo "nalabi 의 데이타가 백업 되었습니다. $T"

mysqldump myhome > $MY/myhome$T.sql
gzip $MY/myhome$T.sql

-. /etc/crontab 사용하기
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

형식 :
a b c d e id runparts directory
분(0~59) 시(0~24) 날짜(0~31) 달(0~12) 요일(0~7) id(크론이 사용할 계정) directory(실행하게될 파일 놓이게 될 경로)

예제 :
15 14 1 * * root /home/nalabi/backup/myhome_backup
매달 1일 오후 2시 15에 myhome_backup을 실행한다.

0 22 * * 1-5 root /home/nalabi/backup/myhome_backup
월요일 부터 금요일까지 매일 오후 8시에 myhome_backup을 실행한다.

23 0-23/2 * * * root /home/nalabi/backup/myhome_backup
매일 0, 2, 4, ....시 23분에 실행한다.

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. 리스토어시 옵션의 강제로 덮어쓰기 하시면 됩니다.
의 순서로 진행하시면 무리없이 하실 수 있습니다.