Sql für Dummies

1.091 Aufrufe

Veröffentlicht am

Datenbanken, der 10km Überblick

https://www.youtube.com/watch?v=5v9fldZhH5M

Veröffentlicht in: Internet
0 Kommentare
2 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.091
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
11
Aktionen
Geteilt
0
Downloads
12
Kommentare
0
Gefällt mir
2
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Sql für Dummies

  1. 1. Datenbanken für Dummies Kristian Köhntopp Alter Sack SysEleven GmbH
  2. 2. Relationenalgebra Vorsicht, Mathematik!
  3. 3. 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”) }
  4. 4. 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
  5. 5. Rechnen mit Tabellen • Selektion • Projektion • Kreuzprodukt • Rename • Aggregation 5 3 Kex √2 Keks a Cookie 1 c π b 2 e
  6. 6. Selektion • SELECT *
 FROM t
 WHERE a=1
 • Wähle eine oder mehrere Zeilen 6 3 Kex √2 Keks a Cookie 1 c π b 2 e Selektion Projektion
  7. 7. 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
  8. 8. 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
  9. 9. Kreuzprodukt • SELECT *
 FROM kunden
 JOIN 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
  10. 10. 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
  11. 11. 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 6 Doppelt!
  12. 12. 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
  13. 13. 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)?
  14. 14. 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 26 25 24 13 12 emp (GROUP BY bossid)
  15. 15. Aggregation • SELECT bossid,
 count(*),
 group_concat(empid) AS mitarbeiter
 FROM emp
 GROUP BY bossid; 15
  16. 16. Relationen-Algebra • Selektion • Projektion • Kreuzprodukt • Rename • Aggregation 16 3 Kex √2 Keks a Cookie 1 c π b 2 e
  17. 17. Relationen-Algebra • Algebra: • Grundmenge A, • Operationen, • Ergebnisse wieder in A
 • Weiter rechnen! 17 3 Kex √2 Keks a Cookie 1 c π b 2 e
  18. 18. Weiter rechnen: Subqueries18
  19. 19. Weiter rechnen: Subqueries19
  20. 20. Weiter rechnen: Subqueries20 Es gibt 2 Tables in kris mit 6 Rows Und in Test dieselbe Situation nochmal!
  21. 21. Weiter rechnen: Subqueries21
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. Transaktionen
  29. 29. “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
  30. 30. 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
  31. 31. 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
  32. 32. 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
  33. 33. 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
  34. 34. 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
  35. 35. 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
  36. 36. 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.
  37. 37. Undo Log Purge • START TRANSACTION READ ONLY; • SELECT * FROM t WHERE id = 1; • — fährt in den Urlaub
 • Was passiert? 37
  38. 38. 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
  39. 39. Ein Zähler verzählt sich…39 name value verkäufe 17 einkäufe 20 START TRANSACTION SELECT value FROM cnt WHERE name = ‘verkäufe’ START TRANSACTION Thread 1 Thread 2 UPDATE cnt SET value = 18 WHERE name = ‘verkäufe’ COMMIT SELECT value FROM cnt WHERE name = ‘verkäufe’ UPDATE cnt SET value = 18 WHERE name = ‘verkäufe’ COMMIT
  40. 40. Richtig zählen…40 name value verkäufe 17 einkäufe 20 START TRANSACTION SELECT value FROM cnt WHERE name = ‘verkäufe’ FOR UPDATE START TRANSACTION Thread 1 Thread 2 name = ‘verkäufe’ locked by Thread 1 UPDATE cnt SET value = 18 WHERE name = ‘verkäufe’ COMMIT lock dropped SELECT value FROM cnt WHERE name = ‘verkäufe’ FOR UPDATE name = ‘verkäufe’ locked by Thread 2
  41. 41. 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
  42. 42. … 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
  43. 43. Daten auf Platten malen
  44. 44. “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
  45. 45. SSD und Power Loss45 https://www.usenix.org/conference/fast13/technical-sessions/presentation/zheng
  46. 46. “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
  47. 47. 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
  48. 48. 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
  49. 49. Caches: wo? • Platte selbst: Track Cache, Onboard-Cache. • Controller: Not-so-smart-Array. • Betriebssystem: File System Buffer Cache.
 • Alle haben unterschiedliche “Flush” Commands. 49
  50. 50. Replikation und verteilte Systeme
  51. 51. Database State51 State (all tables) New State (table modified) Consistent Snapshot Data Changing Statement logged to binary log
  52. 52. Database State • "Uhrzeit" hat keinen Sinn: • viele CPUs, gleichzeitige Operationen • Binlog = Serialisierung aller Ereignisse
 • "Binlog Position" = die "Uhrzeit" dieser Datenbank 52
  53. 53. 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.000001 08:12 binlog.000002 18:31 binlog.000003 22:52 binlog.000004 04:18 binlog.000005 17:49 binlog.000006 03:47 binlog.000007 16:25
  54. 54. Replikation als laufende Recovery54 Master Slave Binlog Relay Log Connection Thread IO Thread SQL Thread To Tables Slave logs in to Master Server ID: x Server ID: y
  55. 55. 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
  56. 56. 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
  57. 57. 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
  58. 58. 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
  59. 59. 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
  60. 60. 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
  61. 61. Replikations-Topologien61 Slave Server Master Server Client writes reads (through LB)
  62. 62. Replikations-Topologien62 Slave Server Master Server Slave Server Local Master Server Heathrow Amsterdam
  63. 63. Replikations-Topologien Nichts als Probleme63 Slave Server Master Server Designated Backup Master binlog.000018 Offset 743271 binlog.000012 Offset 393273?
  64. 64. Replikations-Topologien Dumme Ideen64 Server #1 Server #3 Server #2
  65. 65. "Master-Master" gibt es nicht • Zugriffe ordnen (aio, aii) • funktioniert so nicht (UPDATE, DELETE, failover-Fall) • Wie funktioniert Recovery nach einem ungeordneten Shutdown? 65
  66. 66. Robustes Konzept66 Slave Server Master Server Backup Master Disk Mirror or Shared Disk Virtual IP Number Mobile between Hosts
  67. 67. –Johnny Appleseed Ende der Ausbaustrecke 67
  68. 68. 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
  69. 69. Split Brains und andere Clusterfails • 2PC, 3PC, Paxos, Raft, Jepsen-Testing • ZK, etcd, Consul und was die machen • Write-Serialization • Attendance 69

×