# 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>