sql >> Databasteknik >  >> RDS >> Mysql

Varför fungerar inte mitt säkerhetskopieringsskript för databas i php?

Detta fungerar inte för att säkerhetskopiera din databas som ett SQL-skript, såvida inte din databas bara är en leksaksdatabas, motsvarande ett "hej världen"-skript.

Det manuset är skrämmande. Du bör inte använda den för att säkerhetskopiera en databas. Det skriptet har lagts upp tidigare:PHP Database Dump Script – finns det några problem?

  • Inga felkontroller efter mysql_connect() eller mysql_queries(). Du angav förmodligen bara ett fel lösenord eller något, men du skulle aldrig veta eftersom skriptet inte verifierar att anslutningen lyckades.

  • Det kommer inte att producera rätt INSERT-sats om din databas innehåller några NULLs.

  • Teckenuppsättningar hanteras inte.

  • addslashes() är inte lämplig för att undvika data.

  • Tabellnamn är inte avgränsade.

  • Säkerhetskopierar inte vyer, procedurer, funktioner eller utlösare.

  • mysql_query() buffrar resultat, så om du har en tabell med tusentals rader eller fler kommer du att överskrida din PHP-minnesgräns. Faktum är att skriptet sammanfogar serien av INSERT-satser till en enda PHP-variabel. Så innan den är klar har du hela databas representerad i minnet.

Ingen ska någonsin använda det skriptet. Det är rent skräp, och jag säger inte så lättvindigt.

Använd bara shellexec() för att köra mysqldump.

@Álvaro G. Vicario har en bra poäng, du behöver inte ens använda PHP för den här uppgiften. Jag antog att du måste göra en säkerhetskopia från ett PHP-skript. Så här skapar jag en säkerhetskopia från ett cron-skript:

Skapa ett skalskript, det kan heta vad du vill, t.ex. mymysqldump.sh. Så här skulle jag skriva det:

:
: ${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}

Naturligtvis anpassa värdena för variablerna efter behov för din miljö.

Du kanske märker att användarnamnet och lösenordet inte är det i den här filen. Vänligen lägg inte in lösenord i skript i vanlig text så att alla kan läsa dem. Istället lägger vi dem i en alternativfil för att göra det säkrare.

Skapa en speciell operativsystemanvändare som ska köra säkerhetskopieringen från cron. Ditt system kan ha en speciell användare "mysql" eller "_mysql" för att köra MySQL-servern, men denna användare kan vara konfigurerad att inte ha någon giltig hemkatalog. Du behöver en användare som har en hemkatalog. Låt oss kalla det "mybackup".

Skapa filen .my.cnf under användarens hemkatalog med följande innehåll:

[mysqldump]
user = alupto_backup
password = xyzzy

Där "alupto_backup" och "xyzzy" är MySQL-användarnamnet och dess lösenord (ändra dessa för din miljö). Ställ in ägarskap och läge för denna fil så att endast dess ägare kan läsa den:

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

Skapa en bin-katalog under den här användarens hem och lägg in vårt skalskript i den.

mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin

Nu kan du köra skalskriptet för att testa det:

sh ~mybackup/bin/mymysqldump

Skapa nu en cron-fil för denna användare:

crontab -u mybackup

@daily ~mybackup/bin/mymysqldump

Det borde vara det.



  1. Decimal VS Int i MySQL?

  2. spara html-innehåll i mysql-databasen

  3. Hur kan jag se om mitt Oracle-system är inställt för att stödja Unicode eller multibyte-tecken?

  4. Flera räkningar med olika villkor i en enda MySQL-fråga