WBCE CMS – Way Better Content Editing.
You are not logged in.
Meine Änderungen an restore.php sind auch in meinem Repository abgelegt: https://github.com/gchriz/wbce-backup-p … fixrestore
Last edited by chriz (02.03.2024 06:32:27)
Offline
berny
Die Logausgaben in #124 waren gestern Abend noch nicht ganz schön. Das habe ich nun dort behoben.
Offline
Hallo,
ich finde es super, dass Du Dir unser "Sorgenkind", das Backup-Modul, vornimmst. Lass Dich von mangelnden Rückmeldungen hier im Forum nicht entmutigen. Viele lesen einfach nur mit.
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
berny
Eben ist mir aufgefallen, dass der Restore der ZIP-Datei leider (auch) keine Fehlermeldungen liefert, wenn eine Ziel-Datei nicht überschrieben (also restored) werden kann.
Und das Problem mit den CONSTRAINTS tritt manchmal auf, aber nicht immer. Ich habe schon eine Idee, wo das herkommen könnte.
To be continued...
Offline
Das Auspacken der ZIP-Datei meldet nun auch eventuell auftretende Fehler.
Während des Bastelns schicke ich den jeweiligen Code-Stand erst einmal ins Repo: https://github.com/gchriz/wbce-backup-p … fixrestore
Offline
Da ich beim Backup/Restore "überraschende" Effekte hatte, habe ich die im Backend angezeigte Texte etwas überarbeitet.
So wird hoffentlich etwas klarer, was im Detail hinter den Kulissen bei den einzelnen Sicherungstypen geschieht.
(Ansonsten gibt es ja keine Dokumentation außer den Quelltext.)
Leider kann ich keinen Screenshot direkt hier einfügen (oder hab's nicht gefunden) deshalb per Text:
Mein Vorschlag:
(o) Seiten - Alle erstellten Seiten
( ) CMS - Dateien und Datenbanktabellen dieses CMS
( ) Gesamt - Alle Dateien (DOCUMENT_ROOT) und die
gesamte Datenbank (Rechte für alle DB-Tabellen erforderlich!)
Die Sicherung aller Verzeichnisse und Dateien kann je nach Umfang der installierten Module und Templates sowie der Anzahl Mediendateien lange dauern.
Es werden nur Dateien bis max. 60 MB ins Backup aufgenommen.
Einige Verzeichnisse sind ausgenommen, siehe 'backup_settings.php'.
Leere Verzeichnisse werden nicht gesichert. Verzeichnis-Links wird nicht gefolgt!
Zum Vergleich der bisherige Text:
(o) Alle erstellten Seiten sichern
( ) CMS Sicherung - Nur CMS-Daten und die CMS-Datenbank
( ) Gesamtsicherung - Alle Daten und die gesamte Datenbank
Die Rechte für alle Datenbanken sind dafür erforderlich!
Die Sicherung aller Verzeichnisse und Dateien kann je nach Umfang der installierten Module und Templates sowie der Anzahl Mediendateien lange dauern.
Es werden nur Dateien bis max. 60 MB ins Backup aufgenommen.
Leere Verzeichnisse werden nicht gesichert. Verzeichnis-Links wird nicht gefolgt!
Der Commit ist hier: https://github.com/gchriz/wbce-backup-p … 1cf2cd0474
Offline
So, für den Moment bin ich mit dem erreichten Stand zufrieden.
Ich habe ihn einfach mal "2.8.2" genannt.
Abgelegt ist meine Version im Branch fixrestore.
Der diff zur offiziellen "2.8.1" ist hier zu sehen: https://github.com/gchriz/wbce-backup-p … fixrestore
Das ZIP-File zur Installation kann hier heruntergeladen werden: https://github.com/gchriz/wbce-backup-p … estore.zip
Falls also jemand ausprobieren möchte...
Offline
florian, berny
Weiter geht's... Auch wenn ich mich hier weitestgehend in einem Monolog befinde...
Mein neuer Stand von restore.php kann nun während des Importes der SQL-Datei die WB_URL des Backups in die aktuelle lokale WB_URL umsetzen.
Das ist hilfreich, wenn das Backup nicht am Original-Ort, sondern auf einem anderen Server oder einer anderen URL wiederhergestellt wird. (Siehe z.B. https://forum.wbce.org/viewtopic.php?id=5167)
Ich mache so regelmäßig eine lokale Spiegelinstallation des produktiven Systems.
Die WB_URL des Backups wird aber nicht aus der gesicherten config.php (in der ZIP-Datei) ausgelesen, sondern backup.php schreibt noch ein paar Infos in den Header der SQL-Exports, die dann zur Verfügung stehen. Das finde ich unabhängig von der technischen Nutzung auch für den Admin sinnvoll.
Offline
Bei der Installation von Backup-Plus wird nun das konfigurierte "backups" Verzeichnis angelegt. Ebenso beim Start von Backup Plus.
Ein weiterer manueller Schritt für einen initialen Restore ist entfallen...
Last edited by chriz (08.03.2024 07:11:25)
Offline
florian
Im Moment bin ich erst einmal "fertig" mit der Arbeit an Backup Plus. Ich habe gerade noch etwas am README und am Einstiegsbild ergänzt.
In meinem Repository mit den Commits etc. ist der in den Beiträgen der letzten Tage genutzte Branch fixrestore nun in main gemerged und hier als ZIP-Datei erhältlich. Die Versionsnummer ist vorgreifend auf 2.8.2 gesetzt, damit ein Upgrade möglich ist.
Offline
berny, florian, trnoelli
Eine Sache ist mir gerade aufgefallen: Das Backup der Datenbank steigt mit einem 500er aus, wenn es sehr große Tabellen gibt.
(Das sind oft die Tabellen des wbstats-Moduls, ich hatte hier jetzt gerade den Fall, wo allein in der Tabelle _mod_wbstats_hist 13MB Daten bzw. zigtausende Datensätze enthalten waren.)
Das scheint dann dazu zu führen, dass das Script, das den Datenbankdump erzeugen soll, in einen Timeout läuft oder der Arbeitsspeicher vollläuft - ist leider nicht so genau zu erkennen, was genau schiefläuft, aber jedenfalls wird dann nur eine Sicherung des Dateisystems, ohne DB-Abzug erzeugt.
Wenn ich mit dem Adminer einen DB-Abzug erstelle, sind auch die problematischen Riesentabellen enthalten. Bringt es eventuell was, mal zu schauen, wie die das machen? https://github.com/vrana/adminer/
Ansonsten wäre es hilfreich, wenn im Backup-Tool die Möglichkeit bestünde, bestimmte (WBCE-)Tabellen von der Sicherung auszuschließen.
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
stefanek, berny
Ich hab's jetzt (endlich) auch mal im AOR aktualisiert.
https://addons.wbce.org/pages/addons.ph … m&item=159
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
berny, trnoelli
WBCE 2.0? Ich bekomme leuchtende Augen.
Wie geht das, habe da nichts in der Benutzerverwaltung gefunden oder war ich zu blind, das zu finden?
Das ist leider noch nicht möglich, gilt bei den Admintools das "Alles oder nichts"-Prinzip.
In der kommenden Hauptversion (WBCE 2.0) wird das aber geändert.
Offline
Um diskret von unrealistischen Erwartungen abzulenken ("WBCE 2.0"... das kann noch dauern, sorry, aber 1.6.3 steht vor der Tür und scharrt schon mit den Hufen) - hier zumindest offenbar eine Lösung für das Große-Tabellen-Problem.
In der angefügten backup.php.txt( => kopiere als backup.php nach /modules/backup_plus/) wird jetzt stumpf geprüft, ob der Tabellenname den "üblichen Verdächtigen" (croncheck, wbstats) entspricht - und wenn ja, wird die Tabelle einfach übersprungen. Schon läuft das Backup durch. Ta-daah!
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Zum Ausschliessen von Tabellen würde ich statt der festen Verdrahtung aus #139 in etwa folgendes Konstrukt vorschlagen.
(Zeilennummern bezogen auf Version 2.8.2)
Die Tabellennamen stimmen so noch nicht. Das soll nur ein Beispiel sein.
Und es müsste noch geprüft werden, was beim Restore (Typ 'wbce'') passiert. Es fehlen ja nun Tabellen in der Export-Datei...
diff --git a/backup_settings.default.php b/backup_settings.default.php
index 6d24362..70a19ee 100644
--- a/backup_settings.default.php
+++ b/backup_settings.default.php
@@ -51,6 +51,10 @@ $includeDirs = array('pages');
$exportTables = array('mod_wysiwyg','mod_menu_link','mod_sitemap','pages','sections');
+// -------------------- Excludes for any backup type ----------------------------
+// Specify database tables you DO NOT WANT in the SQL export as an array
+$ignoreTables = array('croncheck', 'wbstats');
+
// -------------------- Excludes for backup type WBCE ---------------------------
// Specify directories you do NOT want in the backup as an array for backup type "wbce"
$ignoreWbceDirs = array('backups', 'owncloud','nextcloud','logs','log','cgi-bin');
diff --git a/backup.php b/backup.php
index 2b0feeb..bf0f4dd 100644
--- a/backup.php
+++ b/backup.php
@@ -312,6 +312,10 @@ while ($row = $result->fetchRow()) {
}
}
+ if (in_array($row[0], $ignoreTables)) {
+ continue;
+ }
+
// Add Drop existing tables
$output .= PHP_EOL."# Drop table ".$row[0]." if exists".PHP_EOL."DROP TABLE IF EXISTS `".$row[0]."`;".PHP_EOL;
Nachtrag: Das ist nur ein möglicher Lösungsansatz aus dem Stehgreif. Im Detail schaue ich mir das am Wochenende mal an.
Last edited by chriz (08.11.2024 23:27:22)
Offline
florian
Und es müsste noch geprüft werden, was beim Restore (Typ 'wbce'') passiert. Es fehlen ja nun Tabellen in der Export-Datei...
Hmja, stimmt. Die Tabellen müssten angelegt werden, aber nicht befüllt werden.
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Hier mein Vorschlag zur optionalen Auslassung von Datenbanktabellen-INHALTEN beim Dump/Backup von Typ "CMS" (="wbce") .
In der Konfigurationsdatei können (Teile von) Tabellennamen angegeben werden.
Standardmäßig ist 'mod_wbstats' eingetragen, so dass alle Tabellen, die auf %mod_wbstats% passen, speziell behandelt werden...
diff --git a/backup_settings.default.php b/backup_settings.default.php
index 250f4ab..906a2f9 100644
--- a/backup_settings.default.php
+++ b/backup_settings.default.php
@@ -55,6 +55,10 @@ $exportTables = array('mod_wysiwyg','mod_menu_link','mod_sitemap','pages','secti
// Specify directories you do NOT want in the backup as an array for backup type "wbce"
$ignoreWbceDirs = array('backups', 'owncloud','nextcloud','logs','log','cgi-bin');
+// Specify (optionally part of) database table names you DO NOT WANT in the SQL export as an array.
+// (For example because the table is too big and would terminate the dump process.)
+$ignoreWbceTables = array('mod_wbstats');
+
// -------------------- Excludes for backup type FULL ----------------------------
// Specify directories you do NOT want in the backup as an array for backup type "full"
... das DROPen und CREATEn der passenden Tabellen wird dann in die SQL-Datei geschrieben. Die Inhalte aber nicht.
diff --git a/backup.php b/backup.php
index d8b8895..a001f0e 100644
--- a/backup.php
+++ b/backup.php
@@ -285,6 +285,24 @@ if ($_GET['type'] == 'wbce') {
// get ONLY wbce tables
$prefix = str_replace('_', '\_', TABLE_PREFIX);
$query = "SHOW TABLES LIKE '".$prefix."%'";
+
+ // identify the (optionally ignored) tables
+ $query2 = "SHOW TABLES where tables_in_" . DB_NAME . " like '".$prefix."%'";
+ foreach( $ignoreWbceTables as $tabpattern) {
+ $query2 .= " and tables_in_" . DB_NAME . " like '%" . $tabpattern . "%'";
+ }
+
+ $result = $database->query($query2);
+ if ($database->is_error()) {
+ die(json_encode(array('code' => 4039, 'error' => $database->get_error())));
+ }
+
+ $tables_to_ignore = array();
+ while ($row = $result->fetchRow()) {
+ $tables_to_ignore[] = $row[0];
+ }
+
+ $log->write('The contents of the following tables are not dumped into the SQL export: '.implode(", ",$tables_to_ignore));
}
if ($_GET['type'] == 'page') {
@@ -331,6 +349,12 @@ while ($row = $result->fetchRow()) {
$out = $query2->fetchRow();
$sql_backup .= $out['Create Table'].";".PHP_EOL.PHP_EOL;
+
+ if (in_array($row[0], $tables_to_ignore)) {
+ $output .= $sql_backup.PHP_EOL.PHP_EOL;
+ continue;
+ }
+
$sql_backup .= "# Dump data for ".$row[0].PHP_EOL;
/**
Ich werde noch ein bisschen dran feilen und testen.
Last edited by chriz (09.11.2024 21:45:20)
Offline
florian
Nach ein paar Korrekturen und Veränderungen sieht der diff (zu Version 2.8.2) nun so aus:
diff --git a/backup_settings.default.php b/backup_settings.default.php
index 250f4ab..69a9421 100644
--- a/backup_settings.default.php
+++ b/backup_settings.default.php
@@ -55,6 +55,9 @@ $exportTables = array('mod_wysiwyg','mod_menu_link','mod_sitemap','pages','secti
// Specify directories you do NOT want in the backup as an array for backup type "wbce"
$ignoreWbceDirs = array('backups', 'owncloud','nextcloud','logs','log','cgi-bin');
+// Specify (optionally part of) database table names you DO NOT WANT in the SQL export as an array.
+// (For example because these tables are too big and would terminate the dump process.)
+$saveAsEmptyWbceTables = array('mod_wbstats');
// -------------------- Excludes for backup type FULL ----------------------------
// Specify directories you do NOT want in the backup as an array for backup type "full"
diff --git a/backup.php b/backup.php
index d8b8895..b5c54a4 100644
--- a/backup.php
+++ b/backup.php
@@ -275,24 +275,50 @@ $output .= PHP_EOL."SET FOREIGN_KEY_CHECKS=0;".PHP_EOL;
/**
* Get table names
- * Use this one for all tables in DB
- *
*/
+
+// Default: Save all tables with content.
+// Can optionally be configured differently for type "wbce" in config value $saveAsEmptyWbceTables
+$tables_to_save_without_content = array();
+
+// For type "full" and as basis for type "page"
$query = "SHOW TABLES";
if ($_GET['type'] == 'wbce') {
- // get ONLY wbce tables
+ // get ONLY current wbce tables
$prefix = str_replace('_', '\_', TABLE_PREFIX);
$query = "SHOW TABLES LIKE '".$prefix."%'";
-}
-if ($_GET['type'] == 'page') {
+ // Get the optionally configured table patterns to identify tables that should be saved without contents.
+ // ==> array $tables_to_save_without_content
+ if (isset($saveAsEmptyWbceTables)) {
+
+ $query2 = "SHOW TABLES where tables_in_" . DB_NAME . " like '".$prefix."%'";
+ foreach( $saveAsEmptyWbceTables as $tabpattern) {
+ $query2 .= " and tables_in_" . DB_NAME . " like '%" . $tabpattern . "%'";
+ }
+
+ $result = $database->query($query2);
+ if ($database->is_error()) {
+ die(json_encode(array('code' => 4039, 'error' => $database->get_error())));
+ }
+
+ $tables_to_save_without_content = array();
+ while ($row = $result->fetchRow()) {
+ $tables_to_save_without_content[] = $row[0];
+ }
+
+ $log->write('The contents of the following tables are *not dumped* into the SQL export: '.implode(", ",$tables_to_save_without_content).PHP_EOL);
+ }
+
+} elseif ($_GET['type'] == 'page') {
foreach( $exportTables as &$tab) {
$tab = TABLE_PREFIX.$tab;
}
- $log->write('Only these tables are included in the SQL export: '.implode(", ",$exportTables));
+ $log->write('Only these tables are included in the SQL export: '.implode(", ",$exportTables).PHP_EOL);
+
}
$result = $database->query($query);
@@ -331,6 +357,12 @@ while ($row = $result->fetchRow()) {
$out = $query2->fetchRow();
$sql_backup .= $out['Create Table'].";".PHP_EOL.PHP_EOL;
+
+ if (in_array($row[0], $tables_to_save_without_content)) {
+ $output .= $sql_backup.PHP_EOL.PHP_EOL;
+ continue;
+ }
+
$sql_backup .= "# Dump data for ".$row[0].PHP_EOL;
/**
diff --git a/info.php b/info.php
index 3b37351..a6cbf9f 100644
--- a/info.php
+++ b/info.php
@@ -13,7 +13,7 @@
$module_directory = 'backup_plus';
$module_name = 'Backup Plus';
$module_function = 'tool';
-$module_version = '2.8.2';
+$module_version = '2.8.3';
$module_platform = '1.5.x';
$module_author = 'misc., Ruud, webbird, freesbee, mastermind, chriz';
$module_license = 'GNU General Public License';
@@ -54,5 +54,7 @@ $module_icon = 'fa fa-download';
* turn off foreign key check in SQL file during restore
* create backups directory on install and every call of Backup Plus to have it existing for sure
*
+ * 2.8.3 (by chriz) new config value saveAsEmptyWbceTables to exclude table contents from backup for given tables
+ *
*/
Ich habe diese Version vorab einfach mal 2.8.3 genannt und in mein Repo hochgeladen: https://github.com/gchriz/wbce-backup-plus
Wer sich traut, das zu testen, kann gerne loslegen!
Offline
Mein Ansatz in #143 mit dem inneren DB-Query ist irgendwie unnötig kompliziert.
Ich würde es lieber mit einer Regular Expression lösen, muss mir das aber erst noch einmal genau anschauen.
Melde mich wieder...
Last edited by chriz (11.11.2024 06:48:04)
Offline
So, ohne den zusätzlichen DB-Query sieht das schon übersichtlicher aus!
backup_settings.default.php und info.php bleiben gegenüber der gestrigen Version in #143 unverändert.
Der diff ist wieder auf Basis von 2.8.2.
diff --git a/backup.php b/backup.php
index d8b8895..88a8697 100644
--- a/backup.php
+++ b/backup.php
@@ -275,24 +275,34 @@ $output .= PHP_EOL."SET FOREIGN_KEY_CHECKS=0;".PHP_EOL;
/**
* Get table names
- * Use this one for all tables in DB
- *
*/
+
+// Default: Save all tables with content.
+// Can optionally be configured differently for type "wbce" in config value $saveAsEmptyWbceTables
+$pattern_for_tables_without_content = "";
+
+// For type "full" and as basis for type "page"
$query = "SHOW TABLES";
if ($_GET['type'] == 'wbce') {
- // get ONLY wbce tables
+ // get ONLY current wbce tables
$prefix = str_replace('_', '\_', TABLE_PREFIX);
$query = "SHOW TABLES LIKE '".$prefix."%'";
-}
-if ($_GET['type'] == 'page') {
+ // Build the optional regex pattern to identify tables that should be saved without contents
+ if (isset($saveAsEmptyWbceTables) && (count($saveAsEmptyWbceTables) > 0)) {
+ $pattern_for_tables_without_content = "/" . implode("|", $saveAsEmptyWbceTables) . "/i";
+ $log->write('Pattern for tables to save without content: "' . $pattern_for_tables_without_content . '"');
+ }
+
+} elseif ($_GET['type'] == 'page') {
foreach( $exportTables as &$tab) {
$tab = TABLE_PREFIX.$tab;
}
- $log->write('Only these tables are included in the SQL export: '.implode(", ",$exportTables));
+ $log->write('Only these tables are included in the SQL export: '.implode(", ",$exportTables).PHP_EOL);
+
}
$result = $database->query($query);
@@ -331,6 +341,17 @@ while ($row = $result->fetchRow()) {
$out = $query2->fetchRow();
$sql_backup .= $out['Create Table'].";".PHP_EOL.PHP_EOL;
+
+ if ($pattern_for_tables_without_content !== "") {
+ if (preg_match($pattern_for_tables_without_content, $row[0])) {
+ $msg = 'Contents are not dumped for: ' . $row[0];
+ $log->write($msg);
+ $output .= $sql_backup;
+ $output .= '# ' . $msg .PHP_EOL.PHP_EOL.PHP_EOL;
+ continue;
+ }
+ }
+
$sql_backup .= "# Dump data for ".$row[0].PHP_EOL;
/**
Ist auch schon in mein Repo hochgeladen: https://github.com/gchriz/wbce-backup-plus
Last edited by chriz (11.11.2024 09:14:50)
Offline
florian
Top, funktioniert! Danke!
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline