วิธีการสำรองฐานข้อมูล sqlite?


98

วิธีที่เหมาะสมในการทำคืออะไร? ฉันแค่คัดลอกไฟล์. sq3 หรือไม่

จะเกิดอะไรขึ้นหากมีผู้ใช้บนไซต์และไฟล์ถูกเขียนในขณะที่กำลังคัดลอก



1
คุณใช้ภาษาและไดรเวอร์อะไรในการเข้าถึงฐานข้อมูล
CL.

1
ฉันใช้ PHP และส่วนขยาย PDO
thelolcat

ขณะนี้มีการร้องขอคุณลักษณะเพื่อแสดง API การสำรองข้อมูล sqlite ใน php: bugs.php.net/bug.php?id=70950
Brian Minton

คำตอบ:


156

เครื่องมือบรรทัดคำสั่ง sqlite3 มีคำสั่งจุด.backup

คุณสามารถเชื่อมต่อกับฐานข้อมูลของคุณด้วย:

sqlite3 my_database.sq3

และเรียกใช้คำสั่งจุดสำรองด้วย:

.backup backup_file.sq3

แทนที่จะเชื่อมต่อแบบโต้ตอบกับฐานข้อมูลคุณยังสามารถสำรองข้อมูลและปิดการเชื่อมต่อได้ในภายหลังด้วย

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

ทั้งสองวิธีผลที่ได้คือสำเนาชื่อของฐานข้อมูลbackup_file.sq3my_database.sq3

ซึ่งแตกต่างจากการคัดลอกไฟล์เป็นประจำเนื่องจากจะดูแลผู้ใช้ที่กำลังทำงานกับฐานข้อมูลอยู่ มีการตั้งค่าล็อกที่เหมาะสมบนฐานข้อมูลดังนั้นการสำรองข้อมูลจึงทำได้โดยเฉพาะ


69
คุณสามารถทำได้ทั้งหมดในบรรทัดเดียว ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell

@Googie: เราสามารถใช้เพื่อจำลองแบบได้หรือไม่? หรือ
mOna

4
@mOna: นี่เป็นเพียงกลไกในการสำรองข้อมูล การจำลองแบบหมายถึงการเผยแพร่การเปลี่ยนแปลงในทันที (ชนิดของฐานข้อมูลแบบกระจาย) ซึ่งจะไม่ทำเพื่อคุณ
Googie

ขอบคุณสำหรับคำตอบ :)
mOna

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ไม่ทำงานตามที่แสดงด้านบน ("ไม่มีอาร์กิวเมนต์ FILENAME บน. สำรอง")
Francesc Rosas

4
นี่คือคำตอบที่ดีที่สุด หากคุณใช้. สำรองข้อมูลบนฐานข้อมูลที่ใช้งานได้ซึ่งหลายคนใช้อาจไม่ได้ผลเนื่องจากในบางจุดฐานข้อมูลถูกล็อก ดังนั้นหากคุณใช้สิ่งนี้ใน CRON มันจะไม่ทำงานและจะไม่บอกคุณว่ามีข้อผิดพลาด ... ให้ใช้. dump ดีกว่า (ใช้ได้ทุกทาง) หรือ API ที่กำหนดโดย SQLite
Memristor

@Memristor แต่ไม่. dump ล็อก DB ให้คนอื่น? FWIW ฉันต้องการสำรองข้อมูลที่ล้มเหลว (พร้อมอีเมลถึงผู้ดูแลระบบ) เพื่อให้บริการหยุดชะงัก
Torsten Bronger

1
โปรดแก้ไขไวยากรณ์. สำรองในคำตอบของคุณ ไม่จำเป็นต้องใช้ตัวดำเนินการ ">"
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();
}

คุณหมายถึงการคัดลอกแบบเป็นโปรแกรมในระดับระบบไฟล์ของไฟล์ฐานข้อมูลหรือไม่?
Andreas Tasoulas

4
1. คุณไม่ได้บอกว่ารหัสนี้เป็นภาษาอะไร OP บอกว่าเขาใช้ PHP แต่ดูเหมือนว่าจะเป็นรหัสจาวา 2. คุณคัดลอกไฟล์ทีละไบต์ ข้อดีของการทำเช่นนั้นควรเป็นอย่างไร? Java (และ php) มีวิธีการคัดลอกไฟล์ อ่านdocs.oracle.com/javase/tutorial/essential/io/copy.html 3 สิ่งนี้ไม่ได้แก้ปัญหาที่อาจมีการเขียนฐานข้อมูลในขณะที่คุณคัดลอก
Christopher K.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.