SQL Formatierungen, Linux erweitert um SNMP
This commit is contained in:
+100
-2
@@ -50,7 +50,7 @@ mkdir -p ~/src
|
||||
### Für mehrere Benutzer
|
||||
|
||||
| Verzeichnis | Zweck |
|
||||
|-------------|-------|
|
||||
| ----------------- | ----------------------------------------------------------------- |
|
||||
| `/srv/` | Gemeinsam genutzte Projekte oder Dienste |
|
||||
| `/usr/local/src/` | Systemweiter Quellcode |
|
||||
| `/opt/` | Installierte Drittanbieter-Software (nicht für eigenen Quellcode) |
|
||||
@@ -137,7 +137,7 @@ find ~/Downloads -name "*.zip" -delete
|
||||
|
||||
---
|
||||
|
||||
# `xargs` erklärt
|
||||
# xargs erklärt
|
||||
|
||||
## Was macht `xargs`?
|
||||
|
||||
@@ -307,11 +307,13 @@ find . -name "*.log" -print0 | xargs -0 rm
|
||||
### `find`
|
||||
|
||||
- Dateien suchen:
|
||||
|
||||
```bash
|
||||
find . -name "*.txt"
|
||||
```
|
||||
|
||||
- Direkt löschen:
|
||||
|
||||
```bash
|
||||
find . -name "*.txt" -delete
|
||||
```
|
||||
@@ -335,3 +337,99 @@ find . -exec <befehl> {} +
|
||||
```
|
||||
|
||||
Diese Variante ist oft einfacher und ebenso effizient.
|
||||
|
||||
# SNMP: MIB-Auflösung und OID-Übersetzung mit net-snmp
|
||||
|
||||
## OIDs werden trotz eingehängter MIB nicht textuell aufgelöst
|
||||
|
||||
### Mögliche Ursachen
|
||||
|
||||
**MIB wird nicht geladen**
|
||||
|
||||
- MIB liegt nicht in einem durchsuchten Verzeichnis. Prüfen mit `net-snmp-config --default-mibdirs`; übliche Pfade sind `~/.snmp/mibs`, `/usr/share/snmp/mibs`.
|
||||
- MIB nicht per `-m` oder Konfiguration aktiviert. Test: `snmpwalk -m ALL ...` oder in `~/.snmp/snmp.conf` bzw. `/etc/snmp/snmp.conf`: `mibs +MEIN-MIB`.
|
||||
- net-snmp lädt standardmäßig nur ein Minimalset. `mibs :` deaktiviert alles.
|
||||
|
||||
**Dateiname passt nicht zum MIB-Namen**
|
||||
|
||||
- net-snmp löst Module über den Dateinamen auf; der interne Modulname (vor `DEFINITIONS ::= BEGIN`) muss stimmen.
|
||||
|
||||
**Fehlende IMPORTS / Abhängigkeiten**
|
||||
|
||||
- Importierte MIBs (z. B. `SNMPv2-SMI`, `SNMPv2-TC`, herstellereigene Basis-MIBs) fehlen → Parsen schlägt still fehl. Sichtbar machen mit:
|
||||
|
||||
```bash
|
||||
snmptranslate -M+/pfad -m ALL -Dparse-mibs OID
|
||||
```
|
||||
|
||||
**Parse-/Syntaxfehler in der MIB**
|
||||
|
||||
- Diagnose:
|
||||
|
||||
```bash
|
||||
snmptranslate -Le -m ALL -M /pfad -On MEIN-MIB::objekt
|
||||
```
|
||||
|
||||
Fehler werden auf stderr ausgegeben.
|
||||
|
||||
**Numerische OID gehört zu keinem geladenen Zweig**
|
||||
|
||||
- Die abgefragte Enterprise-OID liegt außerhalb dessen, was die MIB definiert (falsche/unvollständige MIB).
|
||||
|
||||
### Schneller Prüfweg
|
||||
|
||||
1. `snmptranslate -m +MEIN-MIB -IR meinObjekt` → gibt es einen Treffer?
|
||||
2. `snmptranslate -Le -M /pfad/zu/mibs -m ALL .1.3.6.1.4.1.<enterprise>` → Fehler beim Laden?
|
||||
3. Fehlende Import-MIBs nachlegen.
|
||||
|
||||
Meist ist es eine fehlende Import-Abhängigkeit oder ein falscher Suchpfad/Modulname.
|
||||
|
||||
---
|
||||
|
||||
## Umgekehrt: von `MIB::objekt` auf die OID schließen
|
||||
|
||||
Textuellen Namen statt numerischer OID übergeben (MIB muss geladen sein):
|
||||
|
||||
```bash
|
||||
snmpget -v2c -c public host MEIN-MIB::meinObjekt.0
|
||||
snmpwalk -v2c -c public host MEIN-MIB::meinObjekt
|
||||
```
|
||||
|
||||
### Vorher ohne Gerät prüfen (Name → OID)
|
||||
|
||||
```bash
|
||||
snmptranslate -On MEIN-MIB::meinObjekt
|
||||
```
|
||||
|
||||
`-On` erzwingt die numerische Ausgabe, also die zugehörige OID.
|
||||
|
||||
Umgekehrt (OID → Name):
|
||||
|
||||
```
|
||||
snmptranslate .1.3.6.1.4.1.xxx
|
||||
```
|
||||
|
||||
### Nützliche Varianten
|
||||
|
||||
- Objektname allein suchen (ohne `MIB::`-Präfix):
|
||||
|
||||
```
|
||||
snmptranslate -IR -On meinObjekt
|
||||
```
|
||||
|
||||
- Vollständigen symbolischen Pfad anzeigen:
|
||||
|
||||
```
|
||||
snmptranslate -Of MEIN-MIB::meinObjekt
|
||||
```
|
||||
|
||||
- Objektdetails (Typ, Zugriff, Beschreibung):
|
||||
|
||||
```
|
||||
snmptranslate -Td MEIN-MIB::meinObjekt
|
||||
```
|
||||
|
||||
### Hinweise
|
||||
|
||||
- Scheitert `snmpget MEIN-MIB::meinObjekt.0` mit „Unknown Object Identifier", ist die MIB nicht geladen → mit `-m +MEIN-MIB` bzw. `-M /pfad` ergänzen.
|
||||
- Bei skalaren Objekten die `.0`-Instanz nicht vergessen.
|
||||
@@ -35,8 +35,6 @@ Um alle Datensätze mit `amount` kleiner oder gleich 20 abzurufen, schreibt man:
|
||||
SELECT * FROM sales WHERE amount <= 20
|
||||
```
|
||||
|
||||
|
||||
|
||||
### Unique values
|
||||
|
||||
Angenommen man hat die folgende Tabelle:
|
||||
@@ -44,7 +42,7 @@ Angenommen man hat die folgende Tabelle:
|
||||
**Verkäufe**
|
||||
|
||||
| | Land | Stadt | Betrag |
|
||||
| ---- | ----------- | -------- | ------ |
|
||||
| --- | ----------- | -------- | ------ |
|
||||
| 1 | Polen | Warschau | 13 |
|
||||
| 2 | Deutschland | Berlin | 24 |
|
||||
| 3 | Polen | Katowice | 56 |
|
||||
@@ -123,7 +121,7 @@ Das `OR`-Schlüsselwort bedeutet, dass eine der Bedingungen wahr sein soll.
|
||||
Zum Beispiel betrachtet man die folgende **people**-Tabelle:
|
||||
|
||||
| name | age | gender |
|
||||
| ------ | ---- | ------ |
|
||||
| ------ | --- | ------ |
|
||||
| Joas | 13 | male |
|
||||
| Holwa | 17 | male |
|
||||
| Nohlas | 24 | female |
|
||||
@@ -146,6 +144,7 @@ Das wird das Ergebnis sein:
|
||||
| Loopa | 18 | weiblich |
|
||||
|
||||
###################
|
||||
|
||||
## Kombination von Conditions
|
||||
|
||||
Das Erstellen einer Abfrage mit nur einer Bedingung ist nicht ausreichend. Manchmal möchte man etwas Komplizierteres überprüfen. Dafür haben SQL (und viele andere Programmiersprachen) die AND-, OR- und NOT-Schlüsselwörter, um unsere Fähigkeit zu verbessern, das gewünschte Ergebnis abzurufen.
|
||||
@@ -157,7 +156,6 @@ SELECT col1, col2 FROM table1 WHERE condition1 AND condition2 OR condition3 ...
|
||||
```
|
||||
|
||||
Man kann so viele Bedingungen wie man will zusammen stapeln.
|
||||
###################
|
||||
|
||||
## Sortierung (ORDER BY)
|
||||
|
||||
@@ -166,13 +164,15 @@ Man kann so viele Bedingungen wie man will zusammen stapeln.
|
||||
`ASC` --> Aufsteigend --> kleinster Wert zuerst
|
||||
|
||||
`DESC` --> Absteigend --< Größter Wert zuerst
|
||||
|
||||
### Beispiele und Erklärung
|
||||
|
||||
Beim Abfragen einer Datenbank kann die Organisation der Ergebnisse in einer sinnvollen Reihenfolge die Datenanalyse erheblich effizienter machen. Um das Ergebnis zu sortieren, verwendet man das ORDER BY-Schlüsselwort und danach sollte man angeben, nach welchem Feld man sortiert. Standardmäßig sortiert es in aufsteigender Reihenfolge.
|
||||
|
||||
Zum Beispiel betrachten Sie die folgende **competition**-Tabelle:
|
||||
|
||||
| runner_id | age | avg_speed |
|
||||
| --------- | ---- | --------- |
|
||||
| --------- | --- | --------- |
|
||||
| 1 | 47 | 3.65 |
|
||||
| 2 | 62 | 3.07 |
|
||||
| 3 | 57 | 6.82 |
|
||||
@@ -182,14 +182,12 @@ Zum Beispiel betrachten Sie die folgende **competition**-Tabelle:
|
||||
| 7 | 23 | 6.58 |
|
||||
| 8 | 40 | 3.43 |
|
||||
|
||||
|
||||
|
||||
`SELECT * FROM competition WHERE age > 50 ORDER BY avg_speed`
|
||||
|
||||
Dies ist das Ergebnis
|
||||
|
||||
| runner_id | age | avg_speed |
|
||||
| --------- | ---- | --------- |
|
||||
| --------- | --- | --------- |
|
||||
| 2 | 62 | 3.07 |
|
||||
| 4 | 56 | 4.34 |
|
||||
| 3 | 57 | 6.82 |
|
||||
@@ -199,14 +197,25 @@ Um anzugeben, wie diese Daten sortiert werden sollen, können wir die `DESC`- od
|
||||
`ORDER BY avg_speed ASC`
|
||||
|
||||
## Eigenschaften einer Tabelle
|
||||
`DESCRIBE <tabelle>`
|
||||
|
||||
```sql
|
||||
DESCRIBE <tabelle>
|
||||
```
|
||||
|
||||
oder
|
||||
`SHOW COLUMNS FROM <tabelle>`
|
||||
|
||||
```sql
|
||||
SHOW COLUMNS FROM <tabelle>
|
||||
```
|
||||
|
||||
## Neuer Datensatz
|
||||
|
||||
```sql
|
||||
INSERT INTO <tabelle> (<spalte><spalte>,...) VALUES (<wert>,<wert>,...)
|
||||
```
|
||||
|
||||
## Update Datensatz
|
||||
|
||||
```sql
|
||||
UPDATE <tabelle> set <spalte> = <wert>, <spalte> = <wert>, ... WHERE <Bedingung>
|
||||
```
|
||||
@@ -239,11 +248,13 @@ GRANT SELECT, CREATE ON database.table TO 'username'@'host';
|
||||
## Einlesen der Berechtigungstabellen
|
||||
|
||||
Aktivieren mit
|
||||
|
||||
```sql
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
## Entziehen von Rechten
|
||||
|
||||
```sql
|
||||
REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';
|
||||
```
|
||||
@@ -292,9 +303,11 @@ Zwei Hauptwildcards werden verwendet:
|
||||
Zum Beispiel:
|
||||
|
||||
- `%a` - bedeutet jede Zeichenkette, die mit `a` endet
|
||||
|
||||
- `a%` - bedeutet jede Zeichenkette, die mit `a` beginnt
|
||||
|
||||
- `%a%` - bedeutet jeder String, der `a` enthält
|
||||
|
||||
- `_a%` - bedeutet, dass der Buchstabe `a` der zweite Buchstabe im String ist
|
||||
|
||||
- `%a__` - bedeutet, dass der String `a` an der drittletzten Stelle enthält
|
||||
@@ -315,10 +328,9 @@ Suche aller Personen deren Name mit Gross-K beginnt und mit klein-a endet, sorti
|
||||
select * from people where name like 'K%a' order by name desc;
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Tabelle anlegen
|
||||
|
||||
```sql
|
||||
CREATE TABLE Persons (
|
||||
PersonID int PRIMARY KEY AUTO_INCREMENT,
|
||||
LastName varchar(255) NOT NULL,
|
||||
@@ -326,13 +338,10 @@ CREATE TABLE Persons (
|
||||
Address varchar(255),
|
||||
City varchar(255)
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
| **Datentyp** | **MySQL-Format** | **PostgreSQL-Format** | **INSERT INTO Beispiel** |
|
||||
| :---------------------------------------------------: | :------------------------------------------: | :------------------------------------------: | :----------------------------------------------------------: |
|
||||
|:----------------------------------------------------- |:-------------------------------------------- |:-------------------------------------------- |:------------------------------------------------------------------------ |
|
||||
| **Zeichenkette (TEXT, VARCHAR, CHAR usw.)** | Eingeschlossen in einfache Anführungszeichen | Eingeschlossen in einfache Anführungszeichen | `INSERT INTO tableName (columnName) VALUES ('John Doe');` |
|
||||
| **Zahl (Ganzzahl, Dezimalzahl, Gleitkommazahl usw.)** | Keine Anführungszeichen | Keine Anführungszeichen | `INSERT INTO tableName (columnName) VALUES (25);` |
|
||||
| **Boolescher Wert** | WAHR oder FALSCH (oder 1 und 0) | WAHR oder FALSCH | `INSERT INTO tableName (columnName) VALUES (TRUE);` |
|
||||
@@ -351,7 +360,9 @@ SELECT columns FROM table_name2 WHERE condition;
|
||||
|
||||
## Import einer Datenbank
|
||||
|
||||
```bash
|
||||
mysql <DB> < <SQL-File>
|
||||
```
|
||||
|
||||
## Rechte für die Datenbank
|
||||
|
||||
@@ -371,6 +382,7 @@ FLUSH PRIVILEGES;
|
||||
|
||||
Hiermit kann man sich eine Anzahl von Zeilen ausgeben lassen, welche zwischen Offset und Limit liegen, oder aber über den zweiten Weg mit Fetch
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
first_name,
|
||||
last_name,
|
||||
@@ -383,62 +395,263 @@ OFFSET
|
||||
5 ROWS
|
||||
FETCH NEXT
|
||||
5 ROWS ONLY;
|
||||
```
|
||||
|
||||
Hier werden die ersten fünf Zeilen übersprungen und die nächsten fünf ausgegeben.
|
||||
|
||||
### Abfrage einer bestimmten Anzahl von Zeilen
|
||||
|
||||
Beispiel: von Zeile 10 (Offset) 10 Zeilen weiter (LIMIT)
|
||||
|
||||
```sql
|
||||
select * from .... limit 10 offset 10
|
||||
```
|
||||
|
||||
oder
|
||||
|
||||
```sql
|
||||
offset 228 --Skipping the first 228 rows in the result set
|
||||
--Fetching the next 10 rows only after the offset
|
||||
FETCH NEXT 10 ROWS ONLY;
|
||||
|
||||
|
||||
## Einsortieren
|
||||
#######################################################
|
||||
```
|
||||
|
||||
### The AS keyword
|
||||
|
||||
|
||||
|
||||
Klare und beschreibende Spaltennamen sind essenziell, um Daten auf sinnvolle Weise darzustellen. Wenn Sie eine Tabelle mit schlechten Spaltennamen zeigen, wird es für Ihr Publikum schwer sein zu verstehen, wovon Sie sprechen.
|
||||
|
||||
Um Spaltennamen zu ändern, können Sie das AS-Schlüsselwort verwenden.
|
||||
|
||||
```sql
|
||||
SELECT col1 AS firstColumn, col2 AS secondColumn, ...
|
||||
FROM table1
|
||||
|
||||
|
||||
######################################################
|
||||
```
|
||||
|
||||
## The LIKE keyword
|
||||
|
||||
|
||||
|
||||
Das LIKE-Schlüsselwort wird verwendet, um Ähnlichkeiten von Zeichenketten zu prüfen. Beispielsweise, wenn wir alle Datensätze abrufen möchten, deren Name mit dem Buchstaben a beginnt, dann verwenden wir das LIKE-Schlüsselwort.
|
||||
|
||||
Zwei Hauptwildcards werden verwendet:
|
||||
|
||||
% - steht für eine beliebige Anzahl von Zeichen
|
||||
_ - steht für genau ein Zeichen
|
||||
`% `- steht für eine beliebige Anzahl von Zeichen
|
||||
`_ `- steht für genau ein Zeichen
|
||||
Zum Beispiel:
|
||||
|
||||
%a - bedeutet jede Zeichenkette, die mit a endet
|
||||
a% - bedeutet jede Zeichenkette, die mit a beginnt
|
||||
%a% - bedeutet jeder String, der a enthält
|
||||
_a% - bedeutet, dass der Buchstabe a der zweite Buchstabe im String ist
|
||||
%a__ - bedeutet, dass der String a an der drittletzten Stelle enthält
|
||||
`%a` - bedeutet jede Zeichenkette, die mit a endet
|
||||
`a%` - bedeutet jede Zeichenkette, die mit a beginnt
|
||||
`%a%` - bedeutet jeder String, der a enthält
|
||||
`_a%` - bedeutet, dass der Buchstabe a der zweite Buchstabe im String ist
|
||||
`%a__` - bedeutet, dass der String a an der drittletzten Stelle enthält
|
||||
Um es zu verwenden, schreiben wir:
|
||||
|
||||
```sql
|
||||
SELECT col1, col2, ...
|
||||
FROM table1
|
||||
WHERE col1 LIKE '%a__'
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Mathematical Columns
|
||||
|
||||
### Verfügbare Tabellen und Spalten:
|
||||
|
||||
products: id, price, quantity
|
||||
Erstellen Sie eine Abfrage, die Folgendes berechnet:
|
||||
|
||||
1. Eine Spalte namens total_value, die den Preis mit der Menge multipliziert und eine feste Versandpauschale von 15 hinzufügt
|
||||
2. Eine Spalte namens discounted_value, die:
|
||||
- Zuerst den Preis mit der Menge multipliziert
|
||||
- Dann einen 20%-Rabatt anwendet (multipliziert mit 0.8)
|
||||
- Schließlich eine feste Versandpauschale von 10 hinzufügt
|
||||
|
||||
Versuchen Sie, Klammern angemessen zu verwenden, um sicherzustellen, dass die Berechnungen in der richtigen Reihenfolge durchgeführt werden!
|
||||
|
||||
```sql
|
||||
select (price * quantity + 15) as total_value, (price * quantity * 0.8 + 10) as discounted_value from products
|
||||
```
|
||||
|
||||
## The Modulo Operation
|
||||
|
||||
Der Modulo-Operator `%` gibt den Rest an, der nach der Division einer Zahl durch eine andere übrig bleibt.
|
||||
|
||||
dividend % divisor
|
||||
dividend: Die Zahl, die geteilt wird.
|
||||
divisor: Die Zahl, durch die der Dividend geteilt wird.
|
||||
Zum Beispiel
|
||||
|
||||
```sql
|
||||
10 % 3
|
||||
```
|
||||
|
||||
Hier wird 10 durch 3 geteilt. Die 3 passt dreimal in die 10, mit einem Rest von 1. Daher wird result 1 sein.
|
||||
|
||||
Normalerweise wird Modulo verwendet, um zu prüfen, ob eine Zahl gerade oder ungerade ist:
|
||||
|
||||
Wenn eine Zahl gerade ist, lässt die Division durch 2 einen Rest von 0.
|
||||
Wenn eine Zahl ungerade ist, lässt die Division durch 2 einen Rest von 1.
|
||||
Finden Sie zum Beispiel Zeilen mit geraden Nummern:
|
||||
|
||||
SELECT * FROM table WHERE id % 2 = 0;
|
||||
Oder zum Durchlaufen von Werten:
|
||||
|
||||
number % 12 (gibt 0-11 zurück)
|
||||
number % 8 (gibt 0-7 zurück)
|
||||
Gruppieren Sie zum Beispiel Elemente in 5er-Gruppen:
|
||||
|
||||
SELECT item_number % 5 as group_number FROM inventory;
|
||||
|
||||
Welche Abfrage wählt nur ungerade Zeilen aus?
|
||||
SELECT * FROM users WHERE id % 2 = 1;
|
||||
|
||||
Vervollständigen Sie die Abfrage, um Produkte in 4er-Gruppen zu gruppieren:
|
||||
|
||||
SELECT product_id % 4 as group_num FROM products; -- hier wurde nur % hinzugefügt
|
||||
|
||||
Welchen Wertebereich kann number % 7 zurückgeben?
|
||||
|
||||
0 through 6
|
||||
|
||||
Der Rest bei der Division durch 7 ist immer kleiner als 7 und reicht von 0 bis 6.
|
||||
|
||||
#####################################################
|
||||
|
||||
##############################################################
|
||||
|
||||
# Kurze SQL-Queries in MariaDB erfassen
|
||||
|
||||
`SHOW PROCESSLIST` eignet sich **nicht**, um sehr kurze SQL-Statements zu erfassen. Diese sind häufig bereits beendet, bevor sie in der Prozessliste erscheinen.
|
||||
|
||||
## Aktuelle Konfiguration prüfen
|
||||
|
||||
### General Log
|
||||
|
||||
Prüfen, ob das General Log aktiviert ist:
|
||||
|
||||
```sql
|
||||
SHOW VARIABLES LIKE 'general_log';
|
||||
SHOW VARIABLES LIKE 'log_output';
|
||||
```
|
||||
|
||||
Oder beide Werte gemeinsam anzeigen:
|
||||
|
||||
```sql
|
||||
SHOW VARIABLES
|
||||
WHERE Variable_name IN ('general_log', 'log_output');
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
| Variable_name | Value |
|
||||
| ------------- | ----- |
|
||||
| general_log | ON |
|
||||
| log_output | TABLE |
|
||||
|
||||
---
|
||||
|
||||
### Performance Schema
|
||||
|
||||
Prüfen, ob das Performance Schema aktiviert ist:
|
||||
|
||||
```sql
|
||||
SHOW VARIABLES LIKE 'performance_schema';
|
||||
```
|
||||
|
||||
Zusätzlich prüfen, ob die Statement-Historie verfügbar ist:
|
||||
|
||||
```sql
|
||||
SHOW TABLES FROM performance_schema LIKE 'events_statements%';
|
||||
```
|
||||
|
||||
oder:
|
||||
|
||||
```sql
|
||||
SELECT COUNT(*)
|
||||
FROM performance_schema.events_statements_history;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## General Log aktivieren
|
||||
|
||||
> **Hinweis:** Das General Log erzeugt zusätzlichen Overhead und sollte nur für eine kurzfristige Analyse aktiviert werden.
|
||||
|
||||
```sql
|
||||
SET GLOBAL general_log = ON;
|
||||
SET GLOBAL log_output = 'TABLE';
|
||||
```
|
||||
|
||||
Abfragen anzeigen:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
event_time,
|
||||
user_host,
|
||||
argument
|
||||
FROM mysql.general_log
|
||||
WHERE command_type = 'Query'
|
||||
ORDER BY event_time DESC
|
||||
LIMIT 100;
|
||||
```
|
||||
|
||||
General Log wieder deaktivieren:
|
||||
|
||||
```sql
|
||||
SET GLOBAL general_log = OFF;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Schema verwenden (empfohlen)
|
||||
|
||||
Falls das Performance Schema aktiviert ist, können ausgeführte Statements ohne das General Log analysiert werden:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
SQL_TEXT,
|
||||
TIMER_WAIT / 1000000000 AS duration_ms
|
||||
FROM performance_schema.events_statements_history
|
||||
ORDER BY EVENT_ID DESC;
|
||||
```
|
||||
|
||||
Je nach Konfiguration kann auch die Tabelle `events_statements_history_long` verwendet werden.
|
||||
|
||||
---
|
||||
|
||||
## Slow Query Log
|
||||
|
||||
Das Slow Query Log ist für sehr kurze Queries normalerweise ungeeignet. Es kann zwar so konfiguriert werden, dass alle Abfragen protokolliert werden:
|
||||
|
||||
```sql
|
||||
SET GLOBAL long_query_time = 0;
|
||||
```
|
||||
|
||||
Für eine kurzfristige Analyse ist jedoch das **General Log** meist die bessere Wahl.
|
||||
|
||||
---
|
||||
|
||||
## Empfehlung
|
||||
|
||||
| Ziel | Empfehlung |
|
||||
| ----------------------------------------------- | ----------------------- |
|
||||
| Alle SQL-Statements für kurze Zeit mitschneiden | General Log |
|
||||
| Regelmäßige Analyse mit geringem Overhead | Performance Schema |
|
||||
| Aktive, aktuell laufende Queries anzeigen | `SHOW FULL PROCESSLIST` |
|
||||
|
||||
> **Fazit:** Für sehr kurze Queries ist `SHOW PROCESSLIST` ungeeignet. Verwende stattdessen das **General Log** oder – falls verfügbar – das **Performance Schema**.
|
||||
|
||||
## Suche von Werten die in einer Spalte nur einmal vorkommem
|
||||
|
||||
```sql
|
||||
SELECT *
|
||||
FROM tabelle
|
||||
WHERE spalte IN (
|
||||
SELECT spalte
|
||||
FROM tabelle
|
||||
GROUP BY spalte
|
||||
HAVING COUNT(*) = 1
|
||||
);
|
||||
```
|
||||
|
||||
######################################################
|
||||
|
||||
To change column names use the AS keyword:
|
||||
@@ -587,76 +800,8 @@ SELECT column1, column2, column3 FROM table_name
|
||||
|
||||
#####################################################
|
||||
|
||||
Notizen bei Fehlersuche
|
||||
|
||||
## Mathematical Columns
|
||||
|
||||
|
||||
|
||||
### Verfügbare Tabellen und Spalten:
|
||||
|
||||
products: id, price, quantity
|
||||
Erstellen Sie eine Abfrage, die Folgendes berechnet:
|
||||
|
||||
1. Eine Spalte namens total_value, die den Preis mit der Menge multipliziert und eine feste Versandpauschale von 15 hinzufügt
|
||||
2. Eine Spalte namens discounted_value, die:
|
||||
- Zuerst den Preis mit der Menge multipliziert
|
||||
- Dann einen 20%-Rabatt anwendet (multipliziert mit 0.8)
|
||||
- Schließlich eine feste Versandpauschale von 10 hinzufügt
|
||||
|
||||
Versuchen Sie, Klammern angemessen zu verwenden, um sicherzustellen, dass die Berechnungen in der richtigen Reihenfolge durchgeführt werden!
|
||||
|
||||
select (price * quantity + 15) as total_value, (price * quantity * 0.8 + 10) as discounted_value from products
|
||||
|
||||
|
||||
## The Modulo Operation
|
||||
|
||||
Der Modulo-Operator % gibt den Rest an, der nach der Division einer Zahl durch eine andere übrig bleibt.
|
||||
|
||||
dividend % divisor
|
||||
dividend: Die Zahl, die geteilt wird.
|
||||
divisor: Die Zahl, durch die der Dividend geteilt wird.
|
||||
Zum Beispiel
|
||||
|
||||
10 % 3
|
||||
Hier wird 10 durch 3 geteilt. Die 3 passt dreimal in die 10, mit einem Rest von 1. Daher wird result 1 sein.
|
||||
|
||||
Normalerweise wird Modulo verwendet, um zu prüfen, ob eine Zahl gerade oder ungerade ist:
|
||||
|
||||
Wenn eine Zahl gerade ist, lässt die Division durch 2 einen Rest von 0.
|
||||
Wenn eine Zahl ungerade ist, lässt die Division durch 2 einen Rest von 1.
|
||||
Finden Sie zum Beispiel Zeilen mit geraden Nummern:
|
||||
|
||||
SELECT * FROM table WHERE id % 2 = 0;
|
||||
Oder zum Durchlaufen von Werten:
|
||||
|
||||
number % 12 (gibt 0-11 zurück)
|
||||
number % 8 (gibt 0-7 zurück)
|
||||
Gruppieren Sie zum Beispiel Elemente in 5er-Gruppen:
|
||||
|
||||
SELECT item_number % 5 as group_number FROM inventory;
|
||||
|
||||
|
||||
Welche Abfrage wählt nur ungerade Zeilen aus?
|
||||
SELECT * FROM users WHERE id % 2 = 1;
|
||||
|
||||
Vervollständigen Sie die Abfrage, um Produkte in 4er-Gruppen zu gruppieren:
|
||||
|
||||
SELECT product_id % 4 as group_num FROM products; -- hier wurde nur % hinzugefügt
|
||||
|
||||
|
||||
Welchen Wertebereich kann number % 7 zurückgeben?
|
||||
|
||||
0 through 6
|
||||
|
||||
Der Rest bei der Division durch 7 ist immer kleiner als 7 und reicht von 0 bis 6.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#####################################################
|
||||
|
||||
#### Notizen bei Fehlersuche
|
||||
Hier sollen Werte aus eriner Tabelle in eine andere transferiert werden, jedoch es knallt:
|
||||
|
||||
INSERT INTO isys_catg_sid_stid_list(custom_fields__data__id,isys_catg_sid_stid_list__isys_obj__id,isys_catg_sid_stid_list__sid,isys_catg_sid_stid_list__mm,isys_catg_sid_stid_list__rh,isys_catg_sid_stid_list__rha,isys_catg_sid_stid_list__status,isys_catg_sid_stid_list__description)
|
||||
@@ -681,16 +826,14 @@ GROUP BY isys_catg_custom_fields_list__data__id)
|
||||
ref1 offset 247 rows fetch
|
||||
next 1 rows only;
|
||||
|
||||
|
||||
|
||||
|
||||
## Hier knallt es
|
||||
|
||||
INSERT INTO isys_catg_sid_stid_list(custom_fields__data__id,isys_catg_sid_stid_list__isys_obj__id,isys_catg_sid_stid_list__sid,isys_catg_sid_stid_list__mm,isys_catg_sid_stid_list__rh,isys_catg_sid_stid_list__rha,isys_catg_sid_stid_list__status,isys_catg_sid_stid_list__description)
|
||||
SELECT
|
||||
isys_catg_custom_fields_list__data__id,
|
||||
isys_catg_custom_fields_list__data__id,
|
||||
isys_catg_custom_fields_list__isys_obj__id,CASE WHEN `sid`=-1 THEN NULL ELSE `sid` END,CASE WHEN `mm`=-1 THEN NULL ELSE `mm` END,CASE WHEN `rh`=-1 THEN NULL ELSE `rh` END,CASE WHEN `rha`=-1 THEN NULL ELSE `rha` END,`status`,`description` FROM
|
||||
(SELECT
|
||||
isys_catg_custom_fields_list__data__id,
|
||||
isys_catg_custom_fields_list__data__id,
|
||||
isys_catg_custom_fields_list__isys_obj__id,
|
||||
MAX(CASE WHEN isys_catg_custom_fields_list__field_key = 'c_1465994230999' THEN isys_catg_custom_fields_list__field_content end) AS `sid`,
|
||||
MAX(CASE WHEN isys_catg_custom_fields_list__field_key = 'c_1465994236923' THEN isys_catg_custom_fields_list__field_content end) AS `mm`,
|
||||
@@ -704,141 +847,4 @@ INSERT INTO isys_catg_sid_stid_list(custom_fields__data__id,isys_catg_sid_stid_l
|
||||
)ref1 offset 247 rows fetch
|
||||
next 100 rows only;
|
||||
|
||||
|
||||
########################################################################################################################
|
||||
|
||||
# Kurze SQL-Queries in MariaDB erfassen
|
||||
|
||||
`SHOW PROCESSLIST` eignet sich **nicht**, um sehr kurze SQL-Statements zu erfassen. Diese sind häufig bereits beendet, bevor sie in der Prozessliste erscheinen.
|
||||
|
||||
## Aktuelle Konfiguration prüfen
|
||||
|
||||
### General Log
|
||||
|
||||
Prüfen, ob das General Log aktiviert ist:
|
||||
|
||||
```sql
|
||||
SHOW VARIABLES LIKE 'general_log';
|
||||
SHOW VARIABLES LIKE 'log_output';
|
||||
```
|
||||
|
||||
Oder beide Werte gemeinsam anzeigen:
|
||||
|
||||
```sql
|
||||
SHOW VARIABLES
|
||||
WHERE Variable_name IN ('general_log', 'log_output');
|
||||
```
|
||||
|
||||
Beispiel:
|
||||
|
||||
| Variable_name | Value |
|
||||
|----------------|-------|
|
||||
| general_log | ON |
|
||||
| log_output | TABLE |
|
||||
|
||||
---
|
||||
|
||||
### Performance Schema
|
||||
|
||||
Prüfen, ob das Performance Schema aktiviert ist:
|
||||
|
||||
```sql
|
||||
SHOW VARIABLES LIKE 'performance_schema';
|
||||
```
|
||||
|
||||
Zusätzlich prüfen, ob die Statement-Historie verfügbar ist:
|
||||
|
||||
```sql
|
||||
SHOW TABLES FROM performance_schema LIKE 'events_statements%';
|
||||
```
|
||||
|
||||
oder:
|
||||
|
||||
```sql
|
||||
SELECT COUNT(*)
|
||||
FROM performance_schema.events_statements_history;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## General Log aktivieren
|
||||
|
||||
> **Hinweis:** Das General Log erzeugt zusätzlichen Overhead und sollte nur für eine kurzfristige Analyse aktiviert werden.
|
||||
|
||||
```sql
|
||||
SET GLOBAL general_log = ON;
|
||||
SET GLOBAL log_output = 'TABLE';
|
||||
```
|
||||
|
||||
Abfragen anzeigen:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
event_time,
|
||||
user_host,
|
||||
argument
|
||||
FROM mysql.general_log
|
||||
WHERE command_type = 'Query'
|
||||
ORDER BY event_time DESC
|
||||
LIMIT 100;
|
||||
```
|
||||
|
||||
General Log wieder deaktivieren:
|
||||
|
||||
```sql
|
||||
SET GLOBAL general_log = OFF;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Schema verwenden (empfohlen)
|
||||
|
||||
Falls das Performance Schema aktiviert ist, können ausgeführte Statements ohne das General Log analysiert werden:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
SQL_TEXT,
|
||||
TIMER_WAIT / 1000000000 AS duration_ms
|
||||
FROM performance_schema.events_statements_history
|
||||
ORDER BY EVENT_ID DESC;
|
||||
```
|
||||
|
||||
Je nach Konfiguration kann auch die Tabelle `events_statements_history_long` verwendet werden.
|
||||
|
||||
---
|
||||
|
||||
## Slow Query Log
|
||||
|
||||
Das Slow Query Log ist für sehr kurze Queries normalerweise ungeeignet. Es kann zwar so konfiguriert werden, dass alle Abfragen protokolliert werden:
|
||||
|
||||
```sql
|
||||
SET GLOBAL long_query_time = 0;
|
||||
```
|
||||
|
||||
Für eine kurzfristige Analyse ist jedoch das **General Log** meist die bessere Wahl.
|
||||
|
||||
---
|
||||
|
||||
## Empfehlung
|
||||
|
||||
| Ziel | Empfehlung |
|
||||
|------|------------|
|
||||
| Alle SQL-Statements für kurze Zeit mitschneiden | General Log |
|
||||
| Regelmäßige Analyse mit geringem Overhead | Performance Schema |
|
||||
| Aktive, aktuell laufende Queries anzeigen | `SHOW FULL PROCESSLIST` |
|
||||
|
||||
> **Fazit:** Für sehr kurze Queries ist `SHOW PROCESSLIST` ungeeignet. Verwende stattdessen das **General Log** oder – falls verfügbar – das **Performance Schema**.
|
||||
|
||||
|
||||
## Suche von Werten die in einer Spalte nur einmal vorkommem
|
||||
|
||||
SELECT *
|
||||
FROM tabelle
|
||||
WHERE spalte IN (
|
||||
SELECT spalte
|
||||
FROM tabelle
|
||||
GROUP BY spalte
|
||||
HAVING COUNT(*) = 1
|
||||
);
|
||||
|
||||
|
||||
##############################################################
|
||||
|
||||
Reference in New Issue
Block a user