Backups von Datenbanken

ramsys

Member
Hallo Till,

wenn ich mich richtig erinnere gab es ein Problem beim Backup, wenn Webserver und Datenbankserver auf verschiedenen Servern installiert sind (Multiserver-Setup).

Ist das in 3.0.5.4 behoben? Im Bugtracker konnte ich dazu nichts finden. In der aktuellen 3.0.5.4-dev werden keine Backups der Datenbanken angelegt.
 

ramsys

Member
Okay, das hat mich gerade nicht in Ruhe gelassen :)

Die DB-Backups können auch nicht erstellt werden, da in der Tabelle web_database die Spalte backup_interval den Wert "0" hat. In der Datei database_edit.php wird der entsprechende Wert aus der Tabelle web_domain geholt. Die Tabelle web_domain hat aber gar keine Einträge, da die Webseiten ja auf einem anderen Server liegen.

Auszug database_edit.php:

PHP:
$web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$app->functions->intval($this->dataRecord["parent_domain_id"]));

$backup_interval = $app->functions->intval($web['backup_interval']);

$sql = "UPDATE web_database SET sys_groupid = '$sys_groupid', backup_interval = '$backup_interval', backup_copies = '$backup_copies' WHERE database_id = ".$this->id;

Bug oder Gedankenfehler bei mir?
 

florian030

Well-Known Member
Ich habe mir eben das aktuelle stable-version aus dem git installiert und habe kein Problem mit den Backups feststellen können.

Mal davon abgesehen, dass ich deine Beispiel-Zeilen nicht wirklich finden konnte.

Hast Du dieses Problem, wenn DB und WEB auf verschiedenen Servern liegen oder immer?
 

ramsys

Member
Das kann ja auch nicht funktionieren, da der Wert in der web_
PHP:
domain ein String ist (none, daily) und in der web_database Integer (0). Durch die Umwandlung steht dann in der web_database immer 0.

Das wurde erst in 7c19f2dbb4608ef6b3f219d45490b25aa05e848c vor zwei Tagen behoben. Deshalb funktioniert es jetzt bei Dir :)

Hast Du dieses Problem, wenn DB und WEB auf verschiedenen Servern liegen oder immer?

Ich werde den aktuellen Commit nachher mal installieren und hier berichten, wie es sich dann bei getrennten Servern verhält.

@florian030 Danke für Test ;)
 

ramsys

Member
Der Bug wurde von Falko im Git behoben. Nach dem Update werden nun in beiden Tabellen (web_domain, web_database) die Werte korrekt als string eingetragen (none, daily). Auch bei getrennten Servern von Web und Datenbank!

Es war nur notwendig, bei allen betroffenen Webseiten den Datensatz manuell zu aktualisieren. Ich werde den Durchlauf heute Nacht abwarten und sehen, ob dann alle Daten wie gewünscht im Backup-Verzeichnis liegen.
 

ramsys

Member
BTW Kann man eigentlich, um z.B. das Backup vorzeitig zu simulieren, die cron_daily.sh manuell aufrufen? Oder kommen dann die anderen Funktionen und vor allem die Statistiken durcheinander?
 

florian030

Well-Known Member
Du könntest bestenfalls eine zweite cron_daily.sh anlegen, die eine zweiter cron_daily.php aufruft. In dieser nimmst Du dann Statistiken, Log-Handling und das Quota-Handling raus.
 

ramsys

Member
Hier das Ergebnis:

Wenn Webserver und Datenbankserver auf getrennten Servern liegen, werden nur die Webseiten beim Backup berücksichtigt, keine Datenbanken.

Auf dem Webserver hat die Tabelle "web_domain" den korrekten Eintrag für "backup_interval" und auf dem Datenbankserver die Tabelle "web_database".
 

florian030

Well-Known Member
Stehen die Backups denn in der Tabelle web_backup auf dem Server auf dem das Interface läuft oder nur auf dem DB-Server?

Die Backup-Listen werden nämlich durch SELECT * FROM web_backup WHERE parent_domain_id = eingelesen.
 

ramsys

Member
Auf dem Webserver stehen in der Tabelle web_backup alle Backups vom backup_type "web" und auf dem Datenbankserver alle Backups vom backup_type "mysql".

Auf dem Server des Interface sind in der Tabelle web_backup beide Backups vorhanden (web und mysql), mit der jeweils korrekten server_id.

Bei einem "SELECT * FROM web_backup WHERE parent_domain_id = xx" auf dem Server des Interface würden also 2 Datensätze gefunden werden, auf dem Webserver nur einer.

Dabei ist mir noch aufgefallen, dass "filesize" in der Tabelle web_backup immer leer ist.
 

florian030

Well-Known Member
Für die Ausgabe entscheidend ist die Datenbank, die auf dem Server mit dem Interface verwendet wird.

Dass filesize in der Tabelle leer ist, ist schon richtig. Die Anzeige der Größen der Backups ist nur per Patch oder mit master-git möglich. Letzteres würde ich aber nicht produktiv einsetzen.
 

ramsys

Member
Für die Ausgabe entscheidend ist die Datenbank, die auf dem Server mit dem Interface verwendet wird.

Und dort befinden sich jeweils 2 Datensätze (web und mysql) unter der gleichen parent_domain_id und unterschiedlicher server_id. Nur wird im Interface lediglich der Datensatz "web" angezeigt.

Im Gegensatz dazu befinden sich in dieser Tabelle auch jeweils 2 Datensätze (web und mysql) unter der gleichen parent_domain_id und gleicher server_id, wo also Webserver und Datenbankserver nicht getrennt sind. Hier werden im Interface korrekterweise beide Datensätze "web" und "mysql" angezeigt.
 

ramsys

Member
Die Backup-Listen werden nämlich durch SELECT * FROM web_backup WHERE parent_domain_id = eingelesen.

WHERE parent_domain_id = xx AND server_id = xx

interface/lib/classes/plugin_backuplist.inc.php:

PHP:
		$web = $app->db->queryOneRecord("SELECT server_id FROM web_domain WHERE domain_id = ".$app->functions->intval($this->form->id));
		$sql = "SELECT * FROM web_backup WHERE parent_domain_id = ".$app->functions->intval($this->form->id)." AND server_id = ".$app->functions->intval($web['server_id'])." ORDER BY tstamp DESC, backup_type ASC";
		$records = $app->db->queryAllRecords($sql);

		$bgcolor = "#FFFFFF";
		if(is_array($records)) {
			foreach($records as $rec) {

				// Change of color
				$bgcolor = ($bgcolor == "#FFFFFF")?"#EEEEEE":"#FFFFFF";
				$rec["bgcolor"] = $bgcolor;

				$rec['date'] = date($app->lng('conf_format_datetime'), $rec['tstamp']);
				$rec['backup_type'] = $wb[('backup_type_'.$rec['backup_type'])];

				$records_new[] = $rec;
			}
		}

		$listTpl->setLoop('records', @$records_new);
 

florian030

Well-Known Member
Das ist dann wohl ein Problem, wenn man eine dev-Version verwendet. ;)

Nimm doch mal testweise
Code:
" AND server_id = ".$app->functions->intval($web['server_id']).
raus.

Das
 
Zuletzt bearbeitet:

Werbung

Top