Migre a ROWID funcionalidade Oracle para o SQL Postgre em AWS - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Migre a ROWID funcionalidade Oracle para o SQL Postgre em AWS

Criado por Rakesh Raghav (AWS) e Ramesh Pathuri () AWS

Ambiente: PoC ou piloto

Origem: banco de dados Oracle

Alvo: SQL banco de dados Postgre em AWS

Tipo R: redefinir a plataforma

Workload: Oracle

Tecnologias: migração; bancos de dados

AWSserviços: Amazon Aurora; AmazonRDS; AWS SCT AWS CLI

Resumo

Esse padrão descreve as opções para migrar a funcionalidade de ROWID pseudocoluna no Oracle Database para um banco de dados Postgre no Amazon Relational SQL Database Service (Amazon) for PostgreSQL, RDS Amazon Aurora SQL Postgre -Compatible Edition ou Amazon Elastic Compute Cloud (Amazon). EC2

Em um banco de dados Oracle, a pseudocoluna ROWID é o endereço físico de uma linha em uma tabela. Essa pseudocoluna é usada para identificar de forma exclusiva uma linha, mesmo que a chave primária não esteja presente em uma tabela. O Postgre SQL tem uma pseudocoluna semelhante chamadactid, mas ela não pode ser usada como a. ROWID Conforme explicado na SQLdocumentação do Postgre, ctid pode mudar se for atualizado ou após cada VACUUM processo.

Há três maneiras de criar a funcionalidade de ROWID pseudocoluna no Postgre: SQL

  • Use uma coluna de chave primária em vez de ROWID para identificar uma linha em uma tabela.

  • Use uma chave lógica primária/exclusiva (que pode ser uma chave composta) na tabela. 

  • Adicione uma coluna com valores gerados automaticamente e torne-a uma chave primária/exclusiva para imitar ROWID.

Esse padrão mostra todas as três implementações e descreve as vantagens e desvantagens de cada opção.

Pré-requisitos e limitações

Pré-requisitos

  • Uma AWS conta ativa

  • Experiência em codificação em linguagem processual/Postgre (PL/PgSQL) SQL

  • Origem: banco de dados Oracle

  • Um cluster compatível com Amazon RDS for Postgre SQL ou Aurora SQL Postgre, ou EC2 uma instância para hospedar o banco de dados Postgre SQL

Limitações

  • Esse padrão fornece soluções alternativas para a funcionalidade ROWID. O Postgre SQL não fornece um equivalente ao ROWID do Oracle Database.

Versões do produto

  • Postger SQL 11.9 ou posterior

Arquitetura

Pilha de tecnologia de origem

  • Oracle Database

Pilha de tecnologias de destino

  • SQLCompatível com Aurora Postgre, RDS Amazon for SQL Postgre ou EC2 uma instância com um banco de dados Postgre SQL

Convertendo um banco de dados Oracle em SQL Postgre em AWS

Opções de implementação

Há três opções para contornar a falta de ROWID suporte no PostgreSQL, dependendo se sua tabela tem uma chave primária ou um índice exclusivo, uma chave primária lógica ou um atributo de identidade. Sua escolha depende dos cronogramas do projeto, da fase atual de migração e das dependências do código do aplicativo e do banco de dados.

Opção

Descrição

Vantagens

Desvantagens

Chave primária ou índice exclusivo

Se sua tabela Oracle tiver uma chave primária, você poderá usar os atributos dessa chave para identificar uma linha de forma exclusiva. 

  • Sem dependência de atributos de banco de dados proprietários.

  • Impacto mínimo no desempenho, pois os campos da chave primária são indexados.

  • Requer alterações no código do aplicativo e do banco de dados que depende da mudança ROWID para campos de chave primária.

 

Chave lógica primária/exclusiva

Se sua tabela Oracle tiver uma chave primária, lógica, você poderá usar os atributos dessa chave para identificar uma linha de forma exclusiva. Uma chave primária lógica consiste em um atributo ou conjunto de atributos que pode identificar uma linha de forma exclusiva, mas não é aplicada ao banco de dados por meio de uma restrição.

  • Sem dependência de atributos de banco de dados proprietários.

  • Requer alterações no código do aplicativo e do banco de dados que depende da mudança ROWID para campos de chave primária.

  • Impacto significativo no desempenho se os atributos da chave primária lógica não forem indexados. No entanto, você pode adicionar um índice exclusivo para evitar problemas de desempenho.

Atributo de identidade

se sua tabela Oracle não tiver uma chave primária, você poderá criar um campo adicional como GENERATED ALWAYS AS IDENTITY. Esse atributo gera um valor exclusivo sempre que os dados são inseridos na tabela, portanto, ele pode ser usado para identificar de forma exclusiva uma linha para operações da Data Manipulation Language ()DML.

  • Sem dependência de atributos de banco de dados proprietários.

  • O SQL banco de dados Postgre preenche o atributo e mantém sua exclusividade.

  • Requer alterações no código do aplicativo e do banco de dados que depende de ROWID para mudar para o atributo de identidade.

  • Impacto significativo no desempenho se o campo adicional não estiver indexado. No entanto, você pode adicionar um índice para evitar problemas de desempenho.

Ferramentas

  • O Amazon Relational Database Service (RDSAmazon) para SQL Postgre ajuda você a configurar, operar e escalar um banco de dados relacional SQL Postgre na nuvem. AWS

  • O Amazon Aurora Postgre SQL -Compatible Edition é um mecanismo de banco de dados relacional totalmente gerenciado e ACID compatível que ajuda você a configurar, operar e escalar implantações do Postgre. SQL

  • AWSA interface de linha de comando (AWSCLI) é uma ferramenta de código aberto que ajuda você a interagir com AWS serviços por meio de comandos em seu shell de linha de comando. Nesse padrão, você pode usar o AWS CLI para executar SQL comandos pgAdmin.

  • pgAdminé uma ferramenta de gerenciamento de código aberto para o Postgre. SQL Ele fornece uma interface gráfica que ajuda você a criar, manter e usar objetos de banco de dados.

  • AWSA Schema Conversion Tool AWS SCT () suporta migrações heterogêneas de bancos de dados convertendo automaticamente o esquema do banco de dados de origem e a maior parte do código personalizado em um formato compatível com o banco de dados de destino.

Épicos

TarefaDescriçãoHabilidades necessárias

Identifique as tabelas Oracle que usam o ROWID atributo.

Use a AWS Schema Conversion Tool AWS SCT () para identificar tabelas Oracle que ROWID têm funcionalidade. Para obter mais informações, consulte a AWSSCTdocumentação.

—ou—

No Oracle, use a visualização DBA_TAB_COLUMNS para identificar tabelas que tenham um atributo ROWID. Esses campos podem ser usados para armazenar caracteres alfanuméricos de 10 bytes. Determine o uso e converta-os em um campo VARCHAR, se for apropriado.

DBAou desenvolvedor

Identifique o código que faz referência a essas tabelas.

Use AWS SCT para gerar um relatório de avaliação de migração para identificar os procedimentos afetados peloROWID. Para obter mais informações, consulte a AWSSCTdocumentação.

—ou—

No banco de dados Oracle de origem, use o campo de texto da tabela dba_source para identificar objetos que usam a funcionalidade ROWID.

DBAou desenvolvedor
TarefaDescriçãoHabilidades necessárias

Identifique tabelas que não têm chaves primárias.

No banco de dados Oracle de origem, use DBA_CONSTRAINTS para identificar tabelas que não têm chaves primárias. Essas informações ajudarão você a determinar a estratégia para cada tabela. Por exemplo:

select dt.* from dba_tables dt where not exists (select 1 from all_constraints ct where ct.owner = Dt.owner and ct.table_name = Dt.table_name and ct.constraint_type = 'P' ) and dt.owner = '{schema}'
DBAou desenvolvedor
TarefaDescriçãoHabilidades necessárias

Aplique alterações em tabelas que tenham uma chave primária lógica ou definida.

Faça as alterações no código do aplicativo e do banco de dados mostradas na seção Informações adicionais para usar uma chave primária exclusiva ou uma chave primária lógica para identificar uma linha na tabela.

DBAou desenvolvedor

Inclua um campo adicional às tabelas que não tenham uma chave primária lógica ou definida.

Adicione um atributo do tipo GENERATED ALWAYS AS IDENTITY. Faça as alterações no código do aplicativo e do banco de dados mostradas na seção de Informações adicionais.

DBAou desenvolvedor

Adicione um índice, se necessário.

Adicione um índice ao campo adicional ou à chave primária lógica para melhorar o SQL desempenho.

DBAou desenvolvedor

Recursos relacionados

Mais informações

As seções a seguir fornecem exemplos de SQL códigos Oracle e Postgre para ilustrar as três abordagens.

Cenário 1: usar uma chave primária exclusiva

Nos exemplos a seguir, você cria a tabela testrowid_s1 com emp_id como a chave primária.

Código Oracle:

create table testrowid_s1 (emp_id integer, name varchar2(10), CONSTRAINT testrowid_pk PRIMARY KEY (emp_id)); INSERT INTO testrowid_s1(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s1(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s1(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s1(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 empname2 AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4 UPDATE testrowid_s1 SET name = 'Ramesh' WHERE rowid = 'AAAF3pAAAAAAAMOAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 Ramesh AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4

SQLCódigo postal:

CREATE TABLE public.testrowid_s1 ( emp_id integer, name character varying, primary key (emp_id) ); insert into public.testrowid_s1 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s1 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh

Cenário 2: usar uma chave primária lógica

Nos exemplos a seguir, você cria a tabela testrowid_s2 com emp_id a chave primária.

Código Oracle:

create table testrowid_s2 (emp_id integer, name varchar2(10) ); INSERT INTO testrowid_s2(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s2(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s2(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s2(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 empname2 AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4 UPDATE testrowid_s2 SET name = 'Ramesh' WHERE rowid = 'AAAF3rAAAAAAAMeAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 Ramesh AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4

SQLCódigo postal:

CREATE TABLE public.testrowid_s2 ( emp_id integer, name character varying ); insert into public.testrowid_s2 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s2 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh

Cenário 3: usar um atributo de identidade

Nos exemplos a seguir, você cria a tabela testrowid_s3 sem chave primária e usando um atributo de identidade.

Código Oracle:

create table testrowid_s3 (name varchar2(10)); INSERT INTO testrowid_s3(name) values ('empname1'); INSERT INTO testrowid_s3(name) values ('empname2'); INSERT INTO testrowid_s3(name) values ('empname3'); INSERT INTO testrowid_s3(name) values ('empname4'); commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB empname2 AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4 UPDATE testrowid_s3 SET name = 'Ramesh' WHERE rowid = 'AAAF3sAAAAAAAMmAAB' ; commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB Ramesh AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4

SQLCódigo postal:

CREATE TABLE public.testrowid_s3 ( rowid_seq bigint generated always as identity, name character varying ); insert into public.testrowid_s3 (name) values ('empname1'),('empname2'),('empname3'),('empname4'); select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s3 set name = 'Ramesh' where rowid_seq = 2 ; select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh