# MySQL

# DB-Replikation

## Einrichtung

### Master

1. MySQL Konfigurationsdatei anpassen:

```bash
[mysqld]
server-id = <eindeutige ID zB 10>
log-bin = mysql-bin
binlog-format = ROW

```

2. Neustarten des MySQL-Dienstes auf dem Master-Server
3. Benutzer für die Replikation erstellen und Berechtigungen erteilen:

```sql
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'secure_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;

```

4. Erstellen eines Snapshot-Backups:  
    Dies ist notwendig, um sicherzustellen, dass der Slave-Server mit den aktuellen Daten startet.

```sql
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
-- Notieren Sie sich den Wert von 'File' und 'Position' 
-- für die spätere Verwendung auf dem Slave-Server.

```

<p class="callout info">==&gt; Backup erstellen (mysqldump) und auf dem Slave-Server ablegen.</p>

 5. Tabellen wieder entsperren:

```sql
UNLOCK TABLES;

```

### Slave

1. MySQL Konfigurationsdatei anpassen:

```bash
[mysqld]
server-id = <eindeutige ID zB 11>
relay-log = mysql-relay-bin

```

2. Neustarten des MySQL-Dienstes auf dem Slave-Server
3. <p class="callout info">Datenbank-Dump auf dem Slave-Server importieren</p>
4. Slave-Server konfigurieren, um mit dem Master zu synchronisieren:

```sql
CHANGE MASTER TO
    MASTER_HOST='master_host_ip',
    MASTER_USER='replica_user',
    MASTER_PASSWORD='secure_password',
    MASTER_LOG_FILE='mysql-bin.000001', -- Wert von SHOW MASTER STATUS
    MASTER_LOG_POS=1234; -- Wert von SHOW MASTER STATUS

```

5. Replikation starten:

```sql
START SLAVE;

```

6. Status der Replikation überprüfen:

```sql
SHOW SLAVE STATUS\G;

```

# Prozesse mit bestimmtem 'state' killen

### Bash-Einzeiler (auf der Linux-Konsole)

Wenn du SSH-Zugriff auf den Server oder den MySQL-Client hast, kannst du die Prozess-IDs mit `awk` auslesen und direkt zurück an MySQL zum Beenden pipe-en:

```bash
mysql -e "SELECT id FROM information_schema.processlist WHERE state = 'Waiting for table flush';" \
  | awk '{if(NR>1) print "KILL "$1";"}' \
  | mysql
```

```bash
mysql -e "SELECT id FROM information_schema.processlist WHERE state = 'User Sleep';" \
  | awk '{if(NR>1) print "KILL "$1";"}' \
  | mysql
```

### `pt-kill` (Der professionelle Weg für Produktion)

In Produktionsumgebungen ist **`pt-kill`** (aus dem Percona Toolkit) der sicherste Standard. Es beendet gezielt nur Prozesse, die Kriterien wie den Status erfüllen:

```bash
pt-kill --match-state "Waiting for table flush" --kill --victim-order oldest --interval 5
```

- **`--kill`**: Beendet die Verbindungen.
- **`--print`** (optional statt `--kill`): Zeigt zuerst nur an, was gelöscht werden würde, ohne es auszuführen.

# Waiting for table flush

Der Status **`Waiting for table flush`** entsteht meistens durch ein klassisches **Henne-Ei-Problem** im MySQL-Query-Locking: Ein Prozess fordert das Schließen/Leeren der Tabellencaches an (z. B. ein Backup, `FLUSH TABLES`, `ALTER TABLE` oder `ANALYZE TABLE`), wird aber selbst von einer lang laufenden `SELECT`-Query blockiert. Alle *darauffolgenden* Abfragen auf diese Tabelle müssen dann im Status `Waiting for table flush` warten.

Hier ist die Schritt-für-Schritt-Anleitung zur Ursachenforschung und Prävention:

### 1. Die genaue Ursache ermitteln

Um den "Übeltäter" (den Blocker) zu finden, musst du die Kette der abhängigen Abfragen analysieren.

#### Schritt A: Langläufer identifizieren (`SHOW FULL PROCESSLIST`)

Führe folgenden Befehl aus:

<div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-38 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQzQE" decode-data-ved="1" id="bkmrk-sql" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-38"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-38"><div _ngcontent-ng-c1911328046="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1911328046-38 ng-star-inserted"><span class="ng-tns-c1911328046-38">SQL</span><div _ngcontent-ng-c1911328046="" class="buttons ng-tns-c1911328046-38 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```mysql
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO 
FROM information_schema.PROCESSLIST 
WHERE COMMAND != 'Sleep' 
ORDER BY TIME DESC;

```

<div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-38 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQzQE" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-38"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-38"></div></div></div>**Wonach du suchen musst:**

1. **Der Flush-Auslöser:** Suche nach Abfragen mit `FLUSH TABLES`, `ALTER TABLE`, `RENAME TABLE`, `OPTIMIZE TABLE` oder `ANALYZE TABLE`. Diese haben oft eine moderate `TIME`.
2. **Der eigentliche Blocker:** Suche nach **sehr alten `SELECT`**-Abfragen (hohe `TIME`), die **vor** dem Flush gestartet wurden. Das sind häufig schlechte Queries ohne passenden Index oder ungeschlossene Transaktionen.

#### Schritt B: Exakte Sperren über das Performance Schema auslesen

Falls MySQL 5.7/8.0+ im Einsatz ist, zeigt dir das `performance_schema` genau, welcher Prozess auf welche Metadata Lock (MDL) wartet:

<div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-39 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQzgE" decode-data-ved="1" id="bkmrk-sql-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-39"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-39"><div _ngcontent-ng-c1911328046="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1911328046-39 ng-star-inserted"><span class="ng-tns-c1911328046-39">SQL</span><div _ngcontent-ng-c1911328046="" class="buttons ng-tns-c1911328046-39 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```mysql
SELECT 
    waiting_p.ID AS waiting_thread_id,
    waiting_p.INFO AS waiting_query,
    blocking_p.ID AS blocking_thread_id,
    blocking_p.INFO AS blocking_query
FROM performance_schema.metadata_locks waiting_ml
JOIN information_schema.PROCESSLIST waiting_p 
    ON waiting_ml.OWNER_THREAD_ID = waiting_p.ID
JOIN performance_schema.metadata_locks blocking_ml 
    ON waiting_ml.OBJECT_SCHEMA = blocking_ml.OBJECT_SCHEMA 
    AND waiting_ml.OBJECT_NAME = blocking_ml.OBJECT_NAME
JOIN information_schema.PROCESSLIST blocking_p 
    ON blocking_ml.OWNER_THREAD_ID = blocking_p.ID
WHERE waiting_p.STATE = 'Waiting for table flush'
  AND blocking_p.ID != waiting_p.ID;

```

<div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-39 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQzgE" decode-data-ved="1" id="bkmrk--3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-39"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-39"></div></div></div>### 2. Typische Ursachen &amp; wie man sie behebt

#### Ursache 1: Automatische Backups (`mysqldump` / `mariadb-dump`)

Klassischer Auslöser: Ein Backup-Job führt `FLUSH TABLES WITH READ LOCK` aus. Wenn parallel eine lange `SELECT`-Abfrage läuft, blockiert das Backup alle schreibenden und lesenden Zugriffe.

- **Lösung (InnoDB):** Verwende bei `mysqldump` immer das Flag `--single-transaction`. Dadurch wird die Tabelle nicht mehr global gesperrt:
    
    <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-40 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQzwE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-40"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-40"><div _ngcontent-ng-c1911328046="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1911328046-40 ng-star-inserted"><span class="ng-tns-c1911328046-40">Bash</span><div _ngcontent-ng-c1911328046="" class="buttons ng-tns-c1911328046-40 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```bash
    mysqldump --single-transaction --quick -u root -p meinedatenbank > backup.sql
    
    ```
    
    <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-40 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQzwE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-40"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-40"></div></div></div>

#### Ursache 2: Langsame `SELECT`-Queries ohne Index

Ein automatischer Wartungsjob (z. B. `ANALYZE TABLE`) oder DDL-Befehl möchte ein Table-Flush ausführen. Ein schlechter `SELECT`, der 5 Minuten für einen Full-Table-Scan braucht, blockiert den Flush.

- **Lösung:**
    
    
    - Analysiere langsame Abfragen mit `EXPLAIN` und setze fehlende Indizes.
    - Begrenze die maximale Laufzeit von Leseabfragen über Timeouts (z. B. in MySQL 8.0+):
        
        <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-41 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQ0AE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-41"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-41"><div _ngcontent-ng-c1911328046="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1911328046-41 ng-star-inserted"><span class="ng-tns-c1911328046-41">SQL</span><div _ngcontent-ng-c1911328046="" class="buttons ng-tns-c1911328046-41 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
        SET GLOBAL max_execution_time = 30000; -- bricht SELECTs nach 30 Sekunden ab
        
        ```
        
        <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-41 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQ0AE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-41"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-41"></div></div></div>

#### Ursache 3: Nicht committete Transaktionen

Ein Entwickler oder eine Anwendung hat `BEGIN` ausgeführt, ein `SELECT` gemacht und vergessen, `COMMIT` oder `ROLLBACK` aufzurufen. Der Thread schläft (`Sleep`), hält aber die Metadata-Lock.

- **Lösung:** Aktive Transaktionen identifizieren:
    
    <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-42 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQ0QE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-42"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-42"><div _ngcontent-ng-c1911328046="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1911328046-42 ng-star-inserted"><span class="ng-tns-c1911328046-42">SQL</span><div _ngcontent-ng-c1911328046="" class="buttons ng-tns-c1911328046-42 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```mysql
    SELECT * FROM information_schema.innodb_trx;
    
    ```
    
    <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-42 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQ0QE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-42"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-42"></div></div></div>Findest du dort alte Transaktionen (`trx_started`), kannst du diese gezielt mit `KILL [trx_mysql_thread_id]` beenden.

#### Ursache 4: Zu kleine Table Caches

Wenn MySQL ständig Tabellen schließen muss, weil der Cache voll ist, steigt die Wahrscheinlichkeit für Flush-Konflikte.

- **Lösung:** Überprüfe in der `my.cnf` / `my.ini` folgende Variablen und erhöhe sie gegebenenfalls:
    
    <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-43 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQ0gE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-43"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-43"><div _ngcontent-ng-c1911328046="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c1911328046-43 ng-star-inserted"><span class="ng-tns-c1911328046-43">Ini, TOML</span><div _ngcontent-ng-c1911328046="" class="buttons ng-tns-c1911328046-43 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    table_open_cache = 4096
    table_definition_cache = 4096
    
    ```
    
    <div _ngcontent-ng-c1911328046="" class="code-block ng-tns-c1911328046-43 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwj9kIz6u-iVAxUAAAAAHQAAAAAQ0gE" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_77d6ed3e9a0fcda6","c_ce4f42e318667e5f",null,"rc_06c37c02ecd6b6fc",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1911328046="" class="formatted-code-block-internal-container ng-tns-c1911328046-43"><div _ngcontent-ng-c1911328046="" class="animated-opacity ng-tns-c1911328046-43"></div></div></div>

### Zusammenfassung zur Prävention

<table data-path-to-node="33" id="bkmrk-problem-schnelle-abh"><thead><tr><td>**Problem**</td><td>**Schnelle Abhilfe**</td><td>**Langfristige Prävention**</td></tr></thead><tbody><tr><td><span data-path-to-node="33,1,0,0">**Backups**</span></td><td><span data-path-to-node="33,1,1,0">`--single-transaction` nutzen</span></td><td><span data-path-to-node="33,1,2,0">Keine `FLUSH TABLES WITH READ LOCK` auf InnoDB nutzen</span></td></tr><tr><td><span data-path-to-node="33,2,0,0">**Langläufer**</span></td><td><span data-path-to-node="33,2,1,0">Prozess mit `KILL <ID>` beenden</span></td><td><span data-path-to-node="33,2,2,0">Indizes optimieren &amp; Query-Timeouts setzen</span></td></tr><tr><td><span data-path-to-node="33,3,0,0">**Offene Transaktionen**</span></td><td><span data-path-to-node="33,3,1,0">Idle-Connections kappen</span></td><td><span data-path-to-node="33,3,2,0">`interactive_timeout` &amp; `wait_timeout` reduzieren</span></td></tr></tbody></table>

# User auf neuen Server umziehen

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-um-einen-mysql-benut" inline-copy-host=""><div>Um einen MySQL-Benutzer inklusive seines verschlüsselten Passworts und aller Rechte 1:1 auf einen neuen Server zu übertragen, nutzt du am besten das MySQL-Kommando `SHOW CREATE USER`.</div>  
</div>#### Schritt 1: Benutzer und Passworthash auf dem alten Server auslesen

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-melde-dich-auf-dem-a" inline-copy-host=""><div>Melde dich auf dem **alten Server** in MySQL an:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-29 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" id="bkmrk-bash" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-29"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-29"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-29 ng-star-inserted"><span class="ng-tns-c2000434957-29">Bash</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-29 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
mysql -u root -p

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-29 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" id="bkmrk-" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-29"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-29"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-f%C3%BChre-folgenden-befe" inline-copy-host=""><div>Führe folgenden Befehl für den gewünschten Benutzer aus (ersetze `benutzername` und `localhost` bzw. `%` entsprechend):</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-30 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="6" id="bkmrk-sql" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-30"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-30"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-30 ng-star-inserted"><span class="ng-tns-c2000434957-30">SQL</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-30 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
SHOW CREATE USER 'benutzername'@'localhost';

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-30 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="6" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-30"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-30"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-ausgabe%3A-mysql-gibt-" inline-copy-host=""><div>**Ausgabe:**</div><div>MySQL gibt dir ein fertiges `CREATE USER`-Statement zurück, das das bereits gehashte Passwort enthält. Das sieht ungefähr so aus:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-31 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="9" id="bkmrk-sql-1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-31"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-31"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-31 ng-star-inserted"><span class="ng-tns-c2000434957-31">SQL</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-31 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
CREATE USER 'benutzername'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$...' FAILED_LOGIN_ATTEMPTS 0 PASSWORD_LOCK_TIME 0 ACCOUNT UNLOCK PASSWORD EXPIRE DEFAULT;

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-31 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="9" id="bkmrk--2" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-31"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-31"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%28kopiere-dieses-gesa" inline-copy-host=""><div>*(Kopiere dieses gesamte `CREATE USER ...`-Statement).*</div>  
</div>#### Schritt 2: Berechtigungen (Grants) auslesen

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-lies-direkt-danach-d" inline-copy-host=""><div>Lies direkt danach die zugewiesenen Rechte des Benutzers aus:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-32 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="12" id="bkmrk-sql-2" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-32"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-32"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-32 ng-star-inserted"><span class="ng-tns-c2000434957-32">SQL</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-32 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
SHOW GRANTS FOR 'benutzername'@'localhost';

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-32 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="12" id="bkmrk--3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-32"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-32"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-ausgabe%3A-du-erh%C3%A4ltst" inline-copy-host=""><div>**Ausgabe:**</div><div>Du erhältst eine oder mehrere Zeilen mit `GRANT`-Befehlen, zum Beispiel:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-33 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="15" id="bkmrk-sql-3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-33"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-33"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-33 ng-star-inserted"><span class="ng-tns-c2000434957-33">SQL</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-33 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
GRANT ALL PRIVILEGES ON `meine_datenbank`.* TO `benutzername`@`localhost`;

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-33 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="15" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-33"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-33"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%28kopiere-alle-ausgeg" inline-copy-host=""><div>*(Kopiere alle ausgegebenen `GRANT`-Zeilen).*</div>  
</div>#### Schritt 3: Benutzer auf dem neuen Server anlegen

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-melde-dich-auf-dem-n" inline-copy-host=""><div>Melde dich auf dem **neuen Server** in MySQL an:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-34 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="18" id="bkmrk-bash-1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-34"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-34"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-34 ng-star-inserted"><span class="ng-tns-c2000434957-34">Bash</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-34 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
mysql -u root -p

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-34 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="18" id="bkmrk--5" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-34"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-34"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-f%C3%BCge-den-in-schritt-" inline-copy-host="">1. <div>Füge den in **Schritt 1** kopierten `CREATE USER`-Befehl ein und führe ihn aus.</div>
2. <div>Füge die in **Schritt 2** kopierten `GRANT`-Befehle ein und führe sie aus.</div>
3. <div>Aktualisiere die Rechtematrix:</div>

</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-35 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="21" id="bkmrk-sql-4" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-35"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-35"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-35 ng-star-inserted"><span class="ng-tns-c2000434957-35">SQL</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-35 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
FLUSH PRIVILEGES;

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-35 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="21" id="bkmrk--6" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-35"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-35"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--7" inline-copy-host=""></div>#### Alternative: Automatisiert über die Kommandozeile (für viele User)

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-wenn-du-den-benutzer" inline-copy-host=""><div>Wenn du den Benutzer direkt über ein Terminal-Einzeiler exportieren möchtest, kannst du `pt-show-grants` aus den **Percona Toolkit** nutzen oder `pt-show-grants` / `mysqldump` verwenden:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-36 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="24" id="bkmrk-bash-2" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-36"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-36"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-36 ng-star-inserted"><span class="ng-tns-c2000434957-36">Bash</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-36 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
# Exportiert CREATE USER und GRANT Statements direkt in eine SQL-Datei
mysql -u root -p -BN -e "SHOW CREATE USER 'benutzername'@'localhost';" > user_export.sql
mysql -u root -p -BN -e "SHOW GRANTS FOR 'benutzername'@'localhost';" >> user_export.sql

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-36 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="24" id="bkmrk--8" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8yYTUyOWJjMTIyNTA5MjQ2IiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY18wM2FlNGIxNzA2OWFkM2NmIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-36"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-36"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-diese-user_export.sq" inline-copy-host=""><div>Diese `user_export.sql` kannst du auf den neuen Server übertragen und mit `mysql -u root -p < user_export.sql` importieren.</div></div>

# mysql_native_password vs. caching_sha2_password

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-nein%2C-man-kann-den-p" inline-copy-host=""><div>**Nein, man kann den Passwort-Hash nicht umwandeln.**</div>  
<div>Das liegt an der Funktionsweise von kryptografischen Hashes: Sowohl `mysql_native_password` (SHA1-basiert) als auch `caching_sha2_password` (SHA-256-basiert) sind Einweg-Verschlüsselungen. Aus dem Hash auf dem alten Server lässt sich das ursprüngliche Klartext-Passwort mathematisch nicht wiederherstellen, um daraus den neuen SHA-256-Hash zu berechnen.</div>  
<div>Du hast in dieser Situation jedoch **zwei praktische Wege**:</div>  
</div>#### Option 1: Das alte Verfahren auf dem neuen Server aktivieren (Empfohlen, wenn Passwort unbekannt)

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-mysql-8.0-unterst%C3%BCtz" inline-copy-host=""><div>MySQL 8.0 unterstützt `mysql_native_password` weiterhin (in MySQL 8.0/8.4 ist es zwar deprecated oder als Plugin verfügbar, kann aber problemlos verwendet werden). Du kannst den User also **trotzdem mit seinem alten Hash anlegen**:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-37 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" id="bkmrk-sql" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80MTkzYjcyNTgzNDkwMTIxIiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY19hZjFiZjI1OWMwMmFlMjRhIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-37"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-37"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-37 ng-star-inserted"><span class="ng-tns-c2000434957-37">SQL</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-37 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
CREATE USER 'benutzername'@'localhost' 
  IDENTIFIED WITH mysql_native_password AS '*2470C0C21F792A758062C1D2543813E071372E97';

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-37 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="3" id="bkmrk-" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80MTkzYjcyNTgzNDkwMTIxIiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY19hZjFiZjI1OWMwMmFlMjRhIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-37"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-37"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%28ersetze-den-stern-s" inline-copy-host=""><div>*(Ersetze den Stern-String mit dem Hash aus deinem alten `SHOW CREATE USER`-Befehl).*</div>  
</div>> <div>**Hinweis:** Falls MySQL auf dem neuen Server meckert (`Plugin 'mysql_native_password' is not loaded`), musst du das Plugin in der Server-Konfiguration (`my.cnf` / `mysqld.cnf`) unter `[mysqld]` aktivieren:</div>  
> <div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-38 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="6" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80MTkzYjcyNTgzNDkwMTIxIiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY19hZjFiZjI1OWMwMmFlMjRhIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-38"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-38"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-38 ng-star-inserted"><span class="ng-tns-c2000434957-38">Ini, TOML</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-38 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
> [mysqld]
> mysql_native_password=ON
> 
> ```
> 
> <div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-38 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="6" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80MTkzYjcyNTgzNDkwMTIxIiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY19hZjFiZjI1OWMwMmFlMjRhIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-38"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-38"></div></div></div><div>Danach den MySQL-Dienst neu starten (`systemctl restart mysql`).</div>

#### Option 2: Neues Passwort mit `caching_sha2_password` vergeben

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-wenn-dir-das-passwor" inline-copy-host=""><div>Wenn dir das Passwort im Klartext bekannt ist (oder du ein neues vergeben kannst), erstelle den User direkt mit dem neuen Standard-Verfahren:</div>  
</div><div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-39 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="9" id="bkmrk-sql-1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80MTkzYjcyNTgzNDkwMTIxIiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY19hZjFiZjI1OWMwMmFlMjRhIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-39"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-39"><div _ngcontent-ng-c2000434957="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2000434957-39 ng-star-inserted"><span class="ng-tns-c2000434957-39">SQL</span><div _ngcontent-ng-c2000434957="" class="buttons ng-tns-c2000434957-39 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
CREATE USER 'benutzername'@'localhost' 
  IDENTIFIED WITH caching_sha2_password BY 'DeinNeuesOderAltesKlartextPasswort';

```

<div _ngcontent-ng-c2000434957="" class="code-block ng-tns-c2000434957-39 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="9" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl80MTkzYjcyNTgzNDkwMTIxIiwiY19kNTZjMWEyM2MzZmEzNzE3IixudWxsLCJyY19hZjFiZjI1OWMwMmFlMjRhIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c2000434957="" class="formatted-code-block-internal-container ng-tns-c2000434957-39"><div _ngcontent-ng-c2000434957="" class="animated-opacity ng-tns-c2000434957-39"></div></div></div><div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host=""></div>#### Fazit &amp; Vorgehen

<div _ngcontent-ng-c558000231="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-kennst-du-das-passwo" inline-copy-host="">- <div>**Kennst du das Passwort im Klartext?** → Nutze **Option 2** (sicherer und zukunftssicherer).</div>
- <div>**Kennst du das Passwort NICHT?** → Nutze **Option 1**, um den alten Hash direkt zu übernehmen.</div>

</div>