Zálohovanie SQLite databázy cez PHP

Zálohovanie SQLite databázy cez PHP

SQLite Je to už dávno, čo som písal skript na zálohovanie databázy. Nie je to žiadny problém, avšak pri niektorých databázach vám napísanie niečoho podobného môže trvať aj niekoľko hodín. Napríklad pri MySQL je to celkom komplikované, pretože musíte zistiť všetky vlastnosti stĺpca, jeho indexy a podobne. Ja som sa vošiel do menej ako 120 riadkov kódu a zatiaľ som nenarazil na nijakú chybu vo výsledku zálohy. Nepochybujem, že s inými databázami bude záloha menej zložitá, avšak pri databáze SQLite áno.

Zálohovací skript

Každá jedna databáza SQLite obsahuje špeciálnu tabuľku sqlite_master, ktorá definuje schému databázy. Jej štruktúra je nasledovná:

CREATE TABLE sqlite_master (
  type TEXT,
  name TEXT,
  tbl_name TEXT,
  rootpage INTEGER,
  sql TEXT
);

Záloha pomocou PHP sa vďaka tejto tabuľke stáva veľmi jednoduchou záležitosťou (najmä záloha štruktúry tabuliek). Nasledujúci extrémne jednoduchý skript vytvorí zálohu všetkých tabuliek vrátane uložených záznamov:

<?php

header
('Content-Type:text/plain; charset=utf-8');

$db  sqlite_open('sqlite.db');
$sql sqlite_query($db,
             
"SELECT name,sql FROM " 
            
."(SELECT * FROM sqlite_master UNION ALL "
            
."SELECT * FROM sqlite_temp_master) "
            
."WHERE type='table' "
            
."ORDER BY name"
            
);

while (
$row sqlite_fetch_object($sql)) {
    echo 
$row->sql.";\n\n";

    
$insert sqlite_query($db,"SELECT * FROM ".$row->name);
    
$rows   sqlite_num_rows($insert);
    
$fields sqlite_num_fields($insert);

    if (
$rows 0) {
        for (
$i 0$i $rows$i++) {
            
$data sqlite_fetch_array($insert);
            echo 
"INSERT INTO ".$row->name." VALUES(";
            for (
$j 0$j $fields$j++) {
                if (
$j 0) echo ",";
                echo 
"'".sqlite_escape_string($data[$j])."'";
            }
            echo 
");\n";
        }
        echo 
"\n";
    }
}

Podobne možno vytvoriť aj zálohu databáz MySQL, MSSQL, či PostgreSQL. Presnú štruktúru tabuliek však získate omnoho zložitejším spôsobom. SQL príkaz na zoznam tabuliek SQLite načíta aj dočasné tabuľky. Ak chcete práve tento typ tabuliek zanedbať, stačí SQL príkaz upraviť na trochu jednoduchší:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name

Odkazy

Alternatívne verzie: Text PDF Voice
Autor: PaBi3 · Kategória: Programovanie · Dátum: 11.06.2007 19:32

Komentáre

#1 Lite
12.06.2007 16:54
Ináč, nefunguje v SQLite aj OUTFILE? SELECT * INTO OUTFILE 'backup.sql' FROM auth

LOAD DATA INFILE 'backup.sql' INTO TABLE auth

#2 admin Web E-mail
12.06.2007 19:34
admin OUTFILE sa v dokumentácií SQLite nenachádza.

#3 Milan Web
26.06.2007 13:43
Fajn clanok PaBi, fdaka za tip.

Osobné údaje
Captcha
Odpíšte text z obrázku. Rozlišujú sa malé a veľké písmená.
Obsah
Možnosti