Sql für Dummies

69

Click here to load reader

Transcript of Sql für Dummies

Page 1: Sql für Dummies

Datenbanken für DummiesKristian Köhntopp

Alter Sack

SysEleven GmbH

Page 2: Sql für Dummies

Relationenalgebra

Vorsicht, Mathematik!

Page 3: Sql für Dummies

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”) }

Page 4: Sql für Dummies

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

Page 5: Sql für Dummies

Rechnen mit Tabellen

• Selektion

• Projektion

• Kreuzprodukt

• Rename

• Aggregation

5

3

Kex

√2

Keks

a

Cookie

1

c

π

b

2

e

Page 6: Sql für Dummies

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

Page 7: Sql für Dummies

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

Page 8: Sql für Dummies

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

Page 9: Sql für Dummies

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

Page 10: Sql für Dummies

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

Page 11: Sql für Dummies

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!

Page 12: Sql für Dummies

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

Page 13: Sql für Dummies

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)?

Page 14: Sql für Dummies

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)

Page 15: Sql für Dummies

Aggregation

• SELECT bossid,count(*),group_concat(empid) AS mitarbeiterFROM empGROUP BY bossid;

15

Page 16: Sql für Dummies

Relationen-Algebra

• Selektion

• Projektion

• Kreuzprodukt

• Rename

• Aggregation

16

3

Kex

√2

Keks

a

Cookie

1

c

π

b

2

e

Page 17: Sql für Dummies

Relationen-Algebra

• Algebra:

• Grundmenge A,

• Operationen,

• Ergebnisse wieder in A

• Weiter rechnen!

17

3

Kex

√2

Keks

a

Cookie

1

c

π

b

2

e

Page 18: Sql für Dummies

Weiter rechnen: Subqueries18

Page 19: Sql für Dummies

Weiter rechnen: Subqueries19

Page 20: Sql für Dummies

Weiter rechnen: Subqueries20

Es gibt 2 Tables in kris

mit 6 Rows

Und in Test dieselbe Situation

nochmal!

Page 21: Sql für Dummies

Weiter rechnen: Subqueries21

Page 22: Sql für Dummies

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

Page 23: Sql für Dummies

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

Page 24: Sql für Dummies

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

Page 25: Sql für Dummies

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

Page 26: Sql für Dummies

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

Page 27: Sql für Dummies

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

Page 28: Sql für Dummies

Transaktionen

Page 29: Sql für Dummies

“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

Page 30: Sql für Dummies

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

Page 31: Sql für Dummies

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

Page 32: Sql für Dummies

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

Page 33: Sql für Dummies

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

Page 34: Sql für Dummies

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

Page 35: Sql für Dummies

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

Page 36: Sql für Dummies

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.

Page 37: Sql für Dummies

Undo Log Purge

• START TRANSACTION READ ONLY;

• SELECT * FROM t WHERE id = 1;

• — fährt in den Urlaub

• Was passiert?

37

Page 38: Sql für Dummies

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

Page 39: Sql für Dummies

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

Page 40: Sql für Dummies

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

Page 41: Sql für Dummies

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

Page 42: Sql für Dummies

… 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

Page 43: Sql für Dummies

Daten auf Platten malen

Page 44: Sql für Dummies

“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

Page 45: Sql für Dummies

SSD und Power Loss45

https://www.usenix.org/conference/fast13/technical-sessions/presentation/zheng

Page 46: Sql für Dummies

“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

Page 47: Sql für Dummies

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

Page 48: Sql für Dummies

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

Page 49: Sql für Dummies

Caches: wo?

• Platte selbst: Track Cache, Onboard-Cache.

• Controller: Not-so-smart-Array.

• Betriebssystem: File System Buffer Cache.

• Alle haben unterschiedliche “Flush” Commands.

49

Page 50: Sql für Dummies

Replikation und verteilte Systeme

Page 51: Sql für Dummies

Database State51

State(all tables)

New State(table modified)

ConsistentSnapshot

DataChangingStatement

logged tobinary log

Page 52: Sql für Dummies

Database State

• "Uhrzeit" hat keinen Sinn:

• viele CPUs, gleichzeitige Operationen

• Binlog = Serialisierung aller Ereignisse

• "Binlog Position" = die "Uhrzeit" dieser Datenbank

52

Page 53: Sql für Dummies

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

Page 54: Sql für Dummies

Replikation als laufende Recovery54

Master Slave

Binlog RelayLog

ConnectionThread

IOThread

SQLThread

To Tables

Slavelogs in to Master

Server ID: x Server ID: y

Page 55: Sql für Dummies

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

Page 56: Sql für Dummies

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

Page 57: Sql für Dummies

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

Page 58: Sql für Dummies

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

Page 59: Sql für Dummies

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

Page 60: Sql für Dummies

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

Page 61: Sql für Dummies

Replikations-Topologien61

Slave Server

Master Server

Client

writes

reads(through LB)

Page 62: Sql für Dummies

Replikations-Topologien62

Slave Server

Master Server

Slave Server

Local Master Server

Heathrow Amsterdam

Page 63: Sql für Dummies

Replikations-Topologien Nichts als Probleme63

Slave Server

Master Server DesignatedBackup Master

binlog.000018Offset 743271

binlog.000012Offset 393273?

Page 64: Sql für Dummies

Replikations-Topologien Dumme Ideen64

Server #1

Server #3

Server #2

Page 65: Sql für Dummies

"Master-Master" gibt es nicht

• Zugriffe ordnen (aio, aii)

• funktioniert so nicht (UPDATE, DELETE, failover-Fall)

• Wie funktioniert Recovery nach einem ungeordneten Shutdown?

65

Page 66: Sql für Dummies

Robustes Konzept66

Slave Server

Master Server Backup Master

Disk Mirroror

Shared Disk

VirtualIP Number

Mobile between Hosts

Page 67: Sql für Dummies

–Johnny Appleseed

Ende der Ausbaustrecke

67

Page 68: Sql für Dummies

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

Page 69: Sql für Dummies

Split Brains und andere Clusterfails

• 2PC, 3PC, Paxos, Raft, Jepsen-Testing

• ZK, etcd, Consul und was die machen

• Write-Serialization

• Attendance

69