Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego mój skrypt kopii zapasowej bazy danych nie działa w php?

To nie zadziała w przypadku tworzenia kopii zapasowej bazy danych jako skryptu SQL, chyba że Twoja baza danych jest tylko bazą danych zabawek, odpowiednikiem skryptu „hello world”.

Ten scenariusz jest przerażający. Nie należy go używać do tworzenia kopii zapasowych bazy danych. Ten skrypt został opublikowany wcześniej:Baza danych PHP Skrypt zrzutu — czy są jakieś problemy?

  • Brak sprawdzania błędów po mysql_connect() lub mysql_queries(). Prawdopodobnie po prostu podałeś złe hasło lub coś, ale nigdy się nie dowiesz, ponieważ skrypt nie sprawdza, czy połączenie się powiodło.

  • Nie wygeneruje prawidłowej instrukcji INSERT, jeśli Twoja baza danych zawiera jakiekolwiek wartości NULL.

  • Zestawy znaków nie są obsługiwane.

  • addslashes() jest nieodpowiednie do ucieczki danych.

  • Nazwy tabel nie są rozdzielane.

  • Nie tworzy kopii zapasowych widoków, procedur, funkcji ani wyzwalaczy.

  • mysql_query() buforuje wyniki, więc jeśli masz tabelę z tysiącami wierszy lub więcej, przekroczysz limit pamięci PHP. W rzeczywistości skrypt łączy serię instrukcji INSERT w jedną zmienną PHP. Więc zanim się skończy, będziesz mieć swoje całe baza danych reprezentowana w pamięci.

Nikt nie powinien nigdy używać tego skryptu. To kompletna bzdura i nie mówię tego lekko.

Wystarczy użyć shellexec() do uruchomienia mysqldump.

@Álvaro G. Vicario ma rację, nie musisz nawet używać PHP do tego zadania. Zakładałem, że musisz zrobić kopię zapasową ze skryptu PHP. Oto jak utworzyłbym kopię zapasową ze skryptu cron:

Stwórz skrypt powłoki, można go nazwać jak chcesz, np. mymysqldump.sh. Oto jak bym to napisał:

:
: ${BACKUP_HOST:="localhost"}
: ${BACKUP_DATABASE:="mydatabase"}
: ${BACKUP_DIR:="/opt/local/var/db/mysql5/backups"}
: ${BACKUP_FILE:="${DATABASE}-`date +%Y%m%d%H%M%S`"}

mysqldump -h ${BACKUP_HOST} ${BACKUP_DATABASE} > ${BACKUP_DIR}/${BACKUP_FILE}

Oczywiście dostosuj wartości zmiennych zgodnie z potrzebami swojego środowiska.

Możesz zauważyć, że nazwa użytkownika i hasło nie w tym pliku. Prosimy nie umieszczać haseł w skryptach w postaci zwykłego tekstu, aby każdy mógł je przeczytać. Zamiast tego umieścimy je w pliku opcji, aby był bezpieczniejszy.

Utwórz specjalnego użytkownika systemu operacyjnego, który będzie uruchamiał kopię zapasową z poziomu crona. Twój system może mieć specjalnego użytkownika "mysql" lub "_mysql" do uruchamiania serwera MySQL, ale ten użytkownik może być skonfigurowany tak, aby nie mieć prawidłowego katalogu domowego. Potrzebujesz użytkownika, który ma katalog domowy. Nazwijmy to „moja kopia zapasowa”.

W katalogu domowym tego użytkownika utwórz plik .my.cnf o następującej treści:

[mysqldump]
user = alupto_backup
password = xyzzy

Gdzie "alupto_backup" i "xyzzy" to nazwa użytkownika MySQL i jego hasło (zmień je dla swojego środowiska). Ustaw własność i tryb tego pliku tak, aby tylko jego właściciel mógł go odczytać:

chown mybackup .my.cnf
chmod 600 .my.cnf

Utwórz katalog bin w domu tego użytkownika i umieść w nim nasz skrypt powłoki.

mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin

Teraz możesz uruchomić skrypt powłoki, aby go przetestować:

sh ~mybackup/bin/mymysqldump

Teraz utwórz plik cron dla tego użytkownika:

crontab -u mybackup

@daily ~mybackup/bin/mymysqldump

To powinno być.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak uruchomić skrypt Pythona z zapytania mysql?

  2. Promień 40 kilometrów przy użyciu szerokości i długości geograficznej

  3. Jak sprawdzić, czy MySQLnd jest aktywnym sterownikiem?

  4. MySQL wybierz DISTINCT według najwyższej wartości

  5. jqGrid - Unikalny identyfikator dla nowego wiersza