# Datenbanken # Grundwissen # Anomalien #### Einleitung Wenn wir Datenbanken anlegen oder länger verwenden, können bei falsch programmierten Tabellen sogenannte Anomalien entstehen. Diese Anomalien gilt es zu vermeiden. Hier finden wir einige Anomalien, die in unserer Datenbank auftreten können. #### Mutationsanomalie In der Mutationsanomalie wird ein Wert durch einen Fehler **Falsch geschrieben**. Dies kann einfach durch einen Wert entstehen, für den es mehrere Schreibweisen gibt. z.B. **Straße** und **Strasse**. Dadurch befinden sich dann später verschiedene Schreibweisen von Daten in der Datenbank. Dadurch können wir nicht zuverlässig nach Daten suchen und daher sind die Daten dann nicht richtig verwendbar.
**Vorname** | **Nachname** | **Straße** | **PLZ** | **Ort** |
Peter | Petersen | Hauptstraße 30 | 24944 | Flensburg |
Gerda | Petersen | Hauptstrasse 30 | 24944 | Flensburg |
**Vorname** | **Nachname** | **Straße** | **PLZ** | **Ort** |
Peter | Petersen | Hauptstraße 30 | ? | Flensburg |
Keine Daten | Petersen | Hauptstrasse 30 | 24944 | Flensburg |
**Vorname** | **Nachname** | **Straße** | **PLZ-ID** |
Peter | Petersen | Hauptstraße 30 | 1 |
Gerda | Petersen | Hauptstrasse 30 | 1 |
Ab wann ein Wert **atomar** ist, hängt vom Nutzungskontext ab. Wenn man gewisse Teilungen nicht benötigt, ist dies nicht unbedingt nötig. In der Praxis empfiehlt sich trotzdem alles möglichst klein aufzuteilen.
[](https://pc-wiki.de/uploads/images/gallery/2022-05/D3cWXKvZpyZeUE5o-normalform1.png) #### Normalform 2 (2NF) In der zweiten Normalform muss die Tabelle in der ersten Normalform vorliegen, und alle Nichtschlüsselmerkmale voll funktional vom Primärschlüssel abhängen. Unterm Strich bedeutet dies, dass jedes Nichtschlüsselmerkmal aus dem Primärschlüssel ableitbar ist. Merkmale, die von einem Teilschlüssel abhängig sind, müssen in eine eigene Tabelle geschrieben werden. Hier teilen wir also die Tabellen in einzelne Tabellen auf. Um jetzt eine Tabelle in die zweite Normalform zu übernehmen, müssen wir folgende Schritte durchführen: 1. Alle Nichtschlüsselmerkmale, die von einem Teilschlüssel funktional abhängig sind bestimmen. 2. Aus den Teilschlüsseln mit allen funktional abhängigen Nichtschlüsselmerkmalen eigene Tabellen bilden. 3. Im letzten Schritt entfernen wir alle nicht voll funktional abhängigen Nichtschlüsselmerkmale. [](https://pc-wiki.de/uploads/images/gallery/2022-05/PaXH2BYRZgQ3tEv8-normalform2.png) ##### Normalform 3 (3NF) Im letzten Schritt entfernen wir die letzten Redundanzen. Laut der Definition ist eine Tabelle in der Normalform 3, wenn jedes Schlüsselmerkmal nicht transitiv vom Primärschlüssel abhängig ist. Im Weiteren bedeutet **Transitiv**, dass ein Merkmal einen Umweg nutzen kann, um funktional abhängig von einem anderen Merkmal abhängig ist. Unterm Strich sollen alle Merkmale nur von einem Primärschlüssel abhängig sein. Um eine Tabelle in die dritte Normalform zu übernehmen, verwenden wir folgende Schritte: 1. Alle Nichtschlüsselmerkmale, die transitiv vom Schlüssel abhängen, bestimmen. 2. Im nächsten Schritt sollen aus diesen transitiv abhängigen Nichtschlüsselmerkmalen und den Nichtschlüsselmerkmalen, von denen diese funktional abhängig sind, eigene Tabellen bilden. 3. Im letzten Schritt entfernen wir alle transitiv abhängigen Nichtschlüsselmerkmale aus der Ursprungstabelle. [](https://pc-wiki.de/uploads/images/gallery/2022-05/cm15ymeJcwRhRQGX-normalform3.png) # Microsoft SQL (MSSQL) # JOIN Tabelle in andere Tabelle auslagern Wenn du zwei Tabellen oder mehr mit JOIN miteinander verknüpfen möchtest, kannst du die Tabelle auch in eine andere Tabelle auslagern. (WICHTIG: Die Tabelle wird bei dem Vorgang erstellt! Du kannst also keine schon existierende Tabelle verwenden.) ```SQL SELECT p.Stadtname, p.PLZ, c.Country INTO tblLaender FROM tblPlace p INNER JOIN tblCountry c ON p.ID = c.ID; ``` Du erhältst nun die Ausgabe der JOIN Tabelle in eine andere Tabelle. Du kannst diese jetzt wie gewohnt in SQL weiterverwenden. Die alten Tabellen könntest du dann aus theoretischer Sicht löschen. # MySQL / MariaDB # Alle Benutzer in MySQL / MariaDB anzeigen #### Einleitung Beim Arbeiten mit Datenbanken möchtest du vielleicht einmal nachschauen, welche Benutzer noch angelegt sind, und welchen Zugriff auf die Datenbanken haben. Alte Benutzer können ein sehr hohes Sicherheitsrisiko darstellen, daher sollten Benutzer, die nicht mehr verwendet werden, umgehend beseitigt werden. #### Alle Benutzer anzeigen Um alle Benutzer anzeigen zu lassen, setzt du folgenden Befehl in der SQL Shell ab ```SQL SELECT * FROM mysql.user; ``` Du bekommst dann eine Tabelle zurückgegeben, mit allen Benutzern, die noch angelegt sind, mit Informationen darüber, von welchem Host diese sich anmelden dürfen, wie der Benutzername ist und eine Angabe über das Passwort, natürlich in verschlüsselter Form. Des Weiteren sieht man die Berechtigungen auf den MySQL Server vom jeweiligen Benutzer. # Datenbanken in MySQL / MariaDB anlegen #### Einleitung Um Daten längerfristig zu speichern, bieten sich Datenbanken an. Datenbanken haben den entscheidenden Vorteil das sich mehrere Benutzer gleichzeitig dort anmelden können. Dadurch können Daten schnell und effizient abgefragt werden. #### Datenbank anlegen Wenn du eine Datenbank anlegen möchtest, musst du dir zuerst einen Namen für diese Ausdenken. Der Name darf Buchstaben von **A-Z** ohne Umlaute enthalten. Ein Datenbank Namen darf auch keine führende Zahl enthalten. Des weiteren können Sonderzeichen verwendet werden, aber es können nicht alle Sonderzeichen für Datenbank Namen verwendet werden. Beispielweise kann ein Bindestrich (-) nicht verwendet werden, ein Unterstrich(\_) ist aber in Ordnung. Wenn du dich nun für einen Namen entschieden hast, kannst du nun deine Datenbank erstellen. ```SQL CREATE DATABASE**Bedenke:** Eine Eröffnung von neuen Wegen zum Zugriff auf Server stellen immer neue Sicherheitsrisiken dar! Stelle sicher das dass Risiko bekannt ist!
#### MySQL Um in MySQL Verbindungen von Außen zu erlauben, müssen wir die Konfigurationsdatei mit einem Editor unserer Wahl öffnen. Ich verwende dazu **nano**. Dieser ist auf fast allen Linux Distributionen vorinstalliert und lässt sich sehr leicht verwenden. ```bash sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf ``` Dort müssen wir den Punkt **bind-address** finden. Dort müsste aktuell die **localhost Adresse (127.0.0.1)** stehen. Diesen Wert ändern wir auf **0.0.0.0**, um von allen Servern den Zugriff zu erlauben. Möchten wir aber, dass der Zugriff nur von einem bestimmten Server möglich sein soll, setzen wir dort die **IP-Adresse des Servers** ein. ```bash # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 0.0.0.0 ``` Zum Schluss müssen wir nur noch den MySQL Service neu starten. Danach sollte eine Verbindung möglich sein. ```bash sudo systemctl restart mysql ``` #### MariaDB In MariaDB funktioniert das fast genauso wie in MySQL. Es verändert sich lediglich nur die Konfigurationsdatei, die wir öffnen und editieren müssen. Ich verwende hier wieder **nano**, um die Konfigurationsdatei zu öffnen. ```bash sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf ``` Bei dieser Datei müssen wir auch den Punkt **bind-address** finden und diese dann auf die **IP-Adresse** **0.0.0.0** setzen. Natürlich können wir hier auch wieder die **IP-Adresse** des **Servers** eintragen, welcher Zugriff auf den SQL Server haben soll. Im Anschluss starten wir auch den MySQL Dienst wieder neu. ```bash sudo systemctl restart mysql ``` # Backup einer MySQL Datenbank erstellen #### Einleitung Es ist immer ratsam, Backups von einem System zu erstellen. Wir werden hier den Befehl `mysqldump` verwenden. Dieser kann dazu verwendet werden, um Backups einer bestimmten Datenbank oder mehreren Datenbanken zu erstellen. #### Backup einer Datenbank Um ein Backup einer Datenbank zu erstellen, brauchen wir den Namen der entsprechenden Datenbank. Wir können uns alle Datenbanken anzeigen lassen, mit dem folgenden Befehl in der **MySQL Shell**. ```sql SHOW DATABASES; ``` Im Beispiel erstellen wir ein Backup der Datenbank **\_erp\_prod**. Um dieses Backup zu erstellen, verwenden wir dann den folgenden Befehl. Bei dem Befehl müssen wir nur den **Datenbank-Namen** und den Namen der **Backup-Datei** ändern. ```bash mysqldump -u root -p _erp_prod > backup.sql ```Der Befehl wird aus der **Linux-Shell** abgesetzt, nicht aus der **MySQL-Shell**!
Wir erhalten dann die Backup-Datei in unserem aktuellen Verzeichnis und können diese dann sichern, oder auf einem anderen Server wieder einspielen. #### Backup mehrerer Datenbanken in einer Datei Um mehrere Datenbanken in einer Datei zu sichern, verwenden wir einen ähnlichen Befehl. Dabei verändern wir wieder die Namen der Datenbanken und der Backup-Datei. ```bash mysqldump -u root -p --databases datenbank_eins datenbank_zwei > backup.sql ``` Die beiden Datenbanken befinden sich dann jetzt in der einen **.sql** Datei und können diese auch wieder woanders sichern oder einspielen. #### Alle Datenbanken in einer Datei sichern Wenn wir jetzt alle verfügbaren Datenbanken in einer Datei sichern möchten, müssen wir lediglich den folgenden Befehl verwenden. Dann wird wieder eine Backup-Datei erstellt und alle Daten der Datenbanken werden in diese Datei geschrieben. ```bash mysqldump -u root -p --all-databases > alle_datenbanken.sql ``` #### Datenbanken in verschiedenen Dateien sichern Jetzt zum Schluss können wir die einzelnen Datenbanken in jeweils einer eigenen Datei sichern. Dazu verwenden wir ein **Bash-Skript** welches wir auf unserem Server ausführen. Es werden dann einzelne Dateien angelegt, die den Inhalt der jeweiligen Datenbank haben. ```sh for DB in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $DB > "$DB.sql"; done ``` # Backup einer MySQL Datenbank einspielen #### Einleitung Sobald wir ein Backup einer **MySQL Datenbank** erstellt haben, möchten wir diese vielleicht auch auf einen anderen Server spielen. Dies machen wir, wenn wir z.B. den **Datenbankserver** umziehen möchten. Dazu brauchen wir die **mysqldump** Datei. Diese haben wir erstellt, als wir das Backup angelegt haben. #### Backup einspielen Wir müssen zuerst, in den meisten Fällen, erstmal die Datenbank anlegen, bevor wir ein Backup für die Datenbank einspielen können. Dazu verwenden wir den `CREATE DATABASE` Befehl. ```sql CREATE DATABASE