Skip to content

Kõik WordPressist, veebiarendusest — ja mitte ainult

💾 MySQL andmebaasi varundamine ja taastamine PHP kaudu

💾 MySQL andmebaasi varundamine ja taastamine PHP kaudu

Andmebaasi kaotamine tähendab tellimuste, kasutajate ja sisu kaotamist sekunditega. WordPressi saidi omanikule ei ole varundamine „tore oleks, kui oleks", vaid kohustuslik. Kuid iga päev käsitsi phpMyAdmini sisse logimine raiskab aega ja kui seda vaja läheb, siis varukoopiat lihtsalt pole.

PHP skript lahendab probleemi: annad talle andmebaasi ligipääsu ja ta ekspordib struktuuri ning andmed SQL-faili. Viie minuti seadistamisega saad korratava, programmeeritava varunduse, mida sa ei unusta tegemast.

Edasi: valmis skriptid MySQL-i varundamiseks ja taastamiseks PHP-s. Vaatame, kuidas need töötavad, kust hankida ligipääsuandmed ja kuidas käivitada automaatne varundus graafiku alusel, et su andmebaas ei jääks kunagi kaitseta.

💡 Kiire ülevaade:

  • Ühendu MySQL-iga mysqli kaudu, hangi tabelite nimekiri ja ekspordi struktuur
  • Koosta SQL-dump: CREATE TABLE pluss INSERT iga tabeli kohta, salvesta faili
  • Taasta: loe dump ja käivita päringud ühe paketina mysqli_multi_query abil
  • Automatiseerimine Croni (Linux) või Task Scheduleri (Windows) kaudu käivitab skripti ilma sinu sekkumiseta
  • Pakkimine .gz-vormingusse ja vanade koopiate rotatsioon säästavad ruumi ja hoiavad varunduste ajalugu

Samm 1: ligipääsuandmed ja keskkond, mida vajad enne käivitamist

Enne koodi kirjutamist kogu kolm asja: MySQL-i ligipääsuandmed, varukoopiate salvestamise kataloog ja arusaam, kus skript käivitub.

Andmebaasiga ühendumiseks vajad hosti (tavaliselt localhost või 127.0.0.1), kasutajanime, parooli ja andmebaasi nime. WordPressi saidil asuvad need andmed failis wp-config.php: konstandid DB_HOST (server), DB_USER (kasutaja), DB_PASSWORD (parool) ja DB_NAME (andmebaasi nimi).

Loo varunduste kataloog väljapoole saidi avalikku kausta. Paiguta backups/ kaust ühe taseme võrra kõrgemale kui public_html, et SQL-failid ei oleks brauseri kaudu ligipääsetavad. Kirjutusõigused (chmod 755 või chmod 775) on kohustuslikud: ilma nendeta annavad fopen() ja fwrite() veateate.

PHP skript käivitatakse käsurealt: php backup.php. Veebipõhine käivitamine (brauseri kaudu) on samuti võimalik, kuid käsurida on turvalisem, keegi ei arva ära skripti URL-i ega dumpi su andmebaasi.

Samm 2: PHP skript andmebaasi varundamiseks

Skript teeb kolm läbimist: hangib tabelite nimekirja, iga tabeli kohta ekspordib struktuuri (SHOW CREATE TABLE) ja seejärel andmed (SELECT *). Tulemus koondatakse üheks stringiks ja kirjutatakse .sql-faili. Salvesta kood kui backup.php ja käivita terminalist.

1<?php
2
3$connection = mysqli_connect('localhost', 'user', 'pass', 'my_database');
4
5if (!$connection) {
6 die('Ошибка подключения: ' . mysqli_connect_error());
7}
8
9$tables = [];
10$result = mysqli_query($connection, "SHOW TABLES");
11while ($row = mysqli_fetch_row($result)) {
12 $tables[] = $row[0];
13}
14
15$dump = '';
16foreach ($tables as $table) {
17 $dump .= 'DROP TABLE IF EXISTS ' . $table . ";\n";
18
19 $create = mysqli_query($connection, "SHOW CREATE TABLE " . $table);
20 $row = mysqli_fetch_row($create);
21 $dump .= $row[1] . ";\n\n";
22
23 $data = mysqli_query($connection, "SELECT * FROM " . $table);
24 $num_fields = mysqli_num_fields($data);
25
26 while ($row = mysqli_fetch_row($data)) {
27 $dump .= "INSERT INTO " . $table . " VALUES(";
28 for ($j = 0; $j < $num_fields; $j++) {
29 if (isset($row[$j])) {
30 $row[$j] = mysqli_real_escape_string($connection, $row[$j]);
31 $dump .= '"' . $row[$j] . '"';
32 } else {
33 $dump .= 'NULL';
34 }
35 if ($j < $num_fields - 1) {
36 $dump .= ',';
37 }
38 }
39 $dump .= ");\n";
40 }
41 $dump .= "\n\n";
42}
43
44$filename = 'backups/dump_' . date('Y-m-d_H-i-s') . '.sql';
45$handle = fopen($filename, 'w+');
46fwrite($handle, $dump);
47fclose($handle);
48
49echo "Бэкап сохранён: " . $filename . "\n";
50
51?>

Mis siin rida-realt toimub. mysqli_connect() avab ühenduse, kui ligipääs keelatakse, lõpetab skript töö selge sõnumiga, selle asemel et vaikselt jätkata. SHOW TABLES tsükkel kogub tabelite nimed massiivi.

Iga tabeli kohta tagastab SHOW CREATE TABLE täpselt ühe rea, mille teine väli on täielik DDL-päring. Lisame selle ette DROP TABLE IF EXISTS, et dumpi saaks rakendada puhtale andmebaasile ilma konfliktideta.

SELECT * loeb kõik read. Funktsioon mysqli_real_escape_string() eemaldab jutumärgid ja erimärgid väärtuste seest, erinevalt addslashes()-st arvestab see ühenduse kodeeringut ega lase läbi süste mitmebaidiste jadade kaudu. NULL-väärtused sisestatakse kui NULL, mitte tühja stringina.

Failinimi sisaldab käivitamise kuupäeva ja kellaaega, mugav rotatsiooniks. Fail avatakse w+ režiimis (loo või kirjuta üle) ja saab kogu dumpi ühe fwrite() operatsiooniga.

Samm 3: Skript andmebaasi taastamiseks SQL-dumpist

Vastupidine skript loeb .sql-faili ja käivitab päringud andmebaasi vastu. Praktikas kaaluvad dumpid sageli kümneid megabaite, seega file_get_contents() ja ; järgi tükeldamine ei ole tootmiskeskkonna jaoks parim valik. Kuid õppimise eesmärgil ja väikeste andmebaaside puhul see lähenemine toimib.

Salvesta kui restore.php. Enne käivitamist tee praegusest andmebaasist täielik varukoopia, taastamine kirjutab tabelid üle.

1<?php
2
3$connection = mysqli_connect('localhost', 'root', '', 'test');
4
5if (!$connection) {
6 die('Ошибка подключения: ' . mysqli_connect_error());
7}
8
9$filename = 'backups/dump_2026-06-14_12-00-00.sql';
10
11if (!file_exists($filename)) {
12 die('Файл дампа не найден: ' . $filename);
13}
14
15$contents = file_get_contents($filename);
16
17if (mysqli_multi_query($connection, $contents)) {
18 do {
19 if ($result = mysqli_store_result($connection)) {
20 mysqli_free_result($result);
21 }
22 } while (mysqli_next_result($connection));
23 echo "База восстановлена из: " . $filename . "\n";
24} else {
25 echo "Ошибка восстановления: " . mysqli_error($connection) . "\n";
26}
27
28mysqli_close($connection);
29
30?>

Peamine erinevus rea-kaupa mysqli_query()-st on mysqli_multi_query(). See võtab vastu stringi mitme SQL-päringuga ja käivitab need järjestikku ühe kutsega. do...while tsükkel koos mysqli_next_result()-ga on kohustuslik: ilma selleta järgnevad päringud ei käivitu ja ühendus jääb rippuma.

mysqli_store_result() toob praeguse päringu tulemuse ja mysqli_free_result() vabastab mälu. Kui päring on INSERT või CREATE TABLE, on tulemus false ja see on normaalne: skript liigub lihtsalt järgmise juurde.

Pane tähele: skript ei tee DROP DATABASE ega loo andmebaasi ennast uuesti. See eeldab, et test andmebaas on juba olemas. Turvalisuse huvides võib dumpi esimene rida sisaldada CREATE DATABASE IF NOT EXISTS.

Samm 4: Varunduse automatiseerimine Croni ja pakkimise abil

Käsitsi käivitamine sobib ühekordseteks ülesanneteks. Kuid töötaval saidil peaks varundus toimuma ilma sinuta, igal ööl sel ajal, kui sa magad.

Linuxi serveris lisa Croni ülesanne: crontab -e ja rida 0 3 * * * php /path/to/backup.php käivitab skripti iga päev kell 3 öösel. Windowsis Task Scheduler tegevusega „käivita programm" php.exe ja argumendiks tee skriptini.

Kaks täiustust, mis muudavad õppeskripti tootmiskõlbulikuks:

Pakkimine. Pärast .sql-faili kirjutamist lisa exec("gzip " . $filename);, dumpi suurus väheneb 5-10 korda. Taastamiseks pakib gunzip faili uuesti lahti.

Rotatsioon. Hoia viimase 7 päeva varukoopiaid, kustuta ülejäänud. Lihtne variant, lisa skripti algusesse N päevast vanemate failide puhastus:

1$retention_days = 7;
2$backup_dir = 'backups/';
3foreach (glob($backup_dir . '*.sql.gz') as $file) {
4 if (filemtime($file) < time() - $retention_days * 86400) {
5 unlink($file);
6 }
7}

Tulemuseks on autonoomne süsteem: skript käivitub graafiku alusel, loob pakitud varukoopia kuupäevaga failinimes ja puhastab vanad failid. Osavad käed ja 20 minutit seadistamist asendavad tasulist pluginat.

Ülaltoodud video näitab täielikku automaatse varunduse tsüklit: alates seadistusfailist kuni pakitud .sql.gz kontrollimiseni backups/ kaustas. Lähenemine on täpselt sama, mida selles artiklis kirjeldatud, koos täiendavate veakontrollide ja logimisega.

⁉️🤔 KKK

Kas MySQL-i parooli hoidmine PHP skriptis on turvaline?

Ligipääsuandmete hoidmine skriptis avatekstina on vastuvõetav ainult siis, kui fail asub väljaspool saidi avalikku kataloogi ega ole brauseri kaudu ligipääsetav. Parem on viia ligipääsuandmed eraldi config.php-sse väljapoole public_html-d ja kaasata require abil. Veelgi usaldusväärsem on edastada parool keskkonnamuutuja kaudu: getenv('DB_PASS').

Kas ma saan varundada ainult kindlaid tabeleid?

Jah. Asenda SHOW TABLES selgesõnalise nimede massiiviga: $tables = ['wp_posts', 'wp_postmeta', 'wp_options'];. Või välista ebaolulised tabelid if (!in_array($table, ['wp_litespeed_cache', 'wp_actionscheduler_logs'])) abil. Praktikas moodustavad vahemälu ja logide tabelid olulise osa andmebaasi mahust ega ole taastamiseks vajalikud.

Kui palju ruumi võtab keskmise WordPressi saidi andmebaasi varukoopia?

Pakkimata SQL-dump andmebaasist, kus on 500 postitust ja 15 pluginat, kaalub 15-40 MB. Pärast gzip-i 2-8 MB. Igapäevaste varunduste kuu aja jooksul koguneb koos pakkimisega 100-300 MB, 20 GB kettaga serveri jaoks on see tühine. 7-päevane rotatsioon hoiab hõivatud ruumi 50-100 MB piires.

Mida teha, kui varundusfail on rikutud?

Enne taastamist kontrolli terviklikkust: gunzip -t dump.sql.gz pakitud faili puhul, head -n 20 dump.sql pakkimata faili puhul, veendu, et fail algab SQL-kommentaaridega, mitte binaarse prahiga. Ära taasta rikutud dumpi, sa kaotad andmed. Just seepärast hoiad alles vähemalt 2-3 viimast koopiat.

Kuidas see lähenemine erineb WordPressi varunduspluginatest?

Plugin nagu UpdraftPlus pakub veebiliidest, inkrementaalseid varukoopiaid ja pilve üleslaadimist „karbist võttes". PHP skript annab täieliku kontrolli protsessi üle ilma lisakoodita administraatoris. Arendajale, kes juba serveriga töötab, on skript kiirem ja läbipaistvam. Kliendile, kellel puudub konsooli ligipääs, on plugin mugavam.

Käsitsi skript, mysqldump või plugin, mida oma ülesande jaoks valida

PHP varundusskript annab peamise: arusaamise, mis täpselt sinu andmebaasiga varundamise ajal toimub. Sa ei usalda musta kasti, vaid kontrollid iga päringut.

Kui sait on tootmises ja kiirus loeb, kasuta mysqldump-i. Üks käsk mysqldump -u user -p db_name | gzip > dump.sql.gz teeb sama asja, kuid kordades kiiremini, sest see töötab MySQL-i mootori tasemel, mitte rea-kaupa SELECT. PHP skript on mõeldud õppimiseks, kohandatud stsenaariumiteks (mitte kogu andmebaasi, vaid konkreetse päringu tulemuste varundamine) ja keskkondadesse, kus mysqldump pole saadaval.

Kui sait on WordPressis ja sa ei soovi konsooli süveneda, lahendab iga varundusplugin ülesande ilma koodita. UpdraftPlus, BackWPup, Duplicator haaravad nii andmebaasi kui ka saidi failid.

Alusta käsitsi skriptist, saa aru, kuidas SQL-dump moodustub. Seejärel seadista Cron ja pakkimine. Viimase sammuna kontrolli taastamist testserveris: varukoopiat ilma taastamise kontrollita ei loeta tehtuks. Millist tööriista andmebaasi varundamiseks kasutad? Kirjuta kommentaaridesse.