Migra usuarios de Oracle a Cloud SQL para MySQL: usuarios, tablas y tipos de datos.

Este documento es parte de una serie que proporciona información clave y orientación relacionada con la planificación y la realización de migraciones de bases de datos de Oracle® 11g o 12c a instancias de segunda generación con versión 5.7 de Cloud SQL para MySQL. En la serie, se incluyen las siguientes partes:

Tipos de datos

MySQL proporciona varios tipos de datos que son equivalentes o similares a los tipos de datos que proporciona Oracle. En la siguiente tabla, se enumeran los tipos de datos de MySQL más comunes, seguidos de una comparación entre los tipos de datos básicos de Oracle y los tipos de datos de MySQL correspondientes; si no se admite un tipo de datos, se muestra uno alternativo. Ten en cuenta que una base de datos MySQL 5.7 tiene un límite de 65,535 bytes para toda la fila (según el grupo de caracteres usado).

Tipos de datos básicos de MySQL 5.7

Familia de tipos de datos de MySQL Nombre del tipo de datos de MySQL Especificación del tipo de datos
Strings/
caracteres

CHAR(n)
Almacena n caracteres con exactitud.

VARCHAR(n)
Almacena una cantidad variable de caracteres, hasta un máximo de n caracteres.

BINARY
Almacena n bytes con exactitud.

VARBINARY(n)
Almacena una cantidad variable de caracteres, hasta un máximo de n bytes.

BLOB
Es un objeto binario grande que puede contener una cantidad variable de datos.

TEXT
Es una variante específica de VARCHAR que no requiere que especifiques un límite superior en la cantidad de caracteres.

ENUM
Es un objeto de string con un valor elegido de una lista de valores permitidos que se enumeran de forma explícita en la especificación de la columna cuando se crea la tabla.

SET
Es un objeto de string que puede tener cero o más valores, cada uno de los cuales debe elegirse de una lista de valores permitidos especificados cuando se crea la tabla.
Numéricos

INT
El valor mínimo es −2147483648 | El valor máximo es 2147483647.

INTEGER
El valor mínimo es −2147483648 | El valor máximo es 2147483647.

TINYINT
El valor mínimo es −128 | El valor máximo es 127.

SMALLINT
El valor mínimo es −32768 | El valor máximo es 32767.

MEDIUMINT
El valor mínimo es −8388608 | El valor máximo es 8388607.

BIGINT
El valor mínimo es 2^63 | El valor máximo es 2^63−1.

DECIMAL(p,s)
Es capaz de almacenar cualquier valor con p dígitos y s decimales.

NUMERIC(p,s)
Es capaz de almacenar cualquier valor con p dígitos y s decimales.

FLOAT(m,d)
Los valores se pueden almacenar con un máximo de m dígitos, de los cuales d dígitos pueden estar después del punto decimal.

DOUBLE(m,d)
Los valores se pueden almacenar con un máximo de m dígitos, de los cuales d dígitos pueden estar después del punto decimal.

BIT(m)
Almacenamiento de valores m-bit. m puede ser un valor entre 1 y 64.
Fecha y hora

DATE
- Son valores con una parte de fecha, pero sin parte de tiempo.
- Este tipo recupera y muestra los valores DATE en formato 'YYYY-MM-DD'.
- El rango admitido es de '1000-01-01''9999-12-31'.

DATETIME
- Son valores que contienen partes de fecha y hora.
- Este tipo recupera y muestra los valores DATETIME en formato 'YYYY-MM-DD HH:MM:SS'.
- El rango admitido es de '1000-01-01 00:00:00''9999-
12-31 23:59:59'.

TIMESTAMP
- Son valores que contienen partes de fecha y hora.
TIMESTAMP tiene un rango de '1970-01-01 00:00:01' UTC a  '2038-01-19 03:14:07' UTC.

TIME
- Los valores pueden ser entre '-838:59:59''838:59:59'.
- La parte de horas puede ser muy grande porque el tipo TIME puede usarse para representar no solo una hora del día (que debe ser inferior a 24 horas), sino también un intervalo entre dos eventos (que pueden ser valores que superen las 24 horas o incluso valores negativos).

YEAR
- Tipo de 1 byte YEAR usado para representar valores de año.
- Se puede declarar como YEAR o YEAR(n) y tiene un ancho de visualización de n caracteres.
JSON

JSON
Son datos JSON textuales como un tipo de datos.

Espaciales (geometría)

GEOMETRY
Es el tipo de columna que se debe especificar cuando se usan los modelos de datos que se detallan en el resto de esta tabla.

POINT
Es un valor (x,y).

LINESTRING
Es una línea (pt1, pt2).

POLYGON
Es una secuencia de puntos, en efecto una ruta de acceso cerrada.

MULTIPOINT
Es una colección de valores POINT.

MULTI-LINESTRING
Es una colección de valores LINE.

MULTIPOLYGON
Es una colección de valores POLYGON.

GEOMETRY-COLLECTION
Es una colección de tipos de datos de geometría.
Lógicos

BOOLEAN
- Contiene un valor verdadero o falso.
- Acepta valores como TRUE, '1' y 1 como verdaderos.
- Usa 1 byte de almacenamiento y puede almacenar NULL.

Conversión de tipos de datos de Oracle a MySQL

Familia de tipos de datos de Oracle Nombre del tipo de datos de Oracle Especificación del tipo de datos de Oracle Tipo equivalente de MySQL en Oracle Opción de MySQL correspondiente o alternativa
Strings/
Caracteres

CHAR(n)
El tamaño máximo es de 2,000 bytes.

CHAR(n)

CHARACTER(n)
El tamaño máximo es de 2,000 bytes.

CHARACTER(n)

NCHAR(n)
El tamaño máximo es de 2,000 bytes.

NCHAR(n)

VARCHAR(n)
El tamaño máximo es de 2,000 bytes.

VARCHAR(n)

NCHAR
VARYING(n)
String UTF-8 de extensión variable
El tamaño máximo es de 4,000 bytes.

NCHAR
VARYING(n)

VARCHAR2(n)
11g
El tamaño máximo es de 4,000 bytes El tamaño máximo es de 32 KB en PL/SQL. No

VARCHAR(n)

VARCHAR2(n)
12g
El tamaño máximo es de 32,767 bytes MAX_STRING_SIZE=EXTENDED. No

VARCHAR(n)

NVARCHAR2(n)
El tamaño máximo es de 4,000 bytes. No

VARCHAR(n)

LONG
El tamaño máximo es de 2 GB.

LONG

RAW(n)
El tamaño máximo es de 2,000 bytes. No

VARBINARY(n)

LONG RAW
El tamaño máximo es de 2 GB. No

LONGTEXT
Numéricos

NUMBER
Número de punto flotante. No

NUMERIC/DECIMAL(p,s)
Numéricos

NUMBER
Número de punto flotante. No

NUMERIC/DECIMAL(p,s)

NUMBER(*)
Número de punto flotante. No

DOUBLE

NUMERIC(p,s)
La precisión puede variar de 1 a 38.

NUMERIC(p,s)

FLOAT(p)
Número de punto flotante.

FLOAT(p)

DEC(p,s)
Número de punto fijo.

DEC(p,s)

DECIMAL(p,s)
Número de punto fijo.

DECIMAL(p,s)

INT
Número entero de 38 dígitos.

INT

INTEGER
Número entero de 38 dígitos.

INTEGER

SMALLINT
Número entero de 38 dígitos.

SMALLINT

REAL
Número de punto flotante.

REAL

DOUBLE PRECISION
Número de punto flotante.

DOUBLE PRECISION
Fecha y hora

DATE
Almacena datos de fecha y hora (año, mes, día, hora, minuto y segundo).

DATE

TIMESTAMP(p)
Fecha y hora con fracción.

TIMESTAMP

TIMESTAMP(p)
WITH TIME ZONE
Fecha y hora con fracción y zona horaria. No

DATETIME(n)

INTERVAL
YEAR(p)
TO MONTH
Intervalo de fecha. No

VARCHAR(n)

INTERVAL
DAY(p)
TO SECOND(s)
Intervalo de tiempo y día. No

VARCHAR(n)
Lógicos

BOOLEAN
Valores TRUE, FALSE y NULL. No se puede asignar a una columna de tabla de base de datos.

BOOLEAN
XML

XMLTYPE
Datos XML. No

LONGTEXT
LOB

BFILE
El puntero al archivo binario, con un tamaño máximo de 4 GB. No

VARCHAR(255)

CLOB
Objeto grande de caracteres con un tamaño de archivo máximo de 4 GB. No

LONGTEXT

BLOB
Objeto binario grande con un tamaño máximo de 4 GB.

BLOB

NCLOB
String de Unicode de extensión variable con un tamaño de archivo máximo de 4 GB. No

LONGTEXT
ROWID

ROWID
Dirección de fila física. No

CHAR(n)

UROWID(n)
ID de fila universal de las direcciones de fila lógicas. No

VARCHAR(n)
Espaciales

SDO_GEOMETRY
La descripción geométrica de un objeto espacial. No

N/A

SDO_TOPO_GEOMETRY
Describe una geometría de topología. No

N/A

SDO_GEORASTER
Una cuadrícula de trama o un objeto de imagen se almacena en una sola fila. No

N/A
Tipos de medios

ORDDicom
Admite el almacenamiento y la administración de datos de audio. No

N/A

ORDDicom
Admite el almacenamiento y la administración del formato Digital Imaging and Communications in Medicine (DICOM). No

N/A

ORDDoc
Admite el almacenamiento y la administración de cualquier tipo de datos multimedia. No

N/A

ORDImage
Admite el almacenamiento y la administración de datos de imágenes. No

N/A

ORDVideo
Admite el almacenamiento y la administración de datos de video. No

N/A

Tipos definidos por el usuario

Oracle se refiere a los tipos definidos por el usuario (UDT) como OBJECT TYPES, que se administran mediante PL/SQL. Los tipos definidos por el usuario le permiten a este crear tipos de datos complejos y dedicados a las aplicaciones que se basan en la lista de tipos de datos de Oracle incorporada y se extienden desde allí.

Este es un ejemplo de UDT de Oracle:

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

Notas de la conversión

MySQL no permite que los usuarios creen tipos dedicados y definidos.

Usuarios y tablas

En esta sección, se analiza cómo crear usuarios y asignarles permisos, y la necesidad de convertir tablas de Oracle en tablas de Cloud SQL para MySQL.

Creación de usuarios y permisos para ellos

Las cuentas de usuario de base de datos de Oracle (el “usuario” y el “esquema” de Oracle son idénticos) se pueden usar con el fin de autenticar las sesiones de base de datos y conectarse a ellas, mientras que el acceso de autorización se establece en el nivel individual de cada usuario para los objetos y permisos específicos de base de datos.

En general, hay dos tipos de usuarios de base de datos:

  • Administradores: administran la instancia de la base de datos, los usuarios y los recursos.
  • Cuentas de usuario: entregan operaciones lógicas, como aplicaciones.

Los administradores otorgan privilegios a las cuentas de usuario de la aplicación y del usuario para acceder a los objetos de base de datos. Los permisos de base de datos de Oracle se otorgan a un usuario para operaciones específicas (por ejemplo, con el fin de crear una sesión o conectarse) o a objetos de base de datos específicos (por ejemplo, SELECT en una tabla específica o EXECUTE en un procedimiento almacenado específico).

Consideraciones sobre las conversiones

  • La sintaxis CREATE USER de MySQL es diferente de la de Oracle y no se puede migrar tal como está. Además, ambas bases de datos tienen una arquitectura de usuario diferente.
  • Cuando un administrador crea un usuario en MySQL, debe especificar el servidor al que el usuario debe conectarse para acceder a la base de datos. El servidor puede ser una dirección IP específica o un DNS, o se puede conectar desde todas las fuentes mediante el signo comodín %.
  • Debido a que el nombre de usuario de MySQL es una conexión de dos partes entre el nombre de usuario y el servidor desde el cual el usuario podría conectarse, se puede crear un usuario con el mismo nombre que tiene la dirección del cliente (IP/DNS) pero desde un servidor diferente.
  • Una vez que se crea el usuario, se le puede otorgar permiso a los objetos de base de datos que forman parte de una base de datos o un esquema en particular.
  • Los usuarios también pueden obtener permisos adicionales de acuerdo con los permisos que admite Cloud SQL para MySQL (por ejemplo, el usuario raíz tendrá todos los privilegios, excepto SUPER y FILE). Los usuarios de Oracle pueden estar vinculados a un espacio de tabla dedicado mientras están en MySQL, por lo que esta función no es relevante.

Tablas

Las tablas de Oracle se construyen a partir de muchos elementos, como tipos de datos de columnas, restricciones de tablas, índices, particiones y funciones de propiedad de tablas de Oracle, entre otros. Con el objetivo de migrar de forma correcta a las tablas de base de datos de Cloud SQL para MySQL, todos los elementos de la tabla de Oracle deben convertirse en tablas de MySQL. Algunos elementos se admiten con modificaciones menores o sin ninguna modificación, mientras que otros deben modificarse por completo.

Desde la perspectiva de la migración, la conversión de PL/SQL a MySQL puede requerir más esfuerzo, ya que la conversión de tablas de Oracle en tablas de MySQL es fundamental y tiene una importancia significativa en el rendimiento y el tamaño de los datos.

A continuación, se detallan las principales diferencias entre las tablas de Oracle y MySQL y las funciones relacionadas. Estas diferencias se analizan en las otras partes de la serie.

  • Distinción entre mayúsculas y minúsculas (nombres de tablas y columnas)
  • Sintaxis de la creación de tablas
  • Metadatos de índices y tablas
  • Compatibilidad con restricciones
  • Compatibilidad y limitaciones de los tipos de datos
  • Índices
  • Particiones y administración de particiones
  • Mantenimiento de índices y tablas
  • Tablas temporales
  • Vistas
  • Columnas invisibles y visibles (Oracle 12c)
  • Grupos de caracteres de tablas y columnas