Migrar utilizadores do Oracle para o Cloud SQL para MySQL: tipos de dados, utilizadores e tabelas

Este documento faz parte de uma série que fornece informações e orientações importantes relacionadas com o planeamento e a execução de migrações de bases de dados Oracle® 11g/12c para o Cloud SQL para MySQL versão 5.7, instâncias de segunda geração. A série inclui as seguintes partes:

Tipos de dados

O MySQL oferece vários tipos de dados totalmente equivalentes ou semelhantes aos tipos de dados fornecidos pelo Oracle. A tabela seguinte apresenta os tipos de dados do MySQL mais comuns, seguidos de uma comparação entre os tipos de dados primitivos do Oracle e os tipos de dados do MySQL correspondentes. Quando um tipo de dados não é suportado, é apresentado um tipo de dados alternativo. Tenha em atenção que uma base de dados MySQL 5.7 tem um limite de 65 535 bytes para toda a linha (consoante o conjunto de carateres usado).

Tipos de dados primitivos do MySQL 5.7

Família de tipos de dados do MySQL Nome do tipo de dados do MySQL Especificação do tipo de dados
String/
caráter
CHAR(n)
Armazena exatamente n carateres.
VARCHAR(n)
Armazena um número variável de carateres, até um máximo de n carateres.
BINARY
Armazena exatamente n bytes.
VARBINARY(n)
Armazena um número variável de carateres, até um máximo de n bytes.
BLOB
Objeto binário grande que pode conter uma quantidade variável de dados.
TEXT
Variante específica de VARCHAR que não requer que especifique um limite superior para o número de carateres.
ENUM
Objeto de string com um valor escolhido a partir de uma lista de valores permitidos que são enumerados explicitamente na especificação da coluna quando a tabela é criada.
SET
Objeto de string que pode ter zero ou mais valores, cada um dos quais tem de ser escolhido a partir de uma lista de valores permitidos especificados quando a tabela é criada.
Numérico
INT
O valor mínimo é -2147483648 e o valor máximo é 2147483647.
INTEGER
O valor mínimo é -2147483648 e o valor máximo é 2147483647.
TINYINT
O valor mínimo é -128 e o valor máximo é 127.
SMALLINT
O valor mínimo é -32768 e o valor máximo é 32767.
MEDIUMINT
O valor mínimo é -8388608 e o valor máximo é 8388607.
BIGINT
O valor mínimo é -2^63 e o valor máximo é 2^63-1.
DECIMAL(p,s)
Capaz de armazenar qualquer valor com p dígitos e s decimais.
NUMERIC(p,s)
Capaz de armazenar qualquer valor com p dígitos e s decimais.
FLOAT(m,d)
Os valores podem ser armazenados com um total de até m dígitos, dos quais d podem estar após o ponto decimal.
DOUBLE(m,d)
Os valores podem ser armazenados com um total de até m dígitos, dos quais d podem estar após o ponto decimal.
BIT(m)
Armazenamento de valores de m bits. m pode variar entre 1 e 64.
Data e hora
DATE
– Valores com uma parte de data, mas sem parte de hora.
- Obtém e apresenta os valores DATE no formato 'YYYY-MM-DD'.
- O intervalo suportado é de '1000-01-01' a '9999-12-31'.
DATETIME
– Valores que contêm partes de data e hora.
- Obtém e apresenta os valores DATETIME no formato 'YYYY-MM-DD HH:MM:SS'.
- O intervalo suportado é de '1000-01-01 00:00:00' a '9999-
12-31 23:59:59'.
TIMESTAMP
– Valores que contêm partes de data e hora.
- TIMESTAMP tem um intervalo de '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC.
TIME
– Os valores podem variar entre '-838:59:59' e '838:59:59'.
- A parte das horas pode ser tão grande porque o tipo TIME pode ser usado não só para representar uma hora do dia (que tem de ser inferior a 24 horas), mas também o tempo decorrido ou um intervalo de tempo entre dois eventos (que pode ser muito superior a 24 horas ou até negativo).
YEAR
- YEAR Tipo de 1 byte usado para representar valores de anos.
- Pode ser declarado como YEAR ou YEAR(n) e tem uma largura de apresentação de n carateres.
JSON
JSON
Dados JSON textuais como um tipo de dados.

Espacial (geometria)
GEOMETRY
O tipo de coluna a especificar quando quer usar os modelos de dados que se seguem no resto desta tabela.
POINT
Um valor (x,y).
LINESTRING
Uma linha (pt1, pt2).
POLYGON
Uma sequência de pontos, efetivamente um caminho fechado.
MULTIPOINT
Coleção de valores POINT.
MULTI-LINESTRING
Coleção de valores LINE.
MULTIPOLYGON
Coleção de valores POLYGON.
GEOMETRY-COLLECTION
Recolha de tipos de dados de geometria.
Lógico
BOOLEAN
– Contém um valor verdadeiro ou falso.
- Aceita valores como TRUE, '1' e 1 como verdadeiros.
- Usa 1 byte de armazenamento e pode armazenar NULL.

Conversão do tipo de dados do Oracle para o MySQL

Família de tipos de dados Oracle Nome do tipo de dados Oracle Especificação do tipo de dados da Oracle Equivalente do MySQL para o Oracle MySQL correspondente/alternativo
String/
Caráter
CHAR(n)
Tamanho máximo de 2000 bytes. Sim
CHAR(n)
CHARACTER(n)
Tamanho máximo de 2000 bytes. Sim
CHARACTER(n)
NCHAR(n)
Tamanho máximo de 2000 bytes. Sim
NCHAR(n)
VARCHAR(n)
Tamanho máximo de 2000 bytes. Sim
VARCHAR(n)
NCHAR
VARYING(n)
String UTF-8 de comprimento variável. Tamanho máximo
de 4000 bytes.
Sim
NCHAR
VARYING(n)
VARCHAR2(n)
11g
Tamanho máximo de 4000 bytes. Tamanho máximo de 32 KB em PL/SQL. Não
VARCHAR(n)
VARCHAR2(n)
12g
Tamanho máximo de 32 767 bytes MAX_STRING_SIZE=EXTENDED. Não
VARCHAR(n)
NVARCHAR2(n)
Tamanho máximo de 4000 bytes. Não
VARCHAR(n)
LONG
O tamanho máximo é de 2 GB. Sim
LONG
RAW(n)
Tamanho máximo de 2000 bytes. Não
VARBINARY(n)
LONG RAW
O tamanho máximo é de 2 GB. Não
LONGTEXT
Numérico
NUMBER
Número de vírgula flutuante. Não
NUMERIC/DECIMAL(p,s)
Numérico
NUMBER
Número de vírgula flutuante. Não
NUMERIC/DECIMAL(p,s)
NUMBER(*)
Número de vírgula flutuante. Não
DOUBLE
NUMERIC(p,s)
A precisão pode variar entre 1 e 38. Sim
NUMERIC(p,s)
FLOAT(p)
Número de vírgula flutuante. Sim
FLOAT(p)
DEC(p,s)
Número de ponto fixo. Sim
DEC(p,s)
DECIMAL(p,s)
Número de ponto fixo. Sim
DECIMAL(p,s)
INT
Número inteiro de 38 dígitos. Sim
INT
INTEGER
Número inteiro de 38 dígitos. Sim
INTEGER
SMALLINT
Número inteiro de 38 dígitos. Sim
SMALLINT
REAL
Número de vírgula flutuante. Sim
REAL
DOUBLE PRECISION
Número de vírgula flutuante. Sim
DOUBLE PRECISION
Data e hora
DATE
Armazena dados de data e hora (ano, mês, dia, hora, minuto e segundo). Sim
DATE
TIMESTAMP(p)
Data e hora com fração. Sim
TIMESTAMP
TIMESTAMP(p)
WITH TIME ZONE
Data e hora com fração e fuso horário. Não
DATETIME(n)
INTERVAL
YEAR(p)
TO MONTH
Intervalo de datas. Não
VARCHAR(n)
INTERVAL
DAY(p)
TO SECOND(s)
Intervalo de dia e hora. Não
VARCHAR(n)
Lógico
BOOLEAN
Valores TRUE, FALSE e NULL. Não pode ser atribuído a uma coluna de tabela de base de dados. Sim
BOOLEAN
XML
XMLTYPE
Dados XML. Não
LONGTEXT
LOB
BFILE
Ponteiro para o ficheiro binário, com um tamanho máximo de 4 GB. Não
VARCHAR(255)
CLOB
Objeto grande de carateres com um tamanho máximo de 4 GB. Não
LONGTEXT
BLOB
Objeto binário grande com um tamanho máximo de 4 GB. Sim
BLOB
NCLOB
String Unicode de comprimento variável com um tamanho máximo de ficheiro de 4 GB. Não
LONGTEXT
ROWID
ROWID
Morada física da linha. Não
CHAR(n)
UROWID(n)
ID de linha universal dos endereços de linhas lógicas. Não
VARCHAR(n)
Espacial
SDO_GEOMETRY
A descrição geométrica de um objeto espacial. Não
N/A
SDO_TOPO_GEOMETRY
Descreve uma geometria de topologia. Não
N/A
SDO_GEORASTER
Uma grelha raster ou um objeto de imagem é armazenado numa única linha. Não
N/A
Tipos de suportes
ORDDicom
Suporta o armazenamento e a gestão de dados de áudio. Não
N/A
ORDDicom
Suporta o armazenamento e a gestão de imagens digitais e comunicações em medicina (DICOM). Não
N/A
ORDDoc
Suporta o armazenamento e a gestão de qualquer tipo de dados multimédia. Não
N/A
ORDImage
Suporta o armazenamento e a gestão de dados de imagens. Não
N/A
ORDVideo
Suporta o armazenamento e a gestão de dados de vídeo. Não
N/A

Tipos definidos pelo utilizador

A Oracle refere-se aos tipos definidos pelo utilizador (UDTs) como OBJECT TYPES, que são geridos através do PL/SQL. Os tipos definidos pelo utilizador permitem que o utilizador crie tipos de dados complexos dedicados à aplicação, que se baseiam e se expandem a partir da lista de tipos de dados incorporados do Oracle.

Segue-se um exemplo da Oracle de UDT:

SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
     PHONE_NUM VARCHAR2(11));

Notas de conversão

O MySQL não permite que os utilizadores criem tipos dedicados e definidos.

Utilizadores e tabelas

Esta secção aborda a criação de utilizadores e a atribuição de autorizações, bem como a necessidade de converter tabelas Oracle em tabelas do Cloud SQL para MySQL.

Criação e autorizações de utilizadores

As contas de utilizador da base de dados Oracle (o "utilizador" e o "esquema" da Oracle são idênticos) podem ser usadas para autenticar e estabelecer ligação a sessões da base de dados, enquanto o acesso de autorização é definido ao nível individual de cada utilizador para objetos e autorizações específicos da base de dados.

Em geral, existem dois tipos de utilizadores da base de dados:

  • Administradores: gerir a instância da base de dados, os utilizadores e os recursos.
  • Contas de utilizador: publicação de operações lógicas, como aplicações.

Os administradores concedem privilégios a contas de utilizador e de utilizador da aplicação para aceder aos objetos da base de dados. As autorizações da base de dados Oracle são concedidas a um utilizador para operações específicas (por exemplo, criar sessão/ligar) ou objetos de base de dados específicos (por exemplo, SELECT numa tabela específica ou EXECUTE num procedimento armazenado específico).

Considerações sobre as conversões

  • A sintaxe do MySQL CREATE USER é diferente da do Oracle e não pode ser migrada tal como está. Além disso, ambas as bases de dados têm uma arquitetura de utilizador diferente.
  • Quando um administrador cria um utilizador no MySQL, tem de especificar o servidor ao qual o utilizador tem de se ligar para aceder à base de dados. O servidor pode ser um endereço IP ou um DNS específico, ou pode estabelecer ligação a partir de todas as origens através do caráter universal %
  • Uma vez que o nome de utilizador do MySQL é uma associação de duas partes entre o nome de utilizador e o servidor a partir do qual o utilizador teria autorização para estabelecer ligação, é possível criar um utilizador com o mesmo nome, mas a partir de um servidor diferente do endereço do cliente (IP/DNS).
  • Depois de criado, o utilizador pode receber autorização para aceder a objetos da base de dados que fazem parte de uma base de dados ou de um esquema específico.
  • Também podem ser concedidas autorizações adicionais aos utilizadores de acordo com as autorizações permitidas do Cloud SQL para MySQL (por exemplo, o utilizador root tem todos os privilégios, exceto os privilégios SUPER e FILE). Os utilizadores do Oracle podem ser anexados a um tablespace dedicado, enquanto no MySQL, esta funcionalidade não é relevante.

Tabelas

As tabelas Oracle são criadas a partir de muitos elementos, como tipos de dados de colunas, restrições de tabelas, índices, partições, funcionalidades proprietárias de tabelas Oracle e muito mais. Para migrar com êxito para tabelas da base de dados do Cloud SQL para MySQL, todos os elementos das tabelas do Oracle têm de ser convertidos em tabelas do MySQL. Alguns elementos são suportados sem modificações ou com modificações menores, enquanto outros têm de ser modificados completamente.

Do ponto de vista da migração, a conversão de PL/SQL em MySQL requer provavelmente mais esforço, uma vez que a conversão de tabelas Oracle em tabelas MySQL é uma fase crucial com importância significativa e implicações adicionais no desempenho e no tamanho dos dados.

Seguem-se as principais diferenças entre as tabelas Oracle e MySQL, e as funcionalidades relacionadas. Estas diferenças são abordadas nas restantes partes da série.

  • Sensibilidade a maiúsculas e minúsculas (nomes de tabelas e colunas)
  • Sintaxe de criação de tabelas
  • Metadados de tabelas e índices
  • Compatibilidade com restrições
  • Suporte e limitações de tipos de dados
  • Índices
  • Partições e gestão de partições
  • Manutenção de tabelas e índices
  • Tabelas temporárias
  • Visualizações
  • Colunas visíveis e invisíveis (Oracle 12c)
  • Conjuntos de carateres de tabelas e colunas