Beispiel: Mediawiki Datenbank
Methode 1: Pipe
echo "show tables;select * from user where user_name='Abc';" | mysql --user wikiuser --host dbserver --password=Geheim --database=wikidb
Methode 2: Redirect Input
die SQL-Statements kann man natürlich auch in eine Datei schreiben und mit < reinleiten:
mysql --user wikiuser --host dbserver --password=Geheim --database=wikidb < tabelleundbenutzerzeig.sql
Methode 3: Execute Statement
mysql --user user --host dbserver --password=Geheim --database wikidb -e "show tables;"
% mysql mysql> show databases; mysql> use wikidb; mysql> show tables; mysql> describe Users;
anzeigen
mysql> select user_name,user_email from user where user_name='Abc';"
ändern
mysql> update user set user_email = "Abc@xxx.x" where user = "Abc";
vielleicht gibt es ja noch eine elegantere Methode, aber dieses SQL-Statement findet IPv4-Adressen-ähnliche Konstrukte:
select servername,serverip from servertable where serverip REGEXP '[0-9.][0-9.]*';
Das Ticketsystem OTRS hatte bei einigen Mails wg. Umlaut-Verdauungsproblemen ein größere Anzahl von Dateien als "problem-email" in seinem Verzeichnis mail-spool
abgelegt. Die Frage war: Sind dafür Tickets hinterlegt worden oder nicht?
diese Zeile (wenig elegant), zieht mir eine Liste der "Paypal-Transaktionscodes" aus der Datenbank (die Queue ID 19 ist hier die Paypal-Queue).
echo "select a.a_from,a.a_body from article as a,ticket as t where a.ticket_id = t.id and t.queue_id=19;" | mysql -u root -pPASSWORT --database=otrs | awk -F'Transaktionscode: ' '{print $2}' | sed 's/\\n\\n\\n..*//' | sort > /tmp/db.transaktionscode
Die gewonnene Textdatei habe ich dann auf dem OTRS-Server mit dem Ergebnis von
mail-spool # grep "Transaktionscode: [^<]" * | awk '{print $8}' > /tmp/err.mail.transaktionscodes
verglichen → puh, anscheinend sind doch alle Mails im Ticketsystem
Das hätte ich nicht gedacht: Es gibt auch im Jahr 2020 noch latin1
in Default-Einstellungen, danke MariaDB für diese kleine Überraschung1).
Weil nach dem Upgrade die Server-Software (Zabbix) über latin1
schimpft und utf8
fordert, muss die Datenbank mal schnell umgebaut werden:
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD < alter database $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_bin;' mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -D$MYSQL_DATABASE -B -N -e "SHOW TABLES" | \ awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; SET foreign_key_checks = 1; "}' | \ mysql -D$MYSQL_DATABASE -u$MYSQL_USER -p $MYSQL_DATABASE
Allgemein: wenn man ein MySQL-Passwort sucht, ist es vielleicht dort abgelegt:
% cat .my.cnf [client] host=dbserver user=benutzer1 password=Geheim database=dbname
Im Prinzip kann man alle Parameter, die man dem Client per Kommandozeile übergibt, auch in dieser Datei hinterlegen.
mysqld stoppen und mit --skip-grant-tables
starten
Mit MySQL verbinden:
% mysql -u root
Folgende Zeilen im MySQL-Client eingeben:
mysql> UPDATE mysql.user SET Password=PASSWORD('neuespasswort') WHERE User='root'; mysql> FLUSH PRIVILEGES;
Quelle: Resetting lost mysql root password (archive.org)
$ mysql -h$DB_HOST -u$DB_USER -p$DB_PASSWORD $DB_NAME -e 'status' mysql: [Warning] Using a password on the command line interface can be insecure. -------------- mysql Ver 8.0.29-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu)) Connection id: 24913 Current database: testdb_staging Current user: testuser@192.0.2.192 SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 8.0.30 MySQL Community Server - GPL Protocol version: 10 Connection: dbserver.example.org via TCP/IP Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 TCP port: 3306 Uptime: 49 days 1 hours 7 min 3 sec Threads: 4 Questions: 269784 Slow queries: 1 Opens: 327 Flush tables: 3 Open tables: 116 Queries per second avg: 0.414
Zuerst mal rausfinden, was langsam ist:
Das Log für die Langsamen Querys kann man u.a. in der my.cnf einschalten
# Log slow queries log_slow_queries=/var/log/mysql/slowquery.log long_query_time = 2 log_long_format
Will man eine "Top-Ten der langsamsten Queries":
mysqldumpslow slowquery.log -t 10 -s t
Um die Auslastung schnell in bunten Kurven zu sehen, empfehle ich Jet Profiler. Die freie Version zeigt nicht alles an, aber für einen Überblick ist das Tool dennoch hilfreich.2)
Weil dieser Spickzettel schon ein wenig älter ist, gibt es ein paar der nützlichen Links leider nur noch im Web-Archiv bei archive.org
gilt für alle Tipps, Tricks & Spickzettel:
dies sind einfache, teils banale Notizen für meinen persönlichen Gebrauch,
die hier eher zufällig auch öffentlich lesbar sind
(vielleicht hilft es ja jemandem weiter). Verwendung auf eigene Gefahr
Fehler-Hinweise, Dankesschreiben , etc. bitte an: web.21@unixwitch.de
weitere Tools / Spickzettel