User Tools

Site Tools


de:sysadmin:tools:mysql

MySQL & MariaDB Spickzettel

Basics: select, update

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";

Query-Sammlung

Regexp - IP-Adressen

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.]*';

Paypal-Transaktionscodes aus einer OTRS-Queue

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

Datenbank nach UTF8 umwandeln

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

Passwort

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.

Passwort Recovery (root darf das)

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)


DB Connection Status

$ 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

Performance

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

Performance 2

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 :-/


1)
mariadb.com: "In MariaDB, the default character set is latin1", abgerufen 2020-07-29
2)
Den Tipp bekam ich vom Sternen-Kolonist auf tauceti.net, bevor er es selber bloggte
de/sysadmin/tools/mysql.txt · Last modified: 2022-08-16 10:24 by hella

Page Tools

Mastodon Twitter