전체 복사 수행 - Amazon Redshift

전체 복사 수행

전체 복사는 대량 삽입을 사용하여 테이블을 다시 생성하고 다시 채움으로써 테이블을 자동으로 정렬합니다. 테이블에 정렬되지 않은 큰 리전이 있는 경우, 전체 복사가 vacuum보다 훨씬 빠릅니다. 딥 카피 작업 중에는 추적할 수 있는 경우에만 동시 업데이트를 수행하는 것이 좋습니다. 프로세스가 완료되면 델타 업데이트를 새 테이블로 옮깁니다. VACUUM 작업은 동시 업데이트를 자동으로 지원합니다.

다음 방법 중 하나를 선택해 원본 테이블의 사본을 만들 수 있습니다.

  • 원본 테이블 DDL을 사용합니다.

    CREATE TABLE DDL을 사용할 수 있는 경우, 가장 빠르고 선호되는 방법입니다. 새 테이블을 만들면 기본 키와 외래 키를 비롯해 모든 테이블 및 열 속성을 지정할 수 있습니다. SHOW TABLE 함수를 사용하여 원본 DDL을 찾을 수 있습니다.

  • CREATE TABLE LIKE를 사용합니다.

    원본 DDL을 사용할 수 없는 경우, CREATE TABLE LIKE를 사용해 원본 테이블을 다시 생성할 수 있습니다. 새 테이블은 상위 테이블의 인코딩, 배포 키, 정렬 키 및 null이 아닌 속성을 상속합니다. 새 테이블은 상위 테이블의 기본 키 및 외래 키 속성은 상속하지 않지만 ALTER TABLE을 사용해 추가할 수 있습니다.

  • 임시 테이블을 생성하고 원본 테이블을 자릅니다.

    상위 테이블의 기본 키와 외래 키 특성을 유지해야 하는 경우. 상위 테이블에 종속성이 있는 경우 CREATE TABLE ... AS(CTAS)를 사용하여 임시 테이블을 만들 수 있습니다. 그런 다음 원본 테이블을 자르고 임시 테이블을 이용해 원본 테이블을 채웁니다.

    임시 테이블을 사용하면 영구 테이블을 사용하는 경우에 비해 성능이 대폭 향상되지만 데이터가 손실될 위험이 있습니다. 임시 테이블은 자신이 생성된 세션이 끝날 때 자동으로 삭제됩니다. TRUNCATE는 트랜잭션 블록 내에 있더라도 즉시 커밋됩니다. TRUNCATE가 성공했지만 후속 INSERT가 완료되기 전에 세션이 종료되면 데이터가 손실됩니다. 데이터 손실을 허용할 수 없다면 영구 테이블을 사용합니다.

테이블의 복사본을 생성한 후 새 테이블에 대한 액세스 권한을 부여해야 할 수 있습니다. GRANT를 사용하여 액세스 권한을 정의할 수 있습니다. 테이블의 모든 액세스 권한을 보고 부여하려면 다음 중 하나여야 합니다.

  • 슈퍼 사용자

  • 복사할 테이블의 소유자

  • 테이블의 권한을 볼 수 있는 ACCESS SYSTEM TABLE 권한과, 모든 관련 권한을 부여할 권한이 있는 사용자

또한 딥 카피가 존재하는 스키마에 대한 사용 권한을 부여해야 할 수도 있습니다. 딥 카피의 스키마가 원본 테이블의 스키마와 다르며 public 스키마도 아닌 경우에는 사용 권한을 부여해야 합니다. 사용 권한을 보고 부여하려면 다음 중 하나여야 합니다.

  • 슈퍼 사용자

  • 딥 카피의 스키마에 대한 USAGE 권한을 부여할 수 있는 사용자

원본 테이블 DDL을 사용하여 전체 복사를 수행하려면
  1. (선택적) v_generate_tbl_ddl이라는 스크립트를 실행하여 테이블 DDL을 다시 생성합니다.

  2. 원본 CREATE TABLE DDL을 사용하여 테이블 사본을 만듭니다.

  3. INSERT INTO … SELECT 문을 사용하여 원본 테이블의 데이터로 사본을 채웁니다.

  4. 이전 테이블에 부여된 권한을 확인합니다. 이러한 권한은 SVV_RELATION_PRIVILEGES 시스템 보기에서 확인할 수 있습니다.

  5. 필요한 경우 이전 테이블의 권한을 새 테이블에 부여합니다.

  6. 원래 테이블에 권한이 있는 모든 그룹과 사용자에게 사용 권한을 부여합니다. 딥 카피 테이블이 public 스키마에 있거나 원본 테이블과 동일한 스키마에 있는 경우에는 이 단계를 수행하지 않아도 됩니다.

  7. 원본 테이블을 삭제합니다.

  8. ALTER TABLE 문을 사용하여 사본의 이름을 원본 테이블 이름으로 변경합니다.

다음 예는 sample_copy라는 이름의 SAMPLE 복제본을 사용하여 SAMPLE 테이블에서 전체 복사를 수행합니다.

--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;
CREATE TABLE LIKE를 사용하여 전체 복사를 수행하려면
  1. CREATE TABLE LIKE를 사용하여 새 테이블을 생성합니다.

  2. INSERT INTO … SELECT 문을 사용하여 현재 테이블에서 새 테이블로 행을 복사합니다.

  3. 이전 테이블에 부여된 권한을 확인합니다. 이러한 권한은 SVV_RELATION_PRIVILEGES 시스템 보기에서 확인할 수 있습니다.

  4. 필요한 경우 이전 테이블의 권한을 새 테이블에 부여합니다.

  5. 원래 테이블에 권한이 있는 모든 그룹과 사용자에게 사용 권한을 부여합니다. 딥 카피 테이블이 public 스키마에 있거나 원본 테이블과 동일한 스키마에 있는 경우에는 이 단계를 수행하지 않아도 됩니다.

  6. 현재 테이블을 삭제합니다.

  7. ALTER TABLE 문을 사용하여 새 테이블의 이름을 원본 테이블 이름으로 변경합니다.

다음 예는 CREATE TABLE LIKE를 사용하여 SAMPLE 테이블에서 전체 복사를 수행합니다.

--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;
임시 테이블을 생성하고 원본 테이블을 잘라 전체 복사를 수행하려면
  1. CREATE TABLE AS를 사용하여 원본 테이블의 행으로 임시 테이블을 생성합니다.

  2. 현재 테이블을 자릅니다.

  3. INSERT INTO … SELECT 문을 사용하여 임시 테이블에서 원본 테이블로 행을 복사합니다.

  4. 임시 테이블을 삭제합니다.

다음 예는 임시 테이블을 생성하고 원본 테이블을 잘라 SALES 테이블에서 전체 복사를 수행합니다. 원본 테이블은 그대로 유지되므로 복사 테이블에 권한을 부여하지 않아도 됩니다.

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