Exécution d’une copie complète - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exécution d’une copie complète

Une copie recrée et remplit une table à l’aide d’une insertion en bloc, qui trie automatiquement la table. Si une table possède une grande région non triée, une copie complète est beaucoup plus rapide qu’une opération VACUUM. Nous vous recommandons d’effectuer des mises à jour simultanées dans le cadre d’une opération de copie complète seulement si vous pouvez en assurer le suivi. Une fois le processus terminé, déplacez les mises à jour delta dans la nouvelle table. Une opération VACUUM prend automatiquement en charge les mises à jour simultanées.

Vous pouvez choisir l’une des quatre méthodes pour créer une copie de la table d’origine :

  • Utilisez la table DDL d’origine.

    Si la commande CREATE TABLE DDL est disponible, il s’agit de la méthode préférée et la plus rapide. Si vous créez une nouvelle table, vous pouvez spécifier tous les attributs de table et de colonne, y compris la clé primaire et les clés étrangères. Vous pouvez trouver le DDL d’origine à l’aide de la fonction SHOW TABLE.

  • Utilisez CREATE TABLE LIKE.

    Si le DDL d’origine n’est pas disponible, vous pouvez utiliser CREATE TABLE LIKE pour recréer la table d’origine. La nouvelle table hérite des attributs encoding, distribution key, sort key et not-null de la table parent. La nouvelle table n’hérite pas de la clé primaire et des attributs de clés étrangères de la table parent, mais vous pouvez les ajouter avec ALTER TABLE.

  • Créez une table temporaire et tronquez la table d’origine.

    Si vous devez conserver les attributs de clé primaire et de clé étrangère de la table parent. Si la table parent présente des dépendances, vous pouvez utiliser CREATE TABLE ... AS (CTAS) pour créer une table temporaire. Tronquez ensuite la table d’origine et remplissez-la à partir de la table temporaire.

    L’utilisation d’une table temporaire améliore les performances de façon significative par rapport à l’utilisation d’une table permanente, mais il existe un risque de perte des données. Une table temporaire est automatiquement supprimée à la fin de la séance dans laquelle elle a été créée. TRUNCATE valide immédiatement, même à l’intérieur d’un bloc de transaction. Si l’opération TRUNCATE réussit, mais que la session s’arrête avant la fin de l’opération INSERT suivante, les données sont perdues. Si la perte de données n’est pas acceptable, utilisez une table permanente.

Après avoir créé une copie d’une table, vous pouvez être amené à accorder l’accès à la nouvelle table. Vous pouvez utiliser GRANT pour définir les privilèges d’accès. Pour consulter et octroyer tous les privilèges d’accès d’une table, vous devez être l’une des personnes suivantes :

  • Un super-utilisateur.

  • Le propriétaire de la table que vous souhaitez copier.

  • Un utilisateur disposant du privilège ACCESS SYSTEM TABLE pour consulter les privilèges de la table et du privilège d’octroi pour toutes les autorisations pertinentes.

En outre, vous pouvez être amené à octroyer une autorisation d’utilisation pour le schéma dans lequel se trouve votre copie complète. L’octroi d’une autorisation d’utilisation est nécessaire si le schéma de votre copie complète est différent du schéma de la table d’origine, et s’il ne s’agit pas non plus du schéma public. Pour consulter et octroyer des privilèges d’utilisation, vous devez être l’une des personnes suivantes :

  • Un super-utilisateur.

  • Un utilisateur pouvant octroyer l’autorisation USAGE pour le schéma de la copie complète.

Pour exécuter une copie complète à l’aide de la table DDL d’origine
  1. (Facultatif) Recréez la table DDL en exécutant un script appelé v_generate_tbl_ddl.

  2. Créer une copie de la table à l’aide du CREATE TABLE DDL d’origine.

  3. Utilisez une instruction INSERT INTO … SELECT pour remplir la copie avec les données de la table d’origine.

  4. Vérifiez les autorisations octroyées pour l’ancienne table. Vous pouvez trouver ces autorisations dans la vue système SVV_RELATION_PRIVILEGES.

  5. Si nécessaire, accordez les autorisations de l’ancienne table à la nouvelle.

  6. Accordez l’autorisation d’utilisation à tous les groupes et utilisateurs qui disposent de privilèges dans la table d’origine. Cette étape n’est pas nécessaire si la table de la copie complète se trouve dans le schéma public ou dans le même schéma que la table d’origine.

  7. Supprimez la table d’origine.

  8. Utilisez une instruction ALTER TABLE pour renommer la copie avec le nom d’origine de la table.

L’exemple suivant effectue une copie complète de la table SAMPLE en utilisant un double de SAMPLE nommé sample_copy.

--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;
Pour effectuer une copie complète à l’aide de CREATE TABLE LIKE
  1. Créez une table à l’aide de CREATE TABLE LIKE.

  2. Utilisez une instruction INSERT INTO … SELECT pour copier les lignes de la table en cours vers la nouvelle table.

  3. Vérifiez les autorisations octroyées pour l’ancienne table. Vous pouvez trouver ces autorisations dans la vue système SVV_RELATION_PRIVILEGES.

  4. Si nécessaire, accordez les autorisations de l’ancienne table à la nouvelle.

  5. Accordez l’autorisation d’utilisation à tous les groupes et utilisateurs qui disposent de privilèges dans la table d’origine. Cette étape n’est pas nécessaire si la table de la copie complète se trouve dans le schéma public ou dans le même schéma que la table d’origine.

  6. Supprimez la table actuelle.

  7. Utilisez une instruction ALTER TABLE pour renommer la nouvelle table avec le nom d’origine de la table.

L’exemple suivant effectue une copie complète de la table SAMPLE à l’aide de CREATE TABLE LIKE.

--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;
Pour effectuer une copie en créant une table temporaire et en tronquant la table d’origine
  1. Utilisez CREATE TABLE AS pour créer une table temporaire avec les lignes de la table d’origine.

  2. Tronquez la table en cours.

  3. Utilisez une instruction INSERT INTO … SELECT pour copier les lignes de la table temporaire vers la table d’origine.

  4. Suppression de la table temporaire.

L’exemple suivant effectue une copie complète de la table SALES en créant une table temporaire et en tronquant la table d’origine. Comme la table d’origine est conservée, vous n’avez pas besoin d’accorder d’autorisations à la table de copie.

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