

 Amazon Redshift unterstützt UDFs ab Patch 198 nicht mehr die Erstellung von neuem Python. Das bestehende Python UDFs wird bis zum 30. Juni 2026 weiterhin funktionieren. Weitere Informationen finden Sie im [Blog-Posting](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Laden von Daten in Amazon Redshift
<a name="t_Loading_data"></a>

Es gibt mehrere Möglichkeiten, Daten in eine Amazon-Redshift-Datenbank zu laden. Eine verbreitete Quelle, aus der Daten geladen werden, sind Amazon-S3-Dateien. In der folgenden Tabelle werden einige der Methoden zusammengefasst, die Sie verwenden können, um mit einer Amazon-S3-Quelle zu starten.


| Zu verwendende Methode | Description | Wenn eine Methode erforderlich ist | 
| --- | --- | --- | 
| Befehl COPY | Führt eine Batchdatei-Erfassung durch, um Daten aus Ihren Amazon-S3-Dateien zu laden. Diese Methode nutzt die Parallelverarbeitungsfunktionen von Amazon Redshift. Weitere Informationen finden Sie unter [Laden von Tabellen mit dem Befehl COPY](t_Loading_tables_with_the_COPY_command.md). | Sie sollte verwendet werden, wenn Basisanforderungen zum Laden von Daten erforderlich sind, um die manuelle Erfassung von Batchdateien einzuleiten. Diese Methode wird hauptsächlich für benutzerdefinierte und Drittanbieter-Pipelines für die Dateierfassung oder für einmalige oder Ad-hoc-Workloads zur Dateierfassung verwendet. | 
| COPY... Befehl CREATE JOB (automatisches Kopieren) | Führt Ihre COPY-Befehle automatisch aus, wenn eine neue Datei auf verfolgten Amazon-S3-Pfaden erstellt wird. Weitere Informationen finden Sie unter [Erstellen einer S3-Ereignisintegration, um Dateien automatisch aus Amazon-S3-Buckets zu kopieren](loading-data-copy-job.md). | Er sollte verwendet werden, wenn eine Dateierfassungs-Pipeline automatisch Daten aufnehmen muss, wenn eine neue Datei in Amazon S3 erstellt wird. Amazon Redshift verfolgt erfasste Dateien, um Datenduplizierungen zu verhindern. Diese Methode erfordert eine Konfiguration durch die Besitzer von Amazon-S3-Buckets. | 
| Aus Data-Lake-Abfragen laden | Erstellen Sie externe Tabellen, um Data-Lake-Abfragen für Ihre Amazon-S3-Dateien auszuführen. Führen Sie anschließend den Befehl INSERT INTO aus, um die Ergebnisse Ihrer Data-Lake-Abfragen in lokale Tabellen zu laden. Weitere Informationen finden Sie unter [Externe Tabellen für Redshift Spectrum](c-spectrum-external-tables.md). | Dies sollte in allen folgenden Szenarien verwendet werden:  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/t_Loading_data.html) | 
| Andere Methoden, die Sie in Betracht ziehen können | 
| Streaming-Erfassung  | Die Streaming-Erfassung ermöglicht das Erfassen von Stream-Daten mit geringer Latenz und hoher Geschwindigkeit aus Amazon Kinesis Data Streams und Amazon Managed Streaming für Apache Kafka in einer von Amazon Redshift bereitgestellten Ansicht oder einer materialisierten Amazon-Redshift-Serverless-Ansicht. Weitere Informationen erhalten Sie unter [Erste Schritte mit der Streaming-Erfassung aus Amazon Kinesis Data Streams](materialized-view-streaming-ingestion-getting-started.md) und [Erste Schritte mit der Streaming-Aufnahme aus Apache-Kafka-Quellen](materialized-view-streaming-ingestion-getting-started-MSK.md). | Sie sollte für Anwendungsfälle in Betracht gezogen werden, in denen Daten zuerst zu Dateien in Amazon S3 gestreamt und dann aus Amazon S3 geladen werden. Wenn keine Aufbewahrung von Daten in Amazon S3 erforderlich ist, können Sie häufig ein direktes Streaming Ihrer Daten in Amazon Redshift in Betracht ziehen.  | 
| Ausführen von Data-Lake-Abfragen | Die Ausführung von Abfragen direkt aus einer Data-Lake-Tabelle, anstatt den Inhalt der Tabelle in einer lokalen Tabelle zu erfassen. Weitere Informationen finden Sie unter [Amazon Redshift Spectrum](c-using-spectrum.md). | Diese Methode sollte verwendet werden, wenn der Anwendungsfall nicht die Leistung lokaler Tabellenabfragen in Amazon Redshift erfordert. | 
| Batch-Laden über Amazon Redshift Query Editor V2 | Sie können Ihre Workloads für die Batchdatei-Erfassung visuell in Amazon Redshift Query Editor V2 erstellen und ausführen. Weitere Informationen finden Sie unter [Laden von Daten aus S3](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-loading.html#query-editor-v2-loading-data) im *Managementleitfaden zu Amazon Redshift*. | Diese Methode sollte verwendet werden, wenn Sie COPY-Anweisungen in Query Editor V2 erstellen und ein visuelles Tool zur Vereinfachung der Erstellung der COPY-Anweisungen verwenden möchten. | 
| Laden von Daten aus einer lokalen Datei mit Amazon Redshift Query Editor V2 | Sie können Dateien direkt von Ihrem Desktop zu Amazon-Redshift-Tabellen hochladen, ohne Ihre Dateien manuell zu Amazon S3 hochladen zu müssen. Weitere Informationen finden Sie unter [Laden von Daten aus einer lokalen Datei – Einrichtung und Workflow](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-loading.html#query-editor-v2-loading-data-local) im *Managementleitfaden zu Amazon Redshift*. | Diese Methode sollte verwendet werden, wenn Sie schnell von Ihrem lokalen Computer Dateien laden müssen, um einmalige Abfragen auszuführen. Bei Verwendung dieser Methode speichert Amazon Redshift Query Editor V2 die Datei vorübergehend in einem kundeneigenen Amazon-S3-Bucket und führt einen Kopierbefehl unter Verwendung dieses Amazon-S3-Pfads aus. | 

Ein COPY-Befehl ist die effizienteste Methode für das Laden einer Tabelle. Sie können Ihren Tabellen Daten auch mittels des Befehls INSERT hinzufügen. Dies ist jedoch sehr viel weniger effizient als die Verwendung von COPY. Der Befehl COPY ist in der Lage, mehrere Datendateien oder mehrere Datenströme gleichzeitig zu lesen. Amazon Redshift teilt den Workload den Amazon-Redshift-Clusterknoten zu und führt die Ladeoperationen parallel aus, einschließlich des Sortierens der Zeilen und der Verteilung von Daten auf die Knoten-Slices.

**Anmerkung**  
Externe Tabellen von Amazon Redshift Spectrum sind schreibgeschützt. Sie können die Befehle COPY oder INSERT nicht für externe Tabellen ausführen.

Um auf Daten auf anderen AWS Ressourcen zugreifen zu können, benötigt Amazon Redshift die Erlaubnis, auf diese Ressourcen zuzugreifen und die erforderlichen Aktionen für den Zugriff auf die Daten durchzuführen. Sie können AWS Identity and Access Management (IAM) verwenden, um den Zugriff der Benutzer auf Amazon Redshift Redshift-Ressourcen und -Daten einzuschränken.

Wenn Sie nach dem ersten Laden von Daten eine erhebliche Menge von Daten hinzufügen, verändern oder löschen, sollten Sie anschließend einen VACUUM-Befehl ausführen, um Ihre Daten neu zu organisieren und Platz zurückzugewinnen. Sie sollten auch einen ANALYZE-Befehl ausführen, um die Tabellenstatistiken zu aktualisieren.

**Topics**
+ [Laden von Tabellen mit dem Befehl COPY](t_Loading_tables_with_the_COPY_command.md)
+ [Erstellen einer S3-Ereignisintegration, um Dateien automatisch aus Amazon-S3-Buckets zu kopieren](loading-data-copy-job.md)
+ [Laden von Tabellen mit DML-Befehlen](t_Updating_tables_with_DML_commands.md)
+ [Ausführen einer Deep Copy-Operation](performing-a-deep-copy.md)
+ [Analysieren von Tabellen](t_Analyzing_tables.md)
+ [Bereinigen von Tabellen](t_Reclaiming_storage_space202.md)
+ [Verwalten gleichzeitiger Schreiboperationen](c_Concurrent_writes.md)
+ [Tutorial: So laden Sie Daten aus Amazon S3](tutorial-loading-data.md)

# Laden von Tabellen mit dem Befehl COPY
<a name="t_Loading_tables_with_the_COPY_command"></a>

Der Befehl COPY nutzt die massive Parallelverarbeitungsarchitektur (Massively Parallel Processing, MPP) von Amazon Redshift, um Daten parallel aus Dateien in Amazon S3, DynamoDB-Tabellen oder Textausgaben von einem oder mehreren Remote-Hosts zu lesen und zu laden.

Bevor Sie sich mit allen Optionen des COPY-Befehls vertraut machen, sollten Sie die grundlegenden Optionen für das Laden von Amazon-S3-Daten erlernen. Das Handbuch *Erste Schritte mit Amazon Redshift* zeigt eine einfache Verwendung des COPY-Befehls zum Laden von Amazon-S3-Daten über eine IAM-Standardrolle. Details hierzu finden Sie in [Schritt 4: Daten aus Amazon S3 in Amazon Redshift laden](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html).

**Anmerkung**  
Es wird nachdrücklich empfohlen, den Befehl COPY zu verwenden, um große Mengen von Daten zu laden. Die Verwendung einzelner INSERT-Anweisungen, um eine Tabelle auszufüllen, kann äußerst langsam sein. Wenn Ihre Daten in anderen Amazon-Redshift-Datenbanktabellen bereits vorhanden sind, können Sie alternativ den Befehl INSERT INTO ... verwenden. SELECT oder CREATE TABLE AS verwenden, um die Leistung zu verbessern. Weitere Informationen finden Sie unter [INSERT](r_INSERT_30.md) oder [CREATE TABLE AS](r_CREATE_TABLE_AS.md).

Um Daten von einer anderen AWS Ressource zu laden, muss Amazon Redshift über die Berechtigung verfügen, auf die Ressource zuzugreifen und die erforderlichen Aktionen auszuführen. 

Um das Recht zum Laden von Daten in eine Tabelle mittels eines COPY-Befehls zu gewähren oder zu widerrufen, gewähren oder widerrufen Sie das INSERT-Recht.

Ihre Daten müssen das korrekte Format für das Laden in Ihre Amazon-Redshift-Tabelle besitzen. In diesem Abschnitt werden Richtlinien für die Vorbereitung und Verifizierung Ihrer Daten vor dem Laden und für die Validierung einer COPY-Anweisung vor der Ausführung beschrieben.

Um die Informationen in Ihren Dateien zu schützen, können Sie die Datendateien vor dem Hochladen zu Ihrem Amazon S3 Bucket verschlüsseln. COPY entschlüsselt die Daten während des Ladevorgangs. Sie können auch den Zugriff auf die Ladedaten einschränken, indem Sie Benutzern temporäre Sicherheitsanmeldeinformationen bereitstellen. Temporäre Sicherheitsanmeldedaten bieten erweiterte Sicherheit, da sie nur kurzlebig sind und nach ihrem Ablauf nicht erneut verwendet werden können.

Amazon Redshift verfügt über Funktionen, die in COPY integriert sind, damit unkomprimierte, getrennte Daten schnell geladen werden können. Sie können aber die Dateien mittels gzip, lzop, oder bzip2 komprimieren, um während des Hochladens der Dateien Zeit zu sparen.

Wenn die folgenden Schlüsselwörter in der COPY-Abfrage enthalten sind, wird das automatische Aufteilen unkomprimierter Daten nicht unterstützt: ESCAPE, REMOVEQUOTES und FIXEDWIDTH. Das CSV-Schlüsselwort wird jedoch unterstützt.

Um die Sicherheit Ihrer Daten bei der Übertragung innerhalb der AWS Cloud zu gewährleisten, verwendet Amazon Redshift hardwarebeschleunigtes SSL für die Kommunikation mit Amazon S3 oder Amazon DynamoDB für KOPIER-, ENTLADEN-, Sicherungs- und Wiederherstellungsvorgänge.

Wenn Sie Ihre Tabelle direkt aus einer Amazon-DynamoDB-Tabelle laden, können Sie die Menge des von Amazon DynamoDB bereitgestellten Durchsatzes steuern, den Sie nutzen.

Sie können optional mittels COPY die Eingabedaten analysieren und als Teil des Ladeprozesses automatisch optimierte Kompressionskodierungen auf Ihre Tabelle anwenden.

**Topics**
+ [Anmeldeinformationen und Zugriffsberechtigungen](loading-data-access-permissions.md)
+ [Vorbereiten der Eingabedaten](t_preparing-input-data.md)
+ [So laden Sie Daten aus Amazon S3](t_Loading-data-from-S3.md)
+ [So laden Sie Daten aus Amazon EMR:](loading-data-from-emr.md)
+ [Laden von Daten aus Remote-Hosts](loading-data-from-remote-hosts.md)
+ [Laden von Daten aus einer Amazon-DynamoDB-Tabelle](t_Loading-data-from-dynamodb.md)
+ [Überprüfung, ob die Daten korrekt geladen wurden](verifying-that-data-loaded-correctly.md)
+ [Validieren von Eingabedaten](t_Validating_input_files.md)
+ [Laden von Tabellen mit automatischer Kompression](c_Loading_tables_auto_compress.md)
+ [Optimieren des Speichers für enge Tabellen](c_load_compression_hidden_cols.md)
+ [Laden von Standardspaltenwerten](c_loading_default_values.md)
+ [Fehlerbehebung bei Datenladevorgängen](t_Troubleshooting_load_errors.md)

# Anmeldeinformationen und Zugriffsberechtigungen
<a name="loading-data-access-permissions"></a>

 Um Daten mithilfe einer anderen AWS Ressource wie Amazon S3, Amazon DynamoDB, Amazon EMR oder Amazon EC2 zu laden oder zu entladen, benötigt Amazon Redshift die Erlaubnis, auf die Ressource zuzugreifen und die erforderlichen Aktionen auszuführen, um auf die Daten zuzugreifen. Um beispielsweise Daten aus Amazon S3 zu laden, muss COPY über LIST-Zugriff auf den Bucket und GET-Zugriff auf die Bucket-Objekte verfügen. 

Um die Autorisierung für den Zugriff auf eine Ressource zu erhalten, muss Amazon Redshift authentifiziert werden. Sie können eine rollenbasierte Zugriffssteuerung oder eine schlüsselbasierte Zugriffssteuerung wählen. Dieser Abschnitt bietet eine Übersicht über die beiden Methoden. Weitere Details und Beispiele finden Sie unter [Berechtigungen AWS für den Zugriff auf andere Ressourcen](copy-usage_notes-access-permissions.md).

## Rollenbasierte Zugriffskontrolle
<a name="loading-data-access-role-based"></a>

Bei einer rollenbasierten Zugriffssteuerung übernimmt Amazon Redshift in Ihrem Namen eine AWS Identity and Access Management (IAM)-Rolle. Basierend auf den für die Rolle erteilten Autorisierungen kann Amazon Redshift dann auf die erforderlichen AWS Ressourcen zugreifen.

Wir empfehlen die Verwendung einer rollenbasierten Zugriffskontrolle, da sie zusätzlich zum Schutz Ihrer Anmeldeinformationen eine sicherere und detailliertere Steuerung des Zugriffs auf AWS Ressourcen und vertrauliche Benutzerdaten ermöglicht. AWS 

Um die rollenbasierte Zugriffssteuerung zu verwenden, müssen Sie zunächst unter Verwendung des Amazon-Redshift-Servicerollentyps eine IAM-Rolle erstellen und die Rolle anschließend Ihrem Data Warehouse hinzufügen. Die Rolle muss mindestens die in aufgelisteten Berechtigungen besitzen [IAM-Berechtigungen für COPY, UNLOAD und CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions). Schritte zum Erstellen einer IAM-Rolle und zum Anhängen dieser Rolle an Ihren Cluster finden Sie unter [Creating an IAM Role to Allow Your Amazon Redshift Cluster to Access AWS Services](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-creating-an-iam-role) im *Amazon Redshift* Management Guide.

Sie können über die Amazon-Redshift-Managementkonsole, die CLI oder eine API einem Cluster eine Rolle hinzufügen oder die Rollen anzeigen, die mit einem Cluster verknüpft sind. Weitere Informationen finden Sie unter [Authorizing COPY and UNLOAD Operations Using IAM Roles](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) (Autorisierung von COPY- und UNLOAD-Operationen mit IAM-Rollen) im *Amazon-Redshift-Verwaltungshandbuch*.

Beim Erstellen einer IAM-Rolle gibt IAM einen Amazon-Ressourcennamen (ARN) für die Rolle zurück. Um unter Verwendung einer IAM-Rolle einen COPY-Befehl auszuführen, geben Sie unter Verwendung der Parameter IAM\$1ROLE oder CREDENTIALS den ARN der Rolle an.

Im folgenden Beispiel für den COPY-Befehl wird der Parameter IAM\$1ROLE mit der Rolle `MyRedshiftRole` zur Authentifizierung verwendet.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
IAM_ROLE 'arn:aws:iam::12345678901:role/MyRedshiftRole';
```

Der AWS Benutzer muss mindestens über die unter aufgeführten Berechtigungen verfügen. [IAM-Berechtigungen für COPY, UNLOAD und CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)

## Schlüsselbasierte Zugriffssteuerung
<a name="loading-data-access-key-based"></a>

Bei der schlüsselbasierten Zugriffskontrolle geben Sie die Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel für einen Benutzer an, der berechtigt ist, auf die AWS Ressourcen zuzugreifen, die die Daten enthalten. 

**Anmerkung**  
Es wird nachdrücklich empfohlen, eine IAM-Rolle für die Authentifizierung zu verwenden, statt eine Zugriffsschlüssel-ID und einen geheimen Zugriffsschlüssel im Textformat bereitzustellen. Wenn Sie sich für die schlüsselbasierte Zugriffskontrolle entscheiden, verwenden Sie niemals Ihre AWS Kontoanmeldeinformationen (Root). Erstellen Sie stets einen IAM-Benutzer und geben Sie die Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel für diesen Benutzer an. Schritte zum Erstellen eines IAM-Benutzers finden Sie unter [Erstellen eines IAM-Benutzers in Ihrem AWS -Konto](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html).

# Vorbereiten der Eingabedaten
<a name="t_preparing-input-data"></a>

Wenn die Eingabedaten nicht mit den Tabellenspalten kompatibel sind, die diese erhalten, wird der COPY-Befehl fehlschlagen.

Wenden Sie die folgenden Richtlinien an, um sicherzustellen, dass die Eingabedaten gültig sind: 
+ Die Daten dürfen nur UTF-8-Zeichen mit höchstens vier Bytes enthalten.
+ Überprüfen Sie, ob CHAR- und VARCHAR-Zeichenfolgen die Länge der entsprechenden Spalten nicht überschreiten. VARCHAR-Zeichenfolgen werden in Bytes und nicht in Zeichen gemessen. Daher erfordert eine Zeichenfolge mit vier chinesischen Zeichen, die jeweils vier Bytes enthalten, eine VARCHAR(16)-Spalte.
+ Multibyte-Zeichen können nur mit VARCHAR-Spalten verwendet werden. Überprüfen Sie, ob Multibyte-Zeichen nicht mehr als vier Bytes enthalten.
+ Überprüfen Sie, ob Daten für CHAR-Spalten nur Einzelbyte-Zeichen enthalten.
+ Verwenden Sie keine Sonderzeichen oder eine spezielle Syntax, um das letzte Feld in einem Datensatz anzuzeigen. Dieses Feld kann ein Trennzeichen sein.
+ Wenn Ihre Daten Null-Terminatoren enthalten, auch als NUL (UTF-8 0000) oder Binär-Null (0x000) bezeichnet, können Sie diese Zeichen als NULL-Werte in CHAR- oder VARCHAR-Spalten laden, indem Sie die Option NULL AS im COPY-Befehl verwenden: `null as '\0'` oder `null as '\000'`. Wenn Sie NULL AS nicht verwenden, schlägt COPY fehl, wenn Null-Terminatoren vorhanden sind.
+ Wenn Ihre Zeichenfolgen Sonderzeichen wie Trennzeichen und eingebettete neue Zeilen enthalten, verwenden Sie die ESCAPE-Option des [COPY](r_COPY.md)-Befehls.
+ Überprüfen Sie, ob alle einfachen und doppelten Anführungszeichen korrekt übereinstimmen.
+ Überprüfen Sie, ob Gleitkomma-Zeichenfolgen das Gleitkomma-Standardformat, beispielsweise 12.123, oder ein exponentielles Format, beispielsweise 1.0E4, aufweisen.
+ Überprüfen Sie, ob alle Zeitstempel- und Datumszeichenfolgen die Spezifikationen für befolgen [DATEFORMAT- und TIMEFORMAT-ZeichenfolgenBeispiel](r_DATEFORMAT_and_TIMEFORMAT_strings.md). Das Standardformat für Zeitstempel ist YYYY-MM-DD hh:mm:ss und das Standard-Datumsformat ist. YYYY-MM-DD
+ Weitere Informationen zu Grenzen und Einschränkungen für einzelne Datentypen finden Sie unter [Datentypen](c_Supported_data_types.md). Weitere Informationen zu Fehlern für Multibyte-Zeichen finden Sie unter . [Fehler beim Laden von Multibyte-Zeichen](multi-byte-character-load-errors.md)

# So laden Sie Daten aus Amazon S3
<a name="t_Loading-data-from-S3"></a>

Der Befehl COPY nutzt die massive Parallelverarbeitungsarchitektur (Massively Parallel Processing, MPP) von Amazon Redshift, um Daten parallel aus einer Datei oder mehreren Dateien in einem Amazon S3 Bucket zu lesen und zu laden. Sie können maximal von der Parallelverarbeitung profitieren, indem Sie Ihre Daten in mehrere Dateien aufteilen, wenn die Dateien komprimiert sind. (Es gibt Ausnahmen von dieser Regel. Diese werden unter [Laden von Datendateien](https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-use-multiple-files.html) ausführlich beschrieben.) Sie können auch maximal von der Parallelverarbeitung profitieren, indem Sie für Ihre Tabellen Verteilungsschlüssel festlegen. Weitere Informationen zu Verteilungsschlüsseln finden Sie unter [Datenverteilung zur Abfrageoptimierung](t_Distributing_data.md). 

Die Daten werden Zeile für Zeile in die Zieltabelle geladen. Die Felder in der Datendatei stimmen mit den Tabellenspalten von links nach rechts überein. Die Felder in den Datendateien können eine feste Breite oder durch Zeichen abgetrennt sein. Das Standardtrennzeichen ist das Pipe-Zeichen (\$1). Standardmäßig werden alle Tabellenspalten geladen. Sie können jedoch optional eine durch Komma getrennte Liste von Spalten definieren. Wenn eine Tabellenspalte nicht in der Liste der Spalten enthalten ist, die im COPY-Befehl angegeben ist, wird sie mit einem Standardwert geladen. Weitere Informationen finden Sie unter [Laden von Standardspaltenwerten](c_loading_default_values.md).

**Topics**
+ [Laden von Daten aus komprimierten und unkomprimierten Dateien](t_splitting-data-files.md)
+ [Hochladen von Dateien zu Amazon S3 zur Verwendung mit COPY](t_uploading-data-to-S3.md)
+ [Verwenden des COPY-Befehls zum Laden aus Amazon S3](t_loading-tables-from-s3.md)

# Laden von Daten aus komprimierten und unkomprimierten Dateien
<a name="t_splitting-data-files"></a>

Wenn Sie komprimierte Daten laden, empfehlen wir, die Daten für jede Tabelle in mehrere Dateien aufzuteilen. Wenn Sie unkomprimierte, getrennte Daten laden, verwendet der COPY-Befehl die massiv parallele Verarbeitung (MPP) und Scanbereiche, um Daten aus großen Dateien in einen Amazon S3 Bucket zu laden.

## Laden von Daten aus mehreren komprimierten Dateien
<a name="t_splitting-data-files-compressed"></a>

In Fällen, in denen Sie komprimierte Daten haben, empfehlen wir, die Daten für jede Tabelle in mehrere Dateien aufzuteilen. Der COPY-Befehl kann Daten aus mehreren Dateien parallel laden. Sie können mehrere Dateien durch die Angabe eines gemeinsamen Präfixes bzw. *Präfixschlüssels* für den Satz oder durch die explizite Auflistung der Dateien in einer Manifestdatei laden.

Teilen Sie die Daten so in Dateien auf, dass die Anzahl der Dateien ein Vielfaches der Anzahl der Slices in Ihrem Cluster ist. Auf diese Weise kann Amazon Redshift die Daten gleichmäßig über die Slices verteilen. Die Anzahl der Slices pro Knoten ist von der Knotengröße des Clusters abhängig. Beispielsweise besitzt jeder Datenverarbeitungsknoten des Typs dc2.large zwei Slices. Jeder Datenverarbeitungsknoten des Typs dc2.8xlarge hat 16 Slices. Weitere Informationen zur Anzahl der Slices für die einzelnen Knotengrößen finden Sie unter [About Clusters and Nodes](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-about-clusters-and-nodes) (Informationen zu Clustern und Knoten) im *Managementleitfaden zu Amazon Redshift*. 

Die Knoten sind alle an der parallelen Abfrageausführung beteiligt und arbeiten mit Daten, die so gleichmäßig wie möglich über die Slices verteilt sind. Wenn Sie über einen Cluster mit zwei dc2.large-Knoten verfügen, können Sie Ihre Daten in vier Dateien oder ein Vielfaches von vier teilen. Amazon Redshift berücksichtigt die Dateigröße beim Aufteilen des Workloads nicht. Deshalb müssen Sie dafür sorgen, dass die Dateien ungefähr die gleiche Größe haben, nach der Komprimierung von 1 MB bis 1 GB. 

Wenn Sie Objektpräfixe zur Bezeichnung der Ladedateien verwenden möchten, benennen Sie die einzelnen Dateien mit einem gemeinsamen Präfix. Beispielsweise können Sie die Datei `venue.txt` wie folgt in vier Dateien aufteilen.

```
venue.txt.1
venue.txt.2
venue.txt.3
venue.txt.4
```

Wenn Sie mehrere Dateien in einen Ordner in Ihrem Bucket ablegen und den Ordnernamen als Präfix angeben, lädt COPY alle Dateien in diesem Ordner. Wenn Sie die Dateien, die geladen werden sollen, explizit in einer Manifestdatei auflisten, können sich die Dateien in verschiedenen Buckets oder Ordnern befinden.

Weitere Informationen zu Manifestdateien finden Sie unter [Verwenden eines Manifests für die Angabe von Datendateien](r_COPY_command_examples.md#copy-command-examples-manifest).

## Laden von Daten aus unkomprimierten, getrennten Dateien
<a name="t_splitting-data-files-uncompressed"></a>

Wenn Sie unkomprimierte, getrennte Daten laden, verwendet der COPY-Befehl die Architektur für die massiv parallele Verarbeitung (Massively Parallel Processing, MPP) in Amazon Redshift. Amazon Redshift verwendet automatisch parallel arbeitende Slices, um Datenbereiche aus einer großen Datei in einen Amazon S3 Bucket zu laden. Die Datei muss getrennt sein, damit ein paralleles Laden stattfindet. Zum Beispiel durch Pipe-Zeichen (\$1) getrennt. Das automatische, parallele Laden von Daten mit dem Befehl COPY ist auch für CSV-Dateien verfügbar. Sie können auch von der Parallelverarbeitung profitieren, indem Sie für Ihre Tabellen Verteilungsschlüssel festlegen. Weitere Informationen zu Verteilungsschlüsseln finden Sie unter [Datenverteilung zur Abfrageoptimierung](t_Distributing_data.md).

Das automatische, parallele Laden von Daten wird nicht unterstützt, wenn die COPY-Abfrage eines der folgenden Schlüsselwörter enthält: ESCAPE, REMOVEQUOTES und FIXEDWIDTH.

Die Daten aus der Datei oder den Dateien werden Zeile für Zeile in die Zieltabelle geladen. Die Felder in der Datendatei stimmen mit den Tabellenspalten von links nach rechts überein. Die Felder in den Datendateien können eine feste Breite oder durch Zeichen abgetrennt sein. Das Standardtrennzeichen ist das Pipe-Zeichen (\$1). Standardmäßig werden alle Tabellenspalten geladen. Sie können jedoch optional eine durch Komma getrennte Liste von Spalten definieren. Wenn eine Tabellenspalte nicht in der Liste der Spalten enthalten ist, die im COPY-Befehl angegeben ist, wird sie mit einem Standardwert geladen. Weitere Informationen finden Sie unter [Laden von Standardspaltenwerten](c_loading_default_values.md).

Befolgen Sie für das Laden von Daten aus Amazon S3 diesen allgemeinen Prozess, wenn Ihre Daten unkomprimiert und getrennt sind:

1. Laden Sie Ihre Dateien in Amazon S3 hoch.

1. Führen Sie einen COPY-Befehl aus, um die Tabelle zu laden. 

1. Überprüfen Sie, ob die Daten korrekt geladen wurden.

Beispiele für COPY-Befehle finden Sie unter [Beispiele für COPY](r_COPY_command_examples.md). Weitere Informationen zu Daten, die in Amazon Redshift geladen wurden, finden Sie in den [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md)- und [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md)-Systemtabellen. 

Weitere Informationen zu Knoten und den darin enthaltenen Slices finden Sie unter [Informationen zu Clustern und Knoten](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-about-clusters-and-nodes) im *Amazon-Redshift-Verwaltungshandbuch*.

# Hochladen von Dateien zu Amazon S3 zur Verwendung mit COPY
<a name="t_uploading-data-to-S3"></a>

Beim Hochladen von Textdateien auf Amazon S3 gibt es mehrere verschiedene Ansätze:
+ Wenn Sie komprimierte Dateien haben, wird empfohlen, große Dateien aufzuteilen, um von den Vorteilen der Parallelverarbeitung in Amazon Redshift zu profitieren.
+ Andererseits teilt COPY automatisch große, unkomprimierte, durch Text getrennte Dateidaten auf, um die Parallelität zu erleichtern und die Daten effektiv aus großen Dateien zu verteilen.

Erstellen Sie einen Amazon S3 Bucket für Ihre Datendateien und laden Sie anschließend die Datendateien zum Bucket hoch. Weitere Informationen zum Erstellen von Buckets und Hochladen von Dateien finden Sie unter [Arbeiten mit Amazon S3 Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html) im *Benutzerhandbuch von Amazon Simple Storage Service.* 

**Wichtig**  
Der Amazon-S3-Bucket, der die Datendateien enthält, muss in derselben AWS -Region wie Ihr Cluster erstellt werden, es sei denn, Sie verwenden die Option [REGION](copy-parameters-data-source-s3.md#copy-region), um die Region anzugeben, in der sich der Amazon-S3-Bucket befindet.

Stellen Sie sicher, dass die S3-IP-Bereiche zu Ihrer Zulassungsliste hinzugefügt werden. Weitere Informationen zu den erforderlichen S3-IP-Bereichen finden Sie unter [Netzwerkisolierung](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation).

Sie können einen Amazon-S3-Bucket in einer bestimmten Region erstellen, indem Sie entweder bei der Erstellung des Buckets die Region über die Amazon-S3-Konsole auswählen oder indem Sie einen Endpunkt angeben, wenn Sie den Bucket mithilfe der Amazon-S3-API oder -CLI erstellen.

Überprüfen Sie nach dem Laden der Daten, ob sich die korrekten Dateien in Amazon S3 befinden.

**Topics**
+ [Verwalten der Datenkonsistenz](managing-data-consistency.md)
+ [Hochladen verschlüsselter Daten in Amazon S3](t_uploading-encrypted-data.md)
+ [Überprüfen, ob sich die korrekten Dateien in Ihrem Bucket befinden](verifying-that-correct-files-are-present.md)

# Verwalten der Datenkonsistenz
<a name="managing-data-consistency"></a>

Amazon S3 bietet eine hohe read-after-write Konsistenz für COPY-, UNLOAD-, INSERT- (externe Tabelle), CREATE EXTERNAL TABLE AS- und Amazon Redshift Spectrum Spectrum-Operationen auf Amazon S3 S3-Buckets in allen Regionen. AWS Darüber hinaus sind Lesevorgänge in Amazon S3 Select, Amazon-S3-Zugriffskontrolllisten, Amazon-S3-Objekt-Markierungen und Objekt-Metadaten (z. B. HEAD-Objekt) stark konsistent. Ausführlichere Informationen zur Datenkonsistenz finden Sie unter [Amazon-S3- Datenkonsistenzmodell](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Introduction.html#ConsistencyModel) im *Benutzerhandbuch von Amazon Simple Storage Service*.

# Hochladen verschlüsselter Daten in Amazon S3
<a name="t_uploading-encrypted-data"></a>

Amazon S3 unterstützt sowohl die serverseitige als auch die clientseitige Verschlüsselung. In diesem Thema werden die Unterschiede zwischen serverseitiger und clientseitiger Verschlüsselung behandelt und die Schritte beschrieben, die Sie ausführen müssen, um für Amazon Redshift die clientseitige Verschlüsselung zu verwenden. Die serverseitige Verschlüsselung ist für Amazon Redshift transparent. 

## Server-side encryption
<a name="server-side-encryption"></a>

Die serverseitige Verschlüsselung betrifft die Datenverschlüsselung in Ruhe , das heißt, Amazon S3 verschlüsselt Ihre Daten, während es sie in seine Rechenzentren schreibt, und entschlüsselt sie für Sie, wenn Sie darauf zugreifen. Wenn Sie Tabellen mittels eines COPY-Befehls laden, gibt es in Bezug auf die Art und Weise des Ladens aus serverseitig verschlüsselten oder nicht verschlüsselten Objekten in Amazon S3 keinen Unterschied. Weitere Informationen zur Datenverschlüsselung mittels serverseitiger Verschlüsselung finden Sie unter [Verwendung serverseitiger Verschlüsselung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html) im *Benutzerhandbuch von Amazon Simple Storage Service*.

## Clientseitige Verschlüsselung
<a name="client-side-encryption"></a>

Bei der clientseitigen Verschlüsselung verwaltet Ihre Clientanwendung die Verschlüsselung Ihrer Daten, die Verschlüsselungsschlüssel und die entsprechenden Tools. Sie können Daten unter Verwendung einer clientseitigen Verschlüsselung zu einem Amazon S3 Bucket hochladen und die Daten anschließend mittels des Befehls COPY mit der Option ENCRYPTED und eines privaten Verschlüsselungsschlüssels laden, um größere Sicherheit zu erzielen.

Sie verschlüsseln Ihre Daten mittels einer Envelope-Verschlüsselung. Mittels einer *Envelope-Verschlüsselung* verarbeitet ausschließlich Ihre Anwendung die gesamte Verschlüsselung. Ihre privaten Verschlüsselungsschlüssel und Ihre unverschlüsselten Daten werden niemals an Dritte gesendet. Daher ist es sehr wichtig AWS, dass Sie Ihre Verschlüsselungsschlüssel sicher verwalten. Wenn Sie Ihre Verschlüsselungsschlüssel verlieren, können Sie Ihre Daten nicht mehr entschlüsseln, und Sie können Ihre Verschlüsselungsschlüssel von nicht wiederherstellen. AWS Die Envelope-Verschlüsselung kombiniert die Leistung einer schnellen symmetrischen Verschlüsselung mit der größeren Sicherheit, die eine Schlüsselverwaltung mit asymmetrischen Schlüsseln bietet. Ein one-time-use symmetrischer Schlüssel (der symmetrische Envelope-Schlüssel) wird von Ihrem Amazon S3-Verschlüsselungsclient generiert, um Ihre Daten zu verschlüsseln. Anschließend wird dieser Schlüssel mit Ihrem Root-Schlüssel verschlüsselt und zusammen mit Ihren Daten in Amazon S3 gespeichert. Wenn Amazon Redshift während eines Ladevorgangs auf Ihre Daten zugreift, wird der verschlüsselte symmetrische Schlüssel abgerufen und mit Ihrem echten Schlüssel entschlüsselt. Anschließend werden die Daten entschlüsselt.

Um in Amazon Redshift mit clientseitig verschlüsselten Amazon-S3-Daten zu arbeiten, befolgen Sie die in [Schutz von Daten mittels clientseitiger Verschlüsselung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html) im *Benutzerhandbuch von Amazon Simple Storage Service* beschriebenen Schritte. Zusätzlich müssen Sie Folgendes verwenden:
+ **Symmetrische Verschlüsselung** Die Klasse AWS SDK for Java `AmazonS3EncryptionClient` verwendet die zuvor beschriebene Envelope-Verschlüsselung, die auf einer symmetrischen Schlüsselverschlüsselung basiert. Verwenden Sie diese Klasse, um einen Amazon-S3-Client für das Hochladen von clientseitig verschlüsselten Daten zu erstellen.
+ **Symmetrischer 256-Bit-AES-Root-Schlüssel** Ein Root-Schlüssel verschlüsselt den Envelope-Schlüssel. Sie übergeben den Root-Schlüssel an Ihre Instance der Klasse `AmazonS3EncryptionClient`. Speichern Sie diesen Schlüssel, da Sie diesen benötigen, um Daten zu Amazon Redshift zu kopieren.
+ **Objektmetadaten zum Speichern des verschlüsselten Envelope-Schlüssels** Standardmäßig speichert Amazon S3 den Envelope-Schlüssel in Form von Objektmetadaten für die `AmazonS3EncryptionClient`-Klasse. Der in Form von Objektmetadaten gespeicherte verschlüsselte Envelope-Schlüssel wird während des Entschlüsselungsprozesses verwendet. 

**Anmerkung**  
Wenn Sie während der ersten Verwendung der Verschlüsselungs-API eine Verschlüsselungsfehlermeldung erhalten, enthält Ihre Version des JDK möglicherweise eine Java Cryptography Extension (JCE)-Jurisdiktionsrichtlinie, die die maximale Schlüssellänge für Verschlüsselungs- und Entschlüsselungstransformationen auf 128 Bits begrenzt. Informationen zur Behebung dieses Problems finden Sie [unter Spezifizierung der clientseitigen Verschlüsselung mithilfe des AWS SDK for Java](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryptionUpload.html) im *Amazon Simple Storage Service-Benutzerhandbuch*. 

Weitere Informationen zum Laden von clientseitig verschlüsselten Dateien in Ihre Amazon-Redshift-Tabellen unter Verwendung des Befehls COPY finden Sie unter [Laden verschlüsselter Datendateien aus Amazon S3](c_loading-encrypted-files.md).

## Beispiel: Hochladen von clientseitig verschlüsselten Daten
<a name="client-side-encryption-example"></a>

Ein Beispiel für die Verwendung des AWS SDK for Java zum Hochladen von clientseitig verschlüsselten Daten finden Sie unter [Schützen von Daten mit clientseitiger Verschlüsselung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/encrypt-client-side-symmetric-master-key.html) im *Amazon Simple Storage* Service-Benutzerhandbuch. 

In der zweiten Option werden die Entscheidungen gezeigt, die Sie während der clientseitigen Verschlüsselung treffen müssen, damit die Daten in Amazon Redshift geladen werden können. Insbesondere zeigt das Beispiel die Verwendung von Objektmetadaten für das Speichern des verschlüsselten Envelope-Schlüssels und die Verwendung eines symmetrischen 256-Bit-AES-Root-Schlüssels. 

Dieses Beispiel enthält Beispielcode, der das AWS SDK for Java verwendet, um einen symmetrischen 256-Bit-AES-Stammschlüssel zu erstellen und ihn in einer Datei zu speichern. Anschließend wird mittels eines S3-Verschlüsselungsclients, der die Beispieldaten zunächst clientseitig verschlüsselt, ein Objekt zu Amazon S3 hochgeladen. Das Beispiel zeigt auch den Download des Objekts und die Überprüfung, ob die Daten identisch ist.

# Überprüfen, ob sich die korrekten Dateien in Ihrem Bucket befinden
<a name="verifying-that-correct-files-are-present"></a>

Nachdem Sie Ihre Dateien zu Ihrem Amazon S3 Bucket hochgeladen haben, sollten Sie die Inhalte des Buckets auflisten, um zu überprüfen, ob alle korrekten Dateien vorhanden sind und keine unerwünschten Dateien vorhanden sind. Wenn beispielsweise der Bucket `amzn-s3-demo-bucket` eine Datei namens `venue.txt.back` enthält, wird diese Datei (vielleicht unbeabsichtigt) durch den folgenden Befehl geladen:

```
COPY venue FROM 's3://amzn-s3-demo-bucket/venue' … ;
```

Wenn Sie spezifisch kontrollieren möchten, welche Dateien geladen werden, können Sie eine Manifestdatei verwenden, um die Datendateien explizit aufzulisten. Weitere Informationen zur Verwendung einer Manifestdatei finden Sie in der Beschreibung der [copy_from_s3_manifest_file](copy-parameters-data-source-s3.md#copy-manifest-file)-Option für den COPY-Befehl und unter [Verwenden eines Manifests für die Angabe von Datendateien](r_COPY_command_examples.md#copy-command-examples-manifest) in den Beispielen für COPY. 

Weitere Informationen zum Auflisten der Inhalte des Buckets finden Sie unter [Listing Object Keys](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ListingKeysUsingAPIs.html) (Auflisten von Objektschlüsseln) im *Amazon-S3-Entwicklerhandbuch*.

# Verwenden des COPY-Befehls zum Laden aus Amazon S3
<a name="t_loading-tables-from-s3"></a>

Verwenden Sie den [COPY](r_COPY.md)-Befehl, um eine Tabelle parallel aus Datendateien in Amazon S3 zu laden. Sie können die Dateien, die geladen werden sollen, durch Verwendung eines Amazon-S3-Objektpräfixes oder einer Manifestdatei angeben.

Die Syntax für die Angabe der Dateien, die unter Verwendung eines Präfixes geladen werden sollen, ist wie folgt:

```
COPY <table_name> FROM 's3://<bucket_name>/<object_prefix>'
authorization;
```

 Die Manifestdatei ist eine Datei im JSON-Format, die die Datendateien auflistet, die geladen werden sollen. Die Syntax für die Angabe der Dateien, die unter Verwendung einer Manifestdatei geladen werden sollen, ist wie folgt:

```
COPY <table_name> FROM 's3://<bucket_name>/<manifest_file>'
authorization
MANIFEST;
```

Die Tabelle, die geladen werden soll, muss in der Datenbank bereits vorhanden sein. Informationen zum Erstellen einer Tabelle finden Sie unter [CREATE TABLE](r_CREATE_TABLE_NEW.md) in der SQL-Referenz. 

Die Werte für die *Autorisierung* stellen die AWS Autorisierung bereit, die Amazon Redshift für den Zugriff auf die Amazon S3 S3-Objekte benötigt. Weitere Informationen zu den erforderlichen Berechtigungen finden Sie unter [IAM-Berechtigungen für COPY, UNLOAD und CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions). Die bevorzugte Methode für die Authentifizierung besteht in der Angabe des Parameters IAM\$1ROLE und des Amazon-Ressourcennamens (ARN) für eine IAM-Rolle mit den notwendigen Berechtigungen. Weitere Informationen finden Sie unter [Rollenbasierte Zugriffskontrolle](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) . 

Um sich mit dem Parameter IAM\$1ROLE zu authentifizieren, ersetzen Sie *<aws-account-id>* und *<role-name>* wie in der folgenden Syntax dargestellt. 

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```

Das folgende Beispiel zeigt die Authentifizierung unter Verwendung einer IAM-Rolle.

```
COPY customer 
FROM 's3://amzn-s3-demo-bucket/mydata' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Weitere Informationen zu anderen Autorisierungsoptionen finden Sie unter . [Autorisierungsparameter](copy-parameters-authorization.md)

Wenn Sie Ihre Daten validieren möchten, ohne die Tabelle tatsächlich zu laden, verwenden Sie die Option NOLOAD mit dem Befehl [COPY](r_COPY.md).

Das folgende Beispiel zeigt die ersten wenigen Zeilen mit durch Pipe-Zeichen getrennten Daten in einer Datei namens `venue.txt`.

```
1|Toyota Park|Bridgeview|IL|0
2|Columbus Crew Stadium|Columbus|OH|0
3|RFK Stadium|Washington|DC|0
```

Bevor Sie die Datei zu Amazon S3 hochladen, teilen Sie die Datei in mehrere Dateien auf, sodass der Befehl COPY diese unter Verwendung der Parallelverarbeitung hochladen kann. Die Anzahl der Dateien sollte ein Vielfaches der Anzahl der Slices in Ihrem Cluster sein. Teilen Sie Ihre Ladedatendateien, so dass die Dateien etwa gleich groß sind, zwischen 1 MB und 1 GB nach der Kompression. Weitere Informationen finden Sie unter [Laden von Daten aus komprimierten und unkomprimierten Dateien](t_splitting-data-files.md).

Beispielsweise kann die Datei `venue.txt` wie folgt in vier Dateien aufgeteilt werden:

```
venue.txt.1
venue.txt.2
venue.txt.3
venue.txt.4
```

Der folgende COPY-Befehl lädt die Tabelle VENUE mittels der durch Pipe-Zeichen getrennten Daten in den Datendateien mit dem Präfix „venue“ im Amazon-S3-Bucket `amzn-s3-demo-bucket`. 

**Anmerkung**  
Der Amazon-S3-Bucket `amzn-s3-demo-bucket` in den folgenden Beispiele ist nicht vorhanden. Beispiele für COPY-Befehle, die echte Daten in einem vorhandenen Amazon-S3-Bucket verwenden, finden Sie unter [Load sample data](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html) (Beispieldateien laden).

```
COPY venue FROM 's3://amzn-s3-demo-bucket/venue'
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
DELIMITER '|';
```

Wenn keine Amazon-S3-Objekte mit dem Schlüsselpräfix „venue“ vorhanden sind, schlägt der Ladevorgang fehl.

**Topics**
+ [Verwenden eines Manifests für die Angabe von Datendateien](loading-data-files-using-manifest.md)
+ [Laden komprimierter Datendateien aus Amazon S3](t_loading-gzip-compressed-data-files-from-S3.md)
+ [Laden von Daten mit fester Breite aus Amazon S3](t_loading_fixed_width_data.md)
+ [Laden von Multibyte-Daten aus Amazon S3](t_loading_unicode_data.md)
+ [Laden verschlüsselter Datendateien aus Amazon S3](c_loading-encrypted-files.md)

# Verwenden eines Manifests für die Angabe von Datendateien
<a name="loading-data-files-using-manifest"></a>

Sie können ein Manifest verwenden, um sicherzustellen, dass bei Verwendung des COPY-Befehls während eines Datenladevorgangs alle erforderlichen Dateien und nur diese geladen werden. Sie können ein Manifest verwenden, um Dateien aus verschiedenen Buckets hochzuladen oder Dateien, die nicht das gleiche Präfix verwenden. Statt einen Objektpfad für den COPY-Befehl anzugeben, stellen Sie den Namen einer Textdatei im JSON-Format bereit, in der die Dateien, die hochgeladen werden sollen, explizit aufgelistet werden. Die URL im Manifest muss den Bucket-Namen und den vollständigen Objektpfad für die Datei angeben, nicht nur ein Präfix.

Weitere Informationen zu Manifestdateien finden Sie im COPY-Beispiel unter [Verwenden eines Manifests für die Angabe von Datendateien](r_COPY_command_examples.md#copy-command-examples-manifest)

Das folgende Beispiel zeigt das JSON-Format, um Dateien aus verschiedenen Buckets hochzuladen, deren Namen mit Datumsstempeln beginnen.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/2013-10-04-custdata", "mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket1/2013-10-05-custdata", "mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/2013-10-04-custdata", "mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/2013-10-05-custdata", "mandatory":true}
  ]
}
```

Das optionale `mandatory`-Flag gibt an, ob COPY einen Fehler zurückgeben soll, wenn die Datei nicht gefunden wird. Der Standardwert von `mandatory` ist `false`. Unabhängig von obligatorischen Einstellungen wird COPY beendet, wenn keine Dateien gefunden werden. 

Im folgenden Beispiel wird der COPY-Befehl mit dem Manifest aus dem vorherigen Beispiel ausgeführt, dessen Name ist `cust.manifest`. 

```
COPY customer
FROM 's3://amzn-s3-demo-bucket/cust.manifest' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
MANIFEST;
```

## Verwenden eines mit UNLOAD erstellten Manifests
<a name="loading-data-files-using-unload-manifest"></a>

Ein mit einem [UNLOAD](r_UNLOAD.md)-Vorgang und dem MANIFEST-Parameter erstelltes Manifest kann Schlüssel enthalten, die für den COPY-Vorgang nicht benötigt werden. Das folgende `UNLOAD`-Manifest enthält beispielsweise einen `meta`-Schlüssel, der von einer externen Amazon-Redshift-Spectrum-Tabelle und zum Laden von Dateien im Dateiformat `ORC` oder `Parquet` benötigt wird. Der `meta`-Schlüssel enthält einen `content_length`-Schlüssel mit einem Wert, der der tatsächlichen Größe der Datei in Bytes entspricht. Für den COPY-Vorgang sind jedoch nur der `url`-Schlüssel und ein optionaler `mandatory`-Schlüssel erforderlich.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/unload/manifest_0000_part_00", "meta": { "content_length": 5956875 }},
    {"url":"s3://amzn-s3-demo-bucket/unload/unload/manifest_0001_part_00", "meta": { "content_length": 5997091 }}
 ]
}
```

Weitere Informationen zu Manifestdateien finden Sie unter [Verwenden eines Manifests für die Angabe von Datendateien](r_COPY_command_examples.md#copy-command-examples-manifest).

# Laden komprimierter Datendateien aus Amazon S3
<a name="t_loading-gzip-compressed-data-files-from-S3"></a>

Um Datendateien zu laden, die mit gzip, lzop oder bzip2 komprimiert wurden, schließen Sie die entsprechende Option ein: GZIP, LZOP oder. BZIP2

Der folgende Befehl lädt beispielsweise Daten aus Dateien, die mittels lzop komprimiert wurden.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/customer.lzo' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
DELIMITER '|' LZOP;
```

**Anmerkung**  
Wenn Sie eine Datendatei mit lzop-Komprimierung komprimieren und die Option *--filter* verwenden, unterstützt der COPY-Befehl dies nicht.

# Laden von Daten mit fester Breite aus Amazon S3
<a name="t_loading_fixed_width_data"></a>

Die Datenspalten in Datendateien mit fester Breite haben einheitliche Längen. Jedes Feld in einer Datendatei mit fester Breite besitzt genau dieselbe Länge und Position. Im Fall von Zeichendaten (CHAR und VARCHAR) in einer Datendatei mit fester Breite müssen Sie am Anfang und am Ende Leerzeichen als Platzhalter verwenden, um die einheitliche Breite einzuhalten. Im Fall von Ganzzahlen müssen Sie am Anfang Nullen als Platzhalter verwenden. Eine Datendatei mit fester Breite verwendet keine Trennzeichen, um Spalten zu trennen.

Um eine Datendatei mit fester Breite in eine vorhandene Tabelle zu laden, verwenden Sie den Parameter FIXEDWIDTH im COPY-Befehl. Die Tabellenspezifikationen müssen dem Wert von fixedwidth\$1spec entsprechen, damit die Daten korrekt geladen werden.

Um Daten mit fester Breite aus einer Datei in eine Tabelle zu laden, geben Sie den folgenden Befehl aus:

```
COPY table_name FROM 's3://amzn-s3-demo-bucket/prefix' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
FIXEDWIDTH 'fixedwidth_spec';
```

Der Parameter *fixedwidth\$1spec* ist eine Zeichenfolge, die einen Bezeichner für jede Spalte und die Breite jeder Spalte enthält, getrennt durch einen Punkt. Die **column:width**-Paare werden durch Komma getrennt. Der Bezeichner kann von Ihnen frei gewählt werden: Zahlen, Buchstaben oder eine Kombination aus diesen. Der Bezeichner hat keine Beziehung zur Tabelle selbst. Daher muss die Spezifikation die Spalten in derselben Reihenfolge wie die Tabelle enthalten.

Die folgenden beiden Beispiele zeigen dieselbe Spezifikation, wobei die erste numerische Bezeichner und die zweite Zeichenfolgenbezeichner verwendet:

```
'0:3,1:25,2:12,3:2,4:6'
```

```
'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6'
```

Im folgenden Beispiel sind Beispieldaten mit fester Breite zu sehen, die unter Verwendung der oben aufgeführten Spezifikationen in die Tabelle VENUE geladen werden könnten:

```
1  Toyota Park               Bridgeview  IL0
2  Columbus Crew Stadium     Columbus    OH0
3  RFK Stadium               Washington  DC0
4  CommunityAmerica Ballpark Kansas City KS0
5  Gillette Stadium          Foxborough  MA68756
```

Der folgende COPY-Befehl lädt diesen Datensatz in die Tabelle VENUE:

```
COPY venue
FROM 's3://amzn-s3-demo-bucket/data/venue_fw.txt' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
FIXEDWIDTH 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
```

# Laden von Multibyte-Daten aus Amazon S3
<a name="t_loading_unicode_data"></a>

Wenn Ihre Daten Multibyte-Zeichen enthalten, die andere als ASCII-Zeichen verwenden (beispielsweise chinesische oder kyrillische Zeichen), müssen Sie die Daten in VARCHAR-Spalten laden. Der VARCHAR-Datentyp unterstützt UTF-8-Zeichen mit vier Bytes. Der CHAR-Datentyp unterstützt jedoch nur ASCII-Zeichen mit einem Byte. Sie können keine Zeichen mit fünf Bytes oder mehr in Amazon-Redshift-Tabellen laden. Weitere Informationen zu CHAR und VARCHAR finden Sie unter [Datentypen](c_Supported_data_types.md).

Um zu prüfen, welche Kodierung von einer Eingabedatei verwendet wird, verwenden Sie den Linux-Befehl *`file`*. 

```
$ file ordersdata.txt
ordersdata.txt: ASCII English text
$ file uni_ordersdata.dat
uni_ordersdata.dat: UTF-8 Unicode text
```

# Laden verschlüsselter Datendateien aus Amazon S3
<a name="c_loading-encrypted-files"></a>

Sie können den COPY-Befehl verwenden, um Datendateien zu laden, die unter Verwendung der serverseitigen Verschlüsselung, der clientseitigen Verschlüsselung oder beider Verschlüsselungen zu Amazon S3 hochgeladen wurden. 

Der COPY-Befehl unterstützt die folgenden Amazon S3-Verschlüsselungsarten:
+ Serverseitige Verschlüsselung mit von Amazon S3 verwalteten Schlüsseln (SSE-S3)
+  AWS KMS keys Serverseitige Verschlüsselung mit (SSE-KMS)
+ Clientseitige Verschlüsselung mittels eines clientseitigen symmetrischen Root-Schlüssels

Der COPY-Befehl unterstützt nicht die folgenden Amazon S3-Verschlüsselungsarten:
+ Serverseitige Verschlüsselung mit vom Kunden bereitgestellten Schlüsseln (SSE-C)
+ Clientseitige Verschlüsselung mit einem AWS KMS key
+ Clientseitige Verschlüsselung mittels eines vom Kunden bereitgestellten asymmetrischen Root-Schlüssels

Weitere Informationen zur Amazon-S3-Verschlüsselung finden Sie unter [Schützen von Daten mithilfe serverseitiger Verschlüsselung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) und [Schützen von Daten mithilfe clientseitiger Verschlüsselung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html) im Benutzerhandbuch von Amazon Simple Storage Service.

Der Befehl [UNLOAD](r_UNLOAD.md) verschlüsselt Dateien automatisch mittels SSE-S3. Sie können zum Entladen auch SSE-KMS oder eine clientseitige Verschlüsselung mit einem vom Kunden verwalteten symmetrischen Schlüssel verwenden. Weitere Informationen finden Sie unter [Entladen verschlüsselter Datendateien](t_unloading_encrypted_files.md).

Der COPY-Befehl erkennt automatisch Dateien, die mit SSE-S3 und SSE-KMS verschlüsselt wurden, und lädt diese. Sie können Dateien, die mit einem clientseitigen symmetrischen Root-Schlüssel verschlüsselt wurden, durch Angabe der Option ENCRYPTED und des Schlüssel-Werts laden. Weitere Informationen finden Sie unter [Hochladen verschlüsselter Daten in Amazon S3](t_uploading-encrypted-data.md).

Um clientseitig verschlüsselte Datendateien zu laden, stellen Sie unter Verwendung des Parameters MASTER\$1SYMMETRIC\$1KEY den Root-Schlüsselwert bereit und schließen die Option ENCRYPTED ein.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/encrypted/customer' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
MASTER_SYMMETRIC_KEY '<root_key>' 
ENCRYPTED
DELIMITER '|';
```

Um verschlüsselte Datendateien zu laden, die gzip-, lzop- oder bzip2-komprimiert sind, fügen Sie die Option GZIP, LZOP oder zusammen mit dem Stammschlüsselwert und der BZIP2 Option ENCRYPTED hinzu.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/encrypted/customer' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
MASTER_SYMMETRIC_KEY '<root_key>'
ENCRYPTED 
DELIMITER '|' 
GZIP;
```

# So laden Sie Daten aus Amazon EMR:
<a name="loading-data-from-emr"></a>

Sie können den COPY-Befehl verwenden, um Daten parallel aus einem Amazon-EMR-Cluster zu laden, der für das Schreiben von Textdateien in das Hadoop Distributed File System (HDFS) des Clusters in Form von Dateien mit fester Breite, zeichenbegrenzten Dateien, CSV-Dateien oder JSON-Dateien konfiguriert wurde.

## Prozess zum Laden von Daten aus Amazon EMR
<a name="load-from-emr-process"></a>

In diesem Abschnitt wird das Laden von Daten aus einem Amazon-EMR-Cluster beschrieben. In den folgenden Abschnitten finden Sie detaillierte Anweisungen für die einzelnen Schritte.
+ **[Schritt 1: Konfigurieren von IAM-Berechtigungen](#load-from-emr-steps-configure-iam)**

  Die Benutzer, die den Amazon-EMR-Cluster erstellen und den COPY-Befehl von Amazon Redshift ausführen, müssen die notwendigen Berechtigungen besitzen.
+ **[Schritt 2: Erstellen eines Amazon-EMR-Clusters](#load-from-emr-steps-create-cluster)**

  Konfigurieren Sie den Cluster für die Ausgabe von Textdateien zum Hadoop Distributed File System (HDFS). Sie benötigen die ID des Amazon-EMR-Clusters und das öffentliche Haupt-DNS des Clusters (den Endpunkt für die Amazon-EC2-Instance, die den Cluster hostet). 
+ **[Schritt 3: Abrufen des öffentlichen Schlüssels des Amazon-Redshift-Clusters und der IP-Adressen der Cluster-Knoten](#load-from-emr-steps-retrieve-key-and-ips)**

  Der öffentliche Schlüssel ermöglicht den Knoten des Amazon-Redshift-Clusters die Herstellung von SSH-Verbindungen zu den Hosts. Sie verwenden die IP-Adresse der einzelnen Cluster-Knoten, um die Host-Sicherheitsgruppen zu konfigurieren, damit diese den Zugriff von Ihrem Amazon-Redshift-Cluster unter Verwendung dieser IP-Adressen gestatten. 
+ **[Schritt 4: Hinzufügen des öffentlichen Schlüssels des Amazon-Redshift-Clusters zur Datei mit den autorisierten Schlüsseln der einzelnen Amazon-EC2-Hosts](#load-from-emr-steps-add-key-to-host)** 

  Sie fügen den öffentlichen Schlüssel des Amazon-Redshift-Clusters zur Datei des Hosts hinzu, die die autorisierten Schlüssel enthält, damit der Host den Amazon-Redshift-Cluster erkennt und die SSH-Verbindung akzeptiert. 
+ **[Schritt 5: Konfigurieren der Hosts, sodass sie alle IP-Adressen des Amazon-Redshift-Clusters akzeptieren](#load-from-emr-steps-configure-security-groups)** 

  Ändern Sie die Sicherheitsgruppen der Amazon-EMR-Instance, indem Sie Eingaberegeln für die Akzeptierung der Amazon-Redshift-IP-Adressen hinzufügen.
+ **[Schritt 6: Ausführen des COPY-Befehls, um die Daten zu laden](#load-from-emr-steps-run-copy)**

  Führen Sie den COPY-Befehl aus einer Amazon-Redshift-Datenbank aus, um die Daten in eine Amazon-Redshift-Tabelle zu laden. 

## Schritt 1: Konfigurieren von IAM-Berechtigungen
<a name="load-from-emr-steps-configure-iam"></a>

Die Benutzer, die den Amazon-EMR-Cluster erstellen und den COPY-Befehl von Amazon Redshift ausführen, müssen die notwendigen Berechtigungen besitzen.

**So konfigurieren Sie IAM-Berechtigungen**

1. Fügen Sie dem Benutzer, der den Amazon-EMR-Cluster erstellt, die folgenden Berechtigungen hinzu.

   ```
   ec2:DescribeSecurityGroups
   ec2:RevokeSecurityGroupIngress
   ec2:AuthorizeSecurityGroupIngress
   redshift:DescribeClusters
   ```

1. Fügen Sie der IAM-Rolle oder dem Benutzer, die bzw. der den COPY-Befehl ausführt, die folgende Berechtigung hinzu.

   ```
   elasticmapreduce:ListInstances
   ```

1. Fügen Sie der IAM-Rolle des Amazon-EMR-Clusters die folgende Berechtigung hinzu.

   ```
   redshift:DescribeClusters
   ```

## Schritt 2: Erstellen eines Amazon-EMR-Clusters
<a name="load-from-emr-steps-create-cluster"></a>

Der COPY-Befehl lädt Daten aus Dateien im Hadoop Distributed File System (HDFS) von Amazon EMR. Konfigurieren Sie beim Erstellen des Amazon-EMR-Clusters den Cluster für die Ausgabe von Datendateien an das HDFS des Clusters.

**So erstellen Sie einen Amazon-EMR-Cluster:**

1. Erstellen Sie einen Amazon EMR-Cluster in derselben AWS Region wie der Amazon Redshift Redshift-Cluster. 

   Wenn sich der Amazon-Redshift-Cluster in einer VPC befindet, muss sich der Amazon-EMR-Cluster in derselben VPC-Gruppe befinden. Wenn der Amazon-Redshift-Cluster den EC2-Classic-Modus verwendet (d. h., sich nicht in einer VPC befindet), muss der Amazon-EMR-Cluster ebenfalls den EC2-Classic-Modus verwenden. Weitere Informationen finden Sie unter [Managing Clusters in Virtual Private Cloud (VPC)](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-vpc.html) (Verwalten von Clustern in Virtual Private Cloud (VPC)) im *Amazon-Redshift-Verwaltungshandbuch*.

1. Konfigurieren Sie den Cluster für die Ausgabe von Datendateien an das HDFS des Clusters. Die HDFS-Dateinamen dürfen keine Sternchen (\$1) oder Fragezeichen (?) enthalten.
**Wichtig**  
Die Dateinamen dürfen keine Sternchen (\$1) oder Fragezeichen (?) enthalten.

1. Geben Sie **No** (Nein) für die Option **Auto-terminate** (Automatisches Beenden) in der Amazon-EMR-Clusterkonfiguration an, sodass der Cluster während der Ausführung des COPY-Befehls verfügbar bleibt. 
**Wichtig**  
Wenn eine der Datendateien vor Abschluss von COPY geändert oder gelöscht wird, kann dies zu unerwarteten Ergebnissen führen. Es ist auch möglich, dass die COPY-Operation fehlschlägt. 

1. Notieren Sie die Cluster-ID und das öffentliche Haupt-DNS (den Endpunkt für die Amazon-EC2-Instance, die den Cluster hostet). Diese Informationen werden in späteren Schritten benötigt. 

## Schritt 3: Abrufen des öffentlichen Schlüssels des Amazon-Redshift-Clusters und der IP-Adressen der Cluster-Knoten
<a name="load-from-emr-steps-retrieve-key-and-ips"></a>

Sie verwenden die IP-Adresse der einzelnen Cluster-Knoten, um die Host-Sicherheitsgruppen zu konfigurieren, damit diese den Zugriff von Ihrem Amazon-Redshift-Cluster unter Verwendung dieser IP-Adressen gestatten.

**So rufen Sie den öffentlichen Schlüssel des Amazon-Redshift-Clusters und die IP-Adressen der Cluster-Knoten für Ihren Cluster über die Konsole ab:**

1. Greifen Sie auf die Managementkonsole von Amazon Redshift zu. 

1. Wählen Sie im Navigationsbereich den Link **Cluster** aus. 

1. Wählen Sie Ihren Cluster aus der Liste aus. 

1. Suchen Sie die Gruppe **SSH-Erfassungseinstellungen**. 

   Notieren Sie sich die Informationen unter **Cluster Public Key (Öffentlicher Schlüssel des Clusters)** und **Node IP addresses (Knoten-IP-Adressen)**. Diese Informationen werden in späteren Schritten verwendet.   
![\[Screenshot aus der Gruppe „SSH-Erfassungseinstellungen“ mit dem öffentlichen Clusterschlüssel und den IP-Adressen der Knoten.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/copy-from-ssh-console-2.png)

   Sie werden die privaten IP-Adressen in Schritt 3 verwenden, um den Amazon-EC2-Host so zu konfigurieren, dass er die Verbindung von Amazon Redshift akzeptiert. 

Um den öffentlichen Schlüssel des Clusters und die IP-Adressen der Cluster-Knoten für Ihren Cluster über die Amazon-Redshift-CLI abzurufen, führen Sie den Befehl describe-clusters aus. Beispiel:

```
aws redshift describe-clusters --cluster-identifier <cluster-identifier> 
```

Die Antwort wird einen ClusterPublicKey Wert und die Liste der privaten und öffentlichen IP-Adressen enthalten, ähnlich der folgenden:

```
{
    "Clusters": [
        {
            "VpcSecurityGroups": [], 
            "ClusterStatus": "available", 
            "ClusterNodes": [
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "LEADER", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }, 
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "COMPUTE-0", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }, 
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "COMPUTE-1", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }
            ], 
            "AutomatedSnapshotRetentionPeriod": 1, 
            "PreferredMaintenanceWindow": "wed:05:30-wed:06:00", 
            "AvailabilityZone": "us-east-1a", 
            "NodeType": "dc2.large", 
            "ClusterPublicKey": "ssh-rsa AAAABexamplepublickey...Y3TAl Amazon-Redshift", 
             ...
             ...
}
```

Um den öffentlichen Schlüssel des Clusters und die IP-Adressen der Cluster-Knoten für Ihren Cluster über die Amazon-Redshift-API abzurufen, verwenden Sie die Aktion `DescribeClusters`. Weitere Informationen finden Sie unter [describe-clusters](https://docs.aws.amazon.com/cli/latest/reference/redshift/describe-clusters.html) im *Amazon Redshift CLI Guide* oder [DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html)im Amazon Redshift API Guide. 

## Schritt 4: Hinzufügen des öffentlichen Schlüssels des Amazon-Redshift-Clusters zur Datei mit den autorisierten Schlüsseln der einzelnen Amazon-EC2-Hosts
<a name="load-from-emr-steps-add-key-to-host"></a>

Sie fügen den öffentlichen Schlüssel des Clusters der Datei mit den autorisierten Schlüsseln der einzelnen Hosts für alle Knoten des Amazon-EMR-Clusters hinzu, damit die Hosts Amazon Redshift erkennen und die SSH-Verbindung akzeptieren. 

**So fügen Sie den öffentlichen Schlüssel des Amazon-Redshift-Clusters zur Datei des Hosts mit den autorisierten Schlüsseln hinzu:**

1. Greifen Sie über eine SSH-Verbindung auf den Host zu. 

   Informationen zum Herstellen von Verbindungen mit Instances über SSH finden Sie unter [Connect to Your Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-connect-to-instance-linux.html) (Herstellen einer Verbindung mit Ihrer Instance) im *Amazon-EC2-Benutzerhandbuch*. 

1. Kopieren Sie den öffentlichen Amazon-Redshift-Schlüssel aus der Konsole oder aus dem CLI-Antworttext. 

1. Kopieren Sie den Inhalt des öffentlichen Schlüssels in die Datei `/home/<ssh_username>/.ssh/authorized_keys` auf dem Host. Kopieren Sie die gesamte Zeichenfolge einschließlich des Präfix `ssh-rsa` und des Suffix `Amazon-Redshift`. Beispiel: 

   ```
   ssh-rsa AAAACTP3isxgGzVWoIWpbVvRCOzYdVifMrh… uA70BnMHCaMiRdmvsDOedZDOedZ Amazon-Redshift
   ```

## Schritt 5: Konfigurieren der Hosts, sodass sie alle IP-Adressen des Amazon-Redshift-Clusters akzeptieren
<a name="load-from-emr-steps-configure-security-groups"></a>

 Um eingehenden Datenverkehr für die Host-Instances zuzulassen, bearbeiten Sie die Sicherheitsgruppe und fügen jedem Amazon-Redshift-Clusterknoten eine Inbound-Regel hinzu. Wählen Sie für **Type** SSH mit TCP-Protokoll auf Port 22 aus. Geben Sie für **Source** (Quelle) die privaten IP-Adressen der Amazon-Redshift-Cluster-Knoten ein, die Sie in [Schritt 3: Abrufen des öffentlichen Schlüssels des Amazon-Redshift-Clusters und der IP-Adressen der Cluster-Knoten](#load-from-emr-steps-retrieve-key-and-ips) abgerufen haben. Informationen zum Hinzufügen von Regeln zu einer Amazon-EC2-Sicherheitsgruppe finden Sie unter [Authorizing Inbound Traffic for Your Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html) (Autorisieren von eingehendem Datenverkehr für Instances) im *Amazon-EC2-Benutzerhandbuch*. 

## Schritt 6: Ausführen des COPY-Befehls, um die Daten zu laden
<a name="load-from-emr-steps-run-copy"></a>

Führen Sie einen [COPY](r_COPY.md)-Befehl aus, um eine Verbindung zum Amazon-EMR-Cluster herzustellen und die Daten in eine Amazon-Redshift-Tabelle zu laden. Der Amazon-EMR-Cluster muss weiter ausgeführt werden, bis der COPY-Befehl abgeschlossen ist. Der Cluster darf beispielsweise nicht für die automatische Beendigung konfiguriert sein. 

**Wichtig**  
Wenn eine der Datendateien vor Abschluss von COPY geändert oder gelöscht wird, kann dies zu unerwarteten Ergebnissen führen. Es ist auch möglich, dass die COPY-Operation fehlschlägt.

Geben Sie im COPY-Befehl die ID des Amazon-EMR-Clusters und den Dateipfad und Dateinamen in HDFS an. 

```
COPY sales
FROM 'emr://myemrclusterid/myoutput/part*' CREDENTIALS 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Sie können die Platzhalterzeichen Sternchen (`*` ) und Fragezeichen (`?`) als Teil des Dateinamenarguments verwenden. Beispielsweise lädt `part*` die Dateien `part-0000`, `part-0001` usw. Wenn Sie nur einen Ordnernamen angeben, versucht COPY, alle Dateien im Ordner zu laden.

**Wichtig**  
Wenn Sie Platzhalterzeichen oder nur den Ordnernamen verwenden, müssen Sie überprüfen, ob unerwünschte Dateien geladen werden. Andernfalls schlägt der COPY-Befehl fehl. Einige Prozesse schreiben beispielsweise eine Protokolldatei in den Ausgabeordner.

# Laden von Daten aus Remote-Hosts
<a name="loading-data-from-remote-hosts"></a>

Sie können den Befehl COPY verwenden, um Daten parallel Daten aus einem oder mehreren Remote-Hosts wie Amazon-EC2-Instances oder anderen Computern zu laden. COPY stellt über SSH eine Verbindung zu den Remote-Hosts her und führt Befehle auf den Remote-Hosts aus, um Textausgaben zu generieren. 

Beim Remote-Host kann es sich um eine Amazon-EC2-Linux-Instance oder einen anderen Unix- oder Linux-Computer handeln, der für die Annahme von SSH-Verbindungen konfiguriert wurde. In diesem Handbuch wird angenommen, dass es sich bei Ihrem Remote-Host um eine Amazon-EC2-Instance handelt. Wenn sich das Verfahren für eine andere Art von Computer unterscheidet, wird im Handbuch auf den Unterschied hingewiesen. 

Amazon Redshift kann eine Verbindung zu mehreren Hosts herstellen und für jeden Host mehrere SSH-Verbindungen öffnen. Amazon Redshift sendet über jede Verbindung einen eindeutigen Befehl, um die Textausgabe an die Standardausgabe des Hosts zu generieren. Amazon Redshift liest diese dann wie eine Textdatei.

## Bevor Sie beginnen
<a name="load-from-host-before-you-begin"></a>

Folgendes sollte vorhanden sein, bevor Sie den Vorgang starten: 
+ Ein oder mehrere Host-Computer, beispielsweise Amazon-EC2-Instances, mit denen Sie über SSH eine Verbindung herstellen können.
+ Datenquellen auf den Hosts. 

  Sie stellen Befehle bereit, die der Amazon-Redshift-Cluster auf den Hosts ausführt, um die Textausgabe zu generieren. Nachdem der Cluster eine Verbindung mit einem Host hergestellt hat, führt der COPY-Befehl die Befehle aus, liest den Text aus der Standardausgabe des Hosts und lädt die Daten parallel in eine Amazon-Redshift-Tabelle. Die Textausgabe muss ein Format aufweisen, das der COPY-Befehl verarbeiten kann. Weitere Informationen finden Sie unter [Vorbereiten der Eingabedaten](t_preparing-input-data.md)
+ Zugriff auf die Hosts von Ihrem Computer aus. 

  Im Fall einer Amazon-EC2-Instance verwenden Sie eine SSH-Verbindung, um auf den Host zuzugreifen. Sie müssen auf den Host zugreifen, um den öffentlichen Schlüssel des Amazon-Redshift-Clusters zu der Datei des Hosts mit den autorisierten Schlüsseln hinzuzufügen.
+ Ein aktiver Amazon Redshift Cluster. 

  Weitere Informationen zum Starten eines Clusters finden Sie im Handbuch [Erste Schritte mit Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/). 

## Prozess für das Laden von Daten
<a name="load-from-host-process"></a>

In diesem Abschnitt wird das Laden von Daten aus Remote-Hosts beschrieben. In den folgenden Abschnitten finden Sie detaillierte Anweisungen für die einzelnen Schritte.
+ **[Schritt 1: Abrufen des öffentlichen Schlüssels des Clusters und der IP-Adressen der Cluster-Knoten](#load-from-host-steps-retrieve-key-and-ips)**

  Der öffentliche Schlüssel ermöglicht den Knoten des Amazon-Redshift-Clusters die Herstellung von SSH-Verbindungen zu den Remote-Hosts. Sie verwenden die IP-Adresse der einzelnen Cluster-Knoten, um die Host-Sicherheitsgruppen oder die Host-Firewall zu konfigurieren, damit diese den Zugriff von Ihrem Amazon-Redshift-Cluster unter Verwendung dieser IP-Adressen gestattet/gestatten. 
+ **[Schritt 2: Hinzufügen des öffentlichen Schlüssels des Amazon-Redshift-Clusters zur Datei des Hosts mit den autorisierten Schlüsseln](#load-from-host-steps-add-key-to-host)**

  Sie fügen den öffentlichen Schlüssel des Amazon-Redshift-Clusters zur Datei des Hosts hinzu, die die autorisierten Schlüssel enthält, damit der Host den Amazon-Redshift-Cluster erkennt und die SSH-Verbindung akzeptiert. 
+ **[Schritt 3: Konfigurieren des Hosts, sodass er alle IP-Adressen des Amazon-Redshift-Clusters akzeptiert](#load-from-host-steps-configure-security-groups)** 

  Ändern Sie bei Amazon EC2 die Sicherheitsgruppen der Instance, indem Sie Eingangsregeln für die Akzeptierung der Amazon-Redshift-IP-Adressen hinzufügen. Im Fall anderer Hosts ändern Sie die Firewall, sodass Ihre Amazon-Redshift-Knoten SSH-Verbindungen zum Remote-Host herstellen können. 
+ **[Schritt 4: Abrufen des öffentlichen Schlüssels für den Host](#load-from-host-steps-get-the-host-key)**

  Sie können optional angeben, dass Amazon Redshift den öffentlichen Schlüssel angeben soll, um den Host zu identifizieren. Sie müssen den öffentlichen Schlüssel suchen und den Text in Ihre Manifestdatei kopieren. 
+ **[Schritt 5: Erstellen einer Manifestdatei](#load-from-host-steps-create-manifest)** 

  Das Manifest ist eine Textdatei im JSON-Format, das die Details enthält, die Amazon Redshift benötigt, um eine Verbindung zu den Hosts herzustellen und die Daten abzurufen. 
+ **[Schritt 6: Hochladen der Manifestdatei in einen Amazon S3 Bucket](#load-from-host-steps-upload-manifest)** 

  Amazon Redshift liest das Manifest und verwendet diese Informationen, um eine Verbindung zum Remote-Host herzustellen. Wenn sich der Amazon-S3-Bucket nicht in derselben Region wie Ihr Amazon-Redshift-Cluster befindet, müssen Sie die Option [REGION](copy-parameters-data-source-s3.md#copy-region) verwenden, um die Region anzugeben, in der sich die Daten befinden.
+ **[Schritt 7: Ausführen des COPY-Befehls, um die Daten zu laden](#load-from-host-steps-run-copy)**

  Führen Sie den COPY-Befehl aus einer Amazon-Redshift-Datenbank aus, um die Daten in eine Amazon-Redshift-Tabelle zu laden. 

## Schritt 1: Abrufen des öffentlichen Schlüssels des Clusters und der IP-Adressen der Cluster-Knoten
<a name="load-from-host-steps-retrieve-key-and-ips"></a>

Sie verwenden die IP-Adresse der einzelnen Cluster-Knoten, um die Host-Sicherheitsgruppen zu konfigurieren, damit diese den Zugriff von Ihrem Amazon-Redshift-Cluster unter Verwendung dieser IP-Adressen gestatten.

**So rufen Sie den öffentlichen Schlüssel des Clusters und die IP-Adressen der Cluster-Knoten für Ihren Cluster über die Konsole ab**

1. Greifen Sie auf die Managementkonsole von Amazon Redshift zu.

1. Wählen Sie im Navigationsbereich den Link **Cluster** aus.

1. Wählen Sie Ihren Cluster aus der Liste aus. 

1. Suchen Sie die Gruppe **SSH-Erfassungseinstellungen**.

   Notieren Sie sich die Informationen unter **Cluster Public Key (Öffentlicher Schlüssel des Clusters)** und **Node IP addresses (Knoten-IP-Adressen)**. Diese Informationen werden in späteren Schritten verwendet.  
![\[Screenshot aus der Gruppe „SSH-Erfassungseinstellungen“ mit dem öffentlichen Clusterschlüssel und den IP-Adressen der Knoten.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/copy-from-ssh-console-2.png)

   Sie verwenden die IP-Adressen in Schritt 3, um den Host so zu konfigurieren, dass er die Verbindung von Amazon Redshift akzeptiert. Abhängig von der Art des Hosts, zu dem Sie eine Verbindung herzustellen, und davon, ob er sich in einer VPC befindet, verwenden Sie entweder die öffentlichen IP-Adressen oder die privaten IP-Adressen.

Um den öffentlichen Schlüssel des Clusters und die IP-Adressen der Cluster-Knoten für Ihren Cluster über die Amazon-Redshift-CLI abzurufen, führen Sie den Befehl describe-clusters aus. 

Beispiel: 

```
aws redshift describe-clusters --cluster-identifier <cluster-identifier> 
```

 Die Antwort wird die ClusterPublicKey und die Liste der privaten und öffentlichen IP-Adressen enthalten, ähnlich der folgenden: 

```
{
    "Clusters": [
        {
            "VpcSecurityGroups": [], 
            "ClusterStatus": "available", 
            "ClusterNodes": [
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "LEADER", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }, 
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "COMPUTE-0", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }, 
                {
                    "PrivateIPAddress": "10.nnn.nnn.nnn", 
                    "NodeRole": "COMPUTE-1", 
                    "PublicIPAddress": "10.nnn.nnn.nnn"
                }
            ], 
            "AutomatedSnapshotRetentionPeriod": 1, 
            "PreferredMaintenanceWindow": "wed:05:30-wed:06:00", 
            "AvailabilityZone": "us-east-1a", 
            "NodeType": "dc2.large", 
            "ClusterPublicKey": "ssh-rsa AAAABexamplepublickey...Y3TAl Amazon-Redshift", 
             ...
             ...
}
```

Verwenden Sie die DescribeClusters Aktion, um den öffentlichen Clusterschlüssel und die Clusterknoten-IP-Adressen für Ihren Cluster mithilfe der Amazon Redshift Redshift-API abzurufen. Weitere Informationen finden Sie unter [describe-clusters](https://docs.aws.amazon.com/cli/latest/reference/redshift/describe-clusters.html) im *Amazon Redshift CLI Guide* oder [DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html)im Amazon Redshift API Guide. 

## Schritt 2: Hinzufügen des öffentlichen Schlüssels des Amazon-Redshift-Clusters zur Datei des Hosts mit den autorisierten Schlüsseln
<a name="load-from-host-steps-add-key-to-host"></a>

Sie fügen den öffentlichen Schlüssel des Clusters zur Datei mit den autorisierten Schlüsseln der einzelnen Hosts hinzu, damit der Host den Amazon-Redshift-Cluster erkennt und die SSH-Verbindung akzeptiert. 

**So fügen Sie den öffentlichen Schlüssel des Amazon-Redshift-Clusters zur Datei des Hosts mit den autorisierten Schlüsseln hinzu:**

1. Greifen Sie über eine SSH-Verbindung auf den Host zu. 

   Informationen zum Herstellen von Verbindungen mit Instances über SSH finden Sie unter [Connect to Your Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-connect-to-instance-linux.html) (Herstellen einer Verbindung mit Ihrer Instance) im *Amazon-EC2-Benutzerhandbuch*. 

1. Kopieren Sie den öffentlichen Amazon-Redshift-Schlüssel aus der Konsole oder aus dem CLI-Antworttext. 

1. Kopieren Sie den Inhalt des öffentlichen Schlüssels in die Datei `/home/<ssh_username>/.ssh/authorized_keys` auf dem Remote-Host. Der `<ssh_username>` muss mit dem Wert für das Benutzernamenfeld in der Manifestdatei übereinstimmen. Kopieren Sie die gesamte Zeichenfolge einschließlich des Präfix `ssh-rsa` und des Suffix `Amazon-Redshift`. Beispiel: 

   ```
   ssh-rsa AAAACTP3isxgGzVWoIWpbVvRCOzYdVifMrh… uA70BnMHCaMiRdmvsDOedZDOedZ Amazon-Redshift
   ```

## Schritt 3: Konfigurieren des Hosts, sodass er alle IP-Adressen des Amazon-Redshift-Clusters akzeptiert
<a name="load-from-host-steps-configure-security-groups"></a>

 Wenn Sie mit einer Amazon-EC2-Instance oder einem Amazon-EMR-Cluster arbeiten, fügen Sie der Sicherheitsgruppe des Hosts Regeln für eingehenden Datenverkehr hinzu, um Datenverkehr von den einzelnen Amazon-Redshift-Clusterknoten zuzulassen. Wählen Sie für **Type** SSH mit TCP-Protokoll auf Port 22 aus. Geben Sie für **Source** die IP-Adressen der Amazon-Redshift-Clusterknoten ein, die Sie in [Schritt 1: Abrufen des öffentlichen Schlüssels des Clusters und der IP-Adressen der Cluster-Knoten](#load-from-host-steps-retrieve-key-and-ips) abgerufen haben. Informationen zum Hinzufügen von Regeln zu einer Amazon-EC2-Sicherheitsgruppe finden Sie unter [Authorizing Inbound Traffic for Your Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html) (Autorisieren von eingehendem Datenverkehr für Instances) im *Amazon-EC2-Benutzerhandbuch*. 

Verwenden Sie die privaten IP-Adressen in folgenden Fällen: 
+ Sie haben einen Amazon Redshift Redshift-Cluster, der sich nicht in einer Virtual Private Cloud (VPC) befindet, und eine Amazon EC2 EC2-Classic-Instance, die sich beide in derselben Region befinden. AWS 
+  Sie haben einen Amazon Redshift Redshift-Cluster, der sich in einer VPC befindet, und eine Amazon EC2 EC2-VPC-Instance, die sich beide in derselben AWS Region und in derselben VPC befinden.

 Verwenden Sie andernfalls die öffentlichen IP-Adressen.

Weitere Informationen zur Nutzung von Amazon Redshift finden Sie unter [Managing Clusters in Virtual Private Cloud (VPC)](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-vpc.html) (Verwalten von Clustern in Virtual Private Cloud (VPC)) im *Amazon-Redshift-Verwaltungshandbuch*. 

## Schritt 4: Abrufen des öffentlichen Schlüssels für den Host
<a name="load-from-host-steps-get-the-host-key"></a>

Sie können optional den öffentlichen Schlüssel des Hosts in der Manifestdatei angeben, sodass Amazon Redshift den Host identifizieren kann. Für den Befehl COPY ist der öffentliche Schlüssel des Hosts nicht erforderlich. Aus Sicherheitsgründen empfehlen wir jedoch dringend, einen öffentlichen Schlüssel zu verwenden, um '' -Angriffe zu verhindern. man-in-the-middle 

Sie finden den öffentlichen Schlüssel des Hosts an der folgenden Stelle, wobei `<ssh_host_rsa_key_name>` der eindeutige Name für den öffentlichen Schlüssel des Hosts ist: 

```
:  /etc/ssh/<ssh_host_rsa_key_name>.pub
```

**Anmerkung**  
Amazon Redshift unterstützt nur RSA-Schlüssel. DSA-Schlüssel werden nicht unterstützt.

Wenn Sie in Schritt 5 Ihre Manifestdatei erstellen, fügen Sie den Text des öffentlichen Schlüssels in das Feld „Public Key“ im Manifestdateieintrag ein.

## Schritt 5: Erstellen einer Manifestdatei
<a name="load-from-host-steps-create-manifest"></a>

Der COPY-Befehl kann über SSH Verbindungen zu mehreren Hosts herstellen und für jeden Host mehrere SSH-Verbindungen erstellen. COPY führt über jede Hostverbindung einen Befehl aus und lädt anschließend die Ausgabe der Befehle parallel in die Tabelle. Die Manifestdatei ist eine Textdatei im JSON-Format, die Amazon Redshift zum Herstellen der Verbindung zum Host verwendet. Die Manifestdatei gibt die Endpunkte des SSH-Hosts und die Befehle an, die auf den Hosts ausgeführt werden, um Daten an Amazon Redshift zurückzugeben. Optional können Sie den öffentlichen Schlüssel des Hosts, den Anmeldebenutzernamen und ein obligatorisches Flag für die einzelnen Einträge einschließen.

Erstellen Sie die Manifestdatei auf Ihrem lokalen Computer. In einem späteren Schritt laden Sie die Datei zu Amazon S3 hoch. 

Die Manifestdatei hat folgendes Format:

```
{ 
   "entries": [ 
     {"endpoint":"<ssh_endpoint_or_IP>", 
       "command": "<remote_command>",
       "mandatory":true, 
       "publickey": "<public_key>", 
       "username": "<host_user_name>"}, 
     {"endpoint":"<ssh_endpoint_or_IP>", 
       "command": "<remote_command>",
       "mandatory":true, 
       "publickey": "<public_key>", 
       "username": "host_user_name"} 
    ] 
}
```

Die Manifestdatei enthält für jede SSH-Verbindung jeweils ein "entries"-Konstrukt. Jeder Eintrag stellt eine einzelne SSH-Verbindung dar. Es kann mehrere Verbindungen zu einem einzelnen Host oder mehrere Verbindungen zu mehreren Hosts geben. Die doppelten Anführungszeichen sind wie gezeigt erforderlich, sowohl für die Feldnamen als auch die Werte. Der einzige Wert, der keine doppelten Anführungszeichen benötigt, sind die booleschen Werte **true** oder **false** für das obligatorische Feld. 

Nachfolgend werden die Felder in der Manifestdatei beschrieben. 

endpoint  
Die URL- oder IP-Adresse des Hosts. Beispiele sind `ec2-111-222-333.compute-1.amazonaws.com` oder `22.33.44.56`. 

command   
Der Befehl, der durch den Host ausgeführt wird, um eine Textausgabe oder eine Binärausgabe (gzip, lzop oder bzip2) zu generieren. Bei diesem Befehl kann es sich um jeden Befehl handeln, zu dessen Ausführung der Benutzer *host\$1user\$1name* berechtigt ist. Beim Befehl kann es sich einfach um einen Befehl zum Drucken einer Datei, um eine Abfrage einer Datenbank oder um das Starten eines Skripts handeln. Die Ausgabe (Textdatei, binäre gzip-Datei, binäre lzop-Datei oder binäre bzip2-Datei) muss ein Format aufweisen, das der Amazon-Redshift-Befehl COPY verarbeiten kann. Weitere Informationen finden Sie unter [Vorbereiten der Eingabedaten](t_preparing-input-data.md).

publickey  
(Optional) Der öffentliche Schlüssel des Hosts. Wenn angegeben, verwendet Amazon Redshift den öffentlichen Schlüssel, um den Host zu identifizieren. Wenn der öffentliche Schlüssel nicht angegeben ist, versucht Amazon Redshift nicht, den Host zu identifizieren. Wenn beispielsweise der öffentliche Schlüssel des Remote-Hosts `ssh-rsa AbcCbaxxx…xxxDHKJ root@amazon.com` ist, geben Sie den folgenden Text in das Feld für den öffentlichen Schlüssel ein: `AbcCbaxxx…xxxDHKJ`. 

mandatory  
(Optional) Zeigt an, ob der COPY-Befehl fehlschlagen soll, wenn keine Verbindung hergestellt wird. Der Standardwert ist `false`. Wenn Amazon Redshift nicht mindestens eine Verbindung herstellt, schlägt der COPY-Befehl fehl.

username  
(Optional) Der Benutzername, der für die Anmeldung am Hostsystem und die Ausführung des Remotebefehls verwendet wird. Der Benutzeranmeldename muss mit dem Anmeldenamen identisch sein, der zum Hinzufügen des öffentlichen Schlüssels zur Datei des Hosts mit den autorisierten Schlüsseln in Schritt 2 verwendet wurde. Der Standardbenutzername ist „redshift“.

Im folgenden Beispiel wird gezeigt, wie ein abgeschlossenes Manifest vier Verbindungen mit demselben Host herstellt und über jede Verbindung einen anderen Befehl ausführt:

```
{ 
  "entries": [ 
       {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", 
          "command": "cat loaddata1.txt", 
          "mandatory":true, 
          "publickey": "ec2publickeyportionoftheec2keypair", 
          "username": "ec2-user"}, 
       {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", 
          "command": "cat loaddata2.txt", 
          "mandatory":true, 
          "publickey": "ec2publickeyportionoftheec2keypair", 
          "username": "ec2-user"},
       {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", 
          "command": "cat loaddata3.txt", 
          "mandatory":true, 
          "publickey": "ec2publickeyportionoftheec2keypair", 
          "username": "ec2-user"},
       {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", 
          "command": "cat loaddata4.txt", 
          "mandatory":true, 
          "publickey": "ec2publickeyportionoftheec2keypair", 
          "username": "ec2-user"}
     ] 
}
```

## Schritt 6: Hochladen der Manifestdatei in einen Amazon S3 Bucket
<a name="load-from-host-steps-upload-manifest"></a>

Laden Sie die Manifestdatei zu einem Amazon S3 Bucket hoch. Wenn sich der Amazon S3 S3-Bucket nicht in derselben AWS Region wie Ihr Amazon Redshift Redshift-Cluster befindet, müssen Sie die [REGION](copy-parameters-data-source-s3.md#copy-region) Option verwenden, um die AWS Region anzugeben, in der sich das Manifest befindet. Informationen zum Erstellen eines Amazon S3 Buckets und zum Hochladen einer Datei finden Sie im [Benutzerhandbuch zu Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonS3/latest/userguide/). 

## Schritt 7: Ausführen des COPY-Befehls, um die Daten zu laden
<a name="load-from-host-steps-run-copy"></a>

Führen Sie einen [COPY](r_COPY.md)-Befehl aus, um eine Verbindung zum Host herzustellen und die Daten in eine Amazon-Redshift-Tabelle zu laden. Geben Sie im COPY-Befehl den expliziten Amazon-S3-Objektpfad für die Manifestdatei an und schließen Sie die SSH-Option ein. Beispiel, 

```
COPY sales
FROM 's3://amzn-s3-demo-bucket/ssh_manifest'  
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
DELIMITER '|'
SSH;
```

**Anmerkung**  
Wenn Sie die automatische Kompression verwenden, führt der COPY-Befehl zwei Datenlesevorgänge aus. Dies bedeutet, dass der Remotebefehl zweimal ausgeführt wird. Der erste Lesevorgang dient dazu, eine Stichprobe zur Kompressionsanalyse bereitzustellen. Im zweiten Lesevorgang werden die Dateien tatsächlich geladen. Wenn die zweimalige Ausführung des Remotebefehls aufgrund möglicher Nebeneffekte Probleme verursachen könnte, sollten Sie die automatische Kompression deaktivieren. Um die automatische Kompression zu deaktivieren, führen Sie den COPY-Befehl aus, wobei Sie die Option COMPUPDATE auf OFF setzen. Weitere Informationen finden Sie unter [Laden von Tabellen mit automatischer Kompression](c_Loading_tables_auto_compress.md). 

# Laden von Daten aus einer Amazon-DynamoDB-Tabelle
<a name="t_Loading-data-from-dynamodb"></a>

Sie können den COPY-Befehl verwenden, um eine Tabelle mit Daten aus einer einzelnen Amazon-DynamoDB-Tabelle zu laden.

**Wichtig**  
Die Amazon DynamoDB-Tabelle, die die Daten bereitstellt, muss in derselben AWS Region wie Ihr Cluster erstellt werden, es sei denn, Sie verwenden die [REGION](copy-parameters-data-source-s3.md#copy-region) Option, um die AWS Region anzugeben, in der sich die Amazon DynamoDB-Tabelle befindet.

Der COPY-Befehl nutzt die Architektur für die massiv parallele Verarbeitung (Massively Parallel Processing, MPP) von Amazon Redshift, um Daten parallel aus einer Amazon-DynamoDB-Tabelle zu lesen und zu laden. Sie können die Parallelverarbeitung maximal nutzen, indem Sie für Ihre Amazon-Redshift-Tabellen Verteilungsstile festlegen. Weitere Informationen finden Sie unter [Datenverteilung zur Abfrageoptimierung](t_Distributing_data.md).

**Wichtig**  
Wenn der COPY-Befehl Daten aus der Amazon-DynamoDB-Tabelle liest, ist die entsprechende Datenübertragung Teil des bereitgestellten Durchsatzes dieser Tabelle.

Um die übermäßige Nutzung des bereitgestellten Lesedurchsatzes zu vermeiden, wird empfohlen, keine Daten aus Amazon-DynamoDB-Tabellen zu laden, die sich in Produktionsumgebungen befinden. Wenn Sie Daten aus Produktionstabellen laden, wird empfohlen, die Option READRATIO auf einen sehr viel niedrigeren Wert als den durchschnittlichen Prozentsatz ungenutzten bereitgestellten Durchsatzes festzulegen. Eine niedrige READRATIO-Einstellung hilft, Ablehnungsprobleme zu minimieren. Um den gesamten bereitgestellten Durchsatz einer Amazon-DynamoDB-Tabelle zu nutzen, legen Sie READRATIO auf 100 fest.

Der COPY-Befehl gleicht mittels folgender Regeln Attributnamen in den Elementen, die aus der DynamoDB-Tabelle abgerufen wurden, mit Spaltennamen in einer vorhandenen Amazon-Redshift-Tabelle ab:
+ Amazon-Redshift-Tabellenspalten werden ohne Berücksichtigung von Groß- und Kleinschreibung mit Amazon-DynamoDB-Elementattributen abgeglichen. Wenn ein Element in der DynamoDB-Tabelle mehrere Attribute enthält, die sich nur nach Groß- und Kleinschreibung unterscheiden, wie „price“ und „PRICE“, schlägt der COPY-Befehl fehl.
+ Amazon-Redshift-Tabellenspalten, die mit keinem Attribut in der Amazon-DynamoDB-Tabelle übereinstimmen, werden entweder als NULL oder leer geladen, abhängig von dem Wert, der mit der Option EMPTYASNULL im Befehl [COPY](r_COPY.md) angegeben ist.
+ Amazon-DynamoDB-Attribute, die mit keiner Spalte in der Amazon-Redshift-Tabelle übereinstimmen, werden verworfen. Attribute werden gelesen, bevor sie abgeglichen werden. Daher verbrauchen auch verworfene Attribute einen Teil des bereitgestellten Durchsatzes dieser Tabelle.
+ Es werden nur Amazon-DynamoDB-Attribute mit skalaren STRING- und NUMBER-Datentypen unterstützt. Die Amazon-DynamoDB-Datentypen BINARY und SET werden nicht unterstützt. Wenn ein COPY-Befehl versucht, ein Attribut zu laden, dessen Datentyp nicht unterstützt wird, schlägt der Befehl fehl. Wenn das Attribut mit keiner Amazon-Redshift-Tabellenspalte übereinstimmt, versucht COPY nicht, es zu laden, und es tritt kein Fehler auf.

Der COPY-Befehl verwendet die folgende Syntax, um Daten aus einer Amazon-DynamoDB-Tabelle zu laden:

```
COPY <redshift_tablename> FROM 'dynamodb://<dynamodb_table_name>'
authorization
readratio '<integer>';
```

Die Werte für die *Autorisierung* sind die AWS Anmeldeinformationen, die für den Zugriff auf die Amazon DynamoDB-Tabelle benötigt werden. Wenn diese Anmeldeinformationen einem Benutzer entsprechen, muss dieser Benutzer SCAN- und DESCRIBE-Berechtigungen für die Amazon-DynamoDB-Tabelle besitzen, die geladen wird.

Die Werte für die *Autorisierung* geben die AWS Autorisierung an, die Ihr Cluster für den Zugriff auf die Amazon DynamoDB-Tabelle benötigt. Die Berechtigung muss SCAN und DESCRIBE für die Amazon-DynamoDB-Tabelle einschließen, die geladen wird. Weitere Informationen zu erforderlichen Berechtigungen finden Sie unter [IAM-Berechtigungen für COPY, UNLOAD und CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions). Die bevorzugte Methode für die Authentifizierung besteht in der Angabe des Parameters IAM\$1ROLE und des Amazon-Ressourcennamens (ARN) für eine IAM-Rolle mit den notwendigen Berechtigungen. Weitere Informationen finden Sie unter [Rollenbasierte Zugriffskontrolle](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

Zur Authentifizierung mithilfe des Parameters IAM\$1ROLE *<aws-account-id>* und *<role-name>* wie in der folgenden Syntax dargestellt. 

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```

Das folgende Beispiel zeigt die Authentifizierung unter Verwendung einer IAM-Rolle.

```
COPY favoritemovies 
FROM 'dynamodb://ProductCatalog'
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Weitere Informationen zu anderen Autorisierungsoptionen finden Sie unter . [Autorisierungsparameter](copy-parameters-authorization.md)

Wenn Sie Ihre Daten validieren möchten, ohne die Tabelle tatsächlich zu laden, verwenden Sie die Option NOLOAD mit dem Befehl [COPY](r_COPY.md).

Im folgenden Beispiel wird die FAVORITEMOVIES-Tabelle mit Daten aus der DynamoDB-Tabelle geladen. my-favorite-movies-table Die Leseaktivität kann bis zu 50 % des bereitgestellten Durchsatzes verbrauchen.

```
COPY favoritemovies FROM 'dynamodb://my-favorite-movies-table' 
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
READRATIO 50;
```

Um den Durchsatz zu maximieren, lädt der COPY-Befehl Daten aus einer Amazon-DynamoDB-Tabelle aus allen Datenverarbeitungsknoten im Cluster parallel.

## Bereitgestellter Durchsatz mit automatischer Kompression
<a name="t_Loading-data-from-dynamodb-provisioned-throughput-with-automatic-compression"></a>

Standardmäßig wendet der COPY-Befehl eine automatische Kompression an, wenn Sie eine leere Tabelle ohne Kompressionskodierung angeben. Die automatische Komprimierungsanalyse untersucht zunächst stichprobenartig eine große Zahl von Zeilen aus der Amazon-DynamoDB-Tabelle. Die Größe der Stichprobe basiert auf dem Wert des Parameters COMPROWS. Der Standardwert ist 100.000 Zeilen pro Slice.

Nach der Untersuchung der Stichprobe werden die Stichprobenzeilen verworfen und die gesamte Tabelle wird geladen. Daher werden zahlreiche Zeilen zweimal gelesen. Weitere Informationen zur Funktionsweise der automatischen Kompression finden Sie unter [Laden von Tabellen mit automatischer Kompression](c_Loading_tables_auto_compress.md).

**Wichtig**  
Wenn der COPY-Befehl Daten aus der Amazon-DynamoDB-Tabelle liest, einschließlich der Stichprobenzeilen, ist die entsprechende Datenübertragung Teil des bereitgestellten Durchsatzes dieser Tabelle.

## Laden von Multibyte-Daten aus Amazon DynamoDB
<a name="t_Loading-data-from-dynamodb-loading-multibyte-data-from-amazon-dynamodb"></a>

Wenn Ihre Daten Multibyte-Zeichen enthalten, die andere als ASCII-Zeichen verwenden (beispielsweise chinesische oder kyrillische Zeichen), müssen Sie die Daten in VARCHAR-Spalten laden. Der VARCHAR-Datentyp unterstützt UTF-8-Zeichen mit vier Bytes. Der CHAR-Datentyp unterstützt jedoch nur ASCII-Zeichen mit einem Byte. Sie können keine Zeichen mit fünf Bytes oder mehr in Amazon-Redshift-Tabellen laden. Weitere Informationen zu CHAR und VARCHAR finden Sie unter [Datentypen](c_Supported_data_types.md).

# Überprüfung, ob die Daten korrekt geladen wurden
<a name="verifying-that-data-loaded-correctly"></a>

Fragen Sie nach Abschluss der Ladeoperation die Systemtabelle [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md) ab, um sicherzustellen, dass die erwarteten Dateien geladen wurden. Führen Sie den COPY-Befehl und die Verifizierung des Ladevorgangs innerhalb derselben Transaktion aus. Wenn es Probleme mit dem Ladevorgang gibt, können Sie so ein Rollback für die gesamte Transaktion ausführen.

Die folgende Abfrage gibt Einträge für das Laden der Tabellen in der Datenbank TICKIT zurück:

```
SELECT query, trim(filename) AS filename, curtime, status
FROM stl_load_commits
WHERE filename like '%tickit%' order by query;


 query |         filename          |          curtime           | status
-------+---------------------------+----------------------------+--------
 22475 | tickit/allusers_pipe.txt  | 2013-02-08 20:58:23.274186 |      1
 22478 | tickit/venue_pipe.txt     | 2013-02-08 20:58:25.070604 |      1
 22480 | tickit/category_pipe.txt  | 2013-02-08 20:58:27.333472 |      1
 22482 | tickit/date2008_pipe.txt  | 2013-02-08 20:58:28.608305 |      1
 22485 | tickit/allevents_pipe.txt | 2013-02-08 20:58:29.99489  |      1
 22487 | tickit/listings_pipe.txt  | 2013-02-08 20:58:37.632939 |      1
 22489 | tickit/sales_tab.txt      | 2013-02-08 20:58:37.632939 |      1
(6 rows)
```

# Validieren von Eingabedaten
<a name="t_Validating_input_files"></a>

Um die Daten in den Amazon-S3-Eingabedateien oder in der Amazon-DynamoDB-Tabelle zu validieren, bevor sie tatsächlich geladen werden, verwenden Sie die Option NOLOAD mit dem Befehl [COPY](r_COPY.md). Verwenden Sie NOLOAD mit den COPY-Befehlen und Optionen, die Sie auch zum Laden der Daten verwenden. NOLOAD prüft die Integrität aller Daten, ohne sie in die Datenbank zu laden. Die NOLOAD-Option zeigt alle Fehler an, die beim Versuch, die Daten zu laden, auftreten.

Wenn Sie beispielsweise einen falschen Amazon-S3-Pfad für die Eingabedatei angegeben haben, zeigt Amazon Redshift den folgenden Fehler an:

```
ERROR:  No such file or directory
DETAIL:
-----------------------------------------------
Amazon Redshift error:  The specified key does not exist
code:      2
context:   S3 key being read :
location:  step_scan.cpp:1883
process:   xenmaster [pid=22199]
-----------------------------------------------
```

Informationen zur Fehlerbehebung bei Fehlermeldungen finden Sie unter [Ladefehlerreferenz](r_Load_Error_Reference.md). 

Ein Beispiel mit der Option NOLOAD finden Sie unter [COPY-Befehl mit der Option NOLOAD](r_COPY_command_examples.md#r_COPY_command_examples-load-noload-option).

# Laden von Tabellen mit automatischer Kompression
<a name="c_Loading_tables_auto_compress"></a>

Sie können Komprimierungskodierungen manuell auf Spalten in Tabellen anwenden, basierend auf Ihrer eigenen Auswertung der Daten. Sie können auch den Befehl COPY verwenden, bei dem COMPUPDATE auf ON gesetzt ist, um die Komprimierung automatisch basierend auf Beispieldaten zu analysieren und anzuwenden. 

Sie können die automatische Kompression beim Erstellen und Laden einer völlig neuen Tabelle verwenden. Mit dem Befehl COPY führen Sie eine Komprimierungsanalyse durch. Sie können eine Komprimierungsanalyse auch durchführen, ohne Daten zu laden oder die Komprimierung einer Tabelle zu ändern, indem Sie den Befehl [ANALYZE COMPRESSION](r_ANALYZE_COMPRESSION.md) für eine bereits ausgefüllte Tabelle ausführen. Beispielsweise können Sie ANALYZE COMPRESSION ausführen, wenn Sie die Komprimierung für eine Tabelle für die zukünftige Verwendung analysieren und gleichzeitig die vorhandenen DDL-Anweisungen (Data Definition Language) beibehalten möchten.

Die automatische Kompression sorgt für den Ausgleich der allgemeinen Leistung bei der Auswahl von Kompressionskodierungen. Bereichseingeschränkte Scans können eine geringe Leistung zeigen, wenn Sortierschlüsselspalten stärker komprimiert sind als andere Spalten in der selben Abfrage. Daher überspringt die automatische Komprimierung die Datenanalysephase in den Sortierschlüsselspalten und behält die benutzerdefinierten Kodierungstypen bei. 

Bei der automatischen Komprimierung wird die RAW-Kodierung ausgewählt, wenn Sie nicht explizit eine Art der Kodierung definiert haben. ANALYZE COMPRESSION verhält sich gleich. Um eine optimale Abfrageleistung zu erzielen, sollten Sie RAW für Sortierschlüssel verwenden.

## So funktioniert die automatische Kompression
<a name="c_Loading_tables_auto_compress-how-automatic-compression-works"></a>

Wenn der COMPUPDATE-Parameter auf ON eingestellt ist, führt der COPY-Befehl jedes Mal eine automatische Kompression aus, wenn Sie den COPY-Befehl mit einer leeren Zieltabelle ausführen und alle Tabellenspalten entweder eine RAW-Kodierung oder keine Kodierung aufweisen.

Um die automatische Kompression auf eine leere Tabelle unabhängig von ihren aktuellen Kompressionskodierungen anzuwenden, führen Sie den COPY-Befehl aus, wobei Sie die Option COMPUPDATE auf ON festlegen. Um die automatische Kompression zu deaktivieren, führen Sie den COPY-Befehl aus, wobei Sie die Option COMPUPDATE auf OFF setzen.

Sie können keine automatische Kompression auf eine Tabelle anwenden, die bereits Daten enthält.

**Anmerkung**  
Um die automatische Kompression analysieren zu können, müssen in den geladenen Daten genügend Zeilen vorhanden sein (mindestens 100.000 Zeilen pro Slice), um eine relevante Stichprobe darzustellen.

Die automatische Kompression führt im Hintergrund die folgenden Operationen als Teil der Ladetransaktion aus:

1. Aus der Eingabedatei wird eine anfängliche Stichprobe von Zeilen geladen. Die Größe der Stichprobe basiert auf dem Wert des Parameters COMPROWS. Der Standardwert ist 100,000.

1. Für jede Spalte werden Kompressionsoptionen ausgewählt.

1. Die Stichprobenzeilen werden aus der Tabelle entfernt.

1. Die Tabelle wird erneut mit den gewählten Kompressionskodierungen erstellt.

1. Die gesamte Eingabedatei wird geladen und unter Verwendung der neuen Kodierungen komprimiert.

Nach der Ausführung des COPY-Befehls wird die Tabelle vollständig geladen und komprimiert und kann verwendet werden. Wenn Sie später weitere Daten laden, werden die angefügten Zeilen entsprechend der vorhandenen Kodierung komprimiert.

Wenn Sie nur eine Kompressionsanalyse ausführen möchten, führen Sie ANALYZE COMPRESSION aus. Dies ist effizienter als eine vollständige COPY-Operation. Anschließend können Sie die Ergebnisse auswerten, um zu entscheiden, ob Sie die automatische Kompression verwenden oder die Tabelle manuell neu erstellen sollten.

Die automatische Kompression wird nur für den COPY-Befehl unterstützt. Alternativ können Sie beim Erstellen der Tabelle manuell eine Kompressionskodierung anwenden. Informationen zur manuellen Kompressionskodierung finden Sie unter [Spaltenkomprimierung zur Reduzierung der Größe der gespeicherten Daten](t_Compressing_data_on_disk.md).

## Beispiel für eine automatische Kompression
<a name="r_COPY_COMPRESS_examples"></a>

In diesem Beispiel wird angenommen, dass die Datenbank TICKIT eine Kopie der LISTING-Tabelle mit dem Namen BIGLIST enthält und Sie auf diese Tabelle eine automatische Kompression anwenden möchten, wenn sie mit ungefähr 3 Millionen Zeilen geladen wird.

**So laden Sie die Tabelle und komprimieren sie automatisch**

1. Stellen Sie sicher, dass die Tabelle leer ist. Sie können die automatische Kompression nur auf leere Tabellen anwenden:

   ```
   TRUNCATE biglist;
   ```

1. Laden Sie die Tabelle mit einem einzelnen COPY-Befehl. Auch wenn die Tabelle leer ist, wurde möglicherweise früher bereits eine Kodierung angegeben. Um eine Kompressionsanalyse durch Amazon Redshift zu ermöglichen, setzen Sie den Parameter COMPUPDATE auf ON.

   ```
   COPY biglist FROM 's3://amzn-s3-demo-bucket/biglist.txt' 
   IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
   DELIMITER '|' COMPUPDATE ON;
   ```

   Da die Option COMPROWS nicht angegeben ist, wird die standardmäßige und empfohlene Größe von 100.000 Zeilen pro Slice verwendet.

1. Betrachten Sie das neue Schema für die Tabelle BIGLIST, um die automatisch gewählten Kodierungsschemas zu überprüfen.

   ```
   SELECT "column", type, encoding 
   from pg_table_def where tablename = 'biglist';
   
   
        Column     |            Type             | Encoding 
   ----------------+-----------------------------+----------
    listid         | integer                     | az64
    sellerid       | integer                     | az64
    eventid        | integer                     | az64
    dateid         | smallint                    | none
    numtickets     | smallint                    | az64
    priceperticket | numeric(8,2)                | az64
    totalprice     | numeric(8,2)                | az64
    listtime       | timestamp without time zone | az64
   ```

1. Überprüfen Sie, ob die erwartete Zahl von Zeilen geladen wurde: 

   ```
   select count(*) from biglist;
   
   count
   ---------
   3079952
   (1 row)
   ```

Wenn dieser Tabelle später mittels der Anweisungen COPY oder INSERT Zeilen angefügt werden, werden die gleichen Kompressionskodierungen angewendet.

# Optimieren des Speichers für enge Tabellen
<a name="c_load_compression_hidden_cols"></a>

Wenn Sie eine Tabelle mit sehr wenigen Spalten, jedoch einer sehr großen Zahl von Zeilen haben, nehmen die drei ausgeblendeten Metadatenidentitätsspalten (INSERT\$1XID, DELETE\$1XID, ROW\$1ID) einen unverhältnismäßig großen Anteil am Festplattenplatz für die Tabelle in Anspruch.

 Um die Kompression der ausgeblendeten Spalten zu optimieren, laden Sie die Tabelle in einer einzigen COPY-Transaktion, wenn möglich. Wenn Sie die Tabelle mit mehreren getrennten COPY-Befehlen laden, wird die Spalte INSERT\$1XID nicht gut komprimiert. Sie müssen eine Bereinigungsoperation ausführen, wenn Sie mehrere COPY-Befehle verwenden. Dies verbessert die Kompression von INSERT\$1XID jedoch nicht.

# Laden von Standardspaltenwerten
<a name="c_loading_default_values"></a>

Sie können in Ihrem COPY-Befehl optional eine Spaltenliste definieren. Wenn eine Spalte in der Tabelle aus der Spaltenliste ausgelassen wird, lädt COPY die Spalte entweder mit dem Wert, der von der im Befehl CREATE TABLE angegebenen Option DEFAULT bereitgestellt wird, oder mit NULL, wenn die Option DEFAULT nicht angegeben wurde.

Wenn COPY versucht, einer Spalte NULL zuzuweisen, die als NOT NULL definiert ist, schlägt der COPY-Befehl fehl. Weitere Informationen zum Zuweisen der Option DEFAULT finden Sie unter [CREATE TABLE](r_CREATE_TABLE_NEW.md).

Wenn Sie Daten aus Datendateien in Amazon S3 laden, müssen sich die Spalten in der Spaltenliste in derselben Reihenfolge wie die Felder in der Datendatei befinden. Wenn es für ein Feld in der Datendatei keine entsprechende Spalte in der Spaltenliste gibt, schlägt der COPY-Befehl fehl.

Beim Laden aus einer Amazon-DynamoDB-Tabelle spielt die Reihenfolge keine Rolle. Felder in den Amazon-DynamoDB-Attributen, die mit keiner Spalte in der Amazon-Redshift-Tabelle übereinstimmen, werden verworfen.

Bei der Verwendung des COPY-Befehls zum Laden von DEFAULT-Werten in eine Tabelle gelten die folgenden Einschränkungen: 
+ Wenn eine [IDENTITY](r_CREATE_TABLE_NEW.md#identity-clause)-Spalte in der Spaltenliste enthalten ist, muss auch die Option EXPLICIT\$1IDS im Befehl [COPY](r_COPY.md) angegeben werden. Andernfalls schlägt der COPY-Befehl fehl. Wenn eine IDENTITY-Spalte in der Spaltenliste ausgelassen wird und die Option EXPLICIT\$1IDS angegeben ist, schlägt der COPY-Befehl ebenfalls fehl.
+ Da der ausgewertete DEFAULT-Ausdruck für eine bestimmte Spalte für alle geladenen Zeilen derselbe ist, weist ein DEFAULT-Ausdruck, der eine RANDOM()-Funktion verwendet, allen Zeilen denselben Wert zu.
+ DEFAULT-Ausdrücke, die CURRENT\$1DATE oder SYSDATE enthalten, sind auf den Zeitstempel der aktuellen Transaktion festgelegt.

Ein Beispiel hierfür finden Sie unter „Laden von Daten aus einer Datei mit Standardwerten“ in [Beispiele für COPY](r_COPY_command_examples.md).

# Fehlerbehebung bei Datenladevorgängen
<a name="t_Troubleshooting_load_errors"></a>

Wenn Sie Daten in Amazon-Redshift-Tabellen laden, können Fehler von Amazon S3, ungültige Eingabedaten und COPY-Befehlsfehler auftreten. Die folgenden Abschnitte stellen Informationen zum Identifizieren und Beheben von Fehlern beim Laden von Daten bereit.

**Topics**
+ [Behebung von Fehlern für die S3-Ereignisintegration und für COPY JOB](s3-integration-troubleshooting.md)
+ [ServiceException S3-Fehler](s3serviceexception-error.md)
+ [Systemtabellen für die Behebung von Fehlern beim Laden von Daten](system-tables-for-troubleshooting-data-loads.md)
+ [Fehler beim Laden von Multibyte-Zeichen](multi-byte-character-load-errors.md)
+ [Ladefehlerreferenz](r_Load_Error_Reference.md)

# Behebung von Fehlern für die S3-Ereignisintegration und für COPY JOB
<a name="s3-integration-troubleshooting"></a>

Verwenden Sie die folgenden Informationen, um häufige Probleme bei Amazon-S3-Ereignisintegrationen und COPY JOB mit Amazon Redshift zu beheben.

## Erstellung der S3-Ereignisintegration ist fehlgeschlagen
<a name="s3-integration-troubleshooting-creation"></a>

Wenn die Erstellung der S3-Ereignisintegration fehlgeschlagen ist, ist der Status der Integration `Inactive`. Stellen Sie sicher, dass Folgendes für Ihr Data Warehouse in Amazon Redshift zutrifft.
+ Sie haben den richtigen autorisierten Prinzipal und die richtige Integrationsquelle für Ihren Ziel-Namespace in Amazon Redshift hinzugefügt. Siehe [Voraussetzungen für die Erstellung einer S3-Ereignisintegration](loading-data-copy-job.md#loading-data-copy-job-prerequisites).
+ Sie haben die richtige ressourcenbasierte Richtlinie zum Quell-Bucket in Amazon S3 hinzugefügt. Siehe [Voraussetzungen für die Erstellung einer S3-Ereignisintegration](loading-data-copy-job.md#loading-data-copy-job-prerequisites).

## Ihre Amazon-S3-Daten werden nicht in der Zieldatenbank angezeigt
<a name="s3-integration-troubleshooting-missing-data"></a>

Wenn Daten aus einem COPY JOB nicht angezeigt werden, überprüfen Sie Folgendes.
+ Fragen Sie SYS\$1COPY\$1JOB\$1DETAIL ab, um zu sehen, ob die Amazon-S3-Datei geladen wurde, ob sie noch erfasst werden muss oder ob ein Fehler vorliegt. Weitere Informationen finden Sie unter [SYS\$1COPY\$1JOB\$1DETAIL](SYS_COPY_JOB_DETAIL.md).
+ Überprüfen Sie STL\$1ERROR oder SYS\$1COPY\$1JOB\$1INFO, wenn die Amazon-S3-Datei nicht vorhanden ist oder es unerwartete Wartezeiten gibt. Suchen Sie nach Fehlern in Anmeldeinformationen oder allem, was darauf hindeutet, dass die Integration inaktiv ist. Weitere Informationen erhalten Sie unter [STL\$1ERROR](r_STL_ERROR.md) und [SYS\$1COPY\$1JOB\$1INFO](SYS_COPY_JOB_INFO.md).

# ServiceException S3-Fehler
<a name="s3serviceexception-error"></a>

Die häufigsten ServiceException S3-Fehler werden durch eine falsch formatierte oder falsche Zeichenfolge für Anmeldeinformationen verursacht, wenn sich Ihr Cluster und Ihr Bucket in verschiedenen AWS Regionen befinden und die Amazon S3 S3-Berechtigungen nicht ausreichen.

In diesem Abschnitt werden Informationen zur Fehlerbehebung für die einzelnen Fehlertypen bereitgestellt.

## Ungültige Anmeldeinformationszeichenfolgen
<a name="invalid-credentials-string-error"></a>

Wenn die Anmeldeinformationszeichenfolge nicht korrekt formatiert ist, erhalten Sie die folgende Fehlermeldung: 

```
ERROR: Invalid credentials. Must be of the format: credentials 
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>
[;token=<temporary-session-token>]'
```

Überprüfen Sie, ob die Anmeldeinformationszeichenfolge keine Leerzeichen oder Zeilenumbrüche enthält und in einfachen Anführungszeichen eingeschlossen ist. 

## Ungültige Zugriffsschlüssel-ID
<a name="invalid-access-key-id-error"></a>

Wenn Ihre Zugriffsschlüssel-ID nicht vorhanden ist, erhalten Sie folgende Fehlermeldung: 

```
[Amazon](500310) Invalid operation: S3ServiceException:The AWS Access Key Id you provided does not exist in our records.
```

Dies geht häufig auf einen Fehler beim Kopieren und Einfügen zurück. Überprüfen Sie, ob die Zugriffsschlüssel-ID korrekt eingegeben wurde. Wenn Sie temporäre Sitzungsschlüssel verwenden, überprüfen Sie außerdem, ob der Wert für `token` festgelegt wurde.

## Ungültiger geheimer Zugriffsschlüssel
<a name="invalid-secret-access-key-error"></a>

Wenn der geheime Zugriffsschlüssel falsch ist, erhalten Sie folgende Fehlermeldung: 

```
[Amazon](500310) Invalid operation: S3ServiceException:The request signature we calculated does not match the signature you provided. 
Check your key and signing method.,Status 403,Error SignatureDoesNotMatch
```

Dies geht häufig auf einen Fehler beim Kopieren und Einfügen zurück. Überprüfen Sie, ob der geheime Zugriffsschlüssel korrekt eingegeben wurde und ob es sich um den korrekten Schlüssel für die Zugriffsschlüssel-ID handelt.

## Bucket befindet sich in einer anderen Region
<a name="bucket-in-different-region"></a>

Der im COPY-Befehl angegebene Amazon S3 S3-Bucket muss sich in derselben AWS Region wie der Cluster befinden. Wenn sich Amazon-S3-Bucket und -Cluster in verschiedenen Regionen befinden, erhalten Sie eine Fehlermeldung wie die folgende: 

```
ERROR: S3ServiceException:The bucket you are attempting to access must be addressed using the specified endpoint.
```

Sie können einen Amazon-S3-Bucket in einer bestimmten Region erstellen, indem Sie entweder bei der Erstellung des Buckets die Region über die Amazon-S3-Managementkonsole auswählen oder indem Sie einen Endpunkt angeben, wenn Sie den Bucket mithilfe der Amazon-S3-API oder -CLI erstellen. Weitere Informationen finden Sie unter [Hochladen von Dateien zu Amazon S3 zur Verwendung mit COPY](t_uploading-data-to-S3.md).

Weitere Informationen zu Amazon-S3-Regionen finden Sie unter [Zugriff auf einen Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html#access-bucket-intro) im *Benutzerhandbuch für Amazon Simple Storage Service*.

Alternativ können Sie die Region mithilfe der Option [REGION](copy-parameters-data-source-s3.md#copy-region) mit dem Befehl COPY angeben.

## Zugriff verweigert
<a name="s3-access-denied-error"></a>

Wenn der Benutzer keine ausreichenden Berechtigungen besitzt, erhalten Sie folgende Fehlermeldung:

```
ERROR: S3ServiceException:Access Denied,Status 403,Error AccessDenied
```

Eine mögliche Ursache dafür ist, dass der durch die Anmeldeinformationen identifizierte Benutzer nicht über LIST- und GET-Zugriff für den Amazon-S3-Bucket verfügt. Weitere mögliche Ursachen finden Sie unter [Beheben von Fehlern aufgrund einer Zugriffsverweigerung (403 Forbidden) in Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/troubleshoot-403-errors.html) im *Benutzerhandbuch zu Amazon Simple Storage Service*.

Informationen zur Verwaltung des Benutzerzugriffs auf Buckets finden Sie unter [Identity and Access Management in Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html) im *Benutzerhandbuch zu Amazon Simple Storage Service*.

# Systemtabellen für die Behebung von Fehlern beim Laden von Daten
<a name="system-tables-for-troubleshooting-data-loads"></a>

Die folgenden Amazon-Redshift-Systemtabellen können beim Beheben von Fehlern, die beim Laden von Daten auftreten, nützlich sein:
+ Führen Sie eine Abfrage für [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md) aus, um Fehler zu entdecken, die während spezifischer Ladevorgänge aufgetreten sind.
+ Führen Sie eine Abfrage für [STL\$1FILE\$1SCAN](r_STL_FILE_SCAN.md) aus, um die Ladezeiten für spezifische Dateien anzuzeigen oder um festzustellen, ob eine spezifische Datei überhaupt gelesen wurde.
+ Führen Sie eine Abfrage für [STL\$1S3CLIENT\$1ERROR](r_STL_S3CLIENT_ERROR.md) aus, um Details zu Fehlern zu ermitteln, die während der Übertragung von Daten aus Amazon S3 aufgetreten sind.

**So finden und diagnostizieren Sie Ladefehler**

1. Erstellen Sie eine Ansicht oder definieren Sie eine Abfrage, die Details zu Ladefehlern zurückgibt. Im folgenden Beispiel wird die Tabelle STL\$1LOAD\$1ERRORS mit der Tabelle STV\$1TBL\$1PERM verknüpft, um die Tabelle mit den tatsächlichen Tabellennamen abzugleichen. IDs 

   ```
   create view loadview as
   (select distinct tbl, trim(name) as table_name, query, starttime,
   trim(filename) as input, line_number, colname, err_code,
   trim(err_reason) as reason
   from stl_load_errors sl, stv_tbl_perm sp
   where sl.tbl = sp.id);
   ```

1. Legen Sie die Option MAXERRORS in Ihrem COPY-Befehl auf einen Wert fest, der groß genug ist, dass COPY nützliche Informationen zu Ihren Daten zurückgeben kann. Wenn für den COPY-Befehl Fehler auftreten, weist Sie eine Fehlermeldung an, in der Tabelle STL\$1LOAD\$1ERRORS nach Details zu suchen.

1. Führen Sie eine Abfrage für die Ansicht LOADVIEW aus, um Fehlerdetails anzuzeigen. Beispiel: 

   ```
   select * from loadview where table_name='venue';
   ```

   ```
     tbl   | table_name | query |         starttime          
   --------+------------+-------+----------------------------
    100551 | venue      | 20974 | 2013-01-29 19:05:58.365391 
   
   |     input      | line_number | colname | err_code |       reason
   +----------------+-------------+---------+----------+--------------------
   | venue_pipe.txt |           1 |       0 |     1214 | Delimiter not found
   ```

1. Beheben Sie das Problem in der Eingabedatei oder im Ladeskript basierend auf den Informationen, die von der Ansicht zurückgegeben werden. Typische Ladefehler, auf die Sie achten sollten, sind: 
   + Fehlende Übereinstimmung zwischen Datentypen in der Tabelle und Werten in den Eingabedatenfeldern.
   + Fehlende Übereinstimmung zwischen der Anzahl der Spalten in der Tabelle und der Anzahl der Felder in den Eingabedatenfeldern.
   + Nicht übereinstimmende Anführungszeichen. Amazon Redshift unterstützt sowohl einfache als auch doppelte Anführungszeichen. Diese Anführungszeichen müssen jedoch entsprechend ausgeglichen werden.
   +  date/time Falsches Format für Daten in Eingabedateien.
   + Out-of-range Werte in Eingabedateien (für numerische Spalten).
   + Anzahl der unterschiedlichen Werte für eine Spalte überschreitet die Begrenzung für ihre Kompressionskodierung.

# Fehler beim Laden von Multibyte-Zeichen
<a name="multi-byte-character-load-errors"></a>

Spalten mit einem CHAR-Datentyp akzeptieren nur UTF-8-Einzelbyte-Zeichen bis zum Bytewert 127 oder 7F Hex. Dies entspricht dem ASCII-Zeichensatz. VARCHAR-Spalten akzeptieren UTF-8-Multibyte-Zeichen bis zu einer Länge von vier Bytes. Weitere Informationen finden Sie unter [Zeichentypen](r_Character_types.md). 

Wenn eine Zeile in den geladenen Daten ein für den Datentyp der Spalte ungültiges Zeichen enthält, gibt COPY einen Fehler zurück und protokolliert eine Zeile mit der Fehlernummer 1220 in der Systemprotokolltabelle STL\$1LOAD\$1ERRORS. Das Feld ERR\$1REASON enthält die Byte-Folge in Hex für das ungültige Zeichen. 

Alternativ zur Korrektur von ungültigen Zeichen in den geladenen Daten können Sie die ungültigen Zeichen auch während des Ladeprozesses ersetzen. Um ungültige UTF-8-Zeichen zu ersetzen, geben Sie mit dem COPY-Befehl die Option ACCEPTINVCHARS an. Wenn die Option ACCEPTINVCHARS festgelegt ist, ersetzt das von Ihnen angegebene Zeichen den Codepunkt. Wenn die Option ACCEPTINVCHARS nicht festgelegt ist, akzeptiert Amazon Redshift die Zeichen als gültiges UTF-8. Weitere Informationen finden Sie unter [ACCEPTINVCHARS](copy-parameters-data-conversion.md#acceptinvchars).

Die folgende Liste von Codepunkten ist gültiges UTF-8, COPY-Operationen geben keinen Fehler zurück, wenn die ACCEPTINVCHARS-Option nicht festgelegt wurde. Diese Codepunkte sind jedoch keine gültigen Zeichen. Sie können die Option [ACCEPTINVCHARS](copy-parameters-data-conversion.md#acceptinvchars) verwenden, um einen Codepunkt durch ein von Ihnen festgelegtes Zeichen zu ersetzen. Diese Codepunkte beinhalten den Wertebereich von `0xFDD0` bis `0xFDEF` und Werte bis `0x10FFFF`, endend mit `FFFE` oder `FFFF`:
+ `0xFFFE`, `0x1FFFE`, `0x2FFFE`, …, `0xFFFFE`, `0x10FFFE`
+ `0xFFFF`, `0x1FFFF`, `0x2FFFF`, …, `0xFFFFF`, `0x10FFFF`

Im folgenden Beispiel ist der Fehlergrund angegeben, wenn COPY versucht, das UTF-8-Zeichen `e0 a1 c7a4` in eine CHAR-Spalte zu laden.

```
Multibyte character not supported for CHAR 
(Hint: Try using  VARCHAR). Invalid char: e0 a1 c7a4
```

Wenn sich der Fehler auf einen VARCHAR-Datentyp bezieht, beinhaltet der Fehlergrund einen Fehlercode sowie die ungültige UTF-8-Hex-Sequenz. Im folgenden Beispiel ist der Fehlergrund angegeben, wenn COPY versucht, das UTF-8-Zeichen `a4` in ein VARCHAR-Feld zu laden:

```
String contains invalid or unsupported UTF-8 codepoints. 
Bad UTF-8 hex sequence: a4 (error 3)
```

In der folgenden Tabelle werden die Beschreibungen und vorgeschlagenen Umgehungen für VARCHAR-Ladefehler aufgelistet. Wenn einer dieser Fehler auftritt, ersetzen Sie das Zeichen durch eine gültige UTF-8-Codefolge oder entfernen das Zeichen.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/multi-byte-character-load-errors.html)

# Ladefehlerreferenz
<a name="r_Load_Error_Reference"></a>

Wenn während des Ladens von Daten aus einer Datei Fehler auftreten, führen Sie eine Abfrage für die Tabelle [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md) aus, um den Fehler zu identifizieren und die mögliche Erklärung zu ermitteln. In der folgenden Tabelle werden alle Fehlercodes aufgelistet, die beim Laden von Daten auftreten können:

## Ladefehlercodes
<a name="r_Load_Error_Reference-load-error-codes"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/r_Load_Error_Reference.html)

# Erstellen einer S3-Ereignisintegration, um Dateien automatisch aus Amazon-S3-Buckets zu kopieren
<a name="loading-data-copy-job"></a>

**Anmerkung**  
Die Vorschauversion für auto-copy ist abgelaufen. Daher werden Vorschau-Cluster 30 Tage nach dem Ende der Vorschauversion automatisch entfernt. Wenn Sie auto-copy weiterhin verwenden möchten, sollten Sie Ihre bestehenden auto-copy-Jobs in einem anderen Amazon-Redshift-Cluster neu erstellen. Upgrades von Vorschau-Clustern auf die neueste Amazon-Redshift-Version werden nicht unterstützt.

Sie können einen auto-copy-Job verwenden, um Daten aus Dateien, die in Amazon S3 gespeichert sind, in Ihre Amazon-Redshift-Tabellen zu laden. Amazon Redshift erkennt, wenn neue Amazon-S3-Dateien zu dem in Ihrem COPY-Befehl angegebenen Pfad hinzugefügt werden. Ein COPY-Befehl wird dann automatisch ausgeführt, ohne dass Sie eine externe Datenerfassungspipeline erstellen müssen. Amazon Redshift verfolgt, welche Dateien geladen wurden. Amazon Redshift bestimmt die Anzahl der Dateien, die für jeden COPY-Befehl zusammengefasst werden. Sie können die resultierenden COPY-Befehle in Systemansichten sehen.

Der erste Schritt zur Erstellung eines automatischen COPY JOB besteht in der Erstellung einer S3-Ereignisintegration. Wenn eine neue Datei im Quell-Bucket in Amazon S3 erscheint, verwaltet Amazon Redshift anschließend das Laden der Dateien in Ihre Datenbank mittels des Befehls COPY.

## Voraussetzungen für die Erstellung einer S3-Ereignisintegration
<a name="loading-data-copy-job-prerequisites"></a>

Stellen Sie sicher, dass die folgenden Voraussetzungen erfüllt sind, um Ihre S3-Ereignisintegration einzurichten.
+ Der Amazon-S3-Bucket muss über eine Bucket-Richtlinie verfügen, die mehrere Amazon-S3-Berechtigungen zulässt. Die folgende Beispielrichtlinie ermöglicht beispielsweise Berechtigungen für den Ressourcen-Bucket`amzn-s3-demo-bucket`, der in *us-east-1* gehostet wird. Sowohl der Amazon-S3-Bucket als auch die Integration befinden sich in der derselben AWS-Region.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "Auto-Copy-Policy-01",
              "Effect": "Allow",
              "Principal": {
                  "Service": "redshift.amazonaws.com"
                  },
              "Action": [
                  "s3:GetBucketNotification",
                  "s3:PutBucketNotification",
                  "s3:GetBucketLocation"
              ],
              "Resource": "arn:aws:s3:::amzn-s3-demo-bucket:*",
              "Condition": {
                  "ArnLike": {
                      "aws:SourceArn": "arn:aws:redshift:us-east-1:111122223333:integration:*"
                  },
                  "StringEquals": {
                      "aws:SourceAccount": "111122223333"
                  }
              }
          }
      ]
  }
  ```

------
+ Der von Amazon Redshift bereitgestellte Zielcluster oder der Redshift-Serverless-Namespace muss über Berechtigungen für den Bucket verfügen. Überprüfen Sie, ob eine IAM-Rolle, die Ihrem Cluster oder Serverless Namespace zugeordnet ist, über eine IAM-Richtlinie verfügt, die die richtigen Berechtigungen zulässt. Die Richtlinie muss sowohl `s3:GetObject` für eine Bucket-Ressource wie `amzn-s3-demo-bucket` als auch `s3:ListBucket` für eine Bucket-Ressource und ihren Inhalt zulassen, z. B. `amzn-s3-demo-bucket/*`.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AutoCopyReadId",
              "Effect": "Allow",
              "Action": [
                  "s3:GetObject",
                  "s3:ListBucket"
              ],
              "Resource": [
                  "arn:aws:s3:::amzn-s3-demo-bucket",  
                  "arn:aws:s3:::amzn-s3-demo-bucket/*" 
              ]
          }
      ]
  }
  ```

------

  Fügen Sie Ihre Richtlinie wie folgt zu einer IAM-Rolle hinzu, für die eine Vertrauensbeziehung besteht.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "redshift.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole"
          }
      ]
  }
  ```

------

  Wenn Ihr Ziel-Data-Warehouse ein bereitgestellter Cluster ist, können Sie Ihrem bereitgestellten Cluster über die Amazon-Redshift-Konsole auf der Registerkarte **Cluster-Berechtigungen** in den Cluster-Details eine IAM-Rolle zuordnen. Informationen dazu, wie Sie Ihrem bereitgestellten Cluster eine Rolle zuordnen, finden Sie unter [Zuordnen von IAM-Rollen zu Clustern](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role-associating-with-clusters.html) im *Managementleitfaden zu Amazon Redshift*.

  Wenn Ihr Ziel-Data-Warehouse Redshift Serverless ist, können Sie Ihrem Serverless-Namespace über die Redshift-Serverless-Konsole auf der Registerkarte **Sicherheit und Verschlüsselung** in den Namespace-Details eine IAM-Rolle zuordnen. Informationen dazu, wie Sie Ihrem Serverless-Namespace eine Rolle zuordnen, finden Sie unter [Gewähren von Berechtigungen für Amazon Redshift Serverless](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-security-other-services.html) im *Managementleitfaden zu Amazon Redshift*.
+ Ihr Data Warehouse in Amazon Redshift muss auch über eine Ressourcenrichtlinie verfügen, die den Amazon-S3-Bucket zulässt. Wenn Sie die Amazon-Redshift-Konsole verwenden und die S3-Ereignisintegration erstellen, bietet Amazon Redshift die Option **Reparieren**, um diese Richtlinie zu Ihrem Data Warehouse in Amazon Redshift hinzuzufügen. Um eine Ressourcenrichtlinie selbst zu aktualisieren, können Sie den [put-resource-policy](https://docs.aws.amazon.com/cli/latest/reference/redshift/put-resource-policy.html) AWS CLI Befehl verwenden. Um beispielsweise eine Ressourcenrichtlinie an Ihren von Amazon Redshift bereitgestellten Cluster für eine S3-Ereignisintegration mit einem Amazon S3-Bucket anzuhängen, führen Sie einen AWS CLI Befehl aus, der dem folgenden ähnelt. Das folgende Beispiel zeigt eine Richtlinie für einen bereitgestellten Cluster-Namespace im *us-east-1* AWS-Region Benutzerkonto for. *123456789012* Der Bucket ist benannt. *amzn-s3-demo-bucket*

  ```
  aws redshift put-resource-policy \
  --policy file://rs-rp.json \
  --resource-arn "arn:aws:redshift: us-east-1:123456789012:namespace/cc4ffe56-ad2c-4fd1-a5a2-f29124a56433"
  ```

  Wobei `rs-rp.json` Folgendes enthält:

------
#### [ JSON ]

****  

  ```
  {
  	"Version":"2012-10-17",		 	 	 
  	"Statement": [
  		{
  			"Effect": "Allow",
  			"Principal": {
  				"Service": "redshift.amazonaws.com"
  			},
  			"Action": "redshift:AuthorizeInboundIntegration",
  			"Resource": "arn:aws:redshift:us-east-1:123456789012:namespace:cc4ffe56-ad2c-4fd1-a5a2-f29124a56433",
  			"Condition": {
  				"StringEquals": {
  					"aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket",
  					"aws:SourceAccount": 111122223333
  				}
  			}
  		},
  		{
  			"Effect": "Allow",
  			"Principal": {
  				"AWS": "arn:aws:iam::111122223333:role/myRedshiftRole"
  			},
  			"Action": "redshift:CreateInboundIntegration",
  			"Resource": "arn:aws:redshift:us-east-1:123456789012:namespace:cc4ffe56-ad2c-4fd1-a5a2-f29124a56433",
  			"Condition": {
  				"StringEquals": {
  					"aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket",
  					"aws:SourceAccount": 111122223333
  				}
  			}
  		}
  	]
  }
  ```

------

  Um Ihrem Redshift Serverless-Namespace eine Ressourcenrichtlinie für eine S3-Eventintegration mit einem Amazon S3-Bucket anzuhängen, führen Sie einen AWS CLI Befehl aus, der dem folgenden ähnelt. Das folgende Beispiel zeigt eine Richtlinie für einen serverlosen Namespace im for-Benutzerkonto. *us-east-1* AWS-Region *123456789012* Der Bucket ist benannt. *amzn-s3-demo-bucket*

  ```
  aws redshift put-resource-policy \
  --policy file://rs-rp.json \
  --resource-arn "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1"
  ```

  Wobei `rs-rp.json` Folgendes enthält:

------
#### [ JSON ]

****  

  ```
  {
  	"Version":"2012-10-17",		 	 	 
  	"Statement": [
  		{
  			"Effect": "Allow",
  			"Principal": {
  				"Service": "redshift.amazonaws.com"
  			},
  			"Action": "redshift:AuthorizeInboundIntegration",
  			"Resource": "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1",
  			"Condition": {
  				"StringEquals": {
  					"aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket",
  					"aws:SourceAccount": 111122223333
  	
  				}
  			}
  		},
  		{
  			"Effect": "Allow",
  			"Principal": {
  				"AWS": "arn:aws:iam::123456789012:user/myUser"
  			},
  			"Action": "redshift:CreateInboundIntegration",
  			"Resource": "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1",
  			"Condition": {
  				"StringEquals": {
  					"aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket",
  					"aws:SourceAccount": 111122223333
  				}
  			}
  		}
  	]
  }
  ```

------

## Erstellen einer Amazon-S3-Ereignisintegration
<a name="loading-data-copy-job-create-s3-event-integration"></a>

Um den Kopierjob einzurichten, definieren Sie zunächst eine S3-Ereignisintegration.

------
#### [ Amazon Redshift console ]

**So erstellen Sie eine Amazon-S3-Ereignisintegration in der Amazon-Redshift-Konsole**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die Amazon Redshift Redshift-Konsole unter [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/).

1. Wählen Sie im linken Navigationsbereich **S3-Ereignisintegrationen** aus.

1. Wählen Sie **Amazon-S3-Ereignisintegration erstellen** aus, um den Assistenten zu öffnen und eine S3-Ereignisintegration für die Verwendung mit auto-copy zu erstellen. Ihr Quell-Bucket in Amazon S3 und das Ziel-Data-Warehouse in Amazon Redshift müssen sich in derselben AWS-Region befinden. Geben Sie die folgenden Informationen an, wenn Sie die Schritte zum Erstellen einer Integration ausführen:
   + **Integrationsname** — Ist eine eindeutige Kennung für alle Integrationen, die Ihnen derzeit AWS-Konto gehören. AWS-Region
   + **Beschreibung**: ein Text, der die Amazon S3-Ereignisintegration zur späteren Referenz beschreibt.
   + **Quell-S3-Bucket** — Ist der aktuelle AWS-Konto Amazon S3 S3-Bucket, der AWS-Region die Quelle für die Datenaufnahme in Amazon Redshift ist.
   + **Data Warehouse in Amazon Redshift**: der von Amazon Redshift bereitgestellte Zielcluster oder die Redshift-Serverless-Arbeitsgruppe, die die Daten aus der Integration erfasst.

     Wenn sich das Ziel in Amazon Redshift im selben Konto befindet, können Sie das Ziel auswählen. Wenn sich das Ziel in einem anderen Konto befindet, geben Sie den **Amazon-Redshift-ARN für das Data Warehouse** an. Das Ziel muss über eine Ressourcenrichtlinie mit autorisierten Prinzipalen und einer Integrationsquelle verfügen. Wenn Sie nicht über die richtigen Ressourcenrichtlinien im Ziel verfügen und sich das Ziel im selben Konto befindet, können Sie die Option **Reparieren** auswählen, um die Ressourcenrichtlinien während der Erstellung der Integration automatisch anzuwenden. Wenn sich Ihr Ziel in einem anderen befindet AWS-Konto, müssen Sie die Ressourcenrichtlinie manuell auf das Amazon Redshift Redshift-Warehouse anwenden.

1. Sie können bis zu 50 **Tag-Schlüssel** mit einem optionalen **Wert** eingeben, um zusätzliche Metadaten zur Integration bereitzustellen.

1. Anschließend wird eine Übersichtsseite angezeigt, auf der Sie **S3-Ereignisintegration erstellen** auswählen können.

------
#### [ AWS CLI ]

Um eine Amazon S3 S3-Event-Integration mit dem zu erstellen AWS CLI, verwenden Sie den `create-integration` Befehl mit den folgenden Optionen:
+ `integration-name` – Geben Sie einen Namen für die Integration an.
+ `source-arn` – Geben Sie den ARN des Quell-Buckets in Amazon S3 an.
+ `target-arn` – Geben Sie den Namespace-ARN des von Amazon Redshift bereitgestellten Clusters oder des Redshift-Serverless-Arbeitsgruppenziels an.

Im folgenden Beispiel wird eine Integration erstellt, indem der Integrationsname, der Quell-ARN und der Ziel-ARN angegeben werden. Die Integration ist nicht verschlüsselt.

```
aws redshift create-integration \
--integration-name s3-integration \
--source-arn arn:aws:s3:us-east-1::s3-example-bucket \
--target-arn arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222
          {
    "IntegrationArn": "arn:aws:redshift:us-east-1:123456789012:integration:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
    "IntegrationName": "s3-integration",
    "SourceArn": "arn:aws:s3:::s3-example-bucket",
    "SourceType": "s3-event-notifications",
    "TargetArn": "arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "Status": "creating",
    "Errors": [],
    "CreateTime": "2024-10-09T19:08:52.758000+00:00",
    "Tags": []
}
```

Sie können auch die folgenden AWS CLI Befehle verwenden, um Ihre S3-Eventintegration zu verwalten.
+ `delete-integration` – Geben Sie einen Integrations-ARN an, um eine S3-Ereignisintegration zu löschen.
+ `modify-integration` – Geben Sie einen Integrations-ARN an, um den Namen oder die Beschreibung (oder beides) einer S3-Ereignisintegration zu ändern.
+ `describe-integrations` – Geben Sie einen Integrations-ARN an, um die Eigenschaften einer S3-Ereignisintegration anzuzeigen.

Weitere Informationen zu diesen Befehlen finden Sie im [https://docs.aws.amazon.com/cli/latest/reference/redshift/](https://docs.aws.amazon.com/cli/latest/reference/redshift/).

------

Amazon Redshift erstellt anschließend eine S3-Ereignisintegration mit zugehöriger Quelle und zugehörigem Ziel, Status sowie Informationen zum Status eines zugehörigen auto-copy-Jobs. Sie können Informationen zu einer S3-Ereignisintegration in der Amazon-Redshift-Konsole anzeigen, indem Sie **S3-Ereignisintegrationen** auswählen und dann die Integration auswählen, um ihre Details anzuzeigen. Die Integrationen werden getrennt nach **In meinem Konto** und **Aus anderen Konten** angezeigt. In der Liste **In meinem Konto** werden Integrationen angezeigt, bei denen sich Quelle und Ziel im selben Konto befinden. In der Liste **Aus anderen Konten** werden Integrationen angezeigt, bei denen die Quelle im Besitz eines anderen Kontos ist.

Wenn Sie eine S3-Ereignisintegration löschen, wird der entsprechende COPY JOB-Status von `1` (aktiv) in `0` (inaktiv/ausstehend) geändert. Der entsprechende COPY JOB wird jedoch nicht automatisch entfernt. Wenn Sie später versuchen, einen COPY JOB mit demselben Namen zu erstellen, liegt möglicherweise ein Konflikt vor.

## Erstellen und Überwachen eines COPY JOB
<a name="loading-data-copy-job-create-s3-autocopy"></a>

Wählen Sie nach der Integration auf der Seite **Details zur S3-Ereignisintegration** für die von Ihnen erstellte Integration die Option **auto-copy-Job erstellen** aus. Anschließend gelangen Sie zu Amazon Redshift Query Editor V2, wo Sie den auto-copy-Job für die Integration erstellen können. Amazon Redshift ordnet den Bucket in der FROM-Klausel in der Anweisung COPY JOB CREATE dem Bucket zu, der in der S3-Ereignisintegration verwendet wird. Weitere Informationen zur Verwendung von Amazon Redshift Query Editor V2 finden Sie unter [Abfragen einer Datenbank mit Amazon Redshift Query Editor V2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2.html) im *Managementleitfaden zu Amazon Redshift*. Sie können beispielsweise den folgenden COPY-Befehl in Query Editor V2 ausführen, um einen automatischen COPY JOB zu erstellen, der den Amazon-S3-Bucket `s3://amzn-s3-demo-bucket/staging-folder` einer Amazon-S3-Ereignisintegration zuordnet.

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
JOB CREATE my_copy_job_name
AUTO ON;
```

Sie definieren einen COPY JOB einmalig. Für zukünftige Ausführungen werden dieselben Parameter verwendet.

Um einen COPY JOB zu definieren und zu verwalten, benötigen Sie die entsprechende Berechtigung. Hinweise zum Erteilen und Widerrufen von Berechtigungen für einen COPY JOB finden Sie unter [GRANT](r_GRANT.md) und [REVOKE](r_REVOKE.md). Weitere Informationen zum Erteilen und Widerrufen von bereichsbezogenen Berechtigungen für einen COPY JOB finden Sie unter [Gewähren von bereichsbezogenen Berechtigungen](r_GRANT.md#grant-scoped-syntax) und [Widerrufen von bereichsbezogenen Berechtigungen](r_REVOKE.md#revoke-scoped-permissions).

Sie verwalten die Ladevorgänge mithilfe der Optionen CREATE, LIST, SHOW, DROP, ALTER und RUN. Weitere Informationen finden Sie unter [COPY JOB](r_COPY-JOB.md).

Sie können Systemansichten abfragen, um den Status und Fortschritt von COPY JOB anzuzeigen. Die Ansichten werden wie folgt bereitgestellt:
+ [SYS\$1COPY\$1JOB](SYS_COPY_JOB.md) – enthält eine Zeile für jeden derzeit definierten COPY JOB.
+ [SYS\$1COPY\$1JOB\$1DETAIL](SYS_COPY_JOB_DETAIL.md) – enthält Details zu ausstehenden, fehlerhaften und erfassten Dateien für jeden COPY JOB.
+ [SYS\$1COPY\$1JOB\$1INFO](SYS_COPY_JOB_INFO.md) – enthält protokollierte Meldungen zu einem COPY JOB.
+ [SYS\$1LOAD\$1HISTORY](SYS_LOAD_HISTORY.md) – enthält Details zu COPY-Befehlen.
+ [SYS\$1LOAD\$1ERROR\$1DETAIL](SYS_LOAD_ERROR_DETAIL.md) – enthält Details zu Fehlern bei COPY-Befehlen.
+ [SVV\$1COPY\$1JOB\$1INTEGRATIONS](SVV_COPY_JOB_INTEGRATIONS.md) – enthält Details zu S3-Ereignisintegrationen.
+ [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md) – enthält Fehler von COPY-Befehlen.
+ [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md) – enthält Informationen, die zur Behebung von Fehlern beim Laden von COPY-Befehlsdaten verwendet werden.

Informationen zur Behebung von Fehlern für S3-Ereignisintegrationen finden Sie unter [Behebung von Fehlern für die S3-Ereignisintegration und für COPY JOB](s3-integration-troubleshooting.md).

Um die Liste der von einem COPY JOB geladenen Dateien abzurufen, führen Sie die folgende SQL-Anweisung aus, ersetzen Sie sie jedoch zuerst*<job\$1id>*:

```
SELECT job_id, job_name, data_source, copy_query, filename, status, curtime
FROM sys_copy_job copyjob
JOIN stl_load_commits loadcommit
ON copyjob.job_id = loadcommit.copy_job_id
WHERE job_id = <job_id>;
```

## Überlegungen beim Erstellen einer S3-Ereignisintegration für auto-copy
<a name="loading-data-copy-job-considerations"></a>

Beachten Sie Folgendes, wenn Sie auto-copy verwenden.
+ Sie können maximal 200 COPY JOBS für jeden Cluster oder jede Arbeitsgruppe in einem AWS-Konto erstellen.
+ Sie können maximal 50 S3-Ereignisintegrationen für jedes Amazon-Redshift-Ziel erstellen.
+ Sie können keine S3-Ereignisintegration mit einem Quell-Bucket in Amazon S3 erstellen, der im Namen einen Punkt (.) enthält.
+ Sie können jeweils nur eine S3-Ereignisintegration zwischen derselben Quelle und demselben Ziel erstellen. Das bedeutet, dass es jeweils nur eine S3-Ereignisintegration zwischen einem Amazon-S3-Bucket und einem Data Warehouse in Amazon Redshift geben kann.
+ Es darf keine vorhandenen Ereignisbenachrichtigungen für den Ereignistyp `S3_OBJECT_CREATED` geben, die im Quell-Bucket in Amazon S3 definiert sind. Nachdem eine S3-Ereignisintegration erstellt wurde, können Sie die Amazon S3 S3-Bucket-Ereignisbenachrichtigung jedoch mit einer prefix/suffix mit einem engeren Geltungsbereich aktualisieren. Auf diese Weise können Sie auch `S3_OBJECT_CREATED` für andere prefix/suffix Ziele konfigurieren und so Konflikte mit der S3-Ereignisintegration vermeiden. Wenn Sie Probleme haben, dass die automatische Kopie nicht wie erwartet ausgeführt wurde, bereiten Sie das AWS CloudTrail Protokoll der `s3:PutBucketNotificationConfiguration` Aktion auf Ihrem S3-Bucket für den fraglichen Zeitraum vor, wenn Sie Kontakt aufnehmen AWS Support.

## Unterstützte Regionen
<a name="loading-data-copy-job-regions"></a>

Folgende AWS-Regionen sind für auto-copy verfügbar.


| Region | Auto-copy | 
| --- | --- | 
| Afrika (Kapstadt) | Available (Verfügbar) | 
| Asien-Pazifik (Hongkong) | Available (Verfügbar) | 
| Asien-Pazifik (Taipeh) | Available (Verfügbar) | 
| Asien-Pazifik (Tokio) | Available (Verfügbar) | 
| Asien-Pazifik (Seoul) | Available (Verfügbar) | 
| Asien-Pazifik (Osaka) | Available (Verfügbar) | 
| Asien-Pazifik (Mumbai) | Available (Verfügbar) | 
| Asien-Pazifik (Hyderabad) | Available (Verfügbar) | 
| Asien-Pazifik (Singapur) | Available (Verfügbar) | 
| Asien-Pazifik (Sydney) | Available (Verfügbar) | 
| Asien-Pazifik (Jakarta) | Available (Verfügbar) | 
| Asien-Pazifik (Melbourne) | Available (Verfügbar) | 
| Asien-Pazifik (Malaysia) | Available (Verfügbar) | 
| Asien-Pazifik (Neuseeland) | Nicht verfügbar | 
| Asien-Pazifik (Thailand) | Available (Verfügbar) | 
| Kanada (Zentral) | Available (Verfügbar) | 
| Kanada West (Calgary) | Available (Verfügbar) | 
| China (Peking) | Available (Verfügbar) | 
| China (Ningxia) | Available (Verfügbar) | 
| Europa (Frankfurt) | Available (Verfügbar) | 
| Europa (Zürich) | Available (Verfügbar) | 
| Europa (Stockholm) | Available (Verfügbar) | 
| Europa (Milan) | Available (Verfügbar) | 
| Europa (Spain) | Available (Verfügbar) | 
| Europa (Irland) | Available (Verfügbar) | 
| Europa (London) | Available (Verfügbar) | 
| Europa (Paris) | Available (Verfügbar) | 
| Israel (Tel Aviv) | Available (Verfügbar) | 
| Naher Osten (VAE) | Available (Verfügbar) | 
| Middle East (Bahrain) | Available (Verfügbar) | 
| Mexiko (Zentral) | Available (Verfügbar) | 
| Südamerika (São Paulo) | Available (Verfügbar) | 
| USA Ost (Nord-Virginia) | Available (Verfügbar) | 
| USA Ost (Ohio) | Available (Verfügbar) | 
| USA West (Nordkalifornien) | Available (Verfügbar) | 
| USA West (Oregon) | Available (Verfügbar) | 
| AWS GovCloud (USA-Ost) | Available (Verfügbar) | 
| AWS GovCloud (US-West) | Available (Verfügbar) | 

# Laden von Tabellen mit DML-Befehlen
<a name="t_Updating_tables_with_DML_commands"></a>

Amazon Redshift unterstützt Data Manipulation Language (DML)-Standardbefehle (INSERT, UPDATE und DELETE), die Sie verwenden können, um Zeilen in Tabellen zu modifizieren. Sie können auch den Befehl TRUNCATE verwenden, um schnell eine große Zahl von Löschvorgängen auszuführen.

**Anmerkung**  
Es wird nachdrücklich empfohlen, den Befehl [COPY](r_COPY.md) zu verwenden, um große Mengen von Daten zu laden. Die Verwendung einzelner INSERT-Anweisungen, um eine Tabelle auszufüllen, kann äußerst langsam sein. Wenn Ihre Daten in anderen Amazon-Redshift-Datenbanktabellen bereits vorhanden sind, können Sie alternativ den Befehl INSERT INTO ... verwenden. SELECT FROM oder CREATE TABLE AS verwenden, um die Leistung zu verbessern. Weitere Informationen finden Sie unter [INSERT](r_INSERT_30.md) oder [CREATE TABLE AS](r_CREATE_TABLE_AS.md).

Wenn Sie im Vergleich zur Anzahl der Zeilen vor den Änderungen eine große Zahl von Zeilen in einer Tabelle einfügen, aktualisieren oder löschen, führen Sie für die Tabelle die Befehle ANALYZE und VACUUM aus, wenn Sie fertig sind. Wenn sich über die Zeit kleinere Änderungen in Ihrer Anwendung ansammeln, sollten Sie für die Befehle ANALYZE und VACUUM eine Ausführung in regelmäßigen Abständen planen. Weitere Informationen erhalten Sie unter [Analysieren von Tabellen](t_Analyzing_tables.md) und [Bereinigen von Tabellen](t_Reclaiming_storage_space202.md).

**Topics**
+ [Aktualisieren von Daten und Einfügen neuer Daten](t_updating-inserting-using-staging-tables-.md)

# Aktualisieren von Daten und Einfügen neuer Daten
<a name="t_updating-inserting-using-staging-tables-"></a>

Mit dem Befehl MERGE können Sie einer vorhandenen Tabelle effizient neue Daten hinzufügen. Führen Sie einen Zusammenführungsvorgang durch, indem Sie eine Staging-Tabelle erstellen und dann eine der in diesem Abschnitt beschriebenen Methoden verwenden, um die Zieltabelle aus der Staging-Tabelle zu aktualisieren. Weitere Informationen zum MERGE-Befehl finden Sie unter [MERGE](r_MERGE.md).

In [Beispiele für Zusammenführungen](merge-examples.md) wird ein Beispieldatensatz für Amazon Redshift verwendet, der sogenannte TICKIT-Datensatz. Als Voraussetzung können Sie die TICKIT-Tabellen und -Daten einrichten, indem Sie den Anweisungen unter [Erste Schritte mit gängigen Datenbankaufgaben](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html) folgen. Weitere Informationen zum Beispieldatensatz finden Sie unter [Beispieldatenbank](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

## Zusammenführungsmethode 1: Ersetzung vorhandener Zeilen
<a name="merge-method-replace-existing-rows"></a>

Wenn Sie alle Spalten in der Zieltabelle überschreiben, besteht die schnellste Methode der Zusammenführung darin, die vorhandenen Zeilen zu ersetzen. Bei dieser Methode wird die Zieltabelle nur einmal gescannt. Dabei wird ein innerer Join verwendet, um Zeilen zu löschen, die aktualisiert werden. Nach dem Löschen werden die Zeilen in einer einzigen Einfügungsoperation basierend auf der Staging-Tabelle durch neue Zeilen ersetzt. 

Verwenden Sie diese Methode, wenn alle folgenden Bedingungen zutreffen: 
+ Zieltabelle und Staging-Tabelle enthalten dieselben Spalten. 
+ Sie möchten alle Daten in den Spalten der Zieltabelle durch alle Spalten der Staging-Tabelle ersetzen.
+ Sie verwenden alle Zeilen in der Staging-Tabelle bei der Zusammenführung.

Wenn eines dieser Kriterien nicht zutrifft, verwenden Sie die Zusammenführungsmethode 2: Angabe einer Spaltenliste ohne den Befehl MERGE, wie im folgenden Abschnitt beschrieben.

Wenn Sie nicht alle Zeilen in der Staging-Tabelle verwenden, filtern Sie die Anweisungen DELETE und INSERT mittels einer WHERE-Klausel, um Zeilen auszulassen, die nicht geändert werden. Wenn jedoch die meisten Zeilen in der Staging-Tabelle nicht an der Zusammenführung beteiligt sind, wird die Ausführung einer UPDATE- und INSERT-Operation in getrennten Schritte empfohlen wie später in diesem Abschnitt beschrieben.

## Zusammenführungsmethode 2: Angabe einer Spaltenliste ohne den Befehl MERGE
<a name="merge-method-specify-column-list"></a>

Verwenden Sie diese Methode, um spezifische Spalten in der Zieltabelle zu aktualisieren, statt ganze Zeilen zu überschreiben. Diese Methode dauert länger als die vorherige Methode, da sie einen zusätzlichen Update-Schritt erfordert und den Befehl MERGE nicht nutzt. Verwenden Sie diese Methode, wenn eine der folgenden Bedingungen zutrifft: 
+ Es müssen nicht alle Spalten in der Zieltabelle aktualisiert werden. 
+ Die meisten Zeilen in der Staging-Tabelle werden nicht für Aktualisierung verwendet. 

**Topics**
+ [Zusammenführungsmethode 1: Ersetzung vorhandener Zeilen](#merge-method-replace-existing-rows)
+ [Zusammenführungsmethode 2: Angabe einer Spaltenliste ohne den Befehl MERGE](#merge-method-specify-column-list)
+ [Erstellen einer temporären Staging-Tabelle](merge-create-staging-table.md)
+ [Ausführen einer Zusammenführungsoperation durch Ersetzung vorhandener Zeilen](merge-replacing-existing-rows.md)
+ [Ausführen einer Zusammenführungsoperation durch Angabe einer Spaltenliste ohne den Befehl MERGE](merge-specify-a-column-list.md)
+ [Beispiele für Zusammenführungen](merge-examples.md)

# Erstellen einer temporären Staging-Tabelle
<a name="merge-create-staging-table"></a>

Die *Staging-Tabelle* ist eine temporäre Tabelle, die alle Daten enthält, die für Änderungen der *Zieltabelle* verwendet werden, einschließlich Aktualisierungen und Einfügungen. 

Eine Zusammenführungsoperation erfordert einen Join zwischen der Staging-Tabelle und der Zieltabelle. Um die Join-Zeilen zusammenzufassen, legen Sie den Verteilungsschlüssel der Staging-Tabelle auf dieselbe Spalte wie den Verteilungsschlüssel der Zieltabelle fest. Wenn die Zieltabelle beispielsweise eine Fremdschlüsselspalte als Verteilungsschlüssel verwendet, verwenden Sie dieselbe Spalte für den Verteilungsschlüssel der Staging-Tabelle. Wenn Sie die Staging-Tabelle mittels einer [CREATE TABLE LIKE](r_CREATE_TABLE_NEW.md#create-table-like)-Anweisung erstellen, erbt die Staging-Tabelle den Verteilungsschlüssel aus der übergeordneten Tabelle. Wenn Sie eine CREATE TABLE AS-Anweisung verwenden, erbt die neue Tabelle den Verteilungsschlüssel nicht. Weitere Informationen finden Sie unter [Datenverteilung zur Abfrageoptimierung](t_Distributing_data.md)

Wenn der Verteilungsschlüssel nicht mit dem primären Schlüssel identisch ist und der Verteilungsschlüssel im Rahmen der Zusammenführungsoperation nicht aktualisiert wird, fügen Sie für die Verteilungsschlüsselspalten ein redundantes Join-Prädikat hinzu, um einen zusammengefassten Join zu ermöglichen. Beispiel: 

```
where target.primarykey = stage.primarykey 
and target.distkey = stage.distkey
```

Um zu überprüfen, ob die Abfrage einen zusammengefassten Join verwendet, führen Sie die Abfrage mit [EXPLAIN](r_EXPLAIN.md) aus und suchen für alle Joins nach DS\$1DIST\$1NONE. Weitere Informationen finden Sie unter [Auswerten des Abfrageplans](c_data_redistribution.md)

# Ausführen einer Zusammenführungsoperation durch Ersetzung vorhandener Zeilen
<a name="merge-replacing-existing-rows"></a>

Wenn Sie die im Verfahren beschriebene Zusammenführungsoperation ausführen, führen Sie alle Schritte abgesehen vom Erstellen und Entfernen der temporären Staging-Tabelle in einer einzigen Transaktion aus. Die Transaktion wird rückgängig gemacht, falls ein Schritt fehlschlägt. Die Verwendung einer einzelnen Transaktion reduziert auch die Anzahl der Commit-Vorgänge, was Zeit und Ressourcen spart.

**So führen Sie eine Zusammenführungsoperation durch Ersetzung vorhandener Zeilen aus**

1. Erstellen Sie eine Staging-Tabelle und füllen Sie sie mit Daten aus, die zusammengeführt werden sollen, wie im folgenden Pseudocode gezeigt.

   ```
   CREATE temp table stage (like target); 
   
   INSERT INTO stage 
   SELECT * FROM source 
   WHERE source.filter = 'filter_expression';
   ```

1.  Verwenden Sie MERGE, um einen Inner Join mit der Staging-Tabelle durchzuführen und die Zeilen aus der Zieltabelle zu aktualisieren, die der Staging-Tabelle entsprechen. Fügen Sie dann alle verbleibenden Zeilen in die Zieltabelle ein, die nicht mit der Staging-Tabelle übereinstimmen.

    Wir empfehlen, die Aktualisierungs- und Einfügevorgänge in einem einzigen MERGE-Befehl auszuführen.

   ```
   MERGE INTO target 
   USING stage [optional alias] on (target.primary_key = stage.primary_key)
   WHEN MATCHED THEN 
   UPDATE SET col_name1 = stage.col_name1 , col_name2= stage.col_name2, col_name3 = {expr}
   WHEN NOT MATCHED THEN
   INSERT (col_name1 , col_name2, col_name3) VALUES (stage.col_name1, stage.col_name2, {expr});
   ```

1. Entfernen Sie die Staging-Tabelle. 

   ```
   DROP TABLE stage;
   ```

# Ausführen einer Zusammenführungsoperation durch Angabe einer Spaltenliste ohne den Befehl MERGE
<a name="merge-specify-a-column-list"></a>

Wenn Sie die im Verfahren beschriebene Zusammenführungsoperation ausführen, führen Sie alle Schritte in einer einzigen Transaktion aus. Die Transaktion wird rückgängig gemacht, falls ein Schritt fehlschlägt. Die Verwendung einer einzelnen Transaktion reduziert auch die Anzahl der Commit-Vorgänge, was Zeit und Ressourcen spart.

**So führen Sie eine Zusammenführungsoperation durch Angabe einer Spaltenliste aus**

1. Platzieren Sie die gesamte Operation in einen einzigen Transaktionsblock. 

   ```
   BEGIN transaction;
   … 
   END transaction;
   ```

1. Erstellen Sie eine Staging-Tabelle und füllen Sie sie mit Daten aus, die zusammengeführt werden sollen, wie im folgenden Pseudocode gezeigt. 

   ```
   create temp table stage (like target); 
   insert into stage 
   select * from source 
   where source.filter = 'filter_expression';
   ```

1. Aktualisieren Sie die Zieltabelle mittels eines internen Joins mit der Staging-Tabelle. 
   + Listen Sie in der UPDATE-Klausel explizit die Spalten auf, die aktualisiert werden sollen. 
   + Führen Sie einen internen Join mit der Staging-Tabelle aus. 
   + Wenn sich der Verteilungsschlüssel vom primären Schlüssel unterscheidet und der Verteilungsschlüssel nicht aktualisiert wird, fügen Sie für den Verteilungsschlüssel einen redundanten Join hinzu. Um zu überprüfen, ob die Abfrage einen zusammengefassten Join verwendet, führen Sie die Abfrage mit [EXPLAIN](r_EXPLAIN.md) aus und suchen für alle Joins nach DS\$1DIST\$1NONE. Weitere Informationen finden Sie unter [Auswerten des Abfrageplans](c_data_redistribution.md)
   + Wenn Ihre Zieltabelle nach Zeitstempel sortiert ist, fügen Sie ein Prädikat hinzu, um Scans mit eingeschränkten Bereichen für die Zieltabelle zu nutzen. Weitere Informationen finden Sie unter [Bewährte Methoden für die Gestaltung von Abfragen mit Amazon Redshift](c_designing-queries-best-practices.md).
   + Wenn Sie nicht alle Zeilen in der Zusammenführung verwenden, fügen Sie eine Klausel hinzu, um die Zeilen herauszufiltern, die Sie ändern möchten. Sie können beispielsweise einen Ungleichheitsfilter zu einer oder mehreren Zeilen hinzufügen, um Zeilen auszuschließen, die nicht geändert wurden.
   + Platzieren Sie die Operationen zum Aktualisieren, Löschen und Einfügen in einem einzigen Transaktionsblock, damit ein Rollback ausgeführt werden kann, wenn es Probleme gibt.

    Beispiel: 

   ```
   begin transaction;
   
   update target 
   set col1 = stage.col1, 
   col2 = stage.col2, 
   col3 = 'expression' 
   from stage 
   where target.primarykey = stage.primarykey 
   and target.distkey = stage.distkey 
   and target.col3 > 'last_update_time' 
   and (target.col1 != stage.col1 
   or target.col2 != stage.col2 
   or target.col3 = 'filter_expression');
   ```

1. Löschen Sie nicht benötigte Zeilen aus der Staging-Tabelle, indem Sie einen internen Join mit der Zieltabelle verwenden. Einige Zeilen in der Zieltabelle stimmen bereits mit den entsprechenden Zeilen in der Staging-Tabelle überein. Andere Zeilen wurden im vorherigen Schritt aktualisiert. In beiden Fällen werden diese Zeilen für die Einfügungsoperation nicht benötigt. 

   ```
   delete from stage 
   using target 
   where stage.primarykey = target.primarykey;
   ```

1. Fügen Sie die verbleibenden Zeilen aus der Staging-Tabelle ein. Verwenden Sie hierfür dieselbe Spaltenliste in der VALUES-Klausel, die Sie in Schritt zwei in der UPDATE-Anweisung verwendet haben. 

   ```
   insert into target
   (select col1, col2, 'expression'
   from stage);
   
   end transaction;
   ```

1. Entfernen Sie die Staging-Tabelle. 

   ```
   drop table stage;
   ```

# Beispiele für Zusammenführungen
<a name="merge-examples"></a>

In den folgenden Beispielen werden Zusammenführungen ausgeführt, um die Tabelle SALES zu aktualisieren. Im ersten Beispiel wird die einfachere Methode verwendet, bei der alle Zeilen in der Zieltabelle gelöscht werden und anschließend alle Zeilen aus der Staging-Tabelle eingefügt werden. Im zweiten Beispiel müssen ausgewählte Spalten in der Zieltabelle aktualisiert werden. Daher enthält es einen zusätzlichen Aktualisierungsschritt. 

In [Beispiele für Zusammenführungen](#merge-examples) wird ein Beispieldatensatz für Amazon Redshift verwendet, der sogenannte TICKIT-Datensatz. Als Voraussetzung können Sie die TICKIT-Tabellen und -Daten einrichten, indem Sie den Anweisungen in der Anleitung [Erste Schritte mit gängigen Datenbankaufgaben](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html) folgen. Weitere Informationen zum Beispieldatensatz finden Sie unter [Beispieldatenbank](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

**Beispieldatenquelle für eine Zusammenführung**

Die Beispiele in diesem Abschnitt benötigen eine Beispieldatenquelle, die sowohl Aktualisierungen als auch Einfügungen enthält. Zu diesem Zweck wird eine Beispieltabelle namens SALES\$1UPDATE erstellt, die Daten aus der Tabelle SALES verwendet. Die neue Tabelle wird mit zufälligen Daten ausgefüllt, die neue Vertriebsaktivitäten für den Dezember darstellen. Die Beispieltabelle SALES\$1UPDATE wird verwendet, um die Staging-Tabelle in den folgenden Beispielen zu erstellen. 

```
-- Create a sample table as a copy of the SALES table.

create table tickit.sales_update as
select * from tickit.sales;

-- Change every fifth row to have updates.

update tickit.sales_update
set qtysold = qtysold*2,
pricepaid = pricepaid*0.8,
commission = commission*1.1
where saletime > '2008-11-30'
and mod(sellerid, 5) = 0;

-- Add some new rows to have inserts.
-- This example creates a duplicate of every fourth row.

insert into tickit.sales_update
select (salesid + 172456) as salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, getdate() as saletime
from tickit.sales_update
where saletime > '2008-11-30'
and mod(sellerid, 4) = 0;
```

**Beispiel für eine Zusammenführung, bei der vorhandene Zeilen basierend auf übereinstimmenden Schlüsseln ersetzt werden**

Im folgenden Skript wird die Tabelle SALES\$1UPDATE verwendet, um für die Tabelle SALES eine Zusammenführungsoperation mit neuen Daten für Vertriebsaktivitäten im Dezember auszuführen. In diesem Beispiel werden Zeilen in der SALES-Tabelle ersetzt, die aktualisiert wurden. In diesem Beispiel aktualisieren wir die Spalten QTYSOLD und PRICEPAID. Die Spalten COMMISSION und SALETIME bleiben unverändert.

```
MERGE into tickit.sales 
USING tickit.sales_update sales_update  
on ( sales.salesid = sales_update.salesid
and sales.listid = sales_update.listid
and sales_update.saletime > '2008-11-30'
and (sales.qtysold != sales_update.qtysold 
or sales.pricepaid != sales_update.pricepaid))
WHEN MATCHED THEN
update SET qtysold = sales_update.qtysold,
pricepaid = sales_update.pricepaid
WHEN NOT MATCHED THEN 
INSERT (salesid, listid, sellerid, buyerid, eventid, dateid, qtysold , pricepaid, commission, saletime)
values (sales_update.salesid, sales_update.listid, sales_update.sellerid, sales_update.buyerid, sales_update.eventid, 
sales_update.dateid, sales_update.qtysold , sales_update.pricepaid, sales_update.commission, sales_update.saletime);

-- Drop the staging table.
drop table tickit.sales_update;

-- Test to see that commission and salestime were not impacted.
SELECT sales.salesid, sales.commission, sales.salestime, sales_update.commission, sales_update.salestime 
FROM tickit.sales 
INNER JOIN tickit.sales_update sales_update  
ON 
sales.salesid = sales_update.salesid
AND sales.listid = sales_update.listid
AND sales_update.saletime > '2008-11-30'
AND (sales.commission != sales_update.commission 
OR sales.salestime != sales_update.salestime);
```

**Beispiel für eine Zusammenführung, bei der eine Spaltenliste angegeben wird, ohne den Befehl MERGE zu verwenden**

Im folgenden Beispiel wird eine Zusammenführungsoperation ausgeführt, um SALES durch neue Daten für Vertriebsaktivitäten im Dezember zu aktualisieren. Die Beispieldaten müssen sowohl Aktualisierungen als auch Einfügungen sowie nicht geänderte Zeilen enthalten. In diesem Beispiel sollen die Spalten QTYSOLD und PRICEPAID aktualisiert werden. Die Spalten COMMISSION und SALETIME sollen dagegen nicht verändert werden. Im folgenden Skript wird die Tabelle SALES\$1UPDATE verwendet, um für die Tabelle SALES eine Zusammenführungsoperation auszuführen. 

```
-- Create a staging table and populate it with rows from SALES_UPDATE for Dec
create temp table stagesales as select * from sales_update
where saletime > '2008-11-30';

-- Start a new transaction
begin transaction;

-- Update the target table using an inner join with the staging table
-- The join includes a redundant predicate to collocate on the distribution key –- A filter on saletime enables a range-restricted scan on SALES

update sales
set qtysold = stagesales.qtysold,
pricepaid = stagesales.pricepaid
from stagesales
where sales.salesid = stagesales.salesid
and sales.listid = stagesales.listid
and stagesales.saletime > '2008-11-30'
and (sales.qtysold != stagesales.qtysold 
or sales.pricepaid != stagesales.pricepaid);
 
-- Delete matching rows from the staging table 
-- using an inner join with the target table

delete from stagesales
using sales
where sales.salesid = stagesales.salesid
and sales.listid = stagesales.listid;

-- Insert the remaining rows from the staging table into the target table
insert into sales
select * from stagesales;

-- End transaction and commit
end transaction;

-- Drop the staging table
drop table stagesales;
```

# Ausführen einer Deep Copy-Operation
<a name="performing-a-deep-copy"></a>

In einer Deep Copy-Operation wird eine Tabelle mittels einer Masseneinfügung neu erstellt und ausgefüllt. Dabei wird die Tabelle automatisch sortiert. Wenn eine Tabelle über eine große, nicht sortierte Region verfügt, ist eine Deep Copy-Operation sehr viel schneller als eine Bereinigung. Wir empfehlen, während einer Deep-Copy-Operation nur dann gleichzeitige Aktualisierungen auszuführen, wenn Sie diese nachverfolgen können. Verschieben Sie nach Abschluss des Vorgangs die Delta-Updates in die neue Tabelle. Eine VACUUM-Operation unterstützt gleichzeitige Updates automatisch. 

Für das Erstellen einer Kopie der ursprünglichen Tabelle steht Ihnen eine der folgenden Methoden zur Verfügung: 
+ Verwendung der ursprünglichen Tabellen-DDL. 

  Wenn CREATE TABLE DDL verfügbar ist, ist dies die schnellste und bevorzugte Methode. Wenn Sie eine neue Tabelle erstellen, können Sie alle Tabellen- und Spaltenattribute angeben, einschließlich primärer Schlüssel und Fremdschlüssel. Sie können die ursprüngliche DDL mithilfe der Funktion SHOW TABLE suchen.
+ Verwendung von CREATE TABLE LIKE. 

  Wenn die ursprüngliche DDL nicht verfügbar ist, können Sie CREATE TABLE LIKE verwenden, um die ursprüngliche Tabelle neu zu erstellen. Die neue Tabelle erbt die Kodierung, den Verteilungsschlüssel, den Sortierschlüssel und die NOT NULL-Attribute der übergeordneten Tabelle. Die neue Tabelle erbt die Primärschlüssel- und Fremdschlüsselattribute der übergeordneten Tabelle nicht. Sie können diese jedoch mittels hinzufügen [ALTER TABLE](r_ALTER_TABLE.md).
+ Erstellen Sie eine temporäre Tabelle und verkürzen Sie die ursprüngliche Tabelle. 

  Wenn Sie die Primärschlüssel- und Fremdschlüsselattribute der übergeordneten Tabelle beibehalten müssen. Wenn die übergeordnete Tabelle Abhängigkeiten hat, können Sie CREATE TABLE ... AS (CTAS) verwenden, um eine temporäre Tabelle zu erstellen. Verkürzen Sie anschließend die ursprüngliche Tabelle und füllen Sie sie mit Daten aus der temporären Tabelle. 

  Durch die Verwendung einer temporären Tabelle wird die Leistung im Vergleich zur Verwendung einer permanenten Tabelle deutlich verbessert. Es besteht jedoch das Risiko, dass Daten verloren gehen. Eine temporäre Tabelle wird am Ende der Sitzung, in der sie erstellt wurde, automatisch entfernt. TRUNCATE führt sofort einen Commit aus, auch wenn er innerhalb eines Transaktionsblocks ausgeführt wird. Wenn TRUNCATE erfolgreich ist, die Sitzung jedoch beendet wird, bevor die nachfolgende INSERT-Operation abgeschlossen ist, gehen die Daten verloren. Wenn ein Datenverlust nicht akzeptabel ist, verwenden Sie eine permanente Tabelle. 

Nachdem Sie eine Kopie einer Tabelle erstellt haben, müssen Sie möglicherweise Zugriff auf die neue Tabelle gewähren. Sie können [GRANT](r_GRANT.md) verwenden, um Zugriffsberechtigungen zu definieren. Um alle Zugriffsberechtigungen für eine Tabelle anzeigen und erteilen zu können, müssen Sie einer der folgenden Kategorien angehören: 
+  Superuser 
+  Besitzer der Tabelle, die Sie kopieren möchten. 
+  Benutzer mit der Berechtigung ACCESS SYSTEM TABLE, um die Berechtigungen der Tabelle anzuzeigen, und mit dem Recht zum Erteilen aller relevanten Berechtigungen. 

Darüber hinaus müssen Sie möglicherweise eine Nutzungsberechtigung für das Schema erteilen, in dem sich Ihre Deep Copy befindet. Eine Nutzungsberechtigung muss erteilt werden, wenn sich das Schema Ihrer Deep Copy vom Schema der Originaltabelle unterscheidet und es sich nicht um das `public`-Schema handelt. Um Nutzungsrechte anzeigen und gewähren zu können, müssen Sie einer der folgenden Kategorien angehören:
+  Superuser 
+  Benutzer, der die USAGE-Berechtigung für das Schema der Deep Copy erteilen kann. 

**Ausführen einer Deep Copy-Operation mittels der DDL der ursprünglichen Tabelle**

1. (Optional) Erstellen Sie die Tabellen-DDL durch Ausführen eines Skripts namens neu `v_generate_tbl_ddl`. 

1. Erstellen Sie mittels der ursprünglichen CREATE TABLE DDL eine Kopie der Tabelle.

1. Verwenden Sie eine INSERT INTO … SELECT-Anweisung, um die Kopie mit Daten aus der ursprünglichen Tabelle auszufüllen. 

1. Suchen Sie nach Berechtigungen, die für die alte Tabelle erteilt wurden. Sie können diese Berechtigungen in der Systemansicht SVV\$1RELATION\$1PRIVILEGES sehen.

1. Falls erforderlich, gewähren Sie der neuen Tabelle die Berechtigungen der alten Tabelle.

1. Erteilen Sie jeder Gruppe und jedem Benutzer, die/der über Berechtigungen in der ursprünglichen Tabelle verfügt, eine Nutzungsberechtigung. Dieser Schritt ist nicht erforderlich, wenn sich Ihre Deep-Copy-Tabelle im `public`-Schema oder in demselben Schema wie die Originaltabelle befindet.

1. Entfernen Sie die ursprüngliche Tabelle.

1. Verwenden Sie eine ALTER TABLE-Anweisung, um die Kopie mit dem Namen der ursprünglichen Tabelle umzubenennen.

Im folgenden Beispiel wird für die Tabelle SAMPLE unter Verwendung eines Duplikats von SAMPLE namens sample\$1copy eine Deep-Copy-Operation ausgeführt.

```
--Create a copy of the original table in the sample_namespace namespace using the original CREATE TABLE DDL.
create table sample_namespace.sample_copy ( … );

--Populate the copy with data from the original table in the public namespace.
insert into sample_namespace.sample_copy (select * from public.sample);

--Check SVV_RELATION_PRIVILEGES for the original table's privileges.
select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type;

--Grant the original table's privileges to the copy table.
grant DELETE on table sample_namespace.sample_copy to group group1;
grant INSERT, UPDATE on table sample_namespace.sample_copy to group group2;
grant SELECT on table sample_namespace.sample_copy to user1;
grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy to user2;
         
--Grant usage permission to every group and user that has privileges in the original table.
grant USAGE on schema sample_namespace to group group1, group group2, user1, user2;

--Drop the original table.
drop table public.sample;

--Rename the copy table to match the original table's name.
alter table sample_namespace.sample_copy rename to sample;
```

**Ausführen einer Deep Copy-Operation mittels CREATE TABLE LIKE**

1. Erstellen Sie mittels CREATE TABLE LIKE eine neue Tabelle. 

1. Verwenden Sie eine INSERT INTO … SELECT-Anweisung, um die Zeilen aus der aktuellen Tabelle in die neue Tabelle zu kopieren. 

1. Suchen Sie nach Berechtigungen, die für die alte Tabelle erteilt wurden. Sie können diese Berechtigungen in der Systemansicht SVV\$1RELATION\$1PRIVILEGES sehen.

1. Falls erforderlich, gewähren Sie der neuen Tabelle die Berechtigungen der alten Tabelle.

1. Erteilen Sie jeder Gruppe und jedem Benutzer, die/der über Berechtigungen in der ursprünglichen Tabelle verfügt, eine Nutzungsberechtigung. Dieser Schritt ist nicht erforderlich, wenn sich Ihre Deep-Copy-Tabelle im `public`-Schema oder in demselben Schema wie die Originaltabelle befindet.

1. Entfernen Sie die aktuelle Tabelle. 

1. Verwenden Sie eine ALTER TABLE-Anweisung, um die neue Tabelle mit dem Namen der ursprünglichen Tabelle umzubenennen. 

Im folgenden Beispiel wird für die Tabelle SAMPLE mittels CREATE TABLE LIKE eine Deep-Copy-Operation ausgeführt.

```
--Create a copy of the original table in the sample_namespace namespace using CREATE TABLE LIKE.
create table sameple_namespace.sample_copy (like public.sample);

--Populate the copy with data from the original table.
insert into sample_namespace.sample_copy (select * from public.sample);

--Check SVV_RELATION_PRIVILEGES for the original table's privileges.
select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type;

--Grant the original table's privileges to the copy table.
grant DELETE on table sample_namespace.sample_copy to group group1;
grant INSERT, UPDATE on table sample_namespace.sample_copy to group group2;
grant SELECT on table sample_namespace.sample_copy to user1;
grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy to user2;
         
--Grant usage permission to every group and user that has privileges in the original table.
grant USAGE on schema sample_namespace to group group1, group group2, user1, user2;

--Drop the original table.
drop table public.sample;

--Rename the copy table to match the original table's name.
alter table sample_namespace.sample_copy rename to sample;
```

**Ausführen einer Deep Copy-Operation durch Erstellen einer temporären Tabelle und Verkürzen der ursprünglichen Tabelle**

1. Verwenden Sie CREATE TABLE AS, um eine temporäre Tabelle mit den Zeilen aus der ursprünglichen Tabelle zu erstellen. 

1. Verkürzen Sie die aktuelle Tabelle. 

1. Verwenden Sie eine INSERT INTO … SELECT-Anweisung, um die Zeilen aus der temporären Tabelle in die ursprüngliche Tabelle zu kopieren. 

1. Entfernen Sie die temporäre Tabelle. 

Im folgenden Beispiel wird für die Tabelle SALES eine Deep-Copy-Operation durch Erstellen einer temporären Tabelle und Verkürzen der ursprünglichen Tabelle ausgeführt. Da die ursprüngliche Tabelle erhalten bleibt, müssen Sie keine Berechtigungen für die kopierte Tabelle erteilen.

```
--Create a temp table copy using CREATE TABLE AS.
create temp table salestemp as select * from sales;

--Truncate the original table.
truncate sales;

--Copy the rows from the temporary table to the original table.
insert into sales (select * from salestemp);

--Drop the temporary table.
drop table salestemp;
```

# Analysieren von Tabellen
<a name="t_Analyzing_tables"></a>

Verwenden Sie die ANALYZE-Operation, um die statistischen Metadaten zu aktualisieren, die vom Abfrageplaner verwendet werden, um optimale Pläne zu wählen.

In den meisten Fällen brauchen Sie den Befehl ANALYZE nicht explizit auszuführen. Amazon Redshift überwacht Änderungen an Ihrer Workload und aktualisiert die Statistik im Hintergrund automatisch. Außerdem führt der COPY-Befehl nach dem Laden von Daten in eine leere Tabelle automatisch eine Analyse durch. 

Wenn Sie eine Tabelle oder die gesamte Datenbank explizit analysieren möchten, führen Sie den Befehl [ANALYZE](r_ANALYZE.md) aus. 

## Automatische Analyse
<a name="t_Analyzing_tables-auto-analyze"></a>

Amazon Redshift überwacht fortlaufend Ihre Datenbank und führt automatisch Analyseoperationen im Hintergrund durch. Um die Auswirkungen auf die Systemperformance zu minimieren, wird die automatischen Analyse in Zeiten ausgeführt, in denen der Workload gering ist. 

Die automatische Analyse ist standardmäßig aktiviert. Um die automatische Analyse zu deaktivieren, legen Sie für den Parameter `auto_analyze` den Wert **false** fest, indem Sie die Parametergruppe Ihres Clusters entsprechend ändern. 

Zur Verkürzung der Verarbeitungszeit und zur Verbesserung der allgemeinen Systemleistung überspringt Amazon Redshift die automatische Analyse bei Tabellen mit nur geringen Änderungen. 

Bei einem Analysevorgang werden Tabellen mit Statistiken übersprungen. up-to-date Wenn ANALYZE im Rahmen des ETL-Workflows (Extrahieren, Transformieren und Laden) ausgeführt wird, werden Tabellen, deren Statistik aktuell ist, bei der automatischen Analyse übersprungen. Aus entsprechenden Gründen werden bei einem expliziten Aufruf von ANALYZE Tabellen ausgelassen, deren Statistik bereits bei einer automatischen Analyse aktualisiert wurde. 

## Analyse neuer Tabellendaten
<a name="t_Analyzing_tables-new-tables"></a>

 Standardmäßig ruft der COPY-Befehl nach dem Laden von Daten in eine leere Tabelle den ANALYZE-Befehl auf. Sie können unabhängig davon, ob eine Tabelle leer ist, den Aufruf von ANALYZE erzwingen, indem Sie STATUPDATE auf ON festlegen. Wenn Sie für STATUPDATE den Wert OFF angeben, wird keine Analyse ausgeführt. Nur der Tabellenbesitzer oder ein Superuser können den Befehl ANALYZE oder den Befehl COPY mit STATUPDATE auf ON ausführen.

Amazon Redshift analysiert auch automatisch neue Tabellen, die mit den folgenden Befehlen erstellt werden:
+ CREATE TABLE AS (CTAS) 
+ CREATE TEMP TABLE AS 
+ SELECT INTO 

Wenn Sie eine Abfrage für eine neue Tabelle ausführen, die nach dem anfänglichen Laden der Daten noch nicht analysiert wurde, gibt Amazon Redshift eine Warnung zurück. Wenn Sie jedoch dieselbe Tabelle nach einem anschließenden Aktualisierungs- oder Ladevorgang eine Abfrage ausführen, wird keine Warnung angezeigt. Dieselbe Warnmeldung wird auch zurückgegeben, wenn Sie den Befehl EXPLAIN für eine Abfrage ausführen, die auf Tabellen verweist, die noch nicht analysiert wurden.

Wenn Sie einer nichtleeren Tabelle eine bedeutende Menge von Daten hinzufügen, können Sie die Statistik explizit aktualisieren. Sie können dies mit dem Befehl ANALYZE oder durch Festlegen von STATUPDATE auf ON erreichen. Um Details zur Anzahl der Zeilen anzuzeigen, die seit der letzten ANALYZE-Operation eingefügt oder gelöscht wurden, führen Sie eine Abfrage für die [PG\$1STATISTIC\$1INDICATOR](r_PG_STATISTIC_INDICATOR.md)-Systemkatalogtabelle aus. 

Sie können den Geltungsbereich für den Befehl [ANALYZE](r_ANALYZE.md) auf eine der folgenden Einstellungen festlegen: 
+ Die gesamte aktuelle Datenbank
+ Eine einzelne Tabelle
+ Eine oder mehrere spezifische Spalten in einer einzelnen Tabelle
+ Spalten, die in Abfragen wahrscheinlich als Prädikate verwendet werden

 Der ANALYZE-Befehl ruft eine Zeilenstichprobe aus der Tabelle ab, führt einige Berechnungen aus und speichert die sich daraus ergebenden Spaltenstatistiken. Standardmäßig führt Amazon Redshift einen Stichprobendurchgang für die Spalte DISTKEY und einen weiteren Stichprobendurchgang für alle anderen Spalten in der Tabelle aus. Wenn Sie Statistiken für einen Teilsatz von Spalten generieren möchten, können Sie eine durch Komma getrennte Spaltenliste angeben. Wenn Sie ANALYZE mit der PREDICATE COLUMNS-Klausel ausführen, werden dabei nur Prädikatspalten berücksichtigt.

 ANALYZE-Operationen sind ressourcenintensiv. Sie sollten sie daher nur für Tabellen und Spalten ausführen, für die Statistikaktualisierungen tatsächlich erforderlich sind. Sie müssen nicht regelmäßig oder zu gleichen Termin alle Spalten in allen Tabellen analysieren. Wenn sich die Daten wesentlich verändern, analysieren Sie die Spalten, die häufig bei Folgendem verwendet werden:
+ Sortierungs- und Gruppierungsoperationen
+ Joins
+ Abfrageprädikate

Zur Verkürzung der Verarbeitungszeit und zur Verbesserung der allgemeinen Systemleistung überspringt Amazon Redshift die ANALYZE-Operation für alle Tabellen mit einem niedrigen Prozentsatz geänderter Zeilen, wie durch den Parameter [analyze\$1threshold\$1percent](r_analyze_threshold_percent.md) angegeben. Standardmäßig ist der Analyseschwellenwert auf 10 Prozent festgelegt. Sie können den Analyseschwellenwert für die aktuelle Sitzung durch die Ausführung eines [SET](r_SET.md)-Befehls ändern.

Spalten, die weniger wahrscheinlich häufige Analysen erfordern, sind Spalten, die Fakten und Messungen und zugehörige Attribute enthalten, die niemals tatsächlich abgefragt werden, beispielsweise große VARCHAR-Spalten. Betrachten Sie beispielsweise die Tabelle LISTING in der TICKIT-Datenbank.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'listing';


column         |        type        | encoding | distkey | sortkey 
---------------+--------------------+----------+---------+---------
listid         | integer            | none     | t       | 1       
sellerid       | integer            | none     | f       | 0       
eventid        | integer            | mostly16 | f       | 0       
dateid         | smallint           | none     | f       | 0       
numtickets     | smallint           | mostly8  | f       | 0       
priceperticket | numeric(8,2)       | bytedict | f       | 0       
totalprice     | numeric(8,2)       | mostly32 | f       | 0       
listtime       | timestamp with...  | none     | f       | 0
```

Wenn diese Tabelle jeden Tag mit einer großen Zahl neuer Datensätze geladen wird, muss die Spalte LISTID, die häufig als Join-Schlüssel in Abfragen verwendet wird, regelmäßig analysiert werden. Wenn TOTALPRICE und LISTTIME die häufig verwendeten Einschränkungen in Abfragen sind, können Sie diese Spalten und den Verteilungsschlüssel jeden Wochentag analysieren.

```
analyze listing(listid, totalprice, listtime);
```

Nehmen wir an, dass die Verkäufer und Ereignisse in der Anwendung viel statischer sind und sich das Datum IDs auf eine feste Anzahl von Tagen bezieht, die nur zwei oder drei Jahre umfassen. In diesem Fall ändern sich die jeweiligen Werte für diese Spalten nicht wesentlich. Die Anzahl der Instances der einzelnen spezifischen Werte wird jedoch stetig steigen. 

Betrachten Sie zusätzlich Fälle, in denen die Messungen NUMTICKETS und PRICEPERTICKET im Vergleich zur Spalte TOTALPRICE selten abgefragt werden. In diesem Fall können Sie den ANALYZE-Befehl einmal an jedem Wochenende für die gesamte Tabelle ausführen, um die Statistiken für die fünf Spalten zu aktualisieren, die nicht täglich analysiert werden: 
<a name="t_Analyzing_tables-predicate-columns"></a>
**Prädikatsspalten**  
Eine bequeme Alternative zur Angabe einer Spaltenliste stellt die Analyse nur der Spalten dar, die wahrscheinlich als Prädikate verwendet werden. Wenn Sie eine Abfrage ausführen, werden alle Spalten, die in einem Join, einer Filterbedingung oder einer GROUP BY-Klausel verwendet werden, im Systemkatalog als Prädikatsspalten markiert. Wenn Sie ANALYZE mit der PREDICATE COLUMNS-Klausel ausführen, betrifft die Analyseoperation nur Spalten, die den folgenden Kriterien entsprechen:
+ Die Spalte ist als Prädikatsspalte markiert.
+ Die Spalte ist ein Verteilungsschlüssel.
+ Die Spalte ist Teil eines Sortierschlüssels.

Wenn keine Spalten der Tabelle als Prädikate markiert sind, schließt ANALYZE alle Spalten ein, auch wenn PREDICATE COLUMNS angegeben ist. Wenn keine Spalten als Prädikatspalten markiert sind, kann dies daran liegen, dass für die Tabelle noch keine Abfrage ausgeführt wurde. 

Sie sollten PREDICATE COLUMNS verwenden, wenn das Abfragemuster Ihres Workloads vergleichsweise stabil ist. Wenn das Abfragemuster variabel ist und unterschiedliche Spalten häufig als Prädikate verwendet werden, kann die Verwendung von PREDICATE COLUMNS vorübergehend zu veralteten Statistiken führen. Veraltete Statistiken können zu nicht optimalen Abfrageausführungszeitplänen und langen Ausführungszeiten führen. Wenn Sie ANALYZE das nächste Mal mit PREDICATE COLUMNS ausführen, sind die neuen Prädikatspalten jedoch enthalten. 

Um Details für Prädikatspalten anzuzeigen, verwenden Sie den folgenden SQL-Code, um eine Ansicht namens PREDICATE\$1COLUMNS zu erstellen. 

```
CREATE VIEW predicate_columns AS
WITH predicate_column_info as (
SELECT ns.nspname AS schema_name, c.relname AS table_name, a.attnum as col_num,  a.attname as col_name,
        CASE
            WHEN 10002 = s.stakind1 THEN array_to_string(stavalues1, '||') 
            WHEN 10002 = s.stakind2 THEN array_to_string(stavalues2, '||')
            WHEN 10002 = s.stakind3 THEN array_to_string(stavalues3, '||')
            WHEN 10002 = s.stakind4 THEN array_to_string(stavalues4, '||')
            ELSE NULL::varchar
        END AS pred_ts
   FROM pg_statistic s
   JOIN pg_class c ON c.oid = s.starelid
   JOIN pg_namespace ns ON c.relnamespace = ns.oid
   JOIN pg_attribute a ON c.oid = a.attrelid AND a.attnum = s.staattnum)
SELECT schema_name, table_name, col_num, col_name,
       pred_ts NOT LIKE '2000-01-01%' AS is_predicate,
       CASE WHEN pred_ts NOT LIKE '2000-01-01%' THEN (split_part(pred_ts, '||',1))::timestamp ELSE NULL::timestamp END as first_predicate_use,
       CASE WHEN pred_ts NOT LIKE '%||2000-01-01%' THEN (split_part(pred_ts, '||',2))::timestamp ELSE NULL::timestamp END as last_analyze
FROM predicate_column_info;
```

Angenommen, Sie führen die folgende Abfrage für die Tabelle LISTING aus. Beachten Sie, dass LISTID, LISTTIME und EVENTID in den Join-, Filter- und Group by-Klauseln verwendet werden.

```
select s.buyerid,l.eventid, sum(l.totalprice)
from listing l
join sales s on l.listid = s.listid
where l.listtime > '2008-12-01'
group by l.eventid, s.buyerid;
```

Wenn Sie eine Abfrage für die Ansicht PREDICATE\$1COLUMNS ausführen, wie im folgenden Beispiel gezeigt, sehen Sie, dass LISTID, EVENTID und LISTTIME als Prädikatspalten markiert sind.

```
select * from predicate_columns 
where table_name = 'listing';
```

```
schema_name | table_name | col_num | col_name       | is_predicate | first_predicate_use | last_analyze       
------------+------------+---------+----------------+--------------+---------------------+--------------------
public      | listing    |       1 | listid         | true         | 2017-05-05 19:27:59 | 2017-05-03 18:27:41
public      | listing    |       2 | sellerid       | false        |                     | 2017-05-03 18:27:41
public      | listing    |       3 | eventid        | true         | 2017-05-16 20:54:32 | 2017-05-03 18:27:41
public      | listing    |       4 | dateid         | false        |                     | 2017-05-03 18:27:41
public      | listing    |       5 | numtickets     | false        |                     | 2017-05-03 18:27:41
public      | listing    |       6 | priceperticket | false        |                     | 2017-05-03 18:27:41
public      | listing    |       7 | totalprice     | false        |                     | 2017-05-03 18:27:41
public      | listing    |       8 | listtime       | true         | 2017-05-16 20:54:32 | 2017-05-03 18:27:41
```

Wenn die Statistiken aktuell sind, kann dies die Leistung bei Abfragen verbessern, weil die Abfrageplanung dann optimale Pläne auswählen kann. Amazon Redshift aktualisiert die Statistik im Hintergrund automatisch, und Sie können außerdem den Befehl ANALYZE explizit ausführen. Wenn Sie ANALYZE explizit aufrufen möchten, gehen Sie wie folgt vor:
+ Führen Sie den Befehl ANALYZE aus, bevor Sie Abfragen ausführen.
+ Führen Sie am Ende jedes regulären Lade- oder Aktualisierungszyklus routinemäßig den Befehl ANALYZE über der Datenbank aus.
+ Führen Sie den Befehl ANALYZE über allen neuen Tabellen aus, die Sie erstellen, aber auch über allen vorhandenen Tabellen oder Spalten mit wesentlichen Änderungen.
+ Sie sollten ANALYZE-Operationen für verschiedene Arten von Tabellen und Spalten zu unterschiedlichen Zeitpunkten ausführen, abhängig von ihrer Verwendung in Abfragen und der Wahrscheinlichkeit von Änderungen.
+ Um Zeit und Cluster-Ressourcen zu sparen, sollten Sie die PREDICATE COLUMNS-Klausel verwenden, wenn Sie ANALYZE ausführen.

Sie müssen den Befehl ANALYZE nicht explizit ausführen, nachdem Sie einen Snapshot in einem bereitgestellten Cluster oder Serverless-Namespace wiederhergestellt oder einen pausierten bereitgestellten Cluster fortgesetzt haben. Amazon Redshift behält in diesen Fällen die Systemtabelleninformationen bei, sodass manuelle ANALYZE-Befehle nicht erforderlich sind. Amazon Redshift wird bei Bedarf weiterhin automatische Analysevorgänge ausführen.

Bei einem Analysevorgang werden Tabellen mit up-to-date Statistiken übersprungen. Wenn ANALYZE im Rahmen des ETL-Workflows (Extrahieren, Transformieren und Laden) ausgeführt wird, werden Tabellen, deren Statistik aktuell ist, bei der automatischen Analyse übersprungen. Aus entsprechenden Gründen werden bei einem expliziten Aufruf von ANALYZE Tabellen ausgelassen, deren Statistik bereits bei einer automatischen Analyse aktualisiert wurde.

## Verlauf für den Befehl ANALYZE
<a name="c_check_last_analyze"></a>

Es ist nützlich, zu wissen, wann der Befehl ANALYZE zum letzten Mal für eine Tabelle oder Datenbank ausgeführt wurde. Während der Ausführung des Befehls ANALYZE führt Amazon Redshift mehrere Abfragen aus, die wie folgt aussehen: 

```
padb_fetch_sample: select * from table_name
```

Führen Sie eine Abfrage für STL\$1ANALYZE aus, um den Verlauf von ANALZYE-Operationen anzuzeigen. Wenn Amazon Redshift eine Tabelle automatisch analysiert, wird für die Spalte `is_background` der Wert `t` (true) festgelegt. Andernfalls lautet der Wert `f` (false). Im folgende Beispiel wird STV\$1TBL\$1PERM verknüpft, um den Tabellennamen und Details zur Ausführungszeit anzuzeigen.

```
select distinct a.xid, trim(t.name) as name, a.status, a.rows, a.modified_rows, a.starttime, a.endtime
from stl_analyze a 
join stv_tbl_perm t  on t.id=a.table_id
where name = 'users'
order by starttime;


xid    | name  | status          | rows  | modified_rows | starttime           | endtime            
-------+-------+-----------------+-------+---------------+---------------------+--------------------
  1582 | users | Full            | 49990 |         49990 | 2016-09-22 22:02:23 | 2016-09-22 22:02:28
244287 | users | Full            | 24992 |         74988 | 2016-10-04 22:50:58 | 2016-10-04 22:51:01
244712 | users | Full            | 49984 |         24992 | 2016-10-04 22:56:07 | 2016-10-04 22:56:07
245071 | users | Skipped         | 49984 |             0 | 2016-10-04 22:58:17 | 2016-10-04 22:58:17
245439 | users | Skipped         | 49984 |          1982 | 2016-10-04 23:00:13 | 2016-10-04 23:00:13
(5 rows)
```

Alternativ können Sie eine komplexere Abfrage ausführen, die alle Anweisungen zurückgibt, die in allen abgeschlossenen Transaktionen ausgeführt wurden und den Befehl ANALYZE enthielten: 

```
select xid, to_char(starttime, 'HH24:MM:SS.MS') as starttime,
datediff(sec,starttime,endtime ) as secs, substring(text, 1, 40)
from svl_statementtext
where sequence = 0
and xid in (select xid from svl_statementtext s where s.text like 'padb_fetch_sample%' )
order by xid desc, starttime;

xid  |  starttime   | secs |                  substring
-----+--------------+------+------------------------------------------
1338 | 12:04:28.511 |    4 | Analyze date
1338 | 12:04:28.511 |    1 | padb_fetch_sample: select count(*) from
1338 | 12:04:29.443 |    2 | padb_fetch_sample: select * from date
1338 | 12:04:31.456 |    1 | padb_fetch_sample: select * from date
1337 | 12:04:24.388 |    1 | padb_fetch_sample: select count(*) from
1337 | 12:04:24.388 |    4 | Analyze sales
1337 | 12:04:25.322 |    2 | padb_fetch_sample: select * from sales
1337 | 12:04:27.363 |    1 | padb_fetch_sample: select * from sales
...
```

# Bereinigen von Tabellen
<a name="t_Reclaiming_storage_space202"></a>

Amazon Redshift kann im Hintergrund automatisch eine VACUUM DELETE-Operation für Tabellen sortieren und ausführen. Um Tabellen nach einem Laden oder einer Reihe von inkrementellen Updates zu bereinigen, können Sie auch den [VACUUM](r_VACUUM_command.md)-Befehl ausführen (entweder gegen die gesamte Datenbank oder gegen einzelne Tabellen).

**Anmerkung**  
Nur Benutzer mit den erforderlichen Tabellenberechtigungen können eine Tabelle effektiv bereinigen. Wenn VACUUM ohne die notwendigen Tabellenberechtigungen ausgeführt, wird die Operation zwar erfolgreich abgeschlossen, hat jedoch keine Wirkung. Eine Liste der gültigen Tabellenberechtigungen zum effektiven Ausführen von VACUUM finden Sie unter [VACUUM](r_VACUUM_command.md).  
Aus diesem Grund empfehlen wir, das Vacuuming einzelner Tabellen bei Bedarf durchzuführen. Wir empfehlen ebenfalls diesen Ansatz, da das Vacuuming der gesamten Datenbank ein teurer Vorgang sein kann.

## Automatische Tabellensortierung
<a name="automatic-table-sort"></a>

Amazon Redshift sortiert automatisch die Daten im Hintergrund, um die Tabellendaten in der Reihenfolge ihres Sortierschlüssels zu sortieren. Amazon Redshift verfolgt Ihre Scan-Abfragen, um festzustellen, welche Abschnitte der Tabelle von der Sortierung profitieren. Amazon Redshift verfolgt auch Scananfragen von Clustern zur Parallelitätsskalierung. Bei Multi-Cluster-Architekturen, die Amazon Redshift Data Sharing verwenden, verfolgt Amazon Redshift auch Scananfragen, die von Verbrauchern clusters/workgroups in Ihrem Datennetz stammen, auch clusters/workgroups über verschiedene Regionen hinweg. Die Scan-Statistiken aus dem Hauptcluster, den Clustern zur Parallelitätsskalierung und den Consumer-Clustern werden aggregiert, um zu bestimmen, welche Abschnitte der Tabelle von der Sortierung profitieren.

Abhängig von der Auslastung des Systems leitet Amazon Redshift die Sortierung automatisch ein. Diese automatische Sortierung erübrigt die Ausführung des Befehls VACUUM, um die Daten in der Reihenfolge der Sortierkriterien zu halten. Wenn Sie Daten vollständig nach dem Sortkey sortiert benötigen, z. B. nach einer großen Datenmenge, können Sie den Befehl VACUUM trotzdem manuell ausführen. Um festzustellen, ob Ihre Tabelle von der Ausführung von VACUUM SORT profitieren wird, überwachen Sie die Spalte `vacuum_sort_benefit` in [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). 

Amazon Redshift verfolgt Scan-Abfragen, die den Sortierschlüssel für jede Tabelle verwenden. Amazon Redshift schätzt den maximalen Prozentsatz der Verbesserung beim Scannen und Filtern von Daten für die Tabelle (wenn die Tabelle vollständig sortiert war). Diese Schätzung ist in der Spalte `vacuum_sort_benefit` in [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) sichtbar. Sie können diese Spalte zusammen mit der Spalte `unsorted` verwenden, um festzulegen, wann Abfragen davon profitieren können, VACUUM SORT manuell für eine Tabelle auszuführen. Die Spalte `unsorted` spiegelt die physische Sortierreihenfolge einer Tabelle wider. Die Spalte `vacuum_sort_benefit` gibt die Auswirkung der Sortierung einer Tabelle durch manuelles Ausführen von VACUUM SORT an.

Nehmen Sie beispielsweise die folgende Abfrage:

```
select "table", unsorted,vacuum_sort_benefit from svv_table_info order by 1;
```

```
 table | unsorted | vacuum_sort_benefit 
-------+----------+---------------------
 sales |    85.71 |                5.00
 event |    45.24 |               67.00
```

Obwohl die Tabelle "sales" \$186 % physisch unsortiert ist, hat dies nur einen Einfluss 5 % auf die Abfrageleistung. Dies kann entweder daran liegen, dass nur ein kleiner Teil der Tabelle von Abfragen angesprochen wird oder dass nur sehr wenige Abfragen auf die Tabelle zugegriffen haben. Die Tabelle "event" ist \$145 % physisch unsortiert. Aber die Änderung der Abfrageleistung von 67 % zeigt auf, dass entweder ein größerer Teil der Tabelle von Abfragen abgerufen wurde oder dass die Anzahl der auf die Tabelle zugreifenden Abfragen groß war. Die Tabelle "event" kann potentiell von der Ausführung von VACUUM SORT profitieren.

## Automatisches Aufrufen von VACUUM DELETE
<a name="automatic-table-delete"></a>

Wenn Sie einen Löschvorgang ausführen, werden die Zeilen zum Löschen markiert, jedoch nicht entfernt. Amazon Redshift führt automatisch einen VACUUM DELETE-Vorgang im Hintergrund aus, der auf der Anzahl der gelöschten Zeilen in Datenbanktabellen basiert. Amazon Redshift legt für VACUUM DELETE eine zeitplangesteuerte Ausführung so fest, dass diese Ausführung in Zeiten fällt, in denen der Workload gering ist, und hält die Ausführung bei hoher Auslastung an. 

**Topics**
+ [Automatische Tabellensortierung](#automatic-table-sort)
+ [Automatisches Aufrufen von VACUUM DELETE](#automatic-table-delete)
+ [Häufigkeit von Bereinigungen (VACUUM)](#vacuum-frequency)
+ [Sortierphase und Zusammenführungsphase](#vacuum-stages)
+ [Schwellenwert für die Bereinigung](#vacuum-sort-threshold)
+ [Arten von Bereinigungen](#vacuum-types)
+ [Minimieren von Bereinigungszeiten](vacuum-managing-vacuum-times.md)

## Häufigkeit von Bereinigungen (VACUUM)
<a name="vacuum-frequency"></a>

Sie sollten Bereinigungen so häufig wie notwendig ausführen, um eine konsistente Abfrageleistung aufrechtzuerhalten. Bei der Festlegung der Häufigkeit, mit der Sie den Befehl VACUUM ausführen, sollten Sie folgende Faktoren berücksichtigen:
+ Führen Sie VACUUM während Zeiten aus, in denen Sie für den Cluster nur minimale Aktivität erwarten, beispielsweise abends oder während festgelegter Zeitfenster für die Datenbankadministration. 
+ Führen Sie VACUUM-Befehle außerhalb von Wartungsfenstern aus. Weitere Informationen finden Sie unter [Zeitplanung um Wartungsfenster](https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-avoid-maintenance.html).
+ Eine große, nicht sortierte Region führt zu längeren Bereinigungszeiten. Wenn Sie die Bereinigung verzögern, dauert sie länger, da mehr Daten neu organisiert werden müssen. 
+ VACUUM ist ein I/O intensiver Vorgang. Je länger es dauert, bis Ihr Vacuum abgeschlossen ist, desto mehr Auswirkungen hat es auf gleichzeitige Abfragen und andere Datenbankoperationen, die auf Ihrem Cluster ausgeführt werden. 
+ VACUUM benötigt für Tabellen, die eine überlappende Sortierung verwenden, länger. Um zu beurteilen, ob überlappende Tabellen neu sortiert werden müssen, fragen Sie die Ansicht [SVV\$1INTERLEAVED\$1COLUMNS](r_SVV_INTERLEAVED_COLUMNS.md) ab.

## Sortierphase und Zusammenführungsphase
<a name="vacuum-stages"></a>

Amazon Redshift führt Bereinigungsoperationen in zwei Phasen aus. Zunächst werden die Zeilen in der nicht sortierten Region sortiert. Anschließend werden die neu sortierten Zeilen am Ende der Tabelle mit den vorhandenen Zeilen zusammengeführt, wenn notwendig. Beim Bereinigen einer großen Tabelle wird die Bereinigungsoperation in einer Reihe von Schritten ausgeführt, die aus inkrementellen Sortierungen gefolgt von Zusammenführungen bestehen. Wenn die Operation fehlschlägt oder Amazon Redshift während der Bereinigung offline geht, befindet sich die teilweise bereinigte Tabelle oder Datenbank in einem konsistenten Zustand. Sie müssen jedoch die Bereinigungsoperation manuell neu starten. Inkrementelle Sortierungen gehen verloren. Die zusammengeführten Zeilen, für die vor dem Fehler ein Commit ausgeführt wurde, müssen jedoch nicht erneut bereinigt werden. Wenn die nicht sortierte Region groß ist, kann erhebliche Zeit verloren gehen. Weitere Informationen zu den Sortierungs- und Zusammenführungsphasen finden Sie unter [Reduzieren der Zahl der zusammengeführten Zeilen](vacuum-managing-vacuum-times.md#vacuum-managing-volume-of-unmerged-rows).

Benutzer können auf Tabellen zugreifen, während sie bereinigt werden. Sie können Abfragen und Schreiboperationen ausführen, während eine Tabelle bereinigt wird. Wenn jedoch DML und eine Bereinigung gleichzeitig ausgeführt werden, dauern beide Vorgänge möglicherweise länger. Wenn Sie während einer Bereinigung UPDATE- und DELETE-Anweisungen ausführen, wird die Systemleistung möglicherweise reduziert. Inkrementelle Zusammenführungen blockieren gleichzeitig ausgeführte UPDATE- und DELETE-Operationen. UPDATE- und DELETE-Operationen wiederum blockieren inkrementelle Zusammenführungen für die betroffenen Tabellen. DDL-Operationen wie ALTER TABLE werden blockiert, bis die Bereinigungsoperation für die Tabelle abgeschlossen ist.

**Anmerkung**  
Verschiedene Modifikatoren für VACUUM steuern die Funktionsweise. Sie können sie verwenden, um die Bereinigung an den aktuellen Bedarf anzupassen. Beispielsweise verkürzt die Verwendung von VACUUM RECLUSTER die Bereinigung, indem keine vollständige Verschmelzung durchgeführt wird. Weitere Informationen finden Sie unter [VACUUM](r_VACUUM_command.md).

## Schwellenwert für die Bereinigung
<a name="vacuum-sort-threshold"></a>

Standardmäßig überspringt VACUUM die Sortierungsphase für alle Tabellen, in denen mehr als 95 Prozent der Tabellenzeilen bereits sortiert sind. Das Überspringen der Sortierungsphase kann die Leistung von VACUUM deutlich verbessern. Um den Standardschwellenwert für die Sortierung für eine einzelne Tabelle zu ändern, verwenden Sie den Tabellennamen und den Parameter TO *threshold* PERCENT, wenn Sie den Befehl VACUUM ausführen. 

## Arten von Bereinigungen
<a name="vacuum-types"></a>

Weitere Informationen zu den verschiedenen Arten von Bereinigungstypen finden Sie unter [VACUUM](r_VACUUM_command.md).

# Minimieren von Bereinigungszeiten
<a name="vacuum-managing-vacuum-times"></a>

 Amazon Redshift sortiert im Hintergrund automatisch die Daten und führt VACUUM DELETE aus. Dadurch entfällt die Notwendigkeit, den Befehl VACUUM auszuführen. Bereinigungsvorgänge können zeitaufwendig sein. Abhängig von der Art Ihrer Daten werden die folgenden Verfahren empfohlen, um die Bereinigungszeiten zu minimieren.

**Topics**
+ [Entscheidung über eine Neuindizierung](#r_vacuum-decide-whether-to-reindex)
+ [Reduzieren der Größe der nicht sortierten Region](#r_vacuum_diskspacereqs)
+ [Reduzieren der Zahl der zusammengeführten Zeilen](#vacuum-managing-volume-of-unmerged-rows)
+ [Laden Ihrer Daten in Sortierschlüsselreihenfolge](#vacuum-load-in-sort-key-order)
+ [Verwenden von Zeitreihentabellen zur Reduzierung gespeicherter Daten](#vacuum-time-series-tables)

## Entscheidung über eine Neuindizierung
<a name="r_vacuum-decide-whether-to-reindex"></a>

Häufig können Sie die Abfrageleistung deutlich verbessern, indem Sie einen überlappenden Sortierstil verwenden. Mit der Zeit verschlechtert sich die Leistung jedoch möglicherweise, wenn die Verteilung der Werte in den Sortierschlüsselspalten geändert wird. 

Wenn Sie eine leere, überlappende Tabelle mittels COPY oder CREATE TABLE AS laden, erstellt Amazon Redshift den überlappenden Index automatisch. Wenn Sie eine überlappende Tabelle mittels INSERT laden, müssen Sie im Anschluss VACUUM REINDEX ausführen, um den überlappenden Index zu initialisieren. 

Während Sie Zeilen mit neuen Sortierschlüsselwerten hinzufügen, kann sich die Leistung verschlechtern, wenn die Verteilung der Werte in den Sortierschlüsselspalten geändert wird. Wenn Ihre neuen Zeilen primär innerhalb des Bereichs der vorhandenen Sortierschlüsselwerte liegen, müssen Sie keine Neuindizierung ausführen. Führen Sie VACUUM SORT ONLY oder VACUUM FULL aus, um die Sortierreihenfolge wiederherzustellen. 

Das Abfragemodul kann die Sortierreihenfolge verwenden, um effizient festzulegen, welche Datenblöcke gescannt werden müssen, um eine Abfrage zu verarbeiten. Im Fall einer überlappenden Sortierung analysiert Amazon Redshift die Sortierschlüsselspaltenwerte, um die optimale Sortierreihenfolge zu ermitteln. Wenn aufgrund hinzugefügter Zeilen die Verteilung der Schlüsselwerte geändert oder verschoben wird, ist die Sortierstrategie nicht mehr optimal und der Vorteil, den die Sortierung für die Leistung hat, nimmt ab. Um die Sortierschlüsselverteilung neu zu analysieren, können Sie eine VACUUM REINDEX-Operation ausführen. Die Neuindizierungsoperation ist zeitaufwändig. Um festzustellen, ob eine Tabelle von einer Neuindizierung profitiert, führen Sie eine Abfrage für die Ansicht [SVV\$1INTERLEAVED\$1COLUMNS](r_SVV_INTERLEAVED_COLUMNS.md) aus. 

Beispielsweise zeigt die folgende Abfrage Details für Tabellen an, die überlappende Sortierschlüssel verwenden.

```
select tbl as tbl_id, stv_tbl_perm.name as table_name, 
col, interleaved_skew, last_reindex
from svv_interleaved_columns, stv_tbl_perm
where svv_interleaved_columns.tbl = stv_tbl_perm.id
and interleaved_skew is not null;


 tbl_id | table_name | col | interleaved_skew | last_reindex
--------+------------+-----+------------------+--------------------
 100048 | customer   |   0 |             3.65 | 2015-04-22 22:05:45
 100068 | lineorder  |   1 |             2.65 | 2015-04-22 22:05:45
 100072 | part       |   0 |             1.65 | 2015-04-22 22:05:45
 100077 | supplier   |   1 |             1.00 | 2015-04-22 22:05:45
(4 rows)
```

Der Wert für `interleaved_skew` ist ein Verhältnis, das die Menge der Verschiebung angibt. Ein Wert von 1 bedeutet, dass es keine Verschiebung gegeben hat. Wenn die Verschiebung größer als 1,4 ist, verbessert eine VACUUM REINDEX -Operation in der Regel die Leistung, es sei denn, die Verschiebung ist ein Merkmal des zugrundeliegenden Satzes. 

Sie können den Datumswert in `last_reindex` verwenden, um festzustellen, wie viel Zeit seit der letzten Neuindizierung verstrichen ist. 

## Reduzieren der Größe der nicht sortierten Region
<a name="r_vacuum_diskspacereqs"></a>

Die nicht sortierte Region nimmt an Größe zu, wenn Sie große Mengen neuer Daten in Tabellen laden, die bereits Daten enthalten, oder wenn Sie Tabellen nicht als Teil der routinemäßigen Wartungsoperationen bereinigen. Um lange Ausführungszeiten von Bereinigungsoperationen zu vermeiden, verwenden Sie die folgenden Verfahren:
+ Führen Sie Bereinigungsoperationen regelmäßig aus. 

  Wenn Sie Ihre Tabellen in kleinen Inkrementen laden (beispielsweise täglichen Updates, die einen kleinen Prozentsatz der gesamten Zeilenzahl in der Tabelle darstellen), hilft die regelmäßige Ausführung von VACUUM, eine schnelle Ausführung der einzelnen Bereinigungsoperationen sicherzustellen.
+ Führen Sie den größten Ladevorgang zuerst aus.

  Wenn Sie eine neue Tabelle mit mehreren COPY-Operationen laden müssen, führen Sie den größten Ladevorgang zuerst aus. Wenn Sie einen Ladevorgang zum ersten Mal in eine neue oder verkürzte Tabelle ausführen, werden alle Daten direkt in die sortierte Region geladen, sodass keine Bereinigung erforderlich ist.
+ Verkürzen Sie eine Tabelle, statt alle Zeilen zu löschen. 

  Durch das Löschen von Zeilen aus einer Tabelle wird der Platz nicht zurückgewonnen, den die Zeilen vor der Ausführung der Bereinigungsoperation belegt haben. Durch das Verkürzen einer Tabelle werden jedoch die Tabelle geleert und der Festplattenplatz zurückgewonnen; daher ist keine Bereinigung erforderlich. Alternativ können Sie die Tabelle entfernen und neu erstellen. 
+ Verkürzen oder entfernen Sie Testtabellen. 

  Wenn Sie zu Testzwecken eine kleine Zahl von Zeilen in eine Tabelle laden, sollten Sie die Zeilen nach Abschluss des Vorgangs nicht löschen. Verkürzen Sie stattdessen die Tabelle und laden Sie diese Zeilen als Teil der anschließenden Produktionsladeoperation neu. 
+ Führen Sie eine Deep Copy-Operation aus. 

  Wenn eine Tabelle mit einer zusammengesetzten Sortierschlüsseltabelle einen großen, nicht sortierten Bereich besitzt, ist eine Deep Copy-Operation sehr viel schneller als eine Bereinigung. Eine Deep-Kopie erstellt eine Tabelle neu und füllt diese, indem sie einen Bulk-Insert verwendet, der die Tabelle automatisch neu sortiert. Wenn eine Tabelle einen großen, nicht sortierten Bereich besitzt, ist eine Deep Copy-Operation sehr viel schneller als eine Bereinigung. Der Kompromiss besteht darin, dass Sie während einer Deep Copy-Operation anders als bei einer Bereinigung nicht gleichzeitig Aktualisierungen ausführen können. Weitere Informationen finden Sie unter [Bewährte Methoden für die Gestaltung von Abfragen mit Amazon Redshift](c_designing-queries-best-practices.md). 

## Reduzieren der Zahl der zusammengeführten Zeilen
<a name="vacuum-managing-volume-of-unmerged-rows"></a>

Wenn eine Bereinigungsoperation neue Zeilen mit der sortierten Region einer Tabelle zusammenführen muss, nimmt der für die Bereinigung benötigte Zeitraum zu, wenn die Tabelle größer wird. Sie können die Leistung der Bereinigung verbessern, indem Sie die Zahl der Zeilen reduzieren, die zusammengeführt werden müssen. 

Vor einer Bereinigung besteht eine Tabelle aus einer sortierten Region zu Beginn der Tabelle, gefolgt von einer nicht sortierten Region, deren Größe jedes Mal zunimmt, wenn Zeilen hinzugefügt oder aktualisiert werden. Wenn ein Satz von Zeilen durch eine COPY-Operation hinzugefügt wird, wird der neue Satz von Zeilen anhand des Sortierschlüssels sortiert, wenn er der nicht sortierten Region am Ende der Tabelle hinzugefügt wird. Die neuen Zeilen werden innerhalb des eigenen Satzes, jedoch nicht innerhalb der nicht sortierten Region sortiert. 

Im folgenden Diagramm wird die nicht sortierte Region nach zwei aufeinanderfolgenden COPY-Operationen gezeigt. Der Sortierschlüssel ist CUSTID. Aus Gründen der Einfachheit zeigt dieses Beispiel einen zusammengesetzten Sortierschlüssel. Für überlappende Sortierschlüssel gelten jedoch dieselben Grundsätze, abgesehen davon, dass die Auswirkungen der nicht sortierten Region bei überlappenden Tabellen größer sind. 

![\[Eine unsortierte Tabelle mit Datensätzen aus zwei COPY-Operationen.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/vacuum-unsorted-region.png)


Eine Bereinigung stellt die Sortierreihenfolge der Tabelle in zwei Phasen wieder her:

1. Die nicht sortierte Region wird zu einer neu sortierten Region sortiert. 

   Die erste Phase ist vergleichsweise kostengünstig, da nur die nicht sortierte Region neu geschrieben wird. Wenn der Bereich der Sortierschlüsselwerte der neu sortierten Region größer als der vorhandene Bereich ist, müssen nur die neuen Zeilen neu geschrieben werden und die Bereinigung ist abgeschlossen. Wenn die sortierte Region beispielsweise ID-Werte von 1 bis 500 enthält und nachfolgende COPY-Operationen Schlüsselwerte hinzufügen, die größer als 500 sind, dann muss nur die nicht sortierte Region neu geschrieben werden. 

1. Führen Sie die neu sortierte Region mit der zuvor sortierten Region zusammen. 

   Wenn die Schlüssel in der neu sortierten Region mit den Schlüsseln in der sortierten Region überlappen, muss VACUUM die Zeilen zusammenführen. Beginnend mit dem Anfang der neu sortierten Region (beim niedrigsten Sortierschlüssel) schreibt die Bereinigungsoperation die zusammengeführten Zeilen aus der zuvor sortierten Region und der neu sortierten Region in einen neuen Satz von Blöcken. 

Der Umfang, mit dem der neue Sortierschlüsselbereich mit den vorhandenen Sortierschlüsseln überlappt, legt den Umfang fest, in dem die zuvor sortierte Region neu geschrieben werden muss. Wenn die nicht sortierten Schlüssel über den vorhandenen Sortierbereich verstreut sind, muss eine Bereinigungsoperation möglicherweise vorhandene Teile der Tabelle neu schreiben. 

Im folgenden Diagramm wird gezeigt, wie eine Bereinigungsoperation Zeilen sortierten und zusammenführen würde, die einer Tabelle mit CUSTID als Sortierschlüssel hinzugefügt wurden. Da jede Kopieroperation einen neuen Satz von Zeilen mit Schlüsselwerten hinzufügt, die die vorhandenen Schlüssel überlappen, muss beinahe die gesamte Tabelle neu geschrieben werden. Das Diagramm zeigt einen einzelnen Sortierungs- und Zusammenführungsvorgang. In der Praxis bestehen große Bereinigungen jedoch aus einer Reihe inkrementeller Sortierungs- und Zusammenführungsvorgänge. 

![\[Eine VACUUM-Operation in der Beispieltabelle in zwei Schritten. Zuerst werden die neuen Zeilen sortiert. Anschließend werden sie mit den vorhandenen Zeilen zusammengeführt.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/vacuum-unsorted-region-sort-merge.png)


Wenn der Bereich von Sortierschlüsseln in einem Satz neuer Zeilen mit dem Bereich vorhandener Schlüssel überlappt, nehmen die Kosten der Zusammenführungsphase entsprechend der Tabellengröße zu, während die Tabelle an Größe zunimmt. Die Kosten der Sortierphase entsprechen jedoch weiter der Größe der nicht sortierten Region. In diesem Fall sind die Kosten der Zusammenführungsphase größer als die Kosten der Sortierphase, wie das folgende Diagramm zeigt.

![\[Diagramm, das zeigt, dass die Zusammenführungsphase teurer wird, wenn sich die Sortierschlüssel neuer Zeilen mit vorhandenen Zeilen überschneiden.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/vacuum-example-merge-region-grows.png)


Um den Anteil einer Tabelle zu ermitteln, der neu zusammengeführt wurde, führen Sie eine Abfrage für SVV\$1VACUUM\$1SUMMARY aus, nachdem die Bereinigungsoperation abgeschlossen ist. Die folgende Abfrage zeigt die Auswirkungen von sechs aufeinanderfolgenden Bereinigungsoperationen, während CUSTSALES mit der Zeit an Größe zunahm.

```
select * from svv_vacuum_summary
where table_name = 'custsales';


 table_name | xid  | sort_      | merge_     | elapsed_   | row_  | sortedrow_ | block_  | max_merge_
            |      | partitions | increments | time       | delta | delta      | delta   | partitions
 -----------+------+------------+------------+------------+-------+------------+---------+---------------
  custsales | 7072 |          3 |          2 |  143918314 |     0 |   88297472 |   1524  |      47
  custsales | 7122 |          3 |          3 |  164157882 |     0 |   88297472 |    772  |      47
  custsales | 7212 |          3 |          4 |  187433171 |     0 |   88297472 |    767  |      47
  custsales | 7289 |          3 |          4 |  255482945 |     0 |   88297472 |    770  |      47
  custsales | 7420 |          3 |          5 |  316583833 |     0 |   88297472 |    769  |      47
  custsales | 9007 |          3 |          6 |  306685472 |     0 |   88297472 |    772  |      47
 (6 rows)
```

Die Spalte merge\$1increments zeigt die Menge der Daten an, die für die einzelnen Bereinigungsoperationen zusammengeführt wurden. Wenn die Zahl der Zusammenführungsinkremente über aufeinanderfolgende Bereinigungen entsprechend dem Wachstum der Tabellengröße zunimmt, ist das ein Anzeichen dafür, dass jede Bereinigungsoperation eine zunehmende Zahl von Zeilen in der Tabelle neu zusammenführt, da die vorhandenen und neu sortierten Regionen überlappen. 

## Laden Ihrer Daten in Sortierschlüsselreihenfolge
<a name="vacuum-load-in-sort-key-order"></a>

Wenn Sie Ihre Daten in der Reihenfolge des Sortierschlüssels mithilfe eines COPY-Befehls laden, können Sie die Notwendigkeit einer Bereinigung verringern oder die Bereinigung sogar ganz überflüssig machen. 

COPY fügt automatisch der sortierten Region der Tabelle neue Zeilen hinzu, wenn alle folgenden Bedingungen zutreffen:
+ Die Tabelle verwendet einen zusammengesetzten Sortierschlüssel mit nur einer Sortierspalte. 
+ Die Sortierspalte ist NOT NULL. 
+ Die Tabelle ist zu 100 Prozent sortiert oder leer. 
+ Alle neuen Zeilen liegen in der Sortierreihenfolge höher als die vorhandenen Zeilen, einschließlich Zeilen, die zum Löschen markiert sind. In diesem Beispiel verwendet Amazon Redshift die ersten acht Bytes des Sortierschlüssels, um die Sortierreihenfolge festzulegen.
+  Der Befehl COPY löst bestimmte Ladeoptimierungen nicht aus. Beim Laden großer Datenmengen optimiert Amazon Redshift möglicherweise die Leistung, indem neue sortierte Partitionen erstellt werden, anstatt Zeilen zum sortierten Bereich der Tabelle hinzuzufügen. 

Angenommen, Sie verfügen beispielsweise über eine Tabelle, die Kundenveranstaltungen mittels einer Kunden-ID und eines Zeitpunkts aufzeichnet. Wenn Sie die Tabelle nach der Kunden-ID sortieren, überlappt der Sortierschlüsselbereich der neuen, durch inkrementelle Ladevorgänge hinzugefügten Zeilen wahrscheinlich den vorhandenen Bereich, wie im vorherigen Beispiel gezeigt. Dies führt zu einer kostspieligen Bereinigungsoperation. 

Wenn Sie den Sortierschlüssel auf eine Zeitstempelspalte festlegen, werden die neuen Zeilen in Sortierreihenfolge am Ende der Tabelle angefügt, wie im folgenden Diagramm dargestellt. Dies reduziert die Notwendigkeit einer Bereinigung oder macht diese sogar überflüssig.

![\[Eine Tabelle, die eine Zeitstempelspalte als Sortierschlüssel verwendet, wodurch neue Datensätze abgerufen werden, die nicht sortiert werden müssen.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/vacuum-unsorted-region-date-sort.png)


## Verwenden von Zeitreihentabellen zur Reduzierung gespeicherter Daten
<a name="vacuum-time-series-tables"></a>

Wenn Sie Daten für einen rollierenden Zeitraum warten, verwenden Sie eine Reihe von Tabellen wie im folgenden Diagramm gezeigt.

![\[Fünf Tabellen mit Daten aus fünf Quartalen. Die älteste Tabelle wird gelöscht, um einen gleitenden Zeitraum von einem Jahr beizubehalten.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/vacuum-example-unsorted-region-copy-time-series.png)


Erstellen Sie jedes Mal, wenn Sie einen Satz von Daten hinzufügen, eine neue Tabelle. Löschen Sie anschließend die älteste Tabelle in der Reihe. Sie erzielen einen doppelten Vorteil: 
+ Sie vermeiden den zusätzlichen Aufwand für das Löschen von Zeilen, da die DROP TABLE-Operation sehr viel effizienter als eine DELETE-Massenoperation ist.
+ Wenn die Tabellen nach Zeitstempel sortiert sind, wird keine Bereinigung benötigt. Wenn jede Tabelle die Daten für einen Monat enthält, muss eine Bereinigung höchstens die Daten eines Monats neu schreiben, auch wenn die Tabellen nicht nach Zeitstempel sortiert sind.

Sie können eine UNION ALL-Ansicht erstellen, die von Berichtsabfragen verwendet wird, die Tatsache verbirgt, dass die Dateien in mehreren Tabellen gespeichert sind. Wenn eine Abfrage nach dem Sortierschlüssel filtert, kann der Abfrageplaner effizient alle nicht verwendeten Tabellen überspringen. Eine UNION ALL-Ansicht kann für andere Arten von Abfragen weniger effizient sein. Daher sollten Sie die Abfrageleistung im Zusammenhang mit allen Abfragen bewerten, die die Tabellen verwenden.

# Verwalten gleichzeitiger Schreiboperationen
<a name="c_Concurrent_writes"></a>

Einige Anwendungen erfordern nicht nur gleichzeitiges Abfragen und Laden, sondern auch die Fähigkeit, gleichzeitig zu mehreren Tabellen oder zur selben Tabelle zu schreiben. In diesem Zusammenhang bedeutet *gleichzeitig* überlappend, nicht die Ausführung zu exakt demselben Zeitpunkt. Zwei Transaktionen werden als gleichzeitig betrachtet, wenn die zweite Transaktion gestartet wird, bevor für die erste Transaktion ein Commit ausgeführt wird. Gleichzeitige Operationen können ihren Ursprung in verschiedenen Sitzungen haben, die vom selben Benutzer oder von verschiedenen Benutzern gesteuert werden. 

Amazon Redshift unterstützt diese Arten von Anwendungen, da Tabellen gelesen werden können, während sie inkrementell geladen oder geändert werden. Abfragen steht einfach die letzte übergegebene Version bzw. der letzte *Snapshot* der Daten bereit. Sie müssen nicht darauf warten, dass für die nächste Version ein Commit ausgeführt wird. Wenn Sie möchten, dass eine bestimmte Abfrage auf einen Commit aus einer anderen Schreiboperation wartet, müssen Sie dies entsprechend planen.

**Anmerkung**  
Amazon Redshift unterstützt standardmäßig *automatische Commits*, bei denen für jeden getrennt ausgeführten SQL-Befehl ein einzelnes Commit ausgeführt wird. Wenn Sie in einem Transaktionsblock einen Satz von Befehlen einschließen (definiert durch die Anweisungen [BEGIN](r_BEGIN.md) und [END](r_END.md)), wird der Block als eine einzige Transaktion übergeben, sodass Sie ein Rollback für ihn ausführen können, wenn notwendig. Ausnahmen von diesem Verhalten sind die Befehle TRUNCATE und VACUUM, die automatische alle ausstehenden Änderungen, die in der aktuellen Transaktion vorgenommen wurden, übergeben.   
Einige SQL-Clients geben automatisch BEGIN- und COMMIT-Befehle aus, sodass der Client steuert, ob eine Gruppe von Anweisungen als Transaktion oder jede einzelne Anweisung als eigene Transaktion ausgeführt wird. Konsultieren Sie die Dokumentation zu der von Ihnen verwendeten Schnittstelle. Wenn Sie zum Beispiel den JDBC-Treiber von Amazon Redshift verwenden, führt ein JDBC `PreparedStatement` mit einer Abfragezeichenfolge, die mehrere (durch Semikolon getrennte) SQL-Befehle enthält, alle Anweisungen als eine einzige Transaktion aus. Wenn Sie dagegen SQL verwenden Workbench/J und AUTO COMMIT ON setzen, wird bei der Ausführung mehrerer Anweisungen jede Anweisung als eigene Transaktion ausgeführt. 

In den folgenden Themen werden einige der wesentlichen Konzepte und Anwendungsfälle beschrieben, die Transaktionen, Datenbank-Snapshots, Updates und Gleichzeitigkeitsverhalten umfassen.

**Topics**
+ [Isolierungsstufen in Amazon Redshift](c_serial_isolation.md)
+ [Schreiben und read/write Operationen](c_write_readwrite.md)
+ [Beispiele für gleichzeitige Schreibvorgänge](r_Serializable_isolation_example.md)
+ [Beheben von Fehlern für die serialisierbare Isolierung](c_serial_isolation-serializable-isolation-troubleshooting.md)

# Isolierungsstufen in Amazon Redshift
<a name="c_serial_isolation"></a>

Gleichzeitige Schreiboperationen werden in Amazon Redshift auf geschützte Art unterstützt, indem Schreibsperren für Tabellen und der Grundsatz der *serialisierbaren Isolierung* angewendet werden. Die serialisierbare Isolierung bewahrt die Illusion, dass eine Transaktion, die für eine Tabelle ausgeführt wird, die einzige Transaktion ist, die für diese Tabelle ausgeführt wird.

Amazon-Redshift-Datenbanken unterstützen gleichzeitige Schreiboperationen, indem jede Operation die neueste übergebene Version bzw. den neuesten übergebenen Snapshot ihrer Daten zu Beginn der Transaktion verwendet. Innerhalb der Transaktion wird beim ersten Auftreten der meisten SELECT-Anweisungen, von DML-Befehlen wie COPY, DELETE, INSERT, UPDATE und TRUNCATE und der folgenden DDL-Befehle ein Datenbank-Snapshot erstellt:
+  ALTER TABLE (Hinzufügen oder Entfernen von Spalten) 
+  CREATE TABLE 
+  DROP TABLE 
+  TRUNCATE TABLE 

Keine andere Transaktion kann diesen Snapshot ändern. Das bedeutet, dass Transaktionen voneinander isoliert sind. Gleichzeitige Transaktionen können sich gegenseitig nicht sehen, d. h., sie können die Änderungen der jeweils anderen Transaktionen nicht erkennen.

Eine gleichzeitige Ausführung von Transaktionen muss zu denselben Ergebnissen führen wie die serielle Ausführung dieser Transaktionen. Wenn keine serielle Ausführung dieser Transaktionen dieselben Ergebnisse produziert, wird die Transaktion abgebrochen, die eine Anweisung ausführt, die die Serialisierbarkeit verhindern würde. Für diese Transaktion wird ein Rollback ausgeführt.

Angenommen, ein Benutzer versucht, zwei gleichzeitige Transaktionen auszuführen, T1 und T2. Die Ausführung von T1 und T2 muss zu denselben Ergebnissen führen wie in mindestens einem der folgenden Szenarien:
+ T1 und T2 werden seriell in dieser Reihenfolge ausgeführt.
+ T2 und T1 werden seriell in dieser Reihenfolge ausgeführt.

 Isolierungsstufen in Amazon Redshift verhindern die folgenden Probleme: 
+  Fehlerhafte Leseoperationen: Eine fehlerhafte Leseoperation tritt auf, wenn eine Transaktion Daten liest, die noch nicht übergeben wurden. Angenommen, Transaktion 1 aktualisiert eine Zeile. Transaktion 2 liest die aktualisierte Zeile, bevor T1 die Aktualisierung übergibt. Wenn T1 die Änderung rückgängig macht, hat T2 Daten in nicht übergebenen Zeilen gelesen, für die Amazon Redshift jetzt annimmt, dass sie nie existiert haben. 
+  Nicht wiederholbare Leseoperationen: Eine nicht wiederholbare Leseoperation tritt auf, wenn eine einzelne Transaktion dieselbe Zeile zweimal liest, aber jedes Mal andere Daten erhält. Angenommen, Transaktion 1 liest eine Zeile. Transaktion 2 aktualisiert oder löscht diese Zeile und übergibt die Aktualisierung oder Löschung. Wenn T1 die Zeile erneut liest, ruft sie andere Zeilenwerte ab oder stellt fest, dass die Zeile gelöscht wurde. 
+  Phantome: Ein Phantom ist eine Zeile, die den Suchkriterien entspricht, aber zunächst nicht sichtbar ist. Angenommen, Transaktion 1 liest eine Reihe von Zeilen, die ihren Suchkriterien entsprechen. Transaktion 2 generiert eine neue Zeile in einer UPDATE- oder INSERT-Anweisung, die den Suchkriterien für T1 entspricht. Wenn T1 ihre Suchanweisung erneut ausführt, erhält sie einen anderen Satz von Zeilen. 

## SNAPSHOT- und SERIALIZABLE-Isolierung
<a name="c_serial_isolation-snapshot_and_serializable"></a>

SNAPSHOT und SERIALIZABLE sind die beiden serialisierbaren Isolierungsstufen, die in Amazon Redshift verfügbar sind. 

Die SNAPSHOT-Isolierung ist die Standard-Isolierungsstufe bei der Erstellung von bereitgestellten Clustern und Serverless-Arbeitsgruppen, sodass Sie größere Datenmengen als bei der SERIALIZABLE-Isolierung in kürzerer Zeit verarbeiten können.

Die SERIALIZABLE-Isolierung nimmt mehr Zeit in Anspruch, implementiert jedoch strengere Einschränkungen für gleichzeitige Transaktionen. Diese Isolierungsstufe verhindert Probleme wie Schreibverzerrungsanomalien, da nur jeweils eine Transaktion übergeben werden kann, während alle anderen gleichzeitigen Transaktionen mit einem Fehler wegen Verletzung der serialisierbaren Isolierung abgebrochen werden.

Im Folgenden finden Sie ein Timeline-Beispiel dafür, wie zwei gleichzeitige Schreiboperationen bei Verwendung der SNAPSHOT-Isolierung behandelt würden. Die UPDATE-Anweisung jedes Benutzers darf einen Commit ausführen, da es nicht zu Konflikten kommt, wenn versucht wird, dieselben Zeilen zu aktualisieren.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/c_serial_isolation.html)

Wenn dasselbe Szenario mit serialisierbarer Isolation ausgeführt wird, beendet Amazon Redshift Benutzer 2 aufgrund einer serialisierbaren Verletzung und gibt den Fehler `1023` zurück. Weitere Informationen finden Sie unter [Beheben von Fehlern für die serialisierbare Isolierung](c_serial_isolation-serializable-isolation-troubleshooting.md). In diesem Fall kann nur Benutzer 1 einen erfolgreichen Commit ausführen. 

## Überlegungen
<a name="c_serial_isolation-considerations"></a>

Berücksichtigen Sie bei der Verwendung von Isolierungsstufen in Amazon Redshift Folgendes:
+  Fragen Sie die Katalogansicht STV\$1DB\$1ISOLATION\$1LEVEL ab, um zu sehen, welche Isolierungsstufe Ihre Datenbank verwendet. Weitere Informationen finden Sie unter [STV\$1DB\$1ISOLATION\$1LEVEL](r_STV_DB_ISOLATION_LEVEL.md). 
+  Fragen Sie die Ansicht PG\$1DATABASE\$1INFO ab, um zu sehen, wie viele gleichzeitige Transaktionen für Ihre Datenbank unterstützt werden. Weitere Informationen finden Sie unter [PG\$1DATABASE\$1INFO](r_PG_DATABASE_INFO.md). 
+  Systemkatalogtabellen (PG) und andere Amazon-Redshift-Systemtabellen sind in einer Transaktion nicht gesperrt. Daher sind Änderungen an Datenbankobjekten, die aufgrund von DDL- und TRUNCATE-Transaktionen entstanden sind, beim Commit für alle gleichzeitigen Transaktionen erkennbar. 

   Angenommen, Tabelle A ist in der Datenbank vorhanden, wenn zwei gleichzeitige Transaktionen, T1 und T2, gestartet werden. Angenommen, T2 gibt eine Liste von Tabellen zurück, indem Sie aus der Katalogtabelle PG\$1TABLES auswählen. Dann löscht T1 Tabelle A und Commits, und dann listet T2 die Tabellen erneut auf. Tabelle A ist jetzt nicht mehr aufgeführt. Wenn T2 versucht, eine Abfrage für die entfernte Tabelle auszuführen, gibt Amazon Redshift den Fehler „Beziehung nicht vorhanden“ zurück. Die Katalogabfrage, die die Liste von Tabellen an T2 zurückgibt oder überprüft, ob Tabelle A vorhanden ist, unterliegt nicht denselben Isolierungsregeln wie Operationen in Benutzertabellen. 

   Transaktionen für Aktualisierungen dieser Tabellen werden im Isolierungsmodus read committed ausgeführt. 
+  PG-prefix-Katalogtabellen unterstützen die SNAPSHOT-Isolierung nicht. 

# Schreiben und read/write Operationen
<a name="c_write_readwrite"></a>

Sie können das spezifische Verhalten gleichzeitiger Schreib- und Lese-Schreib-Operationen verwalten, indem Sie entscheiden, wann und wie verschiedene Arten von Befehlen ausgeführt werden. Die folgenden Befehle sind für dieses Thema relevant: 
+ COPY-Befehle, die Ladevorgänge ausführen (anfänglich oder inkrementell)
+ INSERT-Befehle, die jeweils mindestens eine Zeile anfügen
+ UPDATE-Befehle, die vorhandene Zeilen ändern
+ DELETE-Befehle, die vorhandene Zeilen entfernen 

COPY- und INSERT-Operationen sind reine Schreiboperationen. DELETE- und read/write UPDATE-Operationen sind Operationen (damit Zeilen gelöscht oder aktualisiert werden können, müssen sie zuerst gelesen werden). Die Ergebnisse gleichzeitiger Schreibvorgänge sind von den spezifischen Befehlen abhängig, die gleichzeitig ausgeführt werden. 

UPDATE- und DELETE-Operationen verhalten sich anders, da sie von einem anfänglichen Tabellenlesevorgang abhängig sind, bevor Schreibvorgänge ausgeführt werden können. Da gleichzeitige Transaktionen füreinander unsichtbar sind, DELETEs müssen beide UPDATEs Transaktionen eine Momentaufnahme der Daten aus dem letzten Commit lesen. Wenn die erste UPDATE- oder DELETE-Operation die Sperre aufhebt, muss die zweite UPDATE- oder DELETE-Operation feststellen, ob die Daten, mit denen sie arbeitet, möglicherweise veraltet sind. Sie sind nicht veraltet, da die zweite Transaktion den Daten-Snapshot erst erhält, nachdem die erste Transaktion die Sperre aufgehoben hat.

## Potenzielle Deadlock-Situation für gleichzeitige Schreibtransaktionen, an denen mehrere Tabellen beteiligt sind
<a name="c_write_readwrite-potential-deadlock"></a>

Wenn Transaktionen Aktualisierungen von mehr als einer Tabelle umfassen, besteht stets die Möglichkeit, dass gleichzeitig ausgeführte Transaktionen in eine Deadlock-Situation geraten, wenn beide versuchen, zum gleichen Satz von Tabellen zu schreiben. Transaktionen heben alle ihre Tabellensperren auf einmal auf, wenn sie einen Commit oder ein Rollback ausführen. Sie heben Sperren nicht einzeln auf.

Angenommen, die Transaktionen T1 und T2 werden ungefähr zur gleichen Zeit gestartet. Wenn T1 mit dem Schreiben zu Tabelle A beginnt und T2 mit dem Schreiben zu Tabelle B beginnt, können beide Transaktionen ohne Konflikt fortgesetzt werden. Wenn jedoch T1 die Schreiboperation für Tabelle A beendet hat und eine Schreiboperation für Tabelle B starten muss, kann die Transaktion nicht fortgesetzt werden, da T2 die Tabelle B noch nicht freigegeben hat. Wenn umgekehrt T2 die Schreiboperation für Tabelle B beendet hat und eine Schreiboperation für Tabelle A starten muss, kann die Transaktion ebenfalls nicht fortgesetzt werden, da T1 die Tabelle A noch nicht freigegeben hat. Da keine der beiden Transaktionen ihre Sperren aufheben kann, solange nicht für alle ihre Schreiboperationen ein Commit ausgeführt wurde, kann keine der beiden Transaktionen fortgesetzt werden. Um diese Art von Deadlock zu vermeiden, müssen Sie gleichzeitige Schreiboperationen sorgfältig planen. Beispielsweise sollten Sie in Transaktionen Tabellen stets in derselben Reihenfolge aktualisieren und bei Angabe von Sperren Tabellen auch in derselben Reihenfolge sperren, bevor Sie DML-Operationen ausführen. 

## Potenzielle Deadlock-Situation für gleichzeitige Schreibtransaktionen, an denen eine einzelne Tabelle beteiligt ist
<a name="c_write_readwrite-potential-deadlock-single"></a>

In einer Umgebung mit Snapshot-Isolierung können Deadlocks auftreten, wenn gleichzeitige Schreibtransaktionen für dieselbe Tabelle ausgeführt werden. Der Snapshot-Isolation-Deadlock tritt auf, wenn gleichzeitige INSERT- oder COPY-Anweisungen eine Sperre gemeinsam anwenden und fortgesetzt werden und eine weitere Anweisung eine Operation (UPDATE, DELETE, MERGE oder DDL) ausführen muss, die eine exklusive Sperre für dieselbe Tabelle erfordert. 

Betrachten Sie das folgenden Szenario:

Transaktion 1 (T1):

```
INSERT/COPY INTO table_A;
```

Transaktion 2 (T2):

```
INSERT/COPY INTO table_A; 
            <UPDATE/DELETE/MERGE/DDL statement> table_A
```

Ein Deadlock kann auftreten, wenn mehrere Transaktionen mit INSERT- oder COPY-Operationen gleichzeitig für dieselbe Tabelle mit einer gemeinsamen Sperre ausgeführt werden und eine dieser Transaktionen nach der reinen Schreiboperation eine Operation ausführt, die eine exklusive Sperre erfordert, z. B. eine UPDATE-, MERGE-, DELETE- oder DDL-Anweisung.

Um den Deadlock in diesen Situationen zu vermeiden, können Sie Anweisungen trennen, die eine exklusive Sperre erfordern (UPDATE/MERGE/DELETE/DDL statements) to a different transaction so that any INSERT/COPY statements can progress simultaneously, and the statements requiring exclusive locks can execute after them. Alternatively, for transactions with INSERT/COPY statements and MERGE/UPDATE/MERGEAnweisungen in derselben Tabelle), Sie können Wiederholungslogik in Ihre Anwendungen integrieren, um potenzielle Deadlocks zu umgehen. 

# Beispiele für gleichzeitige Schreibvorgänge
<a name="r_Serializable_isolation_example"></a>

In den folgenden Pseudocode-Beispielen wird gezeigt, wie Transaktionen entweder fortgesetzt werden oder warten, wenn sie gleichzeitig ausgeführt werden.

## Beispiele für gleichzeitige Schreiboperationen
<a name="r_Serializable_isolation_example-serializable"></a>

### Gleichzeitige COPY-Operationen für dieselbe Tabelle mit serialisierbarer Isolierung
<a name="r_Serializable_isolation_example-concurrent-copy-operations-into-the-same-table"></a>

Transaktion 1 kopiert Zeilen in die Tabelle LISTING: 

```
begin;
copy listing from ...;
end;
```

Transaktion 2 wird gleichzeitig in einer getrennten Sitzung gestartet und versucht, mehr Zeilen in die Tabelle LISTING zu kopieren. Transaktion 2 muss warten, bis Transaktion 1 die Schreibsperre für die Tabelle LISTING aufhebt. Anschließend kann sie fortgesetzt werden. 

```
begin;
[waits]
copy listing from ;
end;
```

Dasselbe Verhalten würde auftreten, wenn eine oder beide Transaktionen anstelle eines COPY-Befehls einen INSERT-Befehl enthalten.

### Gleichzeitige DELETE-Operationen aus derselben Tabelle mit serialisierbarer Isolierung
<a name="r_Serializable_isolation_example-concurrent-delete-operations-from-the-same-table"></a>

Transaktion 1 löscht Zeilen aus einer Tabelle: 

```
begin;
delete from listing where ...;
end;
```

Transaktion 2 wird gleichzeitig gestartet und versucht, in derselben Tabelle Zeilen zu löschen. Die Transaktion ist erfolgreich, da sie auf den Abschluss von Transaktion 1 wartet, bevor sie versucht, Zeilen zu löschen.

```
begin
[waits]
delete from listing where ;
end;
```

Dasselbe Verhalten würde auftreten, wenn eine oder beide Transaktionen anstelle eines DELETE-Befehls einen UPDATE-Befehl für dieselbe Tabelle enthalten.

### Gleichzeitige Transaktionen mit einer Mischung aus Lese- und Schreiboperationen mit serialisierbarer Isolierung
<a name="r_Serializable_isolation_example-concurrent-transactions"></a>

In diesem Beispiel löscht Transaktion 1 Zeilen aus der Tabelle USERS, lädt die Tabelle neu und führt eine COUNT(\$1)-Abfrage und anschließend ANALYZE aus, bevor sie einen Commit ausführt: 

```
begin;
delete one row from USERS table;
copy ;
select count(*) from users;
analyze ;
end;
```

In der Zwischenzeit wird Transaktion 2 gestartet. Diese Transaktion versucht, zusätzliche Zeilen in die Tabelle USERS zu kopieren, die Tabelle zu analysieren und anschließend dieselbe COUNT(\$1)-Abfrage wie die erste Transaktion auszuführen:

```
begin;
[waits]
copy users from ...;
select count(*) from users;
analyze;
end;
```

Die zweite Transaktion ist erfolgreich, da sie auf den Abschluss der ersten Transaktion warten muss. Die COUNT-Abfrage gibt die Zahl basierend auf dem abgeschlossenen Ladevorgang zurück.

## Beispiele für gleichzeitige Schreiboperationen mit Snapshot-Isolierung
<a name="r_Serializable_isolation_example-snapshot"></a>

### Gleichzeitige COPY-Operationen für dieselbe Tabelle mit Snapshot-Isolierung
<a name="r_Serializable_isolation_example-concurrent-copy-operations-into-the-same-table-snapshot"></a>

Transaktion 1 kopiert Zeilen in die Tabelle LISTING:

```
begin;
copy listing from ...;
end;
```

Transaktion 2 wird gleichzeitig in einer getrennten Sitzung gestartet und versucht, mehr Zeilen in die Tabelle LISTING zu kopieren. Transaktion 2 kann gleichzeitig ausgeführt werden, bis eine der Transaktionen Daten in die Zieltabelle `listing` schreiben muss. Danach werden sie sequenziell ausgeführt. 

```
begin; 
//When the COPY statement from T1 needs to write data to the table, the COPY statement from T2 waits.
copy listing from ...; 
end;
```

Dasselbe Verhalten würde auftreten, wenn eine oder beide Transaktionen anstelle eines COPY-Befehls einen INSERT-Befehl enthalten.

### Gleichzeitige DELETE-Operationen für dieselbe Tabelle mit Snapshot-Isolierung
<a name="r_Serializable_isolation_example-concurrent-delete-operations-from-the-same-table-snapshot"></a>

Gleichzeitige DELETE- oder UPDATE-Operationen aus derselben Tabelle mit Snapshot-Isolierung werden wie Operationen mit serialisierbarer Isolierung ausgeführt.

### Gleichzeitige Transaktionen mit einer Mischung aus Lese- und Schreiboperationen mit Snapshot-Isolierung
<a name="r_Serializable_isolation_example-concurrent-transactions-snapshot"></a>

Gleichzeitige Transaktionen, die mit gemischten Operationen mit Snapshot-Isolierung ausgeführt werden, werden wie Transaktionen mit gemischten Operationen ausgeführt, die mit serialisierbarer Isolierung ausgeführt werden.

# Beheben von Fehlern für die serialisierbare Isolierung
<a name="c_serial_isolation-serializable-isolation-troubleshooting"></a>

## FEHLER: 1023 DETAIL: Serialisierbare Isolationsverletzung für eine Tabelle in Redshift
<a name="c_serial_isolation-serialization-isolation-1023"></a>

Wenn Amazon Redshift einen Fehler für die serialisierbare Isolierung erkennt, wird Ihnen eine Fehlermeldung ähnlich der folgenden Fehlermeldung angezeigt.

```
ERROR:1023 DETAIL: Serializable isolation violation on table in Redshift
```

Um einen Fehler für die serialisierbare Isolierung zu beheben, können Sie die folgenden Methoden anwenden:
+ Wiederholen der abgebrochenen Transaktion.

   Amazon Redshift hat festgestellt, dass ein gleichzeitiger Workload nicht serialisierbar ist. Dies weist auf Lücken in der Anwendungslogik hin, die normalerweise bearbeitet werden können, indem die Transaktion erneut versucht wird, bei der der Fehler aufgetreten ist. Wenn das Problem weiterhin besteht, wenden Sie eine der anderen Methoden an. 
+ Verschieben Sie alle Operationen, die sich nicht in derselben atomaren Transaktion befinden müssen, aus der Transaktion.

  Diese Methode kann angewendet werden, wenn sich einzelne Operationen innerhalb von zwei Transaktion gegenseitig so referenzieren, dass das Ergebnis der jeweils anderen Transaktion beeinflusst werden kann. Die folgenden beiden Sitzungen starten beispielsweise jeweils eine Transaktion. 

  ```
  Session1_Redshift=# begin;
  ```

  ```
  Session2_Redshift=# begin;
  ```

  Das Ergebnis einer SELECT-Anweisung in einer der beiden Transaktionen könnte durch eine INSERT-Anweisung in der jeweils anderen Transaktion beeinflusst werden. Angenommen, Sie führen die folgenden Anweisungen seriell in beliebiger Reihenfolge aus. In jedem Fall besteht das Ergebnis darin, dass eine der SELECT-Anweisungen eine Zeile mehr zurückgibt, als dies bei einer gleichzeitigen Ausführung der Transaktionen der Fall wäre. Es gibt keine Reihenfolge, in der die Operationen seriell ausgeführt werden können und zum gleichen Ergebnis wie bei einer gleichzeitigen Ausführung führen. Daher führt die zuletzt ausgeführte Operation zu einem Fehler für die serialisierbare Isolierung.

  ```
  Session1_Redshift=# select * from tab1;
  Session1_Redshift=# insert into tab2 values (1);
  ```

  ```
  Session2_Redshift=# insert into tab1 values (1);
  Session2_Redshift=# select * from tab2;
  ```

  In vielen Fällen ist das Ergebnis der SELECT-Anweisungen nicht wichtig. Mitanderen Worten: Die Atomizität der Operationen in den Transaktionen ist nicht wichtig. In diesen Fällen verschieben Sie die SELECT-Anweisungen aus den Transaktionen wie in den folgenden Beispielen gezeigt.

  ```
  Session1_Redshift=# begin;
  Session1_Redshift=# insert into tab1 values (1)
  Session1_Redshift=# end;
  Session1_Redshift=# select * from tab2;
  ```

  ```
  Session2_Redshift # select * from tab1;
  Session2_Redshift=# begin;
  Session2_Redshift=# insert into tab2 values (1)
  Session2_Redshift=# end;
  ```

  In diesen Beispielen gibt es keine Querbezüge in den Transaktionen. Die beiden INSERT-Anweisungen beeinflussen sich nicht gegenseitig. In diesen Beispielen gibt es mindestens eine Reihenfolge, in der die Transaktionen seriell ausgeführt werden können und zum gleichen Ergebnis wie bei einer gleichzeitigen Ausführung führen. Das bedeutet, dass die Transaktionen serialisierbar sind.
+ Sie können die Serialisierung erzwingen, indem Sie alle Tabellen in jeder Sitzung sperren.

  Der Befehl [LOCK](r_LOCK.md) blockiert Operationen, die zu Fehlern für die serialisierbare Isolierung führen können. Wenn Sie den Befehl LOCK verwenden, müssen Sie Folgendes ausführen:
  + Sperren Sie alle Tabellen, die von der Transaktion betroffen sind, einschließlich Tabellen, die von schreibgeschützten SELECT-Anweisungen innerhalb der Transaktion betroffen sind.
  + Sperren Sie die Tabellen in derselben Reihenfolge, unabhängig von der Reihenfolge, in der die Operationen ausgeführt werden.
  + Sperren Sie alle Tabellen zu Beginn der Transaktion, bevor Operationen ausgeführt werden.
+ Verwenden Sie die Snapshot-Isolation für gleichzeitige Transaktionen

  Verwenden Sie einen ALTER DATABASE-Befehl mit Snapshot-Isolation. Weitere Informationen zum SNAPSHOT-Parameter für ALTER DATABASE finden Sie unter [Parameters](r_ALTER_DATABASE.md#r_ALTER_DATABASE-parameters).

## FEHLER: 1018 DETAIL: Beziehung existiert nicht
<a name="c_serial_isolation-serialization-isolation-1018"></a>

Wenn Sie Amazon-Redshift-Vorgänge in verschiedenen Sitzungen ausführen, wird Ihnen eine Fehlermeldung ähnlich der folgenden Fehlermeldung angezeigt.

```
ERROR: 1018 DETAIL: Relation does not exist.
```

Transaktionen in Amazon Redshift folgen der Snapshot-Isolation. Nachdem eine Transaktion gestartet wurde, erstellt Amazon Redshift einen Snapshot der Datenbank. Während des gesamten Lebenszyklus der Transaktion arbeitet die Transaktion mit dem Status der Datenbank, wie sie im Snapshot wiedergegeben wird. Wenn die Transaktion aus einer Tabelle liest, die nicht im Snapshot vorhanden ist, wird die zuvor angezeigte Fehlermeldung 1018 ausgelöst. Selbst wenn eine andere gleichzeitige Transaktion eine Tabelle erstellt, nachdem die Transaktion den Snapshot erstellt hat, kann die Transaktion nicht aus der neu erstellten Tabelle lesen.

Um diesen Serialisierungsisolationsfehler zu beheben, können Sie versuchen, den Start der Transaktion an einen Punkt zu verschieben, an dem Sie wissen, dass die Tabelle existiert.

Wenn die Tabelle von einer anderen Transaktion erstellt wird, liegt dieser Punkt nach dem Commit dieser Transaktion. Stellen Sie außerdem sicher, dass gleichzeitig für keine Transaktion ein Commit durchgeführt wurde, das die Tabelle möglicherweise gelöscht hat.

```
session1 = # BEGIN;
session1 = # DROP TABLE A;
session1 = # COMMIT;
```

```
session2 = # BEGIN;
```

```
session3 = # BEGIN;
session3 = # CREATE TABLE A (id INT);
session3 = # COMMIT;
```

```
session2 = # SELECT * FROM A;
```

Daher führt die zuletzt von session2 als Lesevorgang ausgeführte Operation zu einem serialisierbaren Isolierungsfehler. Dieser Fehler tritt auf, wenn session2 einen Snapshot erstellt und die Tabelle bereits von einer festgeschriebenen session1 gelöscht wurde. Mit anderen Worten, obwohl eine gleichzeitige session3 die Tabelle erstellt hat, sieht session2 die Tabelle nicht, da sie sich nicht im Snapshot befindet.

Um diesen Fehler zu beheben, können Sie die Sitzungen wie folgt neu anordnen.

```
session1 = # BEGIN;
session1 = # DROP TABLE A;
session1 = # COMMIT;
```

```
session3 = # BEGIN;
session3 = # CREATE TABLE A (id INT);
session3 = # COMMIT;
```

```
session2 = # BEGIN;
session2 = # SELECT * FROM A;
```

Wenn nun session2 seinen Snapshot erstellt, wurde für session3 bereits ein Commit ausgeführt, und die Tabelle befindet sich in der Datenbank. Session2 kann fehlerfrei aus der Tabelle lesen.

# Tutorial: So laden Sie Daten aus Amazon S3
<a name="tutorial-loading-data"></a>

In diesem Tutorial durchlaufen Sie den kompletten Prozess des Ladens von Daten in Ihre Amazon-Redshift-Datenbanktabellen aus Datendateien in einem Amazon-S3-Bucket. 

In diesem Tutorial führen Sie folgende Aufgaben aus: 
+ Laden Sie Datendateien als kommagetrennte Werte (CSV), als durch bestimmte Zeichen getrennte Werte und Formate mit fester Breite herunter. 
+ Erstellen eines Amazon-S3-Buckets und Upload der Datendateien zu diesem Bucket. 
+ Starten eines Amazon-Redshift-Clusters und Erstellen von Datenbanktabellen. 
+ Verwenden von COPY-Befehlen zum Laden der Tabellen aus den Datendateien auf Amazon S3. 
+ Beheben von Ladefehlern und Modifizieren Ihrer COPY-Befehle zur Behebung der Fehler.

## Voraussetzungen
<a name="tutorial-loading-data-prerequisites"></a>

Sie benötigen die folgenden Voraussetzungen:
+ Ein AWS Konto zum Starten eines Amazon Redshift Redshift-Clusters und zum Erstellen eines Buckets in Amazon S3.
+ Ihre AWS Anmeldeinformationen (IAM-Rolle) zum Laden von Testdaten aus Amazon S3. Wenn Sie eine neue IAM-Rolle benötigen, wechseln Sie zu [Erstellen von IAM-Rollen](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html).
+ Ein SQL-Client, z. B. der Konsolenabfrage-Editor von Amazon Redshift. 

Dieses Tutorial kann unabhängig von anderen absolviert werden. Zusätzlich zu diesem Tutorial empfehlen wir die folgenden Tutorials, um ein umfassenderes Verständnis vom Entwurf und von der Verwendung von Amazon-Redshift-Datenbanken zu erhalten: 
+ Das Handbuch [Erste Schritte mit Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/) begleitet Sie beim Erstellen eines Amazon-Redshift-Clusters und dem Laden von Beispieldaten. 

## -Übersicht
<a name="tutorial-loading-data-overview"></a>

Sie können zum Hinzufügen von Daten zu Ihren Amazon-Redshift-Tabellen einen INSERT-Befehl oder einen COPY-Befehl verwenden. Der COPY-Befehl bietet den Umfang und die Geschwindigkeit eines Data Warehouse von Amazon Redshift und ist damit um ein Vielfaches schneller und effizienter als INSERT-Befehle. 

Der COPY-Befehl nutzt die massive Parallelverarbeitungsarchitektur (Massively Parallel Processing, MPP) von Amazon Redshift, um Daten parallel aus mehreren Datenquellen zu lesen und zu laden. Sie können aus Datendateien in Amazon S3, Amazon EMR oder auf jedem Remote-Host laden, der über eine Secure Shell (SSH)-Verbindung erreichbar ist. Oder Sie können direkt aus einer Amazon-DynamoDB-Tabelle laden. 

In diesem Tutorial verwenden Sie den Befehl COPY, um Daten aus Amazon S3 zu laden. Viele der hier vorgestellten Prinzipien gelten auch für das Laden aus anderen Datenquellen. 

Weitere Informationen zur Verwendung des COPY-Befehls finden Sie in diesen Ressourcen: 
+ [Bewährte Methoden für Amazon Redshift zum Laden von Daten](c_loading-data-best-practices.md)
+ [So laden Sie Daten aus Amazon EMR:](loading-data-from-emr.md)
+ [Laden von Daten aus Remote-Hosts](loading-data-from-remote-hosts.md)
+ [Laden von Daten aus einer Amazon-DynamoDB-Tabelle](t_Loading-data-from-dynamodb.md)

## Schritt 1: Erstellen eines Clusters
<a name="tutorial-loading-data-launch-cluster"></a>

Wenn Sie bereits einen Cluster haben, den Sie verwenden möchten, können Sie diesen Schritt überspringen. 

Verwenden Sie für die Übungen in diesem Tutorial einen Vierknoten-Cluster. 

**So erstellen Sie einen Cluster**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die Amazon Redshift Redshift-Konsole unter [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/).

   Wählen Sie über das Navigationsmenü **Dashboard für bereitgestellte Cluster** aus.
**Wichtig**  
Stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen verfügen, um die Cluster-Operationen durchzuführen. Informationen zur Gewährung der erforderlichen Berechtigungen finden Sie unter [Autorisieren von Amazon Redshift für den Zugriff auf AWS Dienste](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html).

1. Wählen Sie oben rechts die AWS Region aus, in der Sie den Cluster erstellen möchten. Wählen Sie für die Zwecke dieses Tutorials **USA West (Oregon)** aus.

1. Wählen Sie im Navigationsmenü **Clusters** (Cluster) und dann **Create cluster** (Cluster erstellen) aus. Die Seite **Create Cluster (Cluster erstellen)** wird angezeigt. 

1. Auf der Seite **Cluster erstellen** geben Sie die Parameter für Ihren Cluster ein. Wählen Sie Ihre eigenen Werte für die Parameter aus, außer die folgenden Werte zu ändern:
   + Wählen Sie **dc2.large** als Knotentyp.
   + Klicken Sie für die **Anzahl der Knoten** auf **4**.
   + Wählen Sie im Abschnitt **Cluster permissions (Clusterberechtigungen)** eine IAM-Rolle aus **Available IAM roles (Verfügbare IAM-Rollen)** aus. Diese Rolle sollte eine sein, die Sie zuvor erstellt haben und die Zugriff auf Amazon S3 hat. Wählen Sie dann **Associate IAM role** (IAM-Rolle zuordnen) aus, um sie der Liste der **Associated IAM roles** (Zugeordneten IAM-Rollen) für den Cluster hinzuzufügen.

1. Wählen Sie **Create cluster** (Cluster erstellen). 

Befolgen Sie die Schritte im Handbuch [Erste Schritte mit Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/) zur Verbindung zu Ihrem Cluster von einem SQL-Client aus sowie zum Testen einer Verbindung. Sie müssen die verbleibenden Schritte aus "Erste Schritte" nicht durchführen, um Tabellen zu erstellen, Daten hochzuladen und Beispielabfragen auszuprobieren. 

## Schritt 2: Herunterladen der Datendateien
<a name="tutorial-loading-data-download-files"></a>

In diesem Schritt laden Sie einen Satz Beispieldatendateien auf Ihren Computer herunter. Im nächsten Schritt laden Sie die Dateien in einen Amazon S3 Bucket hoch.

**So laden Sie die Datendateien herunter:**

1. Laden Sie die komprimierte Datei herunter: [LoadingDataSampleFiles.zip.](samples/LoadingDataSampleFiles.zip) 

1. Extrahieren Sie die Dateien in einen Ordner auf Ihrem Computer.

1. Prüfen Sie, ob Ihr Ordner die folgenden Dateien enthält. 

   ```
   customer-fw-manifest
   customer-fw.tbl-000
   customer-fw.tbl-000.bak
   customer-fw.tbl-001
   customer-fw.tbl-002
   customer-fw.tbl-003
   customer-fw.tbl-004
   customer-fw.tbl-005
   customer-fw.tbl-006
   customer-fw.tbl-007
   customer-fw.tbl.log
   dwdate-tab.tbl-000
   dwdate-tab.tbl-001
   dwdate-tab.tbl-002
   dwdate-tab.tbl-003
   dwdate-tab.tbl-004
   dwdate-tab.tbl-005
   dwdate-tab.tbl-006
   dwdate-tab.tbl-007
   part-csv.tbl-000
   part-csv.tbl-001
   part-csv.tbl-002
   part-csv.tbl-003
   part-csv.tbl-004
   part-csv.tbl-005
   part-csv.tbl-006
   part-csv.tbl-007
   ```

## Schritt 3: Hochladen der Datei in einen Amazon S3 Bucket
<a name="tutorial-loading-data-upload-files"></a>

In diesem Schritt erstellen Sie einen Amazon S3 Bucket und laden die Datendateien in diesen Bucket.

### 
<a name="tutorial-loading-data-to-upload-files"></a>

**Hochladen der Dateien in einen Amazon S3 Bucket**

1. Erstellen eines Buckets in Amazon S3.

   Weitere Informationen zum Erstellen eines Buckets finden Sie unter [Erstellen von Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) im *Benutzerhandbuch für Amazon Simple Storage Service*.

   1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die Amazon S3 S3-Konsole unter [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

   1. Wählen Sie **Create Bucket** (Bucket erstellen) aus.

   1. Wählen Sie eine AWS-Region. 

      Erstellen Sie den Bucket in derselben Region, in der sich auch Ihr Cluster befindet. Wenn sich Ihr Cluster in der Region USA West (Oregon) befindet, wählen Sie **USA West (Oregon) Region (us-west-2)** aus.

   1. Geben Sie im Feld **Bucket-Name** des Dialogfelds **Bucket erstellen** einen Bucket-Namen ein. 

      Der von Ihnen gewählte Bucket-Name muss unter allen in Amazon S3 vorhandenen Bucket-Namen eindeutig sein. Eine Möglichkeit, für Eindeutigkeit zu sorgen, besteht darin, vor den Namen von Buckets den Namen Ihres Unternehmens zu setzen. Bucket-Namen müssen bestimmten Regeln folgen. Weitere Informationen finden Sie unter [Bucket-Einschränkungen und -Limits](https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html) im *Benutzerhandbuch zu Amazon Simple Storage Service.* 

   1. Wählen Sie die empfohlenen Standardwerte für die restlichen Optionen.

   1. Wählen Sie **Create Bucket** (Bucket erstellen) aus. 

      Wenn Amazon S3 Ihren Bucket erfolgreich erstellt hat, wird der leere Bucket in der Konsole im Feld **Buckets** angezeigt. 

1. Erstellen Sie einen Ordner.

   1. Wählen Sie den Namen des neuen Buckets.

   1. Wählen Sie die Schaltfläche **Ordner erstellen** aus.

   1. Geben Sie als Namen für den neuen Ordner ein **load**.
**Anmerkung**  
Der von Ihnen erstellte Bucket befindet sich nicht in einer Sandbox. In dieser Übung fügen Sie Objekte zu einem echten Bucket hinzu. Für die Zeit, in der Sie die Objekte im Bucket speichern, wird Ihnen ein Nominalbetrag berechnet. Weitere Informationen zu Amazon-S3-Preisen finden Sie unter [Amazon-S3-Preise](https://aws.amazon.com/s3/pricing/).

1. Laden Sie die Datendateien in den neuen Amazon S3 Bucket.

   1. Wählen Sie auf den Namen des Datenordners aus.

   1. Wählen Sie im Assistenten für das Hochladen die Option **Dateien hinzufügen**.

      Befolgen Sie die Amazon-S3-Konsolenanweisungen, um alle heruntergeladenen und extrahierten Dateien hochzuladen.

   1. Klicken Sie auf **Upload**.
<a name="tutorial-loading-user-credentials"></a>
**Benutzeranmeldeinformationen**  
Der COPY-Befehl in Amazon Redshift muss einen Lesezugriff auf Dateiobjekte im Amazon-S3-Bucket besitzen. Wenn Sie dieselben Benutzer-Anmeldeinformationen verwenden, um den Amazon-S3-Bucket zu erstellen und den Amazon-Redshift-Befehl COPY auszuführen, verfügt der Befehl COPY über alle erforderlichen Berechtigungen. Wenn Sie andere Benutzeranmeldeinformationen verwenden möchten, können Sie den Zugriff über die Amazon-S3-Zugriffssteuerungselemente gewähren. Der Amazon Redshift COPY-Befehl erfordert mindestens ListBucket und GetObject Berechtigungen für den Zugriff auf die Dateiobjekte im Amazon S3 S3-Bucket. Weitere Informationen über Zugriffsrichtlinien für Amazon-S3-Ressourcen finden Sie unter [Managing access permissions to your Amazon S3 resources](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html) (Verwaltung der Zugriffsberechtigungen zu Ihren Amazon-S3-Ressourcen).

## Schritt 4: Erstellen der Beispieltabellen
<a name="tutorial-loading-data-create-tables"></a>

Für dieses Tutorial verwenden Sie einen Satz von Tabellen, die auf dem Schema „Star Schema Benchmark (SSB)“ basieren. Das folgende Diagramm zeigt das SSB-Datenmodell. 

![\[Die fünf Tabellen des SSB-Schemas und ihre gegenseitigen Beziehungen.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/tutorial-optimize-tables-ssb-data-model.png)


Die SSB-Tabellen sind möglicherweise bereits in der aktuellen Datenbank vorhanden. Wenn ja, führen Sie einen Drop für die Tabellen aus, um sie aus der Datenbank zu entfernen, bevor Sie sie im nächsten Schritt mit den Befehlen CREATE TABLE erstellen. Die in diesem Tutorial verwendeten Tabellen haben möglicherweise andere Attribute als die vorhandenen Tabellen.

**So erstellen Sie die Beispieltabellen:**

1. Um die SSB-Tabellen zu löschen, führen Sie die folgenden Befehle in Ihrem SQL-Client aus.

   ```
   drop table part cascade;
   drop table supplier;
   drop table customer;
   drop table dwdate;
   drop table lineorder;
   ```

1. Führen Sie die folgenden CREATE TABLE-Befehle in Ihrem SQL-Client aus. 

   ```
   CREATE TABLE part 
   (
     p_partkey     INTEGER NOT NULL,
     p_name        VARCHAR(22) NOT NULL,
     p_mfgr        VARCHAR(6),
     p_category    VARCHAR(7) NOT NULL,
     p_brand1      VARCHAR(9) NOT NULL,
     p_color       VARCHAR(11) NOT NULL,
     p_type        VARCHAR(25) NOT NULL,
     p_size        INTEGER NOT NULL,
     p_container   VARCHAR(10) NOT NULL
   );
   
   CREATE TABLE supplier 
   (
     s_suppkey   INTEGER NOT NULL,
     s_name      VARCHAR(25) NOT NULL,
     s_address   VARCHAR(25) NOT NULL,
     s_city      VARCHAR(10) NOT NULL,
     s_nation    VARCHAR(15) NOT NULL,
     s_region    VARCHAR(12) NOT NULL,
     s_phone     VARCHAR(15) NOT NULL
   );
   
   CREATE TABLE customer 
   (
     c_custkey      INTEGER NOT NULL,
     c_name         VARCHAR(25) NOT NULL,
     c_address      VARCHAR(25) NOT NULL,
     c_city         VARCHAR(10) NOT NULL,
     c_nation       VARCHAR(15) NOT NULL,
     c_region       VARCHAR(12) NOT NULL,
     c_phone        VARCHAR(15) NOT NULL,
     c_mktsegment   VARCHAR(10) NOT NULL
   );
   
   CREATE TABLE dwdate 
   (
     d_datekey            INTEGER NOT NULL,
     d_date               VARCHAR(19) NOT NULL,
     d_dayofweek          VARCHAR(10) NOT NULL,
     d_month              VARCHAR(10) NOT NULL,
     d_year               INTEGER NOT NULL,
     d_yearmonthnum       INTEGER NOT NULL,
     d_yearmonth          VARCHAR(8) NOT NULL,
     d_daynuminweek       INTEGER NOT NULL,
     d_daynuminmonth      INTEGER NOT NULL,
     d_daynuminyear       INTEGER NOT NULL,
     d_monthnuminyear     INTEGER NOT NULL,
     d_weeknuminyear      INTEGER NOT NULL,
     d_sellingseason      VARCHAR(13) NOT NULL,
     d_lastdayinweekfl    VARCHAR(1) NOT NULL,
     d_lastdayinmonthfl   VARCHAR(1) NOT NULL,
     d_holidayfl          VARCHAR(1) NOT NULL,
     d_weekdayfl          VARCHAR(1) NOT NULL
   );
   CREATE TABLE lineorder 
   (
     lo_orderkey          INTEGER NOT NULL,
     lo_linenumber        INTEGER NOT NULL,
     lo_custkey           INTEGER NOT NULL,
     lo_partkey           INTEGER NOT NULL,
     lo_suppkey           INTEGER NOT NULL,
     lo_orderdate         INTEGER NOT NULL,
     lo_orderpriority     VARCHAR(15) NOT NULL,
     lo_shippriority      VARCHAR(1) NOT NULL,
     lo_quantity          INTEGER NOT NULL,
     lo_extendedprice     INTEGER NOT NULL,
     lo_ordertotalprice   INTEGER NOT NULL,
     lo_discount          INTEGER NOT NULL,
     lo_revenue           INTEGER NOT NULL,
     lo_supplycost        INTEGER NOT NULL,
     lo_tax               INTEGER NOT NULL,
     lo_commitdate        INTEGER NOT NULL,
     lo_shipmode          VARCHAR(10) NOT NULL
   );
   ```

## Schritt 5: Ausführen der COPY-Befehle
<a name="tutorial-loading-run-copy"></a>

Sie führen COPY-Befehle aus, um jede der Tabellen im SSB-Schema zu laden. Die Beispiele für COPY-Befehle demonstrieren das Laden aus unterschiedlichen Dateiformaten unter Verwendung verschiedener COPY-Befehlsoptionen sowie die Behebung von Ladefehlern.

### COPY-Befehlssyntax
<a name="tutorial-loading-data-copy-syntax"></a>

Die grundlegende [COPY](r_COPY.md)-Befehlssyntax ist wie folgt. 

```
COPY table_name [ column_list ] FROM data_source CREDENTIALS access_credentials [options] 
```

Zur Ausführung eines COPY-Befehls geben Sie die folgenden Werte an. 
<a name="tutorial-loading-syntax-table-name"></a>
**Tabellenname**  
Die Zieltabelle für den COPY-Befehl. Die Tabelle muss in der Datenbank bereits vorhanden sein. Die Tabelle kann temporär oder persistent sein. Der COPY-Befehl fügt die neuen Eingabedaten den vorhandenen Zeilen in der Tabelle an. 
<a name="tutorial-loading-syntax-column-list"></a>
**Spaltenliste**  
Standardmäßig lädt COPY Felder aus den Quelldaten in ihrer Reihenfolge in die Tabellenspalten. Sie können optional eine *Spaltenliste* angeben, d. h. eine durch Kommas getrennte Liste von Spaltennamen, um Datenfelder bestimmten Spalten zuzuordnen. In diesem Tutorial verwenden Sie keine Spaltenlisten. Weitere Informationen finden Sie unter [Column List](copy-parameters-column-mapping.md#copy-column-list) in der Referenz zum COPY-Befehl.

<a name="tutorial-loading-syntax-data-source.title"></a>Datenquelle

Sie können den COPY-Befehl verwenden, um Daten aus einem Amazon-S3-Bucket, aus einem Amazon-EMR-Cluster, über eine SSH-Verbindung aus einem Remote-Host oder aus einer Amazon-DynamoDB-Tabelle zu laden. Für dieses Tutorial laden Sie Datendateien in einen Amazon-S3-Bucket. Beim Laden von Amazon S3 müssen Sie den Namen des Buckets und den Speicherort der Datendateien angeben. Dazu geben Sie entweder einen Objektpfad für die Datendateien oder den Speicherort einer Manifestdatei an, die jede Datendatei und ihren Speicherort explizit auflistet. 
+ Schlüsselpräfix 

  Ein in Amazon S3 gespeichertes Objekt wird durch einen Objektschlüssel eindeutig definiert, der den Bucketnamen, eventuelle Ordnernamen sowie den Objektnamen enthält. Ein *Schlüsselpräfix *bezieht sich auf eine Reihe von Objekten, die das gleiche Präfix haben. Der Objektpfad ist ein Schlüsselpräfix, das der COPY-Befehl verwendet, um alle Objekte mit dem gleichen Schlüsselpräfix zu laden. Beispielsweise kann sich das Schlüsselpräfix `custdata.txt` auf eine einzelne Datei oder auf einen Satz von Dateien einschließlich `custdata.txt.001`, `custdata.txt.002` und so weiter beziehen. 
+ Manifestdatei

  In einigen Fällen müssen Sie möglicherweise Dateien mit unterschiedlichen Präfixen laden, z. B. aus mehreren Buckets oder Ordnern. In anderen Fällen müssen Sie möglicherweise Dateien ausschließen, die ein Präfix verwenden. In diesen Fällen können Sie eine Manifestdatei verwenden. Eine *Manifestdatei* führt alle Ladedateien und ihre eindeutigen Objektschlüssel explizit auf. Sie verwenden eine Manifestdatei, um die PART-Tabelle später in diesem Tutorial zu laden. 
<a name="tutorial-loading-syntax-credentials"></a>
**Anmeldeinformationen**  
Um auf die AWS Ressourcen zuzugreifen, die die zu ladenden Daten enthalten, müssen Sie die AWS Zugangsdaten für einen Benutzer mit ausreichenden Rechten angeben. Diese Anmeldeinformationen enthalten einen Amazon-Ressourcennamen (ARN) für die IAM-Rolle. Um Daten aus Amazon S3 zu laden, müssen die Anmeldeinformationen ListBucket und GetObject Berechtigungen enthalten. Weitere Anmeldeinformationen sind erforderlich, wenn Ihre Daten verschlüsselt sind. Weitere Informationen finden Sie unter [Autorisierungsparameter](copy-parameters-authorization.md) in der Referenz zum COPY-Befehl. Weitere Informationen zur Verwaltung des Zugriffs finden Sie unter [Managing access permissions to your Amazon S3 resources](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html) (Verwaltung von Zugriffsberechtigungen für Ihre Amazon-S3-Ressourcen). 

<a name="tutorial-loading-syntax-options.title"></a>Optionen

Sie können mit dem COPY-Befehl eine Reihe von Parametern angeben, um Dateiformate anzugeben, Datenformate zu verwalten, mit Fehlern umzugehen und andere Features zu steuern. In diesem Tutorial verwenden Sie die folgenden COPY-Befehlsoptionen und -Funktionen: 
+ Schlüsselpräfix

  Informationen zum Laden von mehreren Dateien durch Angabe eines Schlüsselpräfixes finden Sie unter [Laden der Tabelle PART mit NULL AS](#tutorial-loading-load-part).
+ CSV-Format

  Informationen zum Laden von Daten im CSV-Format finden Sie unter [Laden der Tabelle PART mit NULL AS](#tutorial-loading-load-part).
+ NULL AS

  Hinweise zum Laden von PART mit der Option NULL AS finden Sie unter [Laden der Tabelle PART mit NULL AS](#tutorial-loading-load-part).
+ Zeichengetrenntes Format

  Hinweise zur Verwendung der Option DELIMITER finden Sie unter [Die Optionen DELIMITER und REGION](#tutorial-loading-load-supplier).
+ REGION

  Informationen zur Verwendung der Option REGION finden Sie unter [Die Optionen DELIMITER und REGION](#tutorial-loading-load-supplier).
+ Breite des festen Formats

  Informationen zum Laden der Tabelle CUSTOMER aus Daten mit fester Breite finden Sie unter [Laden der Tabelle CUSTOMER mit MANIFEST](#tutorial-loading-load-customer).
+ MAXERROR

  Hinweise zur Verwendung der Option MAXERROR finden Sie unter [Laden der Tabelle CUSTOMER mit MANIFEST](#tutorial-loading-load-customer).
+ ACCEPTINVCHARS

  Hinweise zur Verwendung der Option ACCEPTINVCHARS finden Sie unter [Laden der Tabelle CUSTOMER mit MANIFEST](#tutorial-loading-load-customer).
+ MANIFEST

  Hinweise zur Verwendung der Option MANIFEST finden Sie unter [Laden der Tabelle CUSTOMER mit MANIFEST](#tutorial-loading-load-customer).
+ DATEFORMAT

  Hinweise zur Verwendung der Option DATEFORMAT finden Sie unter [Laden der Tabelle DWDATE mit DATEFORMAT](#tutorial-loading-load-dwdate).
+ GZIP, LZOP und BZIP2

  Informationen zum Komprimieren von Dateien finden Sie unter [Laden von mehreren Datendateien](#tutorial-loading-load-lineorder).
+ COMPUPDATE

  Hinweise zur Verwendung der Option COMPUPDATE finden Sie unter [Laden von mehreren Datendateien](#tutorial-loading-load-lineorder).
+ Mehrere Dateien

  Informationen zum Laden mehrerer Dateien finden Sie unter [Laden von mehreren Datendateien](#tutorial-loading-load-lineorder).

### Laden der SSB-Tabellen
<a name="tutorial-loading-run-copy-load-tables"></a>

Mit den folgenden COPY-Befehlen laden Sie jede der Tabellen im SSB-Schema. Der Befehl für jede Tabelle demonstriert unterschiedliche COPY-Optionen und Fehlerbehebungstechniken.

Gehen Sie zum Laden der SSB-Tabellen wie folgt vor: 

1. [Ersetzen Sie den Bucket-Namen und die Anmeldeinformationen AWS](#tutorial-loading-run-copy-replaceables)

1. [Laden der Tabelle PART mit NULL AS](#tutorial-loading-load-part)

1. [Laden der Tabelle CUSTOMER mit MANIFEST](#tutorial-loading-load-customer)

1. [Laden der Tabelle DWDATE mit DATEFORMAT](#tutorial-loading-load-dwdate)

#### Ersetzen Sie den Bucket-Namen und die Anmeldeinformationen AWS
<a name="tutorial-loading-run-copy-replaceables"></a>

Die COPY-befehle in diesem Tutorial werden im folgenden Format angegeben.

```
copy table from 's3://<your-bucket-name>/load/key_prefix' 
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
options;
```

Gehen Sie für jeden COPY-Befehl wie folgt vor:

1. *<your-bucket-name>*Ersetzen Sie ihn durch den Namen eines Buckets in derselben Region wie Ihr Cluster. 

   Für diesen Schritt wird davon ausgegangen, dass Bucket und Cluster sich in derselben Region befinden. Alternativ können Sie die Region mittels der Option [REGION](copy-parameters-data-source-s3.md#copy-region) mit dem Befehl COPY angeben. 

1. Ersetzen Sie *<aws-account-id>* und *<role-name>* durch Ihre eigene AWS-Konto und IAM-Rolle. Das Segment der Anmeldedatenzeichenfolge, das in einfachen Anführungszeichen eingeschlossen ist, darf keine Leerzeichen oder Zeilenumbrüche enthalten. Beachten Sie, dass sich das Format des ARNs geringfügig von dem im Beispiel verwendeten Format unterscheiden kann. Am besten kopieren Sie den ARN für die Rolle aus der IAM-Konsole, um sicherzustellen, dass er korrekt ist, wenn Sie die COPY-Befehle ausführen. 

#### Laden der Tabelle PART mit NULL AS
<a name="tutorial-loading-load-part"></a>

In diesem Schritt verwenden Sie die Optionen CSV und NULL AS, um die PART-Tabelle zu laden. 

Der COPY-Befehl kann Daten aus mehreren Dateien parallel laden, was viel schneller ist als das Laden aus einer einzelnen Datei. Zur Demonstration dieses Prinzips sind die Daten für jede Tabelle in diesem Tutorial in acht Dateien unterteilt, obwohl die Dateien sehr klein sind. In einem späteren Schritt vergleichen Sie den Zeitunterschied zwischen dem Laden aus einer einzelnen Datei und dem Laden aus mehreren Dateien. Weitere Informationen finden Sie unter [Laden von Datendateien](c_best-practices-use-multiple-files.md). 
<a name="tutorial-loading-key-prefix"></a>
**Schlüsselpräfix**  
Sie können aus mehreren Dateien durch die Angabe eines Schlüsselpräfixes den Dateiensatz oder durch die explizite Auflistung der Dateien in einer Manifestdatei laden. In diesem Schritt verwenden Sie ein Schlüsselpräfix. In einem späteren Schritt verwenden Sie eine Manifestdatei. Das Schlüsselpräfix `'s3://amzn-s3-demo-bucket/load/part-csv.tbl'` lädt den folgenden Satz der Dateien im Ordner `load`. 

```
part-csv.tbl-000
part-csv.tbl-001
part-csv.tbl-002
part-csv.tbl-003
part-csv.tbl-004
part-csv.tbl-005
part-csv.tbl-006
part-csv.tbl-007
```
<a name="tutorial-loading-csv-format"></a>
**CSV-Format**  
CSV (Comma Separated Values) ist ein für den Import und den Export von Spreadsheet-Daten häufig verwendetes Format. CSV ist flexibler als das Comma-Delimited Format, da es den Einschluss von Zeichenfolgen mit Anführungszeichen in Feldern erlaubt. Das Standard-Anführungszeichen für COPY aus dem CSV-Format ist das doppelte Anführungszeichen ("), Sie können aber mit der Option QUOTE AS ein anderes Zeichen angeben. Wenn Sie das Anführungszeichen innerhalb des Feldes verwenden, verwenden Sie ein weiteres Anführungszeichen als Escape-Zeichen.

Der folgende Auszug aus einer CSV-formatierten Datendatei für die PART-Tabelle zeigt Zeichenfolgen, die in doppelte Anführungszeichen () eingeschlossen sind. (`"LARGE ANODIZED BRASS"`). Er zeigt außerdem eine Zeichenfolge, die in zwei doppelte Anführungszeichen innerhalb einer Zeichenfolge mit Anführungszeichen eingeschlossen () ist. (`"MEDIUM ""BURNISHED"" TIN"`).

```
15,dark sky,MFGR#3,MFGR#47,MFGR#3438,indigo,"LARGE ANODIZED BRASS",45,LG CASE
22,floral beige,MFGR#4,MFGR#44,MFGR#4421,medium,"PROMO, POLISHED BRASS",19,LG DRUM
23,bisque slate,MFGR#4,MFGR#41,MFGR#4137,firebrick,"MEDIUM ""BURNISHED"" TIN",42,JUMBO JAR
```

Die Daten für die PART-Tabelle enthalten Zeichen, die dazu führen, dass COPY fehlschlägt. In dieser Übung finden Sie die Fehler und beheben sie. 

Um Daten im CSV-Format zu laden, fügen Sie Ihrem COPY-Befehl `csv` hinzu. Führen Sie den folgenden Befehl aus, um die PART-Tabelle zu laden. 

```
copy part from 's3://<your-bucket-name>/load/part-csv.tbl' 
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
csv;
```

Sie könnten eine Fehlermeldung ähnlich der folgenden erhalten.

```
An error occurred when executing the SQL command:
copy part from 's3://amzn-s3-demo-bucket/load/part-csv.tbl' 
credentials' ...

ERROR: Load into table 'part' failed.  Check 'stl_load_errors' system table for details. [SQL State=XX000] 

Execution time: 1.46s

1 statement(s) failed.
1 statement(s) failed.
```

Um mehr Informationen zu dem Fehler zu erhalten, fragen Sie die Tabelle STL\$1LOAD\$1ERRORS ab. Die folgende Abfrage verwendet die Funktion SUBSTRING zum Kürzen von Spalten zur besseren Lesbarkeit sowie LIMIT 10, um die Anzahl der ausgegebenen Zeilen zu reduzieren. Sie können die Werte in `substring(filename,22,25)` an die Länge Ihres Bucketnamens anpassen.

```
select query, substring(filename,22,25) as filename,line_number as line, 
substring(colname,0,12) as column, type, position as pos, substring(raw_line,0,30) as line_text,
substring(raw_field_value,0,15) as field_text, 
substring(err_reason,0,45) as reason
from stl_load_errors 
order by query desc
limit 10;
```

```
 query  |    filename      | line |  column   |    type    | pos |      
--------+-------------------------+-----------+------------+------------+-----+----
 333765 | part-csv.tbl-000 |    1 |           |            |   0 |

 line_text        | field_text |                    reason
------------------+------------+----------------------------------------------
 15,NUL next,     |            | Missing newline: Unexpected character 0x2c f
```
<a name="tutorial-loading-null-as"></a>
**NULL AS**  
Die `part-csv.tbl`-Datendateien verwenden das NUL-Begrenzungszeichen (`\x000` oder `\x0`) zur Anzeige von NULL-Werten.

**Anmerkung**  
Trotz ihrer sehr ähnlichen Schreibweise sind NUL und NULL nicht identisch. NUL ist ein UTF-8-Zeichen mit Codepunkt `x000`, das oft zur Kennzeichnen des Datensatzendes (End of Record, EOR) verwendet wird. NULL ist ein SQL-Wert, der für die Abwesenheit von Daten steht. 

Standardmäßig behandelt COPY das Begrenzungszeichen NUL als EOR-Zeichen und beendet den Datensatz, was oft zu unerwarteten Ergebnissen oder einem Fehler führt. Es gibt keine einzige Standardmethode, um NULL in Textdaten anzuzeigen. Mit der Befehlsoption NULL AS COPY können Sie also angeben, welches Zeichen beim Laden der Tabelle durch NULL ersetzt werden soll. In diesem Beispiel soll COPY das NUL-Begrenzungszeichen als NULL-Wert behandeln.

**Anmerkung**  
Die Tabellenspalte, die den NULL-Wert erhält, muss als *nullfähig* konfiguriert sein. Das bedeutet, dass sie die NOT NULL-Einschränkung in der CREATE TABLE-Spezifikation nicht enthalten darf.

Führen Sie den folgenden COPY-Befehl aus, um PART mit der Option NULL AS zu laden.

```
copy part from 's3://<your-bucket-name>/load/part-csv.tbl' 
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
csv
null as '\000';
```

Um zu prüfen, ob COPY NULL-Werte geladen hat, führen Sie den folgenden Befehl aus, um nur die Zeilen auszuwählen, die NULL enthalten.

```
select p_partkey, p_name, p_mfgr, p_category from part where p_mfgr is null;
```

```
 p_partkey |  p_name  | p_mfgr | p_category
-----------+----------+--------+------------
        15 | NUL next |        | MFGR#47
        81 | NUL next |        | MFGR#23
       133 | NUL next |        | MFGR#44 
(2 rows)
```

#### Die Optionen DELIMITER und REGION
<a name="tutorial-loading-load-supplier"></a>

Die Optionen DELIMITER und REGION sind wichtig, um zu verstehen, wie Daten geladen werden.
<a name="tutorial-loading-character-delimited-format"></a>
**Zeichengetrenntes Format**  
Die Felder in einer zeichengetrennten Datei werden von einem speziellen Teichen, etwa einem senkrechten Strich (\$1), einem Komma (,) oder einem Tabulatorzeichen (\$1t) abgetrennt. Dafür können alle einzelnen ASCII-Zeichen verwendet werden, auch nicht gedruckte ASCII-Zeichen. Sie geben das Trennzeichen mit der Option DELIMITER an. Das Standardtrennzeichen ist der senkrechte Strich (\$1). 

Der folgende Auszug aus den Daten für die Tabelle SUPPLIER verwendet den senkrechten Strich als Trennzeichen. 

```
1|1|257368|465569|41365|19950218|2-HIGH|0|17|2608718|9783671|4|2504369|92072|2|19950331|TRUCK
1|2|257368|201928|8146|19950218|2-HIGH|0|36|6587676|9783671|9|5994785|109794|6|19950416|MAIL
```
<a name="tutorial-loading-region"></a>
**REGION**  
Wann immer möglich, sollten Sie Ihre Ladedaten in derselben AWS Region wie Ihr Amazon Redshift Redshift-Cluster lokalisieren. Wenn sich Ihre Daten und Ihr Cluster in derselben Region befinden, reduzieren Sie die Latenz und vermeiden Kosten für den regionenübergreifenden Datentransfer. Weitere Informationen finden Sie unter [Bewährte Methoden für Amazon Redshift zum Laden von Daten](c_loading-data-best-practices.md). 

Wenn Sie Daten aus einer anderen AWS Region laden müssen, verwenden Sie die Option REGION, um die AWS Region anzugeben, in der sich die Ladedaten befinden. Wenn Sie eine Region angeben, müssen sich alle Ladedaten, einschließlich der Manifestdateien, in der benannten Region befinden. Weitere Informationen finden Sie unter [REGION](copy-parameters-data-source-s3.md#copy-region). 

Wenn sich Ihr Cluster in der Region USA Ost (Nord-Virginia) befindet und sich Ihr Amazon-S3-Bucket in der Region USA West (Oregon) befindet, zeigt der folgende COPY-Befehl, wie die Tabelle SUPPLIER aus Daten mit Pipe-Trennzeichen geladen wird. 

```
copy supplier from 's3://amzn-s3-demo-bucket/ssb/supplier.tbl' 
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
delimiter '|' 
gzip
region 'us-west-2';
```

#### Laden der Tabelle CUSTOMER mit MANIFEST
<a name="tutorial-loading-load-customer"></a>

In diesem Schritt laden Sie die Tabelle CUSTOMER mit den Optionen FIXEDWIDTH, MAXERROR, ACCEPTINVCHARS und MANIFEST.

Die Beispieldaten für diese Übung enthalten Zeichen, die beim Laden durch COPY Fehler verursachen. Mit der Option MAXERRORS und der Systemtabelle STL\$1LOAD\$1ERRORS können Sie die Ladefehler ausfindig machen und mit den Optionen ACCEPTINVCHARS und MANIFEST die Fehler beheben.
<a name="tutorial-loading-fixed-width"></a>
**Format mit fester Breite**  
Das Format mit fester Breite definiert jedes Feld mit einer festen Anzahl von Zeichen, anstatt die Felder durch Trennzeichen voneinander zu scheiden. Der folgende Auszug aus den Daten für die Tabelle CUSTOMER verwendet das Format mit fester Breite.

```
1   Customer#000000001   IVhzIApeRb           MOROCCO  0MOROCCO  AFRICA      25-705 
2   Customer#000000002   XSTf4,NCwDVaWNe6tE   JORDAN   6JORDAN   MIDDLE EAST 23-453
3   Customer#000000003   MG9kdTD              ARGENTINA5ARGENTINAAMERICA     11-783
```

Die Reihenfolge der label/width Paare muss exakt mit der Reihenfolge der Tabellenspalten übereinstimmen. Weitere Informationen finden Sie unter [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth).

Die Spezifikationszeichenfolge für die feste Breite der Daten für die Tabelle CUSTOMER ist die folgende.

```
fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, 
c_region :12, c_phone:15,c_mktsegment:10'
```

Um die Tabelle CUSTOMER aus Daten mit fester Breite zu laden, führen Sie den folgenden Befehl aus.

```
copy customer
from 's3://<your-bucket-name>/load/customer-fw.tbl'
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10';
```

Sie sollten eine Fehlermeldung ähnlich der folgenden erhalten.

```
An error occurred when executing the SQL command:
copy customer
from 's3://amzn-s3-demo-bucket/load/customer-fw.tbl'
credentials'...

ERROR: Load into table 'customer' failed.  Check 'stl_load_errors' system table for details. [SQL State=XX000] 

Execution time: 2.95s

1 statement(s) failed.
```
<a name="tutorial-loading-maxerror"></a>
**MAXERROR**  
Standardmäßig schlägt der COPY-Befehl beim ersten Auftreten eines Fehlers fehl und gibt eine Fehlermeldung aus. Um beim testen Zeit zu sparen, können Sie die Option MAXERROR verwenden, damit COPY eine bestimmte Anzahl von Fehlern übergeht, bevor der Befehl fehlschlägt. Da wir beim ersten Test des Ladens der Daten der Tabelle CUSTOMER Fehler erwarten, fügen Sie dem COPY-Befehl `maxerror 10` hinzu. 

Führen Sie zum Test mit den Optionen FIXEDWIDTH und MAXERROR den folgenden Befehl aus.

```
copy customer
from 's3://<your-bucket-name>/load/customer-fw.tbl'
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10'
maxerror 10;
```

Diesmal erhalten Sie statt einer Fehlermeldung eine Warnmeldung, ähnlich der folgenden.

```
Warnings:
Load into table 'customer' completed, 112497 record(s) loaded successfully.
Load into table 'customer' completed, 7 record(s) could not be loaded.  Check 'stl_load_errors' system table for details.
```

Die Warnung gibt an, dass COPY auf sieben Fehler gestoßen ist. Fragen Sie zur Prüfung der Fehler die Tabelle STL\$1LOAD\$1ERRORS ab, wie im folgenden Beispiel gezeigt.

```
select query, substring(filename,22,25) as filename,line_number as line, 
substring(colname,0,12) as column, type, position as pos, substring(raw_line,0,30) as line_text,
substring(raw_field_value,0,15) as field_text, 
substring(err_reason,0,45) as error_reason
from stl_load_errors 
order by query desc, filename 
limit 7;
```

Das Ergebnis der Abfrage von STL\$1LOAD\$1ERRORS sollte ähnlich wie folgt aussehen.

```
 query  |         filename          | line |  column   |    type    | pos |           line_text           | field_text |              error_reason
--------+---------------------------+------+-----------+------------+-----+-------------------------------+------------+----------------------------------------------
 334489 | customer-fw.tbl.log       |    2 | c_custkey | int4       |  -1 | customer-fw.tbl               | customer-f | Invalid digit, Value 'c', Pos 0, Type: Integ
 334489 | customer-fw.tbl.log       |    6 | c_custkey | int4       |  -1 | Complete                      | Complete   | Invalid digit, Value 'C', Pos 0, Type: Integ
 334489 | customer-fw.tbl.log       |    3 | c_custkey | int4       |  -1 | #Total rows                   | #Total row | Invalid digit, Value '#', Pos 0, Type: Integ
 334489 | customer-fw.tbl.log       |    5 | c_custkey | int4       |  -1 | #Status                       | #Status    | Invalid digit, Value '#', Pos 0, Type: Integ
 334489 | customer-fw.tbl.log       |    1 | c_custkey | int4       |  -1 | #Load file                    | #Load file | Invalid digit, Value '#', Pos 0, Type: Integ
 334489 | customer-fw.tbl000        |    1 | c_address | varchar    |  34 | 1         Customer#000000001  | .Mayag.ezR | String contains invalid or unsupported UTF8
 334489 | customer-fw.tbl000        |    1 | c_address | varchar    |  34 | 1         Customer#000000001  | .Mayag.ezR | String contains invalid or unsupported UTF8
(7 rows)
```

Bei der Untersuchung der Ergebnisse sehen Sie zwei Meldungen in der Spalte `error_reasons`:
+ 

  ```
  Invalid digit, Value '#', Pos 0, Type: Integ 
  ```

  Diese Fehler wurden von der Datei `customer-fw.tbl.log` verursacht. Das Problem besteht darin, dass es sich um eine Protokolldatei und nicht um eine Datendatei handelt, die daher nicht geladen werden sollte. Sie können eine Manifestdatei verwenden, um das Laden falscher Dateien zu vermeiden. 
+ 

  ```
  String contains invalid or unsupported UTF8 
  ```

  Der Datentyp VARCHAR unterstützt Multibyte-UTF-8-Zeichen mit bis zu drei Byte. Wenn die Ladedaten nicht unterstützte oder ungültige Zeichen enthalten, können Sie jedes ungültige Zeichen mit der Option ACCEPTINVCHARS gegen ein angegebenes Alternativzeichen austauschen.

Ein weiteres Problem mit der Last ist schwieriger zu erkennen – die Last führte zu unerwarteten Ergebnissen. Fragen Sie mit dem folgenden Befehl die Tabelle CUSTOMER ab, um dieses Problem zu untersuchen.

```
select c_custkey, c_name, c_address        
from customer
order by c_custkey
limit 10;
```

```
 c_custkey |          c_name           |         c_address
-----------+---------------------------+---------------------------
         2 | Customer#000000002        | XSTf4,NCwDVaWNe6tE
         2 | Customer#000000002        | XSTf4,NCwDVaWNe6tE
         3 | Customer#000000003        | MG9kdTD
         3 | Customer#000000003        | MG9kdTD
         4 | Customer#000000004        | XxVSJsL
         4 | Customer#000000004        | XxVSJsL
         5 | Customer#000000005        | KvpyuHCplrB84WgAi
         5 | Customer#000000005        | KvpyuHCplrB84WgAi
         6 | Customer#000000006        | sKZz0CsnMD7mp4Xd0YrBvx
         6 | Customer#000000006        | sKZz0CsnMD7mp4Xd0YrBvx
(10 rows)
```

Die Zeilen sollten eindeutig sein, es gibt jedoch Duplikate. 

Eine weitere Möglichkeit zur Untersuchung unerwarteter Ergebnisse besteht darin, die Anzahl der geladenen Zeilen zu prüfen. In unserem Fall sollten 100000 Zeilen geladen werden, die Lademeldung gab 112497 geladene Datensätze an. Die zusätzlichen Zeilen wurden geladen, weil COPY eine überzählige Datei, , geladen hat., `customer-fw.tbl0000.bak`. 

In dieser Übung verwenden Sie eine Manifestdatei, um das Laden der falschen Dateien zu vermeiden. 
<a name="tutorial-loading-acceptinvchars"></a>
**ACCEPTINVCHARS**  
Standardmäßig gilt, dass COPY beim Treffen auf eine von dem Datentyp der Spalte nicht unterstütztes Zeichen die Zeile überspringt und einen Fehler ausgibt. Informationen zu ungültigen UTF-8-Zeichen finden Sie unter [Fehler beim Laden von Multibyte-Zeichen](multi-byte-character-load-errors.md). 

Sie können die Option MAXERRORS verwenden, um Fehler zu ignorieren und den Ladevorgang fortzusetzen, dann STL\$1LOAD\$1ERRORS abfragen, um die ungültigen Zeichen zu finden und anschließend die Datendateien korrigieren. MAXERRORS wird jedoch sinnvollerweise für die Behebung von Ladeproblemen verwendet und sollte generell nicht in einer Produktionsumgebung genutzt werden. 

Die Option ACCEPTINVCHARS ist normalerweise die bessere Wahl für den Umgang mit ungültigen Zeichen. ACCEPTINVCHARS instruiert COPY dazu, jedes ungültige Zeichen durch ein festgelegtes gültiges Zeichen zu ersetzen und den Ladevorgang fortzusetzen. Sie können jedes gültige ASCII-Zeichen, ausgenommen NULL, als Austauschzeichen festlegen. Das Standard-Austauschzeichen ist ein Fragezeichen (?). COPY ersetzt Multibyte-Zeichen durch eine Austauschzeichenfolge gleicher Länge. Ein 4-Byte-Zeichen wird etwa durch ersetzt `'????'`. 

COPY gibt die Anzahl der Zeilen zurück, die ungültige UTF-8-Zeichen enthielten. Außerdem wird für jede betroffene Zeile ein Eintrag in die Systemtabelle STL\$1REPLACEMENTS hinzugefügt (bis zu maximal 100 Zeilen pro Knotenebene). Zusätzliche ungültige UTF-8-Zeichen werden ebenfalls ersetzt. Diese Ersetzungsereignisse werden jedoch nicht aufgezeichnet. 

ACCEPTINVCHARS ist nur für VARCHAR-Spalten gültig. 

Für diesen Schritt fügen Sie die ACCEPTINVCHARS mit dem Ersetzungszeichen `'^'` hinzu. 
<a name="tutorial-loading-manifest"></a>
**MANIFEST**  
Wenn Sie von Amazon S3 mit einem Schlüsselpräfix kopieren, besteht die Gefahr, dass Sie unerwünschte Tabellen laden. Beispielsweise enthält der Ordner `'s3://amzn-s3-demo-bucket/load/` acht Datendateien, die das Schlüsselpräfix `customer-fw.tbl` gemeinsam haben: `customer-fw.tbl0000`, `customer-fw.tbl0001` usw. Dieser Ordner enthält aber auch die überschüssigen Dateien `customer-fw.tbl.log` und `customer-fw.tbl-0001.bak`. 

Um sicherzustellen, dass Sie alle und nur die korrekten Dateien laden, verwenden Sie eine Manifestdatei. Das Manifest ist eine Textdatei im JSON-Format, die den eindeutigen Objektschlüssel für jede zu ladende Quelldatei ausdrücklich aufführt. Die Dateiobjekte können sich in verschiedenen Ordnern oder Buckets, müssen sich aber in derselben Region befinden. Weitere Informationen finden Sie unter [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest).

Nachfolgend sehen Sie den `customer-fw-manifest`-Text. 

```
{
  "entries": [
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-000"},
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-001"},
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-002"},
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-003"},
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-004"},    
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-005"},
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-006"}, 
    {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-007"} 
    ]
}
```

**So laden Sie die Daten für die Tabelle CUSTOMER mit der Manifestdatei:**

1. Öffnen Sie die Datei `customer-fw-manifest` in einem Text-Editor.

1. Ersetzen Sie *<your-bucket-name>* durch den Namen von Ihrem Bucket.

1. Speichern Sie die Datei.

1. Laden Sie die Datei in den Ladeordner in Ihrem Bucket.

1. Führen Sie den folgenden COPY-Befehl aus.

   ```
   copy customer from 's3://<your-bucket-name>/load/customer-fw-manifest'
   credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
   fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10'
   maxerror 10 
   acceptinvchars as '^'
   manifest;
   ```

#### Laden der Tabelle DWDATE mit DATEFORMAT
<a name="tutorial-loading-load-dwdate"></a>

In diesem Schritt verwenden Sie die Optionen DELIMITER und DATEFORMAT, um die Tabelle DWDATE zu laden.

Beim Laden der Spalten DATE und TIMESTAMP erwartet COPY das Standardformat YYYY-MM-DD für Datumsangaben und YYYY-MM-DD HH:MI:SS für Zeitstempel. Wenn die Ladedaten das Standardformat nicht verwenden, können Sie das Format mithilfe von DATEFORMAT und TIMEFORMAT angeben. 

Der folgende Auszug zeigt Datumsformate in der Tabelle DWDATE. Beachten Sie, dass die Datumsformate in Spalte zwei nicht konsistent sind.

```
19920104	1992-01-04          Sunday		January	1992	199201	Jan1992	1	4	4	1...
19920112	January 12, 1992	Monday		January	1992	199201	Jan1992	2	12	12	1...
19920120	January 20, 1992	Tuesday	    January	1992	199201	Jan1992	3	20	20	1...
```
<a name="tutorial-loading-dateformat"></a>
**DATEFORMAT**  
Sie können nur ein Datumsformat angeben. Wenn die Ladedaten inkonsistente Formate enthalten, möglicherweise in verschiedenen Spalten, oder wenn das Format zum Zeitpunkt des Ladevorgangs nicht bekannt ist, verwenden Sie DATEFORMAT mit dem Argument `'auto'`. Wenn `'auto'` angegeben ist, erkennt COPY jedes gültige Datums- oder Zeitformat und konvertiert es in das Standardformat. Die Option `'auto'` erkennt verschiedene Formate, die bei der Verwendung einer DATEFORMAT- und TIMEFORMAT-Zeichenfolge nicht unterstützt werden. Weitere Informationen finden Sie unter [Verwenden der automatischen Erkennung bei DATEFORMAT und TIMEFORMAT](automatic-recognition.md). 

Führen Sie den folgenden COPY-Befehl aus, um die Tabelle DWDATE zu laden.

```
copy dwdate from 's3://<your-bucket-name>/load/dwdate-tab.tbl'
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
delimiter '\t' 
dateformat 'auto';
```

#### Laden von mehreren Datendateien
<a name="tutorial-loading-load-lineorder"></a>

Sie können die Optionen GZIP und COMPUPDATE verwenden, um eine Tabelle zu laden.

Sie können eine Tabelle aus einer einzelnen Datendatei oder aus mehreren Dateien laden. Auf diese Weise können Sie die Ladezeiten der beiden Methoden vergleichen. 
<a name="tutorial-loading-gzip-lzop"></a>
**GZIP, LZOP und BZIP2**  
Sie können Ihre Dateien mit den Kompressionsformaten gzip, lzop und bzip2 komprimieren. Beim laden aus komprimierten Dateien dekomprimiert COPY diese während des Ladevorgangs. Die Komprimierung Ihrer Dateien spart Speicherplatz und verkürzt die Ladezeiten. 
<a name="tutorial-loading-compupdate"></a>
**COMPUPDATE**  
Wenn COPY eine leere Tabelle ohne Kompressionskodierungen lädt, analysiert der Befehl die Ladedaten, um die optimalen Kodierungen zu bestimmen. Anschließend ändert er die Tabelle, um diese Kodierungen vor dem beginn des Ladevorgangs anzuwenden. Diese Analyse nimmt Zeit in Anspruch, findet aber höchstens einmal pro Tabelle statt. Um Zeit zu sparen, können Sie diesen Schritt überspringen, indem Sie COMPUPDATE ausschalten. Um eine genaue Auswertung der COPY-Zeiten zu ermöglichen, schalten Sie COMPUPDATE für diesen Schritt aus.
<a name="tutorial-loading-multiple-files"></a>
**Mehrere Dateien**  
Der Befehl COPY kann Daten sehr effizient laden, wenn er aus mehreren Dateien parallel statt aus einer einzigen Datei lädt. Sie können Ihre Daten in Dateien aufteilen, sodass die Anzahl der Dateien ein Vielfaches der Anzahl der Schichten in Ihrem Cluster beträgt. In diesem Fall teilt Amazon Redshift den Workload auf und verteilt die Daten gleichmäßig auf die Schichten. Die Anzahl der Slices pro Knoten ist von der Knotengröße des Clusters abhängig. Weitere Informationen zur Anzahl der Slices für die einzelnen Knotengrößen finden Sie unter [About Clusters and Nodes](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-about-clusters-and-nodes) (Informationen zu Clustern und Knoten) im *Managementleitfaden zu Amazon Redshift*.

Beispielsweise können die in diesem Tutorial verwendeten Datenverarbeitungsknoten jeweils zwei Slices enthalten. Ein aus vier Knoten bestehender Cluster hat daher acht Slices. In früheren Schritten waren die Ladedaten in acht Dateien enthalten, obwohl diese sehr klein waren. Sie können den Zeitunterschied zwischen dem Laden aus einer einzigen großen Datei und dem Laden aus mehreren Dateien vergleichen. 

Selbst Dateien, die 15 Millionen Datensätze enthalten und ungefähr 1,2 GB belegen, sind im Kontext von Amazon Redshift sehr klein. Sie sind jedoch ausreichend, um den Leistungsvorteil des Ladens aus mehreren Dateien zu zeigen. 

In der folgenden Abbildung werden die Datendateien für LINEORDER gezeigt.

![\[Die Daten in der Tabelle LINEORDER sind in neun Dateien aufgeteilt.\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/images/tutorial-load-lineorder-files.png)


**So evaluieren Sie die Leistung von COPY mit mehreren Dateien:**

1. In einem Labortest wurde der folgende Befehl ausgeführt, um COPY aus einer einzelnen Datei auszuführen. Dieser Befehl zeigt einen fiktiven Bucket.

   ```
   copy lineorder from 's3://amzn-s3-demo-bucket/load/lo/lineorder-single.tbl' 
   credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
   gzip
   compupdate off
   region 'us-east-1';
   ```

1. Die Ergebnisse sind wie folgt. Beachten Sie die Ausführungszeit.

   ```
   Warnings:
   Load into table 'lineorder' completed, 14996734 record(s) loaded successfully.
   
   0 row(s) affected.
   copy executed successfully
   
   Execution time: 51.56s
   ```

1. Anschließend wurde der folgende COPY-Befehl ausgeführt, um Daten aus mehreren Dateien zu kopieren.

   ```
   copy lineorder from 's3://amzn-s3-demo-bucket/load/lo/lineorder-multi.tbl' 
   credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 
   gzip
   compupdate off
   region 'us-east-1';
   ```

1. Die Ergebnisse sind wie folgt. Beachten Sie die Ausführungszeit.

   ```
   Warnings:
   Load into table 'lineorder' completed, 14996734 record(s) loaded successfully.
   
   0 row(s) affected.
   copy executed successfully
   
   Execution time: 17.7s
   ```

1. Vergleichen Sie die Ausführungszeiten.

   In unserem Experiment sank die Zeit für das Laden von 15 Millionen Datensätzen von 51,56 Sekunden auf 17,7 Sekunden, d. h. um 65,7 Prozent. 

   Diese Ergebnisse basieren auf der Verwendung eines Clusters mit vier Knoten. Wenn Ihr Cluster mehr Knoten hat, vervielfachen sich die Zeiteinsparungen. Bei typischen Amazon-Redshift-Clustern mit manchmal Hunderten von Knoten ist der Unterschied noch viel deutlicher. Wenn Sie einen Cluster mit nur einem Knoten haben, besteht nur ein geringer Unterschied zwischen den Ausführungszeiten. 

## Schritt 6: Bereinigen und Analysieren der Datenbank
<a name="tutorial-loading-data-vacuum"></a>

Immer wenn Sie eine größere Zahl von Zeilen hinzufügen, löschen oder modifizieren, sollten Sie einen VACUUM- und dann einen ANALYZE-Befehl ausführen. Eine *Bereinigung* gewinnt den Speicherplatz gelöschter Zeilen zurück und stellt die Sortierfolge wieder her. Der ANALYZE-Befehl aktualisiert die Statistik-Metadaten, wodurch der Abfrageoptimierer korrektere Abfragepläne erstellen kann. Weitere Informationen finden Sie unter [Bereinigen von Tabellen](t_Reclaiming_storage_space202.md). 

Wenn Sie die Daten in der Reihenfolge des Sortierschlüssels laden, geht die Bereinigung sehr schnell. In diesem Tutorial haben Sie eine große Zahl von Zeilen hinzugefügt, jedoch in leere Tabellen. Daher muss die Sortierung nicht wiederhergestellt werden; weiterhin haben Sie keine Zeilen gelöscht. COPY aktualisiert die Statistiken automatisch, nachdem eine leere Tabelle geladen wurde. Das sollten auch Ihre Statistiken sein. up-to-date Aus Gründen der guten Organisation schließen Sie dieses Tutorial jedoch ab, indem Sie ein Vacuuming und eine Analyse Ihrer Datenbank durchführen.

Führen Sie zum Bereinigen und Analysieren der Datenbank die folgenden Befehle aus.

```
vacuum;
analyze;
```

## Schritt 7: Bereinigen Ihrer Ressourcen
<a name="tutorial-loading-data-clean-up"></a>

Solange dieser ausgeführt wird, fallen Gebühren für Ihren Cluster an. Wenn Sie dieses Tutorial abgeschlossen haben, sollten Sie Ihre Umgebung wieder auf den ursprünglichen Zustand zurücksetzen, indem Sie die Schritte in [Schritt 5: Aufheben des Zugriffs und Löschen Ihres Beispielclusters](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-clean-up-tasks.html) im Handbuch *Erste Schritte in Amazon Redshift* ausführen.

Wenn Sie den Cluster behalten möchten, den von den SSB-Tabellen beanspruchten Speicherplatz jedoch zurückgewinnen möchten, führen Sie die folgenden Befehle aus. 

```
drop table part;
drop table supplier;
drop table customer;
drop table dwdate;
drop table lineorder;
```

### Next
<a name="tutorial-loading-next-summary"></a>

[Zusammenfassung](#tutorial-loading-data-summary)

## Zusammenfassung
<a name="tutorial-loading-data-summary"></a>

In diesem Tutorial haben Sie Datendateien zu Amazon S3 hochgeladen und dann die Daten mit dem COPY-Befehl aus den Dateien in Amazon-Redshift-Tabellen geladen.

Sie haben Daten unter Verwendung der folgenden Formate geladen:
+ Zeichengetrennt
+ CSV
+ feste Breite

Mit der Systemtabelle STL\$1LOAD\$1ERRORS haben Sie Ladefehler ermittelt und dann mit den Optionen REGION, MANIFEST, MAXERROR, ACCEPTINVCHARS, DATEFORMAT und NULL AS beseitigt.

Zum Laden der Daten haben Sie die folgenden bewährten Verfahren verwendet: 
+ [Verwenden eines COPY-Befehls zum Laden von Daten](c_best-practices-use-copy.md)
+ [Laden von Datendateien](c_best-practices-use-multiple-files.md)
+ [Verwenden eines einzelnen COPY-Befehls zum Laden aus mehreren Dateien](c_best-practices-single-copy-command.md)
+ [Komprimieren Ihrer Datendateien](c_best-practices-compress-data-files.md)
+ [Prüfen der Datendateien vor und nach einem Ladevorgang](c_best-practices-verifying-data-files.md)

Für weitere Informationen zu bewährten Verfahren für Amazon Redshift vgl. die folgenden Links: 
+ [Bewährte Methoden für Amazon Redshift zum Laden von Daten](c_loading-data-best-practices.md)
+ [Bewährte Methoden für die Gestaltung von Tabellen mit Amazon Redshift](c_designing-tables-best-practices.md) 
+ [Bewährte Methoden für die Gestaltung von Abfragen mit Amazon Redshift](c_designing-queries-best-practices.md) 