2013-10-02 18 views
10

W przeszłości otrzymywałem dużą pomoc od społeczności SO, więc kiedy to wymyśliłem, myślałem, że oto moja okazja, by trochę oddać. Mam nadzieję, że to komuś pomaga.Kopia zapasowa bazy danych MySQL do Dropbox

Problem, z jakim miałem do czynienia, polegał na tym, że moja główna witryna została zbudowana na WordPressie, z inną bazą danych dla sekcji e-commerce witryny, chciałem utworzyć kopię zapasową całej witryny (wszystkie pliki, obie bazy danych itp.), Aby Dropbox na co dzień.

Po długich poszukiwaniach nie mogłem znaleźć niczego, co zrobiłoby dokładnie to, czego szukałem.

Nota prawna: Aby to zadziałało, nie trzeba uruchamiać WordPress ani witryny e-commerce. Będzie działać na dowolnej bazie danych MySQL i wymaga PHP.

Natknąłem się na WordPress Backup to Dropbox plugin, który dostarczył mi około 90%. Wtyczka pozwoliła mi na utworzenie kopii zapasowej wszystkich plików w witrynie oraz wykonanie kopii zapasowej bazy danych WordPress z zaplanowaną częstotliwością.

Problem polega na tym, że wtyczka tylko wykonuje kopię zapasową bazy danych WordPress, ale nie mojej bazy danych e-commerce.

Znalazłem również samouczek MySQL backup to Dropbox (kredyt, w którym jest on należny), na którym opiera się część kodu. Jest to świetny samouczek, ale chciałem go utworzyć i usunąć kopię zapasową w różnych momentach - samouczek został zarchiwizowany i usunięty w tym samym czasie.

+0

dobry tutorial :) –

Odpowiedz

12

Rozwiązanie, które wymyśliłem, nie jest specyficzne dla witryny WordPress lub e-commerce. Każdy, kto ma bazę danych MySQL i może uruchamiać PHP, powinien móc z tego skorzystać. Być może z kilkoma poprawkami do mojej odpowiedzi, ale nadal powinny być w stanie osiągnąć końcowy wynik.

Aby zapisać kopię zapasową bazy danych e-commerce, utworzyłem folder w katalogu głównym mojej witryny (/ temp - nazwij go, jak chcesz). Potem musiałem faktycznie utworzyć kopię zapasową bazy danych. Otwórz edytor tekstu i utwórz plik o nazwie backup_dropbox.php.

backup_dropbox.php

<?php 
// location of your /temp directory relative to this file. In my case this file is in the same directory. 
$tempDir = ""; 
// username for e-commerce MySQL DB 
$user = "ecom_user"; 
// password for e-commerce MySQL DB 
$password = "ecomDBpa$$word"; 
// e-commerce DB name to backup 
$dbName = "ecom_db_name"; 
// e-commerce DB hostname 
$dbHost = "localhost"; 
// e-commerce backup file prefix 
$dbPrefix = "db_ecom"; 

// create backup sql file 
$sqlFile = $tempDir.$dbPrefix.".sql"; 
$createBackup = "mysqldump -h ".$dbHost." -u ".$user." --password='".$password."' ".$dbName." > ".$sqlFile; 
exec($createBackup); 

//to backup multiple databases, copy all of the above code for each DB, rename the variables to something unique, and set their values to whatever is appropriate for the different databases. 
?> 

Teraz ten skrypt powinien utworzyć kopię zapasową bazy danych "ecom_db_name" gdy jest on prowadzony. Aby uruchomić go zgodnie z zaplanowanym interwałem (chcę, aby działał kilka minut przed rozpoczęciem mojej kopii zapasowej WordPress o 7 rano). Możesz użyć numeru WP-Cron (jeśli twoja strona ma wystarczający ruch, aby niezawodnie uruchomić go w odpowiednim momencie) lub zaplanować zadanie cron.

Nie jestem ekspertem od zadań crona i tego typu poleceń, więc może być lepszy sposób. Użyłem tego na dwóch różnych stronach i uruchomiłem je na dwa różne sposoby. Baw się z tym, co działa najlepiej dla Ciebie.

Pierwszy sposób znajduje się na katalogu, który nie jest chroniony hasłem, drugi jest dla password protected directory. (Zastąp nazwę użytkownika i hasło swoją nazwą użytkownika i hasłem, i oczywiście ustaw example.com/temp/backup_dropbox.php wszędzie tam, gdzie plik znajduje się na twoim serwerze).

Cron Zadanie do uruchomienia backup_dropbox.PHP 5 minut przed kopiowaniem WP

55 6 * * * php /home/webhostusername/public_html/temp/backup_dropbox.php 

LUB

55 6 * * * wget -q -O /dev/null http://username:[email protected]/temp/backup_dropbox.php 

Teraz zadanie cron jest uruchamiane backup_dropbox.php i tworzę kopię zapasową bazy danych codziennie o 6:55 rano. Kopia zapasowa WordPress do Dropbox, która rozpoczyna się o 7 rano, zwykle trwa około 5-6 minut, ale może potrwać nieco dłużej.

Chcę usunąć moje pliki kopii zapasowej .sql po tym, jak z powodzeniem utworzono kopie zapasowe w usłudze Dropbox, aby nie było tam na zawsze, aby ktoś mógł jakoś otworzyć/pobrać plik bazy danych.

Ponownie uruchom edytor tekstu i utwórz kolejny plik o nazwie clr_bkup.php.

clr_bkup.php

<? 
$tmpDir = ""; 
//delete the database backup file 

unlink($tmpDir.'db_ecom.sql'); 
// if you had multiple DB backup files to remove just copy the line above for each backup, and replace 'db_ecom.sql' with your DB backup file name 

?> 

Ponieważ backup WordPress trwa kilka minut, aby skończyć, chcę uruchomić crona do wykonania clr_bkup.php 10 ostatnich 7, które powinny dać wystarczająco czas. Ponownie, pierwsze zadanie cron poniżej dotyczy niechronionego katalogu, a drugie katalogu chronionego hasłem.

Cron Job uruchomić clr_bkup.php 10 minut po rozpoczęciu

10 7 * * * php /home/webhostusername/public_html/temp/clr_bkup.php 

LUB

10 7 * * * wget -q -O /dev/null http://username:[email protected]/temp/clr_bkup.php 

sekwencja zdarzeń

backup WP Aby pomóc owinąć wokół twojej głowie, co jest dzieje się, tutaj jest oś czasu:

6:55 am: Cron Job ma uruchomić backup_dropbox.php, który tworzy kopię zapasową mojej bazy danych.

7:00: Kopia zapasowa WordPress do Dropbox działa i tworzy kopie zapasowe wszystkich plików, które zmieniły się od czasu ostatniej kopii zapasowej, w tym mojej 5-minutowej, nowo utworzonej kopii zapasowej bazy danych.

7:10 am: Do tej pory zakończyła się kopia zapasowa Dropbox, więc zadanie Cron ma uruchomić clr_bkup.php, co powoduje usunięcie pliku kopii zapasowej z serwera.

Zmienne, notatki i inne. Informacje

Timing

Pierwszą rzeczą, która wisiała mi się trafiało taktowanie rację. Dla uproszczenia wykorzystałem czas w powyższym przykładzie, tak jakby wszystko działo się w tej samej strefie czasowej. W rzeczywistości mój serwer hosta znajduje się na zachodnim wybrzeżu Stanów Zjednoczonych, podczas gdy moja strefa czasowa w WordPress jest ustawiona na Wschodnie Wybrzeże Stanów Zjednoczonych (różnica 3 godzin). Moje aktualne zadania cron są uruchamiane 3 godziny wcześniej (czas serwera) niż to, co pokazano powyżej. To będzie inne dla wszystkich. Najlepiej jest wiedzieć różnicę czasu z góry.

Run zapasowa z czasem Sprawdź

W katalogu, który nie jest chroniony hasłem, chciałem zachować skrypt backup_dropbox.php od uruchomiony w dowolnym innym momencie dnia niż 6:55 rano (odwiedzając to w przeglądarce o 10 rano na przykład). Włączyłem sprawdzanie czasu na początku pliku backup_dropbox.php, które zasadniczo sprawdza, czy nie jest 6:55, a następnie nie pozwól mu wykonać reszty kodu. I zmodyfikowane backup_dropbox.php do:

<?php 
$now = time(); 
$hm = date('h:i', $now); 
if ($hm != '06:55') { 
    echo "error message"; 
} else { 
// DB BACKUP code from above goes here 
} 
?> 

Przypuszczam, że można również dodać do pliku clr_bkup.php tylko niech to usunąć pliki kopii zapasowej na 7:10 rano, ale ja naprawdę nie widzę potrzeby, ponieważ jedyny czas, w którym clr_bkup.php zrobi wszystko, jest w każdym razie między 6: 55-7: 10. Do ciebie, jeśli zdecydujesz się na tę trasę.

Nie na WordPress?

Istnieje szereg bezpłatnych i płatnych usług, które podtrzymają swoją stronę albo do Dropbox lub innej podobnej usługi jak Google Drive, Amazon S3, Box itp, lub niektóre będą przechowywać pliki na swoich serwerach za opłatą.

Backup Machine, Codeguard, Dropmysite, Backup Box lub Mover aby wymienić tylko kilka.

Chcesz mieć zbędne kopie zapasowe poza siedzibą firmy?

Istnieje wiele usług, które pozwolą Ci automatycznie tworzyć zdalne redundantne kopie zapasowe w dowolnym z wyżej wymienionych magazynów w chmurze.

Na przykład, jeśli tworzysz kopię zapasową swojej witryny do Dropbox, możesz użyć usługi o nazwie If This Then That (IFTTT), aby automatycznie dodawać pliki przesłane do konkretnej wersji Dropbox folder to Google Drive. W ten sposób Dropbox będzie miał problemy z serwerami, będziesz mieć również kopię zapasową Google Drive. Lista kopii zapasowych wymienionych powyżej może również zrobić coś takiego.

Nadzieja to pomaga

Nie może być lepszy sposób to wszystko. Byłem w szczypie i musiałem wymyślić coś, co działa niezawodnie, co robi. Jeśli istnieją jakiekolwiek ulepszenia, które można wprowadzić, prosimy o udział w komentarzach.

+1

To spowodowałoby, że wiele sensu do kompresji plików. Oto jak: '$ sqlFile = $ tempDir. $ DbPrefix.". Sql.gz "; $ createBackup = "mysqldump -h". $ DbHost. "-u". $ User. "--password = '". $ Hasło. "'". $ DbName. "| Gzip>". $ SqlFile; ' (Uwaga: Nie sądzę, aby działało to na Windowsie.) –

Powiązane problemy