¿Cuál es la forma más sencilla de exportar una base de datos MySQL a RedShift sin usar SaaS pagado?

He escrito una extensa publicación de blog sobre las diferentes formas de replicar su MySQL a Amazon Redshift.

Hay 3 enfoques comunes que difieren en complejidad. El enfoque a elegir depende de su caso de uso específico, principalmente qué tan grande es su base de datos, con qué frecuencia cambia y qué tan rápido la necesita en su Redshift.

Aquí están los 3 enfoques comunes:

  1. Descarga y carga completas : ejecute periódicamente un trabajo que descargue toda su base de datos, cargue sus datos en Redshift y elimine sus datos anteriores. Es la opción más sencilla de implementar, pero solo funciona si tiene una escala pequeña.
  2. Volcado y carga incrementales : en este enfoque, la tabla MySQL se consulta periódicamente para obtener actualizaciones desde la última consulta. Las actualizaciones se cargan en Amazon Redshift y una consulta de consolidación reconstruye la tabla original. Es un poco más complejo, pero también funciona si tiene una gran base de datos, siempre que sus tablas no cambien con demasiada frecuencia.
  3. Replicación de binlog : este enfoque (a veces denominado captura de datos de cambio – CDC) hace que el binlog se transmita y cargue continuamente en Amazon Redshift. Esta es la solución más compleja, pero funciona a cualquier escala, con la latencia más baja.

Si está considerando la solución completa de volcado y carga, puede crear un script simple y ejecutarlo con un trabajo cron. Amazon tiene una guía relativamente buena sobre cómo convertir tipos de datos MySQL a tipos Redshift. Una vez que establezca los tipos de datos correctos en su tabla de Redshift, Redshift convertirá la mayoría de los tipos por usted en carga. Si aún necesita limpiar / truncar sus datos, puede ejecutar un script de Python intermedio para transformar su volcado.

Si bien parece bastante sencillo al principio, hay muchas trampas para evitar (¿qué sucede cuando se altera la estructura de su tabla MySQL?). Si está abierto a probar una solución SaaS, puede consultar Alooma: en cuestión de minutos tendrá una solución de replicación binlog en funcionamiento que se encargará de toda su tubería, incluida la conversión del tipo de datos.

La forma más simple es usar el script Python que escribí: MySQL-To-Redshift-Loader.

Aquí está el ejemplo de cómo extraer datos de MySQL usando Python:

extracto de def (env):

in_qry = abierto (opt.mysql_query_file, “r”). read (). strip (). strip (‘;’)
db_client_dbshell = r ‘% s \ mysql.exe’% MYSQL_CLIENT_HOME.strip (‘”‘)
loadConf = [db_client_dbshell, ‘- u’, opt.mysql_user, ‘- p% s’% opt.mysql_pwd, ‘- D’, opt.mysql_db_name, ‘-h’, opt.mysql_db_server]

límite = ”
si opt.mysql_lame_duck> 0:
limit = ‘LIMIT% d’% opt.mysql_lame_duck
out_file = ‘c: /tmp/orders.csv’
if os.path.isfile (out_file):
os.remove (archivo_salido)

q = “” ”
% s% s
INTO OUTFILE ‘% s’
CAMPOS TERMINADOS POR ‘% s’
CERRADO POR ‘% s’
LÍNEAS TERMINADAS POR ‘\ r \ n’;
“” “% (in_qry, limit, out_file, opt.mysql_col_delim, opt.mysql_quote)
p1 = Popen ([‘echo’, q], stdout = PIPE, stderr = PIPE, env = env)

p2 = Popen (loadConf, stdin = p1.stdout, stdout = PIPE, stderr = PIPE)

salida = ”
estado = 0
si 1:
mientras que la salida:
salida = p2.stdout.readline ()
salida de impresión
si 1:
err = ”
mientras err:
err = p2.stderr.readline ()
imprimir err
p1.wait ()
p2.wait ()

Aquí hay un ejemplo de cómo cargar datos al formulario S3 de Redshift usando el comando COPIAR:

def carga (ubicación):
start_time = time.time ()
fn = ‘ http: // s3: //% s & # 039 ; % ubicación
conn_string = REDSHIFT_CONNECT_STRING.strip (). strip (‘”‘)
con = psycopg2.connect (conn_string);
cur = con.cursor ();
cita = ”
si opt.red_quote:
quote = ‘quote \’% s \ ”% opt.red_quote
ignoreheader = ”
si opt.red_ignoreheader:
ignoreheader = ‘IGNOREHEADER% s’% opt.red_ignoreheader
timeformat = ”
si opt.red_timeformat:
# timeformat = “dateformat ‘auto'”
timeformat = “TIMEFORMAT ‘% s'”% opt.red_timeformat.strip (). strip (“‘”)
sql = “” ”
COPY% s FROM ‘% s’
CREDENCIALES ‘aws_access_key_id =% s; aws_secret_access_key =% s’
DELIMITADOR ‘% s’
FORMATO CSV% s
GZIP
% s
% s;
COMETER;
“” “% (opt.red_to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, opt.red_col_delim, quote, timeformat, ignoreheader)
cur.execute (sql)
con.close ()

A2A.

Bueno, la forma más fácil es usar AWS DMS. Si no desea usar esto (ya que técnicamente es SaaS), debe exportar cada uno de sus objetos a archivos CSV / gzip y moverlos a S3. Luego puede ejecutar comandos de copia de Redshift para cargar estos datos en Redshift. Sin embargo, hay muchas advertencias sobre este enfoque, que dependerán mucho de sus datos y de la limpieza de su sistema.

Como menciona otra respuesta, si su sistema está diseñado para MySQL y solo lo está moviendo a AWS (sin rediseñarlo), Aurora será una mejor opción. Redshift será una mejor opción si está dispuesto a remodelar y rediseñar su sistema y tiene la intención de utilizarlo para el almacenamiento y análisis de datos.

Con nuestra solución Atom DFM, obtienes tus primeros 10 millones de eventos gratis cada mes, y cada 1 millón de eventos después de eso por solo $ 1. También proporcionamos muchas funciones para Redshift que ayudan a administrar sus datos (pausa, reproducción, movimiento, vacío, etc.) (divulgación: trabajo en el equipo de Atom en ironSource).

Siéntase libre de leer más sobre la solución Atom aquí.

Si diseñó su base de datos en MySQL, es mucho más probable que la aproveche mejor al exportarla a Amazon Aurora que a Redshift. Amazon ofrece un servicio de conversión que puede ser costoso o no, pero tiene una mejor apuesta de que es necesaria poca o ninguna conversión al migrar a Aurora.

Hay una serie de calificaciones al pasar de relacional a columnar que no son triviales. Es probable que muchas cosas en la escala de cosas de MySQL sean demasiado pequeñas para que Redshift las use de manera eficiente.