registros - pasar datos de una tabla a otra mysql
Importar base de datos MySQL pero ignorar tabla especĂfica (7)
¡La respuesta aceptada por RandomSeed podría llevar mucho tiempo! Importar la tabla (solo para soltarla más tarde) puede ser un gran desperdicio dependiendo del tamaño.
Para un archivo creado usando
mysqldump -u user -ppasswd --opt --routines DBname > DBdump.sql
Actualmente obtengo un archivo de aproximadamente 7GB, 6GB de los cuales son datos para una tabla de registro que no ''necesito'' estar allí; la recarga de este archivo lleva un par de horas. Si necesito volver a cargar (para propósitos de desarrollo, o si alguna vez se requiere para una recuperación en vivo), hojeo el archivo de esta manera:
sed ''/INSERT INTO `TABLE_TO_SKIP`/d'' DBdump.sql > reduced.sql
Y recargar con:
mysql -u user -ppasswd DBname < reduced.sql
Esto me da una base de datos completa, con la tabla "no deseada" creada pero vacía. Si realmente no desea las tablas, simplemente suelte las tablas vacías una vez que finalice la carga.
Para tablas múltiples podrías hacer algo como esto:
sed ''/INSERT INTO `TABLE1_TO_SKIP`/d'' DBdump.sql | /
sed ''/INSERT INTO `TABLE2_TO_SKIP`/d'' | /
sed ''/INSERT INTO `TABLE3_TO_SKIP`/d'' > reduced.sql
Hay un ''gotcha'': tenga cuidado con los procedimientos en su volcado que pueden contener "INSERT INTO TABLE_TO_SKIP".
Tengo un archivo SQL grande con una base de datos y unas 150 tablas. Me gustaría usar mysqlimport
para importar esa base de datos, sin embargo, me gustaría que el proceso de importación ignore u omita un par de tablas. ¿Cuál es la sintaxis adecuada para importar todas las tablas, pero ignorar algunas de ellas? Gracias.
Aquí está mi script para excluir algunas tablas del volcado de MySQL. Lo uso para restaurar la base de datos cuando necesito mantener datos de pagos y pagos.
exclude_tables_from_dump.sh
#!/bin/bash
if [ ! -f "$1" ];
then
echo "Usage: $0 mysql_dump.sql"
exit
fi
declare -a TABLES=(
user
order
order_product
order_status
payments
)
CMD="cat $1"
for TBL in "${TABLES[@]}";do
CMD+="|sed ''s/DROP TABLE IF EXISTS /`${TBL}/`/# DROP TABLE IF EXIST /`${TBL}/`/g''"
CMD+="|sed ''s/CREATE TABLE /`${TBL}/`/CREATE TABLE IF NOT EXISTS /`${TBL}/`/g''"
CMD+="|sed -r ''/INSERT INTO /`${TBL}/`/d''"
CMD+="|sed ''/DELIMITER/ /;/;/,/DELIMITER/ /;/d''"
done
eval $CMD
Evita el DROP y la repetición de tablas y la inserción de datos en estas tablas. También elimina todas las FUNCIONES y PROCEDIMIENTOS que se almacenan entre DELIMITER ;; y delimitador;
No lo usaría en producción, pero si tuviera que importar rápidamente una copia de seguridad que contenga una tabla más pequeña y una tabla monstruosa grande que podría tomar horas para importar, lo más probable es que "grep -v unwanted_table_name original.sql> reduce.sql
y luego mysql -f <reduce.sql
Para cualquiera que trabaje con archivos .sql.gz; Encontré que la siguiente solución es muy útil. Nuestra base de datos tenía más de 25 GB y tuve que eliminar las tablas de registro.
gzip -cd "./mydb.sql.gz" | sed -r ''/INSERT INTO `(log_table_1|log_table_2|log_table_3|log_table_4)`/d'' | gzip > "./mydb2.sql.gz"
Gracias a la respuesta de Don y al comentario de Xosofox y esta publicación relacionada: Use zcat y sed o awk para editar el archivo de texto comprimido .gz
Poco viejo, pero imagino que todavía podría ser útil ...
Me gustó la respuesta de @Don ( https://.com/a/26379517/1446005 ) pero me pareció muy molesto que primero tuviera que escribir en otro archivo ...
En mi caso particular, esto tomaría demasiado tiempo y espacio de disco.
Así que escribí un pequeño script de bash:
#!/bin/bash tables=(table1_to_skip table2_to_skip ... tableN_to_skip) tableString=$(printf "|%s" "${tables[@]}") trimmed=${tableString:1} grepExp="INSERT INTO /`($trimmed)/`" zcat $1 | grep -vE "$grepExp" | mysql -uroot -p
esto no genera una nueva secuencia de comandos SQL, sino que la canaliza directamente a la base de datos
Además, sí crea las tablas, simplemente no importa los datos (que fue el problema que tuve con las tablas de registro enormes)
Si lo desea, puede hacer esto una tabla a la vez:
mysqldump -p sourceDatabase tableName > tableName.sql
mysql -p -D targetDatabase < tableName.sql
mysqlimport
no es la herramienta adecuada para importar sentencias de SQL. Esta herramienta está destinada a importar archivos de texto con formato, como CSV. Lo que quiere hacer es alimentar su volcado de SQL directamente al cliente mysql
con un comando como este:
bash > mysql -D your_database < your_sql_dump.sql
Ni mysql
ni mysqlimport
proporcionan la función que necesita. Su mejor oportunidad sería importar el volcado completo y luego eliminar las tablas que no desea.
Si tiene acceso al servidor de donde proviene el volcado, entonces puede crear un nuevo volcado con mysqldump --ignore-table=database.table_you_dont_want1 --ignore-table=database.table_you_dont_want2 ...
desplácese hacia abajo para una mejor opción