sql >> Database teknologi >  >> RDS >> Mysql

Hvorfor virker mit database backup-script ikke i php?

Dette vil ikke fungere til at sikkerhedskopiere din database som et SQL-script, medmindre din database kun er en legetøjsdatabase, svarende til et "hello world"-script.

Det manuskript er rystende. Du bør ikke bruge det til at sikkerhedskopiere en database. Det script er blevet sendt før:PHP-database Dump Script - er der nogen problemer?

  • Ingen fejlkontrol efter mysql_connect() eller mysql_queries(). Du har sikkert lige givet en forkert adgangskode eller noget, men du ville aldrig vide det, fordi scriptet ikke bekræfter, at forbindelsen var vellykket.

  • Det vil ikke producere den rigtige INSERT-sætning, hvis din database indeholder NULL'er.

  • Tegnsæt håndteres ikke.

  • addslashes() er ikke egnet for at undslippe data.

  • Tabelnavne er ikke afgrænset.

  • Sikkerhedskopierer ikke visninger, procedurer, funktioner eller udløsere.

  • mysql_query() buffer resultater, så hvis du har en tabel med tusindvis af rækker eller mere, vil du overskride din PHP-hukommelsesgrænse. Faktisk sammenkæder scriptet rækken af ​​INSERT-sætninger til en enkelt PHP-variabel. Så før den er færdig, har du din hele database repræsenteret i hukommelsen.

Ingen bør nogensinde bruge det script. Det er totalt vrøvl, og det siger jeg ikke let.

Bare brug shellexec() til at køre mysqldump.

@Álvaro G. Vicario har en god pointe, du behøver ikke engang bruge PHP til denne opgave. Jeg gik ud fra, at du skulle lave en sikkerhedskopi fra et PHP-script. Sådan laver jeg en sikkerhedskopi fra et cron-script:

Lav et shell script, det kan hedde hvad du vil, f.eks. mymysqldump.sh. Sådan vil jeg skrive 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}

Tilpas naturligvis værdierne for variablerne efter behov for dit miljø.

Du bemærker måske, at brugernavnet og adgangskoden ikke er i denne fil. Indsæt venligst ikke adgangskoder i scripts i almindelig tekst, så alle kan læse dem. I stedet lægger vi dem i en indstillingsfil for at gøre det mere sikkert.

Opret en speciel operativsystembruger, der skal køre sikkerhedskopien fra cron. Dit system kan have en speciel bruger "mysql" eller "_mysql" til at køre MySQL-serveren, men denne bruger kan være konfigureret til ikke at have nogen gyldig hjemmemappe. Du skal bruge en bruger, der har en hjemmemappe. Lad os kalde det "mybackup".

Under den brugers hjemmemappe skal du oprette en fil .my.cnf med følgende indhold:

[mysqldump]
user = alupto_backup
password = xyzzy

Hvor "alupto_backup" og "xyzzy" er MySQL-brugernavnet og dets adgangskode (ændre disse for dit miljø). Indstil ejerskabet og tilstanden for denne fil, så kun dens ejer kan læse den:

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

Opret en bin-mappe under denne brugers hjem og sæt vores shell-script ind i den.

mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin

Nu kan du køre shell-scriptet for at teste det:

sh ~mybackup/bin/mymysqldump

Opret nu en cron-fil til denne bruger:

crontab -u mybackup

@daily ~mybackup/bin/mymysqldump

Det burde være det.



  1. Ruller Oracle transaktionen tilbage ved en fejl?

  2. Liste over ikke-tomme tabeller i MySQL-databasen

  3. Online SQL-syntakskontrol, der er i overensstemmelse med flere databaser

  4. Få alle poster fra MySQL-databasen, der er inden for Google Maps .getBounds?