MySQL Backup mit Phing auf Windows

Wie man ein MySQL Backup automatisieren kann

Initiale Einrichtung

Textbasierte Backups eignen sich für Datenbanken, die nicht sehr groß sind. Nicht besonders groß ist relativ. Hängt sehr von der Hardware ab. Mit entsprechender Hardware sind auch Datenbanken mit 100 MB kein Problem. Die Backups kann man mit vergleichsweise einfachen Mitteln automatisieren.

Eigentlich benötigt man dazu nur das von Haus aus bei MySQL/MariaDB vorhandene Backuptool mysqldump, Phing und je nachdem ob Windows oder Linux den Aufgabenplaner oder einen Cronjob. Hier wurde die Windowsvariante gewählt. Durch die Phing-Konfigurationsdatei wird jede Datenbank einzeln exportiert, komprimiert und an einen Zielort verschoben. Durch die für den Aufgabenplaner erstellte .bat Datei werden die Datenbanken nacheinander in einer Schleife gesichert. Die .bat Datei nur in den Aufgabenplaner eintragen und schon hat man das Datenbankupdate automatisiert.

Benutzerrechte MySQL


GRANT USAGE ON *.* TO '<backup_user>'@'localhost' IDENTIFIED BY '<password>';
GRANT SELECT, LOCK TABLES ON `mysql`.* TO '<backup_user>'@'localhost';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON <backup_db>.* TO '<backup_user>'@'localhost';

phing-config.xml


<?xml version="1.0" encoding="UTF-8"?>
<project name="BackupMariaDB" default="clean">	
	<fail unless="dbName" message="Please provide database name." />
	<fail unless="dbUser" message="Please provide database user name." />
	<fail unless="dbPassword" message="Please provide database password." />
	<fail unless="baseBuildDir" message="Please provide base build directory." />
	<fail unless="targetDir" message="Please provide a target directory." />
	
	<tstamp prefix="mytime"></tstamp>
    <property name="buildName"  value="${dbName}_${mytime.DSTAMP}_${mytime.TSTAMP}" override="true" />
    <property name="buildDir"  value="${baseBuildDir}/${buildName}" override="true" />
    <property name="archiveFile"  value="${buildName}.tar.gz" override="true" />
    <property name="archivePath"  value="${buildDir}/.." override="true" />

    <!-- ============================================  -->
    <!-- Target: prepare                               -->
    <!-- ============================================  -->
    <target name="prepare">
	    <tstamp prefix="mytime"></tstamp>
        <echo msg="Making directory ${buildDir}" />
        <mkdir dir="${buildDir}" />
    </target> 
	
    <!-- ============================================  -->
    <!-- Target: build                                 -->
    <!-- ============================================  -->
    <target name="build" depends="prepare">	
	    <echo msg="Dumping database ${dbName}" />
		<exec checkreturn="true" command="mysqldump -u${dbUser} -p${dbPassword} --default-character-set=utf8mb4 --databases ${dbName}  > ${buildDir}/${dbName}.sql" />	

        <echo msg="Creating .tar.gz" />
		<tar destfile="${archivePath}/${archiveFile}" compression="gzip">
			<fileset dir="${buildDir}">
				<include name="**/**"></include>
   			</fileset>
		</tar>
    </target>
	
    <!-- ============================================  -->
    <!-- Target: move                               -->
    <!-- ============================================  -->
    <target name="move" depends="build">	
	    <echo msg="Move ${archivePath}/${archiveFile} to ${targetDir}/${archiveFile}" />
		<move file="${archivePath}/${archiveFile}" tofile="${targetDir}/${archiveFile}" overwrite="true"/>	
    </target>
	
    <!-- ============================================  -->
    <!-- Target: clean                                 -->
    <!-- ============================================  -->
    <target name="clean" depends="move">
        <echo msg="Cleanup, delete build dir ${buildDir}" />
        <delete dir="${buildDir}" includeemptydirs="true" verbose="false" failonerror="true" />		
    </target>	
</project>

run.bat


@echo off
set db[0]="<backup_db>"

set dbUser="<db_user>"
set dbPassword="<db_password>"
set baseBuildDir="<baseBuildDir>"
set targetDir="<targetDir>"

set "x=0"

:SymLoop
if defined db[%x%] (
    call php C:\Opt\phing\phing.phar -f C:\Users\SomeUser\Backup\Database\phing-config.xml ^
	-DdbName=%%db[%x%]%% ^
	-DdbUser=%dbUser% ^
	-DdbPassword=%dbPassword% ^
	-DbaseBuildDir=%baseBuildDir% ^
	-DtargetDir=%targetDir%
	
    set /a "x+=1"
    GOTO :SymLoop
)

Hinzufügen einer Datenbank zum Backup

Möchte man eine Datenbank zum Backup hinzufügen muss man nur die Rechte für die jeweilige Datenbank setzen und das Array in der .bat Datei erweitern.

Hinzufügen Benutzerrechte MySQL


GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON <new_backup_db>.* TO '<backup_user>'@'localhost';

Erweiterung run.bat


set db[0]="<backup_db>"
set db[1]="<new_backup_db>"
...

Zurück zur Kategorie: Dev-Ops
Zurück nach oben