Exportar una base de datos MySQL a una base de datos SQLite

80

Ayúdame a exportar una base de datos MySQL a una base de datos SQLite.

Devi
fuente
2
El proyecto SQLite también tiene una página sobre utilidades de conversión: sqlite.org/cvstrac/wiki?p=ConverterTools
Clinton
@Clinton hay una advertencia en la página a la que ha vinculado que la información es obsoleta.
kjones

Respuestas:

71

Hay un fantástico script de shell de Linux en Github que convierte Mysql en un archivo Sqlite3. Necesita mysqldump y sqlite3 instalados en su servidor. Funciona genial.

georgiecasey
fuente
funciona mejor hasta ahora! solo es necesario eliminar algunas declaraciones "COLLATE xy" con codificaciones que sqlite no comprende. tenga en cuenta que no necesitará sqlite3 en su servidor si desea un clon de su base de datos mysql para el desarrollo local.
benzkji
1
Desafortunadamente no funcionó para mí. Aparte de los problemas con las declaraciones "PRIMARY KEY" que se mencionan a continuación, se informaron muchos otros errores, relacionados con declaraciones "INSERT" y tablas faltantes ("objetos").
BartoszKP
2
Autor anandoned el guión, pero se continuó trabajando en este tenedor: github.com/dumblob/mysql2sqlite
ilyaigpetrov
3
github.com/dumblob/mysql2sqlite es ahora la versión oficial. 2016-05-11 17:32 GMT+2 @esperlu declared MIT as a fitting license (also retrospectively) and the original gist as deprecated.
Li-aung Yip
1
gracias por el aviso ilyaigpetrov y @ Li-aungYip, he actualizado el enlace
georgiecasey
7

La respuesta de @ user2111698 editada por @quassy funciona según lo prometido. Como hago esto con frecuencia, pongo sus instrucciones en un script bash:

#!/bin/bash

mysql_host=localhost
mysql_user=george
mysql_dbname=database
sqlite3_dbname=database.sqlite3

# dump the mysql database to a txt file
mysqldump \
  --skip-create-options \
  --compatible=ansi \
  --skip-extended-insert \
  --compact \
  --single-transaction \
  -h$mysql_host \
  -u$mysql_user \
  -p $mysql_dbname \
  > /tmp/localdb.txt

# remove lines mentioning "PRIMARY KEY" or "KEY"
cat /tmp/localdb.txt \
  | grep -v "PRIMARY KEY" \
  | grep -v KEY \
  > /tmp/localdb.txt.1

# mysqldump leaves trailing commas before closing parentheses  
perl -0pe 's/,\n\)/\)/g' /tmp/localdb.txt.1 > /tmp/localdb.txt.2

# change all \' to ''
sed -e 's/\\'\''/'\'''\''/g' /tmp/localdb.txt.2 > /tmp/localdb.txt.3

if [ -e $sqlite3_dbname ]; then
    mv $sqlite3_dbname $sqlite3_dbname.bak
fi
sqlite3 $sqlite3_dbname < /tmp/localdb.txt.3

Se puede encontrar una esencia con comentarios detallados en https://gist.github.com/grfiv/b79ace3656113bcfbd9b7c7da8e9ae8d

George Fisher
fuente
Si formatea su código para eliminar el desplazamiento, facilitará la lectura para los demás.
zhon
Feliz de; no veo rápidamente cómo
George Fisher
1
Si elimina los comentarios, habrá terminado con el desplazamiento vertical (agregue cualquier comentario que crea que es importante en el texto de su respuesta). El desplazamiento vertical se puede manejar con una nueva línea de barra invertida.
zhon
si su archivo sql tiene más de 1 GB, divídalo primero. de lo contrario, el script de perl da un error de ciclo de sustitución.
Nurp
3

mysql2sqlite.sh mencionado en la publicación superior no se adapta bien a las líneas PRIMARY KEY, no escribe el final )para completar la declaración CREATE.

Esto es lo que hice. Ejecuté el volcado de mysql como:

mysqldump --skip-create-options --compatible=ansi --skip-extended-insert --compact --single-transaction -h<host> -u<user> -p<passwd> <database name> > localdb.txt

Luego usé grep para eliminar PRIMARY KEY y KEY:

cat localdb.txt | grep -v "PRIMARY KEY' | grep -v KEY > localdb.txt.1

Luego utilicé un editor para arreglar el archivo. Cuando se eliminan las claves, termina con una declaración CREATE que se parece a:

CREATE ...
  ...,
)

Ese rastro ,debe eliminarse. En vi esta expresión coincide con ellos, $ \ n)

Entonces necesitas cambiar todo \'a''

Entonces puedes hacer la importación:

sqlite3 local.sqlite3 < localdb.txt.1

Y eso es. No he encontrado un solo programa que me haya funcionado. Espero que esto ayude a alguien.

inquieto
fuente
2

Creé manualmente la estructura de la tabla en la base de datos sqlite.

Luego cargué los datos con el siguiente comando:

mysqldump -u root {database} {table} --no-create-info --skip-extended-insert  --complete-insert --skip-add-locks  --compatible=ansi | sed "s/\\\'/''/g" |sqlite3 flora.db

Tuve que usar sed para arreglar una codificación de ápice diferente en las dos bases de datos

caiofior
fuente
Gracias por esto, fue útil ya que la pregunta original no especificaba si era necesario o no incluir el esquema de creación. Más simple cuando el esquema ya se ha configurado
kjones
0

Personalmente, me gusta el uso simple de mysqldump, pero se necesitan algunos ajustes (dependiendo de su arte con Unix y lo que quiera hacer).

Ex. para una sola mesa (prods) con PK:

$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
    Error: near line 1: table "prods" already exists
    Error: near line 7: UNIQUE constraint failed: prods.id, prods.ts
$ sqlite3 testme2.db '.schema'
    CREATE TABLE "prods" (
      "id" varchar(30) NOT NULL DEFAULT '',
      "ts" int(11) NOT NULL DEFAULT '0',
      "val" double DEFAULT NULL,
      PRIMARY KEY ("id","ts")
    );

Para cosas más complejas, probablemente sea mejor escribir un contenedor, o luego, usar el fantástico script de shell awk Linux ya mencionado en Gist .

Nuno
fuente
-1

Existe una herramienta fantástica y liviana llamada SQLite Database Browser que le permite crear y editar bases de datos sqlite. Lo usé para crear bases de datos para aplicaciones de Android. Puede ejecutar declaraciones SQL en él para cargar los datos, por lo que si exporta los datos desde una base de datos mySQL, puede importarlos usando esta herramienta. Aquí hay un enlace: http://sqlitebrowser.sourceforge.net/

Aaron Ratner
fuente
2
¿Cómo ayuda esto con la conversión de MySQL?
CL.
2
Le ayuda a hacer exactamente lo que necesita hacer. De hecho, estoy literalmente haciendo esto ahora mismo. Exporte su MySQL usando mysqldump o phpMyAdmin y luego use la herramienta anterior para importarlo a una base de datos sqlite. Pidió "exportar una base de datos MySQL a una base de datos SQLite" y la herramienta anterior será el segundo paso para hacer exactamente lo que necesita. Rechazar la ayuda legítima es simplemente un error. Soy nuevo aquí y mi respuesta no solo abordó la pregunta, sino que es lo que estoy usando ahora mismo en una situación del mundo real. No se apresure a votar en contra sin motivo alguno y desaliente a la gente a participar.
Aaron Ratner
2
Dejó fuera el segundo (y más importante) paso real, convirtiendo todas las partes específicas de MySQL del volcado de MySQL en sintaxis estándar o específica de SQLite.
CL.
4
Tarde, pero esta herramienta no funciona para este problema. No es compatible con la sintaxis específica de MySQL (solo la sintaxis SQLite). Tendrá que editar bastante el archivo de volcado para que se importe correctamente.
Sverri M. Olsen
5
@AaronRatner No, la solución no funciona. La pregunta pregunta explícitamente sobre la conversión de una base de datos MySQL, y la herramienta que recomienda no maneja la sintaxis de MySQL. No es necesario que te lo tomes como algo personal; por lo que estás diciendo, supongo que eres tú el que necesita "relajarse" :-) Si alguien dice que tu solución no es útil para ellos, solo están indicando una simple hecho. Su respuesta de que esto es "excepcionalmente difícil porque la solución es útil" es absurda. Sé que no me ayuda, porque no lo es :-) ¡Salud!
BartoszKP
-17

exportar los datos con

  mysqldump database > database.sql

e importar los datos con

  sqlite3 database < database.sql

es posible que necesite las opciones -u (usuario) y -p (contraseña)

Brandon Frohbieter
fuente
9
¿Funcionará esto realmente con las diferencias y características disponibles en mysql y no en sqlite?
rzetterberg
5
Esto no funcionará. Los índices, las descripciones de las tablas, las secuencias de escape de datos binarios, los mecanismos de bloqueo, probablemente otras cosas, son todos diferentes entre MySQL y SQLite.
CR.
Esta es una solución mucho mejor: stackoverflow.com/questions/455606/…
Joseph
4
Esto no funcionará. Pruebe la solución antes de publicar lo primero que se le ocurra ...
Maciej Jankowski