Q&A

  • Database 백업/복구


윈도우 98/ 델파이3을 사용하고 있습니다.



DB는 파라독스를 사용하구요



DB 파일이 있는 디렉토리를 다른 디렉토리에 백업을 받은 후



그 백업 디렉토리에 있는 DB 파일을 SELECT 하여 INSERT하려고 합니다.



왜냐하면 테이블이 바뀌어서 새로운 테이블을 원래 디렉토리에 넣구 말입니다.



그런데 몇번 이 실행파일을 실행시키면 자꾸 에러가 나구 해서요...



'corrupt ~.px ... ' 등 DB 인덱스가 깨져서 그런건지 확실히 잘 모르겠어서요..



예로 소스를 올리겠습니다. 간단하게 하나의 테이블에 관한 것만 올리겠습니다.



procedure TForm1.FormCreate(Sender: TObject);

begin



table1.Open;

Query4.Close;

Query4.Open;



if table1.IsEmpty then begin

end

else begin

while not Query4.EOF do begin

table1.Delete;

if table1.IsEmpty then

exit;

end;

end;



end;



procedure TForm1.Button1Click(Sender: TObject);

begin



Query1.Close;



Query1.Open;





while Not Query1.EOF do begin

table1.Insert;

table1.FieldByName('Busi_cd').AsString := Query1.FieldByName('Busi_cd').AsString;

table1.FieldByName('Busi_nm').AsString := Query1.FieldByName('Busi_nm').AsString;

table1.FieldByName('Busi_type').AsString := Query1.FieldByName('Busi_type').AsString;

table1.FieldByName('city_nm').AsString := Query1.FieldByName('city_nm').AsString;

table1.FieldByName('Gu_nm').AsString := Query1.FieldByName('Gu_nm').AsString;

table1.FieldByName('Dong_nm').AsString := Query1.FieldByName('Dong_nm').AsString;

table1.FieldByName('Addr_etc').AsString := Query1.FieldByName('Addr_etc').AsString;

table1.FieldByName('Buy_ck').AsString := Query1.FieldByName('Buy_ck').AsString;

table1.FieldByName('president').AsString := Query1.FieldByName('president').AsString;

table1.FieldByName('In_Reserv1').AsString := Query1.FieldByName('In_Reserv1').AsString;

table1.FieldByName('In_Reserv2').AsString := Query1.FieldByName('In_Reserv2').AsString;

table1.FieldByName('Tel_no').AsString := Query1.FieldByName('Tel_no').AsString;

table1.FieldByName('Fax_no').AsString := Query1.FieldByName('Fax_no').AsString;

table1.FieldByName('Zip_code').AsString := Query1.FieldByName('Zip_code').AsString;

table1.FieldByName('Credit_Grade').AsString := Query1.FieldByName('Credit_Grade').AsString;

table1.FieldByName('Establish_dt').AsString := Query1.FieldByName('Establish_dt').AsString;

table1.FieldByName('Cust_kind').AsString := Query1.FieldByName('Cust_kind').AsString;

table1.FieldByName('Dept').AsString := Query1.FieldByName('Dept').AsString;

table1.FieldByName('Order_Nm').AsString := Query1.FieldByName('Order_Nm').AsString;

table1.FieldByName('Birthday').AsString := Query1.FieldByName('Birthday').AsString;

table1.FieldByName('Birthday_type').AsString := Query1.FieldByName('Birthday_type').AsString;

table1.FieldByName('Marriage').AsString := Query1.FieldByName('Marriage').AsString;

table1.FieldByName('sys_date').AsString := Query1.FieldByName('sys_date').AsString;



table1.Post;



Query1.Next;

end;



Showmessage('Data 변환이 모두 되었습니다.');



end;



procedure TForm1.Button2Click(Sender: TObject);

begin

Query1.Close;

table1.Close;



Close;



end;



이상이 소스구요.. 참고로 테이블은 한 34 정도가 되는 듯 싶군요..



SELECT 할 Query1 컴포넌트의 DatabaseName은 원래 DB가 존재하는 디렉토리로 설정했구요.

INSERT 할 Table1 컴포넌트의 DatabaseName은 백업받아 놓은 디렉토리로 설정했습니다.





그럼 고수님들의 답변을 기다리겠습니다..



파라독스는 잘 써보지를 않아서요.. 프로그램 업그레이드 하기가 어렵네요...



그럼 꾸벅.





1  COMMENTS
  • Profile
    권민호 2000.11.05 19:33
    궁금이 wrote:

    >

    > 윈도우 98/ 델파이3을 사용하고 있습니다.

    >

    > DB는 파라독스를 사용하구요

    >

    > DB 파일이 있는 디렉토리를 다른 디렉토리에 백업을 받은 후

    >

    > 그 백업 디렉토리에 있는 DB 파일을 SELECT 하여 INSERT하려고 합니다.

    >

    > 왜냐하면 테이블이 바뀌어서 새로운 테이블을 원래 디렉토리에 넣구 말입니다.

    >

    > 그런데 몇번 이 실행파일을 실행시키면 자꾸 에러가 나구 해서요...

    >

    > 'corrupt ~.px ... ' 등 DB 인덱스가 깨져서 그런건지 확실히 잘 모르겠어서요..

    >

    > 예로 소스를 올리겠습니다. 간단하게 하나의 테이블에 관한 것만 올리겠습니다.

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    >

    > table1.Open;

    > Query4.Close;

    > Query4.Open;

    >

    > if table1.IsEmpty then begin

    > end

    > else begin

    > while not Query4.EOF do begin

    > table1.Delete;

    > if table1.IsEmpty then

    > exit;

    > end;

    > end;

    >

    > end;

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > begin

    >

    > Query1.Close;

    >

    > Query1.Open;

    >

    >

    > while Not Query1.EOF do begin

    > table1.Insert;

    > table1.FieldByName('Busi_cd').AsString := Query1.FieldByName('Busi_cd').AsString;

    > table1.FieldByName('Busi_nm').AsString := Query1.FieldByName('Busi_nm').AsString;

    > table1.FieldByName('Busi_type').AsString := Query1.FieldByName('Busi_type').AsString;

    > table1.FieldByName('city_nm').AsString := Query1.FieldByName('city_nm').AsString;

    > table1.FieldByName('Gu_nm').AsString := Query1.FieldByName('Gu_nm').AsString;

    > table1.FieldByName('Dong_nm').AsString := Query1.FieldByName('Dong_nm').AsString;

    > table1.FieldByName('Addr_etc').AsString := Query1.FieldByName('Addr_etc').AsString;

    > table1.FieldByName('Buy_ck').AsString := Query1.FieldByName('Buy_ck').AsString;

    > table1.FieldByName('president').AsString := Query1.FieldByName('president').AsString;

    > table1.FieldByName('In_Reserv1').AsString := Query1.FieldByName('In_Reserv1').AsString;

    > table1.FieldByName('In_Reserv2').AsString := Query1.FieldByName('In_Reserv2').AsString;

    > table1.FieldByName('Tel_no').AsString := Query1.FieldByName('Tel_no').AsString;

    > table1.FieldByName('Fax_no').AsString := Query1.FieldByName('Fax_no').AsString;

    > table1.FieldByName('Zip_code').AsString := Query1.FieldByName('Zip_code').AsString;

    > table1.FieldByName('Credit_Grade').AsString := Query1.FieldByName('Credit_Grade').AsString;

    > table1.FieldByName('Establish_dt').AsString := Query1.FieldByName('Establish_dt').AsString;

    > table1.FieldByName('Cust_kind').AsString := Query1.FieldByName('Cust_kind').AsString;

    > table1.FieldByName('Dept').AsString := Query1.FieldByName('Dept').AsString;

    > table1.FieldByName('Order_Nm').AsString := Query1.FieldByName('Order_Nm').AsString;

    > table1.FieldByName('Birthday').AsString := Query1.FieldByName('Birthday').AsString;

    > table1.FieldByName('Birthday_type').AsString := Query1.FieldByName('Birthday_type').AsString;

    > table1.FieldByName('Marriage').AsString := Query1.FieldByName('Marriage').AsString;

    > table1.FieldByName('sys_date').AsString := Query1.FieldByName('sys_date').AsString;

    >

    > table1.Post;

    >

    > Query1.Next;

    > end;

    >

    > Showmessage('Data 변환이 모두 되었습니다.');

    >

    > end;

    >

    > procedure TForm1.Button2Click(Sender: TObject);

    > begin

    > Query1.Close;

    > table1.Close;

    >

    > Close;

    >

    > end;

    >

    > 이상이 소스구요.. 참고로 테이블은 한 34 정도가 되는 듯 싶군요..

    >

    > SELECT 할 Query1 컴포넌트의 DatabaseName은 원래 DB가 존재하는 디렉토리로 설정했구요.

    > INSERT 할 Table1 컴포넌트의 DatabaseName은 백업받아 놓은 디렉토리로 설정했습니다.

    >

    >

    > 그럼 고수님들의 답변을 기다리겠습니다..

    >

    > 파라독스는 잘 써보지를 않아서요.. 프로그램 업그레이드 하기가 어렵네요...

    >

    > 그럼 꾸벅.

    >

    >



    특정한 테이블의 인덱스가 깨진상태로 보입니다.

    자료실에보면 인덱스 복구하는 유틸리티가 있습니다.

    복구후 다시 실행하여 보십시요.

    <참고>

    일반적인 백업방식은 아니라고 봅니다.

    차라리 데이타디렉토리 전체를 압축하는 것이 어떨까요.

    파일압축콤포넌트를 사용하여 쓰신다면 쉽게 구현이 됩니다.

    위 방법시 한가지 주의해야할 것은 프로그램 종료를 시키고

    백업 및 복원프로그램을 돌려야 합니다.

    그렇지 않으로 파일이 오픈된상태라 읽지를 못하고 그냥 넘어가

    완벽한 백업파일을 구축할 수 없답니다.



    아래는 Zipmaster라는 압축콤포넌트를 사용하여 백업및복원하는

    루틴입니다. 참고가 된다면 ...



    <백업>

    ZipMaster1.DLLDirectory := ExtractFilePath(Application.ExeName);

    ZipMaster1.Load_Zip_Dll;

    ZipMaster1.Load_Unz_Dll;

    ZipMaster1.ZipFilename := ExtractFilePath(Application.ExeName)+'backup'+

    'b'+FormatDateTime('yyyymmdd', now)+'.zip';

    ZipMaster1.FSpecArgs.Add(ExtractFilePath(Application.ExeName)+'temp*.*');

    ZipMaster1.Add;

    ZipMaster1.Unload_Zip_Dll;

    ZipMaster1.Unload_Unz_Dll;

    FileListBox1.Update;

    Screen.Cursor := Old;

    MessageDlg('데이타 백업완료!!!', mtInformation, [mbOk], 0);



    <복원>

    ZipMaster1.DLLDirectory := ExtractFilePath(Application.ExeName);

    ZipMaster1.Load_Zip_Dll;

    ZipMaster1.Load_Unz_Dll;

    ZipMaster1.ExtrBaseDir := ExtractFilePath(Application.ExeName)+'data';

    ZipMaster1.ZipFilename := Edit1.text;

    ZipMaster1.ExtrOptions := [ExtrOverWrite];

    ZipMaster1.Extract;

    MessageDlg('데이타 복원완료!!!', mtInformation, [mbOk], 0);

    ZipMaster1.Unload_Zip_Dll;

    ZipMaster1.Unload_Unz_Dll;