Como migrar usuários do Oracle para o Cloud SQL para MySQL: tipos de dados, usuários e tabelas

Este documento faz parte de uma série que fornece informações importantes e orientações relacionadas ao planejamento e à execução de migrações de banco 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 partes a seguir:

Tipos de dados

O MySQL fornece vários tipos de dados que são totalmente equivalentes ou semelhantes aos tipos de dados fornecidos pela Oracle. Na tabela a seguir, listamos os tipos de dados MySQL mais comuns, seguidos por uma comparação entre os tipos de dados primários do Oracle e os tipos de dados MySQL correspondentes. Quando um tipo de dados não é compatível, um tipo alternativo é listado. Um banco de dados MySQL 5.7 tem um limite de 65.535 bytes para toda a linha (dependendo do conjunto de caracteres usado).

Tipos de dados primários do MySQL 5.7

Família de tipos de dados MySQL Nome do tipo de dados MySQL Especificação do tipo de dados
String/
caractere

CHAR(n)
Armazena exatamente n caracteres.

VARCHAR(n)
Armazena um número variável de caracteres, até um máximo de n caracteres.

BINARY
Armazena exatamente n bytes.

VARBINARY(n)
Armazena um número variável de caracteres, até um máximo de n bytes.

BLOB
Objeto grande binário que pode conter uma quantidade variável de dados.

TEXT
Variante específica de VARCHAR que não exige um limite máximo para o número de caracteres.

ENUM
Objeto de string com um valor escolhido em 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 deles precisa ser escolhido em uma lista de valores permitidos especificados quando a tabela é criada.
Numérico

INT
O valor mínimo é de - 1414484848 | O valor máximo é 2147483647.

INTEGER
O valor mínimo é de - 1414484848 | O valor máximo é 2147483647.

TINYINT
O valor mínimo é -128 | O valor máximo é 127.

SMALLINT
O valor mínimo é -32768 | O valor máximo é 32767.

MEDIUMINT
O valor mínimo é -8388608 | O valor máximo é 8388607.

BIGINT
O valor mínimo é de 2^63 | 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 até m dígitos no total, dos quais d dígitos podem estar após o ponto decimal.

DOUBLE(m,d)
Os valores podem ser armazenados com até m dígitos no total, dos quais d dígitos podem estar após o ponto decimal.

BIT(m)
Armazenamento de valores de m bits. m pode alcançar de 1 a 10.
Data e hora

DATE
- valores com uma parte da data, mas sem parte da hora.
- recupera e exibe valores DATE no formato 'YYYY-MM-DD'.
- o intervalo compatível é de '1000-01-01' a '9999-12-31'.

DATETIME
- valores que contêm partes de data e hora.
- recupera e exibe valores DATETIME no formato 'YYYY-MM-DD HH:MM:SS'.
- o intervalo compatível é 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 de '-838:59:59' a '838:59:59'.
- a parte do horário pode ser muito grande, porque o tipo TIME pode ser usado não apenas para representar uma hora do dia (que precisa ser menor que 24 horas), mas também um tempo decorrido ou um intervalo de tempo entre dois eventos (que podem ser muito maiores que 24 horas ou até mesmo negativos).

YEAR
- YEAR tipo de 1 byte usado para representar valores de ano.
- pode ser declarado como YEAR ou YEAR(n) e tem uma largura de exibição de n caracteres.
JSON

JSON
Dados JSON textuais como um tipo de dados.

Espacial (geometria)

GEOMETRY
O tipo de coluna a ser especificado quando você quer usar os modelos de dados que seguem no restante desta tabela.

POINT
Um valor (x,y).

LINESTRING
Uma linha (pt1, pt2).

POLYGON
Uma sequência de pontos, efetivamente um caminho fechado.

MULTIPOINT
Conjunto de valores POINT.

MULTI-LINESTRING
Conjunto de valores LINE.

MULTIPOLYGON
Conjunto de valores POLYGON.

GEOMETRY-COLLECTION
Conjunto de tipos de dados de geometria.
Lógica

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 Oracle para MySQL

Família de tipos de dados do Oracle Nome do tipo de dados do Oracle Especificação do tipo de dados do Oracle Equivalente do MySQL para o Oracle Correspondente/alternativa do MySQL
String/
caractere

CHAR(n)
Tamanho máximo de 2.000 bytes. Sim

CHAR(n)

CHARACTER(n)
Tamanho máximo de 2.000 bytes. Sim

CHARACTER(n)

NCHAR(n)
Tamanho máximo de 2.000 bytes. Sim

NCHAR(n)

VARCHAR(n)
Tamanho máximo de 2.000 bytes. Sim

VARCHAR(n)

NCHAR
VARYING(n)
String UTF-8 de comprimento variável
de 4.000 bytes.
Sim

NCHAR
VARYING(n)

VARCHAR2(n)
11g
Tamanho máximo de 4.000 bytes. Tamanho máximo de 32 KB em PL/SQL. Não

VARCHAR(n)

VARCHAR2(n)
12g
Tamanho máximo de 32767 bytes MAX_STRING_SIZE=EXTENDED. Não

VARCHAR(n)

NVARCHAR2(n)
Tamanho máximo de 4.000 bytes. Não

VARCHAR(n)

LONG
Tamanho máximo de 2 GB. Sim

LONG

RAW(n)
Tamanho máximo de 2.000 bytes. Não

VARBINARY(n)

LONG RAW
Tamanho máximo de 2 GB. Não

LONGTEXT
Numérico

NUMBER
Número de ponto flutuante. Não

NUMERIC/DECIMAL(p,s)
Numérico

NUMBER
Número de ponto flutuante. Não

NUMERIC/DECIMAL(p,s)

NUMBER(*)
Número de ponto flutuante. Não

DOUBLE

NUMERIC(p,s)
A precisão pode variar de 1 a 38. Sim

NUMERIC(p,s)

FLOAT(p)
Número de ponto 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 ponto flutuante. Sim

REAL

DOUBLE PRECISION
Número de ponto 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 data. Não

VARCHAR(n)

INTERVAL
DAY(p)
TO SECOND(s)
Intervalo de dia e hora. Não

VARCHAR(n)
Lógica

BOOLEAN
Valores TRUE, FALSE e NULL. Não é possível atribuir uma coluna de tabela de banco de dados. Sim

BOOLEAN
XML

XMLTYPE
Dados XML. Não

LONGTEXT
LOB

BFILE
Ponteiro para arquivo binário, com tamanho máximo de 4 GB. Não

VARCHAR(255)

CLOB
Objeto grande de caractere com tamanho máximo de arquivo de 4 GB. Não

LONGTEXT

BLOB
Objeto grande binário com tamanho máximo de 4 GB. Sim

BLOB

NCLOB
String Unicode de comprimento variável com tamanho máximo de arquivo de 4 GB. Não

LONGTEXT
ROWID

ROWID
Endereço da linha física. Não

CHAR(n)

UROWID(n)
ID de linha universal dos endereços de linha lógicos. 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 grade de varredura ou um objeto de imagem é armazenado em uma única linha. Não

N/A
Tipos de mídia

ORDDicom
Compatível com armazenamento e gerenciamento de dados de áudio. Não

N/A

ORDDicom
Compatível com o armazenamento e o gerenciamento de imagens e comunicações digitais em medicina (DICOM, na sigla em inglês). Não

N/A

ORDDoc
Compatível com armazenamento e gerenciamento de qualquer tipo de dados de mídia. Não

N/A

ORDImage
Compatível com o armazenamento e o gerenciamento de dados de imagem. Não

N/A

ORDVideo
Compatível com armazenamento e gerenciamento de dados de vídeo. Não

N/A

Tipos definidos pelo usuário

A Oracle se refere a tipos definidos pelo usuário (UDTs, na sigla em inglês) como OBJECT TYPES, que são gerenciados usando PL/SQL. Eses tipos permitem que o usuário crie tipos de dados complexos e dedicados a aplicativos baseados na lista de tipos de dados integrados do Oracle.

Veja um exemplo de UDT do Oracle:

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 usuários criem tipos dedicados e definidos.

Usuários e tabelas

Nesta seção, tratamos de como criar usuários e atribuir permissões a eles, além da necessidade de converter tabelas do Oracle em tabelas do Cloud SQL para MySQL.

Criação e permissões de usuários

As contas de usuário do banco de dados Oracle ("user" e "schema" da Oracle são idênticos) podem ser usadas para autenticação e conexão com sessões de banco de dados, enquanto o acesso de autorização é definido no nível individual de cada usuário para permissões e objetos de banco de dados específicos.

Em geral, há dois tipos de usuários de banco de dados:

  • Administradores: gerenciar a instância, os usuários e os recursos do banco de dados.
  • Contas de usuário: disponibilizar operações lógicas, como aplicativos.

Os administradores concedem privilégios a contas de usuário e de aplicativo para acessar os objetos do banco de dados. As permissões do banco de dados Oracle são concedidas a um usuário para operações específicas (por exemplo, criar sessão/conexão) ou objetos de banco de dados específicos (por exemplo, SELECT em uma tabela específica ou EXECUTE em um procedimento armazenado específico).

Considerações sobre conversão

  • A sintaxe CREATE USER do MySQL é diferente da do Oracle e não pode ser migrada no estado atual. Além disso, os dois bancos de dados têm arquitetura de usuário diferente.
  • Quando um administrador cria um usuário no MySQL, ele precisa especificar o servidor ao qual o usuário precisa se conectar para acessar o banco de dados. O servidor pode ser um endereço IP ou DNS específico ou pode se conectar de todas as fontes usando o caractere curinga %.
  • Como o nome de usuário do MySQL é um anexo de duas partes entre o nome de usuário e o servidor a partir do qual o usuário poderia se conectar, um usuário pode ser criado com o mesmo nome, mas a partir de um servidor diferente do endereço do cliente (IP/DNS).
  • Depois que o usuário é criado, ele pode receber permissão para objetos de banco de dados que fazem parte de um banco de dados ou esquema específico.
  • Os usuários também podem receber outras permissões de acordo com Permissões do Cloud SQL para MySQL. Por exemplo, o usuário raiz terá todos os privilégios, exceto SUPER e FILE. Os usuários da Oracle podem ser anexados a um espaço de tabela dedicado no MySQL. Portanto, essa funcionalidade não é relevante.

Tabelas

As tabelas Oracle são construídas com base em muitos elementos, como tipos de dados de coluna, restrições de tabela, índices, partições, recursos reservados de tabelas Oracle e muito mais. Para migrar com sucesso para as tabelas de banco de dados do Cloud SQL para MySQL, todos os elementos da tabela Oracle precisam ser convertidos em tabelas MySQL. Alguns elementos são compatíveis sem nenhuma modificação, outros sofrem pequenas modificações e outros precisam ser completamente modificados.

Do ponto de vista da migração, a conversão de PL/SQL em MySQL provavelmente requer mais esforço, porque converter tabelas da Oracle em tabelas do MySQL é uma etapa essencial com importância significativa e outras implicações no desempenho e no tamanho dos dados.

Veja a seguir as principais diferenças entre as tabelas Oracle e MySQL e os recursos relacionados. Essas diferenças são discutidas nas partes restantes da série.

  • Diferenciação entre maiúsculas e minúsculas (nomes de tabelas e colunas)
  • Criar sintaxe de tabela
  • Metadados de tabela e índice
  • Suporte a restrições
  • Compatibilidade e limitações de tipos de dados
  • Índices
  • Partições e gerenciamento de partições
  • Gerenciamento de tabelas e índices
  • Tabelas temporárias
  • Visualizações
  • Colunas visíveis e invisíveis (Oracle 12c)
  • Conjuntos de caracteres de tabela e coluna