Download - Sql für Dummies
Datenbanken für DummiesKristian Köhntopp
Alter Sack
SysEleven GmbH
Relationenalgebra
Vorsicht, Mathematik!
Rechnen mit Tabellen3
3
Kex
√2
Keks
a
Cookie
1
c
π
b
2
e
{ 1, 2, 3 } vs. (1, 2, 3) Datentypen?
Tabelle: { (1, 2, 3), (π, e, √2), (“Keks”, “Cookie”, “Kex”) }
Rechnen mit Tabellen
• Was können wir mit der Tabelle tun, das wieder eine Tabelle ergibt?
• Algebra:Grundmenge A, Operationen, Ergebnisse wieder in A
• Weiter rechnen!
4
3
Kex
√2
Keks
a
Cookie
1
c
π
b
2
e
Rechnen mit Tabellen
• Selektion
• Projektion
• Kreuzprodukt
• Rename
• Aggregation
5
3
Kex
√2
Keks
a
Cookie
1
c
π
b
2
e
Selektion
• SELECT *FROM tWHERE a=1
• Wähle eine oder mehrere Zeilen
6
3
Kex
√2
Keks
a
Cookie
1
c
π
b
2
e
Selektion
Projektion
Projektion
• SELECT b, concat(“*”, b, “*”) FROM t
• Wähle eine oder mehrere Spalten.
• Generiere neue Spalten durch Anwendung von Funktionen.
7
3
Kex
√2
Keks
a
Cookie
1
c
π
b
2
e
Selektion
Projektion
Kreuzprodukt
• Kombiniere jede Zeile aus a mit jeder Zeile aus b (“full join”)
• Oft mit Joinbedingung: Behalte nur die Paarungen, die Sinn ergeben.
8
3
aid
1
2
a
bid
1
2
b
23
3 1
22
2
aid
1
1
1
bid
1
2
a join b
Kreuzprodukt
• SELECT *FROM kundenJOIN bestellungen ON kunden.kid = bestellungen.kid
• “Verknüpfe alle Kunden mit allen Bestellungen via Kundennummer.”
• “Liste mir alle Kunden mit Kundennamen etc auf, die jemals bestellt haben.”
9
Rename - Self-Join
• create table emp (-> empid integer unsigned not null,-> bossid integer unsigned null-> ) engine = innodb;
• insert into emp-> values ( 1, NULL), (2, 1), (3,1), (4, 2), (5, 2), (6, 2);
10
emp
1
23
4 5 6
Rename - Self-Join
• SELECT * FROM emp JOIN emp ON emp.bossid = emp.empid;
• ERROR 1066 (42000): Not unique table/alias: 'emp'
11
emp
1
23
4 5 6Doppelt!
Rename - Self-Join
• SELECT emp.empid AS mitarbeiter, " hat den Boss ", boss.empid AS boss FROM emp AS boss JOIN emp ON emp.bossid = boss.empid;
12
26
5 2
24
3
empid
1
1
2
bossid
NULL
1
emp
26
5 2
24
3
empid
1
1
2
bossid
NULL
1
emp (as boss)
Self-Join
Tabelle umbenennen
Spalte umbenennen
Rename - Self-Join
• SELECT emp.empid AS mitarbeiter, " hat den Boss ", boss.empid AS boss FROM emp AS boss JOIN emp ON emp.bossid = boss.empid;
13
Wo ist das Paar (1, NULL)?
Aggregation
• select empid, bossid from emp; • +--------+--------+|empid|bossid|+--------+--------+|1|NULL||2|1||3|1||4|2||5|2||6|2|+--------+-------+
14
26
5 2
24
3
empid
1
1
2
bossid
NULL
1
emp
bossidempid
262524
1312
emp (GROUP BY bossid)
Aggregation
• SELECT bossid,count(*),group_concat(empid) AS mitarbeiterFROM empGROUP BY bossid;
15
Relationen-Algebra
• Selektion
• Projektion
• Kreuzprodukt
• Rename
• Aggregation
16
3
Kex
√2
Keks
a
Cookie
1
c
π
b
2
e
Relationen-Algebra
• Algebra:
• Grundmenge A,
• Operationen,
• Ergebnisse wieder in A
• Weiter rechnen!
17
3
Kex
√2
Keks
a
Cookie
1
c
π
b
2
e
Weiter rechnen: Subqueries18
Weiter rechnen: Subqueries19
Weiter rechnen: Subqueries20
Es gibt 2 Tables in kris
mit 6 Rows
Und in Test dieselbe Situation
nochmal!
Weiter rechnen: Subqueries21
Subqueries
• SELECT query FROM query AS t WHERE x = ( query )
• Die Ergebnisse von Queries sind Tabellen, sie können in andere Queries eingesetzt werden.
• Das geht nur deshalb, weil SQL eine Algebra ist.
22
Tupel sind Zeilen, ein Datentyp
• select a,b,c from t where a = 'eins' and b = ‘one';
• select a,b,c from t where (a,b) = ('eins','one');
23
Tupel sind Zeilen, ein Datentyp
• select * from t where (a,b) in (('eins','one'), ('zwei', ‘two'));
• (a=‘eins’ AND b=‘one’) OR (a=‘zwei’ AND b=‘two’)
24
Tupel sind Zeilen, ein Datentyp
• select a,b,c from t where 'eins' in (a,b,c);
• (‘eins’=a) OR (‘eins’=b) OR (‘eins’=c)
• ‘eins’ in einer beliebigen Spalte
25
Tupel sind Zeilen, ein Datentyp
• select a,b,c from t where ('eins','one') in ((a,b),(b,c));
• (‘eins’=a AND ‘one’=b) OR (‘eins’=b AND ‘one’=c)
• (‘eins’, ‘one) in benachbarten Spalten
26
Abfragesprachen, die keine Algebra sind
• LDAP
• Abfragen auf Bäumen.
• Resultate sind keine Bäume, sondern Knotenmengen.
• XPath, XSLT
• Abfragen auf Bäumen.
• Resultat Nodeset (Herstellerspezifische Workarounds).
27
Transaktionen
“Undo”29
id d txn#
1 one 2
2 zwei 1
3 drei 1
id d txn#
1 eins 1
Undo LogTable t
UPDATE t SET d = ‘one’ WHERE id = 1
Transaktionen
• START TRANSACTION READ WRITE;
• UPDATE t SET d = ‘one’ WHERE id = 1;
• COMMIT;
• START TRANSACTION READ WRITE;
• UPDATE t SET d = ‘one’ WHERE id = 1;
• ROLLBACK;
30
Nix zu tun, Daten stehen schon in der Tabelle
Daten aus dem Undo Log zurück schaufeln
Transaktionen
• Writer:
• START TRANSACTION READ WRITE;
• UPDATE t SET d = ‘one’ WHERE id = 1;
• Reader:
• SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
• SELECT * FROM t WHERE id = 1;
31
Transaktionen
• Writer:
• START TRANSACTION READ WRITE;
• UPDATE t SET d = ‘one’ WHERE id = 1;
• Reader:
• SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
• SELECT * FROM t WHERE id = 1;
32
Transaktionen
• Was ist die Bedeutung von
• START TRANSACTION READ ONLY;
• SELECT * FROM t WHERE id = 1;
• SELECT * FROM t WHERE id = 1;
• COMMIT;
• im Vergleich zu “SELECT * FROM t WHERE id = 1” ohne Transaktion?
33
Transaktionen
• SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
• START TRANSACTION READ ONLY;
• Die Welt bleibt stehen: Snapshot!
• ‘Gehe im Undo Log mehr als einen Schritt zurück und liefere die neusten Daten, die älter sind als meine Transaktion.’
• COMMIT;
34
Uncommitted, Committed, Repeatable Read35
id d txn#
1 one 9
2 zwei 5
3 drei 7
id d txn#
1 bla 8
1 fasel 6
1 eins 1
Undo LogTable t
SELECT id, d FROM t WHERE id = 1 — txn#4
Undo Log Purge36
id d txn#
1 one 9
2 zwei 5
3 drei 7
id d txn#
1 bla 8
1 fasel 6
1 eins 1
Undo LogTable t
Lösche alle Undo Log Einträge, die älter sind als die älteste noch aktive Transaktion.
Undo Log Purge
• START TRANSACTION READ ONLY;
• SELECT * FROM t WHERE id = 1;
• — fährt in den Urlaub
• Was passiert?
37
Ein Zähler
• CREATE TABLE cnt ( name VARCHAR, value INTEGER);
• SELECT value FROM cnt WHERE name = ‘verkäufe’;
• UPDATE cnt SET value = 18 WHERE name = ‘verkäufe’;
38
name value
verkäufe 17
einkäufe 20
Ein Zähler verzählt sich…39
name value
verkäufe 17
einkäufe 20
START TRANSACTION
SELECT valueFROM cntWHERE name = ‘verkäufe’
START TRANSACTION
Thread 1 Thread 2
UPDATE cntSET value = 18WHERE name = ‘verkäufe’
COMMIT
SELECT valueFROM cntWHERE name = ‘verkäufe’
UPDATE cntSET value = 18WHERE name = ‘verkäufe’
COMMIT
Richtig zählen…40
name value
verkäufe 17
einkäufe 20
START TRANSACTION
SELECT valueFROM cntWHERE name = ‘verkäufe’FOR UPDATE
START TRANSACTION
Thread 1 Thread 2
name = ‘verkäufe’lockedby Thread 1
UPDATE cntSET value = 18WHERE name = ‘verkäufe’
COMMIT lock dropped
SELECT valueFROM cntWHERE name = ‘verkäufe’FOR UPDATE
name = ‘verkäufe’lockedby Thread 2
MVCC
• “Multi Value Concurrency Control”
• “Multi Value”: in der Tabelle und alte Versionen im Undo-Log
• “Concurrency Control”: Ein Write wird niemals ein Read Blocken.
• SELECT … FOR UPDATE ist ein Read, der wie ein Write lockt und blockt.
41
… TRANSACTION ISOLATION LEVEL …
• Isolation ist etwas, das jeder Client für sich selber wählen kann.
• Das Undo-Log ist sowieso notwendig, damit Rollback geht.
• Der Isolation Level bestimmt, wie weit der Reader ins Undo-Log abtaucht.
• Das erlaubt Snapshots, private eingefrorene Kopien der Datenbank.
42
Daten auf Platten malen
“Platten”
• Sektoren: 512 Byte, 520 Byte, 4096 Byte
• “Ein Sektor wird immer ganz oder gar nicht überschrieben.”
• Was ist mit SSD?
• Das ist kompliziert. Man will was mit PLP (Power Loss Protection).
44
SSD und Power Loss45
https://www.usenix.org/conference/fast13/technical-sessions/presentation/zheng
“Pages”
• InnoDB hat 16 KB Pages
• Oracle und Postgres: 8 KB
• Page ist die I/O Unit, d.h. es werden immer 2 oder mehr Sektoren (4K Sektoren) geschrieben.
• “half written pages” sind selbst im Idealfall möglich.
46
Was tun?
• Pages nie überschreiben.
• InnoDB: Doublewrite Buffer
• “Schreibe Page im Doublewrite Buffer, markiere als erledigt, schreibe noch einmal in-place.”
• Postgres: WAL full page writes
• “Hänge die alte Page ans WAL an, schreibe in-place.”
47
Writeback-Caches: Tod der Daten
• Writethrough-Cache:
• Write geht in den Cache und auf die Platte.
• “write ok”: Die Daten stehen wirklich auf der Platte.
• Writeback-Cache:
• Write geht in den Cache, “write ok” melden.
• Daten stehen auf der Platte oder nicht, niemand weiß es.
48
Caches: wo?
• Platte selbst: Track Cache, Onboard-Cache.
• Controller: Not-so-smart-Array.
• Betriebssystem: File System Buffer Cache.
• Alle haben unterschiedliche “Flush” Commands.
49
Replikation und verteilte Systeme
Database State51
State(all tables)
New State(table modified)
ConsistentSnapshot
DataChangingStatement
logged tobinary log
Database State
• "Uhrzeit" hat keinen Sinn:
• viele CPUs, gleichzeitige Operationen
• Binlog = Serialisierung aller Ereignisse
• "Binlog Position" = die "Uhrzeit" dieser Datenbank
52
Backup und Restore
• Vollbackups jede Mitternacht
• Binlog-Position zum Backup bekannt
• Restore:
• Vollbackup + alle Writes seit diesem Backup
• "Point in Time Recovery"
53
Sunday,Midnight
Monday,Midnight
Tuesday,Midnight
binlog.00000108:12
binlog.00000218:31
binlog.00000322:52
binlog.00000404:18
binlog.00000517:49
binlog.00000603:47
binlog.00000716:25
Replikation als laufende Recovery54
Master Slave
Binlog RelayLog
ConnectionThread
IOThread
SQLThread
To Tables
Slavelogs in to Master
Server ID: x Server ID: y
Replikation als laufende Recovery
• Restore eines Slave aus einem Vollbackup
• SLAVE_IO_THREAD lädt die Binlogs vom Master runter
• seit dem Vollbackup-Zeitpunkt
• SLAVE_SQL_THREAD wendet das Binlog laufend an
• Slave = ein durchlaufender Dauer-Restore
55
Statement based vs. Row based
• Wir laden changes vom Master runter:
• SBR: Original-Statement, wie es der Master gesehen hat
• RBR: Die Rows, die das Statement geändert hat
• Was ist besser?
56
Statement Based
• Manche Statements haben unterschiedliche Results, wenn man sie zum 2. Mal ausführt
• NOW(), RAND(), LAST_INSERT_ID()
• LIMIT mit und ohne ORDER BY
• Tausend andere Spezialfälle
• Fazit: SBR ist fragil (in der Praxis stabil genug)
57
Row Based
• Ein Statement = viele Row Changes (braucht Transaktionen!)
• Ein Statement bricht auf dem Master ab (Transaktionen!)
• int auf dem Master, smallint auf dem Slave (WTF?)
• Was passiert beim Replikationsfehler?
58
SBR vs RBR
• In der Praxis:
• RBR ist 1/3 so groß wie SBR
• Kein Index -> Bumm.
• BLOB -> Bumm (fixed in 5.6+) wegen pre/post image
• In Summe: kleiner, robuster, klare Constraints.
59
Best Practices für Replikationen
• “Replikation ist eine laufende Binlog Recovery”
• InnoDB verwenden, MyISAM vernichten, PK verlangen.
• RBR verwenden, BLOB berücksichtigen.
• Neu in MySQL 5.5, Maria 5.5: Group Commit
• Neu in MySQL 5.7, Maria 10.1: Parallel Slave
60
Replikations-Topologien61
Slave Server
Master Server
Client
writes
reads(through LB)
Replikations-Topologien62
Slave Server
Master Server
Slave Server
Local Master Server
Heathrow Amsterdam
Replikations-Topologien Nichts als Probleme63
Slave Server
Master Server DesignatedBackup Master
binlog.000018Offset 743271
binlog.000012Offset 393273?
Replikations-Topologien Dumme Ideen64
Server #1
Server #3
Server #2
"Master-Master" gibt es nicht
• Zugriffe ordnen (aio, aii)
• funktioniert so nicht (UPDATE, DELETE, failover-Fall)
• Wie funktioniert Recovery nach einem ungeordneten Shutdown?
65
Robustes Konzept66
Slave Server
Master Server Backup Master
Disk Mirroror
Shared Disk
VirtualIP Number
Mobile between Hosts
–Johnny Appleseed
Ende der Ausbaustrecke
67
Alternativen zu Master-Master
• HA-Problem lösen:
• Disk/IP Switch, Log Recovery FS, DB
• Galera
• “writes to a single master, most of the time, rollbacks”
• Replikationsumschaltungen
• Relay Log Drain, Binlog-Konvertierung (MHA, GTID)
68
Split Brains und andere Clusterfails
• 2PC, 3PC, Paxos, Raft, Jepsen-Testing
• ZK, etcd, Consul und was die machen
• Write-Serialization
• Attendance
69