Hallo, Gast |
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.
|
Foren-Statistiken |
» Mitglieder: 1
» Neuestes Mitglied: Joopi
» Foren-Themen: 513
» Foren-Beiträge: 726
Komplettstatistiken
|
Benutzer Online |
Momentan sind 14 Benutzer online » 0 Mitglieder » 8 Gäste AhrefsBot, Bing, Bytespider, DotBot, Semrush, bot
|
|
|
MySQLDump - nur neue Daten abfragen |
Geschrieben von: Joopi - 07-01-2023, 10:21 - Forum: Programmieren
- Keine Antworten
|
 |
Ich stand vor dem Problem, dass ich eine relativ große Datenbank habe und diese vom lokalen Rechner regelmäßig auf einen externen Webspace transportiert und dort in die Datenbank eingespielt werden muss.
Realisiert habe ich bislang dieses Aufgabe mit mysqldump. Das bedeutet aber, wenn man keine Optionen mitgibt, dass mit der Dumpdatei zunächst alle Tabellen gelöscht werden (drop table), um sie anschließend wieder zu erstellen (create table). Danach werden alle Daten in die Tabelle bzw. Tabellen eingefügt (insert).
Und irgendwann kommt man an einem Punkt, an dem die Datei, auch wenn sie gezippt ist, sehr groß wird und der Import mehr als 30 Minuten dauert.
Also musste eine Lösung her, dass aus der Quelldatenbank des lokalen Rechners nur die ab einem bestimmt Zeitpunkt neu hinzugekommenen Datensätze abfragt werden sowie das Löschen und Erstellen der betroffenen Tabelle unterlassen wird. Es dürfen einfach nur die neuen Datensätze ab Zeitpunkt **X** in die bestehenden Tabellen eingefügt werden.
Und es gibt eine Lösung dazu. Ich habe mich dazu entschieden, diese Lösung mittels Erfassungsdatum, dass in allen Tabellen ein Standardfeld ist, zu versuchen.
Nach einigen Versuchen hatte ich dann die richtige Syntax gefunden, die wie folgt aussieht:
Code: mysqldump --no-create-info --user=user --password="password" datenbank tabelle --where="erfasst>='2022-02-11 19:19:48'" > test.sql
Mit der Option --no-create-info wird sowohl das Löschen als auch das Erstellen von Tabellen verhindert. Ansonsten ist der Befehl zum normalen Befehl von mysqldump nur noch dahingehend abweichend, dass hinter dem Tabellennamen angegeben werden muss, welches Feld und welcher Wert abgefragt werden sollen - --where="erfasst>='2022-02-11 19:19:48'".
Dieser Befehl funktioniert auch mit mehreren Tabellen, die natürlich alle das entsprechend Feld erfasst haben müssen.
Code: mysqldump --no-create-info --user=user --password="password" datenbank tabelle1 tabelle2 tabelle3 --where="erfasst>='2022-02-11 19:19:48'" > test.sql
Und nun geht das Updaten der Datenbank auf dem externen Webspace in Sekundenschnelle. Über diese Lösung habe ich mich riesig gefreut, denn sie bietet mir für andere Sachverhalte viel mehr Spielraum.
|
|
|
Zeichen ersetzen |
Geschrieben von: Joopi - 07-01-2023, 10:15 - Forum: Programmieren
- Keine Antworten
|
 |
In MySQL ist es möglich, in den einzelnen Feldern Zeichen zu suchen und zu ersetzen. Das kann sich auf ganze Worte, Wortteile oder einzelne Buchstaben beziehen.
Im nachfolgenden Beispiel wird in der Tabelle autos im Feld baujahr das Wort alt durch das Wort neu ersetzt.
Ändern von Zeichen innerhalb der Datensätze in einer MySQL-Tabelle.
Code: UPDATE autos SET baujahr = replace(baujahr, 'alt', 'neu');
|
|
|
Volltextsuche |
Geschrieben von: Joopi - 07-01-2023, 10:13 - Forum: Programmieren
- Keine Antworten
|
 |
Es ist schonmal notwendig, innerhalb einer Tabelle nach Text zu suchen. Dieses ist mit ganz einfachen Mitteln möglich. Ein SQL-Statement könnte wie folgt aussehen:
Code: SELECT mailtext FROM tabelle WHERE mailtext LIKE "%Herzliche Grüße%";
Damit habe ich ein Tabellenfeld durchforstet und mir damit sehr viel manuelles Arbeiten erspart, um zu wissen, in welchen Datensätze die obige Floskel enthalten ist.
Wichtig dabei sind die Prozentzeichen, die den Suchtext eingrenzen. Nur dieses wird dann entsprechend der Vorgaben des Statements gesucht. Hierbei scheint es keine Rolle zu spielen, ob Groß- oder Kleinschreibung vorhanden ist.
In einem HTML-Formular könnte so eine Volltextsuche ausgestaltet werden. Prima Sache!
|
|
|
unique key hinzufügen |
Geschrieben von: Joopi - 07-01-2023, 10:12 - Forum: Programmieren
- Keine Antworten
|
 |
Um Doppelerfassung zu vermeiden, bietet es sich an, dass entsprechende Feld auf unique zu setzen. Wird es bei der Erstellung der Tabelle noch nicht erledigt, so kann das nachträglich wie folgt gemacht werden:
Code: ALTER TABLE tabelle ADD UNIQUE ("id");
|
|
|
Tabelle kopieren |
Geschrieben von: Joopi - 07-01-2023, 10:08 - Forum: Programmieren
- Keine Antworten
|
 |
Mit nachstehenden MySQL-Befehlen lässt sich eine Tabelle recht einfach in eine andere Datenbank kopieren. In diesem Beispiel werden die Daten von db1 in db2 kopiert.
Zunächst muss die neue Tabelle (mit gleicher Struktur) erstellt werden:
Code: CREATE TABLE db2.newTable LIKE db1.oldTable;
Danach können die Daten in die neue Tabelle kopiert werden:
Code: ALTER TABLE db2.newTable DISABLE KEYS;
Code: INSERT INTO db2.newTable SELECT * FROM db1.oldTable;
Code: ALTER TABLE db2.newTable ENABLE KEYS;
|
|
|
Tabelle create |
Geschrieben von: Joopi - 07-01-2023, 10:07 - Forum: Programmieren
- Keine Antworten
|
 |
Sofern ich Tabellen auf der Konsole anlege, benutze ich folgenden Befehl:
Code: CREATE TABLE tabelle (
id integer NOT NULL auto_increment,
text varchar(30) NOT NULL,
beschreibung text NOT NULL,
erfasst datetime NOT NULL,
geaendert timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
primary key(id)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Diese Darstellung ist nur exemplarisch. Wichtig sind für mich die beiden Felder mit Datumsangaben.
|
|
|
Select verstehen und richtig anwenden |
Geschrieben von: Joopi - 07-01-2023, 10:05 - Forum: Programmieren
- Keine Antworten
|
 |
Man lernt in der Tat nie aus und immer wieder was neues. Aus allen Lehrbüchern, die ich zu MySQL und/oder PHP gelesen habe, wurde noch nie vermittelt, dass der Befehlsteil SELECT * FROM so in der Form nie verwendet werden soll. Mit dieser Anweisung werden alle Spalten einer Tabelle in die Abfrage aufgenommen, egal, ob sie dann auch genutzt werden oder nicht.
Da selbst die Doku von MySQL diese Schreibweise nutzt, später aber aussagt, dass man es nie in echten Programmen tun soll, haben wohl viele Autoren diese Vereinfachung übernommen. Man soll tatsächlich explizit alle in der Abfrage notwendigen Spalten angeben. Warum das so sein soll, habe ich nach dem Lesen des folgenden Artikels verstanden:
Warum soll ich nicht SELECT * schreiben?
Meine Programme sind zwar klein, und die Tabellenabfragen sind eher einfach, aber ich werde in Zukunft schon darauf achten, die tatsächlich zu nutzenden Spalten in die SELECT-Anweisung aufzunehmen.
|
|
|
Letzten Datensatz ermitteln |
Geschrieben von: Joopi - 07-01-2023, 10:03 - Forum: Programmieren
- Keine Antworten
|
 |
Dann und wann ist es notwendig, den letzten Datensatz einer Tabelle zu ermitteln. Meist ist es die ID aus einem Autowert-Feld.
Die einfachste Methode ist eine SELECT-Abfrage mit LIMIT 1 und einer Sortierung mit DESC (aufwärts).
Code: SELECT id FROM tabelle ORDER BY id DESC LIMIT 1;
Diese Methode funktioniert natürlich in allen Scripten entsprechend, die eine Verbindung zu einer MySQL-Datenbank aufbauen können. Im vorliegenden Beispiel benötigte ich den letzten Datensatz eben in einem Shellscript.
Code: lastid=($(mysql -u $user -h $server --password="$pw" $db -e "SELECT id FROM $tabelle1 ORDER BY id DESC LIMIT 1";))
|
|
|
Installation und Rootpasswort |
Geschrieben von: Joopi - 07-01-2023, 09:57 - Forum: Programmieren
- Keine Antworten
|
 |
Irgendwie komme ich bei Neuinstallationen immer wieder in Konflikt mit dem Rootpasswort für MariaDB oder MySQL.
Heute, am 01.01.2022, hatte ich versucht, in einer virtuellen Maschine (VirtualBox) einen MariaDB-Server aufzusetzen. Das hat nicht funktioniert. Das Setzen des Rootpassworts wollte nicht gelingen. Dabei fiel mir erst später auf, dass MariaDB gar nicht gestartet worden war. Es gelang mir auch nicht, MariaDB zum Laufen zu bekommen.
Kurzerhand entschied ich mich das gute alte MySQL zu installieren. Das ging sehr gut.
Folgende Befehle setzte ich ab:
Code: sudo apt-get install mysql-server mysql-client
Code: sudo mysql_secure_installation
Bei diesem Befehl hatte MariaDB eine Fehlermeldung ausgegeben. MySQL lief schön durch und ich konnte das Rootpasswort setzen. Doch eine Anmeldung in der Konsole wollte nur gelingen, wenn ich die Anmeldung als Sudo-User vornahm. Das hatte auch den Nachteil, dass ich mich über Adminer im Browser nicht anmelden konnte.
Der Workaround hierzu ist sehr gut auf der folgenden Webseite beschrieben:
can't login as mysql user root from normal user account in ubuntu 16.04
In der Kurzform für mich sind folgende Befehl abzuarbeiten, um dem MySQL-User root wieder normal funktionsfähig zu machen.
Der Sudo-User loggt sich in die MySQL-Konsole ein:
Code: sudo mysql -u root -h localhost -p
Sodann überprüft er, wie der MySQL-User root in der entsprechenden Tabelle der Datenbank mysql steht:
Code: SELECT User,Host FROM mysql.user;
Der User root ist dann zu löschen:
Code: DROP USER 'root'@'localhost';
Der User root ist dann neu anzulegen:
Code: CREATE USER 'root'@'localhost' IDENTIFIED BY 'passwort';
Die komplette Latte an Rechten ist dem User root zu vergeben:
Code: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
Und dann sind die neuen Berechtigungen sofort auszurollen:
Danach konnte ich mich auf der Konsole als normaler User und Passwort nach MySQL einloggen und in Adminer konnte ich mich auch einloggen mit dem User root und dem neuen Passwort.
Adminer kann nur genutzt werden, wenn der User root ein Passwort hat. Das nur am Rande erwähnt.
|
|
|
Fehlerbehandlung |
Geschrieben von: Joopi - 07-01-2023, 09:51 - Forum: Programmieren
- Keine Antworten
|
 |
Wenn über ein HTML(PHP)-Formular Daten in eine Tabelle geschrieben werden sollen, dann sollte auch eine Fehlerbehandlung erfolgen.
Mit diesem Code-Schnipsel kann man die Fehlermeldung und die Fehlernummer anzeigen lassen, die ausgegeben werden, wenn es zu einem Fehler kommen sollte. Der Datensatz sollte dann auch nicht in der Tabelle erscheinen.
PHP-Code: if(mysqli_error($db)) { echo "<p>Das ist der Fehler: " . mysqli_error($db) . " und der Fehlercode:" . mysqli_errno($db) . "</p>"; echo "<a href=\"mail_add.php\"><img border=\"0\" src=\"header_button3.php?text=Mailaddi&font=4\"></a>\n"; }
Die Prüfung erfolgt über die Datenbankverbindugn **\$db**. Die Fehlerausgabe erfolgt mit Klartext und mit Fehlernummer.
|
|
|
|