sqlite 데이터베이스를 백업하는 방법은 무엇입니까?


97

이를 수행하는 적절한 방법은 무엇입니까? .sq3 파일 만 복사합니까?

사이트에 사용자가 있고 파일이 복사되는 동안 기록되는 경우 어떻게됩니까?



1
데이터베이스에 액세스하기 위해 어떤 언어와 드라이버를 사용하고 있습니까?
CL.

1
저는 PHP와 PDO 확장을 사용하고 있습니다
thelolcat 2014 년

현재 PHP에서 sqlite 백업 API를 노출하기위한 기능 요청이 있습니다. bugs.php.net/bug.php?id=70950
Brian Minton

답변:


155

sqlite3 명령 줄 도구에는 .backupdot 명령이 있습니다.

다음을 사용하여 데이터베이스에 연결할 수 있습니다.

sqlite3 my_database.sq3

다음과 같이 backup dot 명령을 실행하십시오.

.backup backup_file.sq3

데이터베이스에 대한 대화식 연결 대신 백업을 수행하고 나중에 연결을 닫을 수도 있습니다.

sqlite3 my_database.sq3 ".backup 'backup_file.sq3'"

어느 쪽이든 결과는 backup_file.sq3데이터베이스의 이름 이 지정된 복사본 my_database.sq3입니다.

현재 데이터베이스에서 작업하는 모든 사용자를 관리하므로 정기적 인 파일 복사와 다릅니다. 데이터베이스에 적절한 잠금이 설정되어 있으므로 백업이 독점적으로 수행됩니다.


68
한 줄로 모두 할 수 있습니다 ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell 2014-09-07

@Googie : 복제에 사용할 수 있습니까? 또는
모나

4
@mOna : 이것은 백업을 만들기위한 메커니즘 일뿐입니다. 복제는 즉석에서 변경 사항을 전파하는 것을 의미합니다 (분산 데이터베이스의 일종).
Googie

:)이 답장을 보내 주셔서 감사합니다
모나

1
@RonJohn 실제로 파일의 복사본을 만들지 만 데이터베이스에 대한 쓰기 액세스가 적절한 잠금으로 제한되어 있으므로 원자 적 작업이며 중간 수정이 없음을 보장합니다.
Googie

6

.backup이 가장 좋은 방법입니다.

sqlite3 my_database .backup my_database.back

.dump 명령을 시도 할 수도 있습니다. 전체 데이터베이스 또는 테이블을 텍스트 파일로 덤프하는 기능을 제공합니다. TABLE이 지정된 경우 LIKE 패턴 TABLE과 일치하는 테이블 만 덤프합니다.

sqlite3 my_database .dump > my_database.back

덤프 및 저장을 사용하여 보관 복사본을 만드는 좋은 방법은 나중에 데이터베이스를 재구성합니다.

sqlite3 my_database .dump | gzip -c > my_database.dump.gz
zcat my_database.dump.gz | sqlite3 my_database

또한이 질문을 확인 수행 sqlite3를 .backup 및 .dump 명령은 데이터베이스를 잠글?


4
SQLite는 3.8.2에서 .backup위와 같이 작동하지 않습니다 ( ".backup에 파일 이름 인수 누락")
Francesc 로사

4
이것이 최고의 답변입니다. 많은 사람들이 사용하는 작업 데이터베이스에서 .backup을 사용하는 경우 어느 시점에서 데이터베이스가 잠겨 있기 때문에 작동하지 않을 수 있습니다. 따라서 CRON에서 이것을 사용하는 경우 작동하지 않고 오류가 있음을 알리지 않습니다. .dump (항상 작동) 또는 SQLite에서 제공하는 API를 사용하는 것이 좋습니다.
Memristor

@Memristor 그러나 .dump는 다른 사람들을 위해 DB를 잠그지 않습니까? FWIW, 나는 중단 된 서비스보다 실패한 백업 (관리자에게 메일 포함)을 선호합니다.
Torsten Bronger

1
답변에서 .backup 구문을 수정하십시오. '>'연산자가 필요하지 않습니다.
Nashev

-23
try {
    final String inFileName = "/data/data/your app package/databases/db";
    File dbFile = new File(inFileName);
    FileInputStream fis = new FileInputStream(dbFile);
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CALC/Backup";
    File dir = new File(path);
    if (!dir.exists()) dir.mkdirs();
    String outFileName = path + "/filename"; // output file name
    // Open the empty db as the output stream
    OutputStream output = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = fis.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
    Toast.makeText(getActivity(), "Backup Successfully", 2).show();
    // Close the streams
    output.flush();
    output.close();
    fis.close();
} 
catch (Exception e) {
    e.printStackTrace();
}

데이터베이스 파일의 파일 시스템 수준에서 프로그래밍 방식 복사를 의미합니까?
안드레아스 Tasoulas

4
1.이 코드가 어떤 언어인지조차 말하지 않습니다. OP는 그가 PHP를 사용하고 있다고 말했지만 이것은 자바 코드 인 것 같습니다. 2. 파일을 바이트 단위로 복사합니다. 그렇게하면 어떤 이점이 있습니까? Java (및 PHP)에는 파일을 복사하는 방법이 있습니다. docs.oracle.com/javase/tutorial/essential/io/copy.html을 읽으십시오. 3. 이것은 db를 복사하는 동안 작성 될 수있는 문제를 해결하지 않습니다.
Christopher K.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.