mysql bash backup mysqldump mysql-error-1062

Cómo saltarse una fila al importar un volcado de MySQL incorrecto



bash backup (5)

¿Solo pensó en eliminar las directivas MySQL en la parte superior del volcado? (Inintencionadamente lo hice cuando reinicié una restauración después de eliminar todos los registros / tablas que ya había insertado con un comando sed). Estas directivas le dicen a MySQL, entre otras cosas, que no haga pruebas únicas, pruebas de claves foráneas, etc.)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE=''+00:00'' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=''NO_AUTO_VALUE_ON_ZERO'' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

Dado un mal mysqldump que causa un error en la importación:

namtar backups # mysql -p < 2010-12-01.sql Enter password: ERROR 1062 (23000) at line 8020: Duplicate entry ''l�he?'' for key ''wrd_txt''

¿Hay alguna manera fácil de decirle a importar que salte la fila dada y continúe?

(Sí, sé que puedo editar manualmente el archivo o analizar el resultado, pero no es muy conveniente)


Las otras opciones ciertamente son opciones viables, pero otra solución sería simplemente editar el archivo .sql obtenido de mysqldump .

Cambio:

INSERT INTO table_name ...

A

INSERT IGNORE INTO table_name ...


Si puede volver a hacer el volcado, podría agregar --insert-ignore a la línea de comando cuando realice el volcado.

O puede intentar usar el comando mysqlimport con --force , que continuará incluso si encuentra errores de MySQL.


Siguiendo el consejo de la respuesta y el comentario de jmlsteele, aquí se explica cómo convertir los insertos en INSERT IGNORE sobre la marcha.

Si está importando desde un archivo sql :

sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" < 2010-12-01.sql | mysql -p

Si está importando desde un archivo gz , simplemente canalice la salida de gunzip a sed en lugar de usar la entrada de archivo:

gunzip < 2010-12-01.sql.gz | sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" | mysql -p


mysql -f -p < 2010-12-01.sql

la -f (fuerza) siendo la opción operativa aquí, funcionó para mí.