respaldar ejemplo datos mysql mysqldump load-data-infile

ejemplo - tabla mysqldump sin descargar la clave principal



mysqldump table (9)

  1. Clona tu mesa
  2. Suelta la columna en la tabla de clones
  3. Vuelque la tabla de clones sin la estructura (pero con la opción -c para obtener las inserciones completas)
  4. Importa donde quieras

Tengo una tabla distribuida en dos servidores que ejecutan MySQL 4. Necesito combinarlos en un servidor para nuestro entorno de prueba.

Estas tablas literalmente tienen millones de registros cada una, y la razón por la que están en dos servidores se debe a lo grandes que son. Cualquier alteración y paginación de las tablas nos dará un golpe de rendimiento demasiado grande.

Debido a que están en un entorno de producción, es imposible para mí alterarlos de ninguna manera en sus servidores existentes.

El problema es que la clave principal es un campo único de incremento automático, por lo que hay intersecciones.

He estado tratando de descubrir cómo usar el comando mysqldump para ignorar ciertos campos, pero las teclas --disable simplemente modifican la tabla, en lugar de deshacerse completamente de las claves.

En este punto, parece que voy a necesitar modificar la estructura de la base de datos para utilizar una suma de comprobación o hash para la clave principal como una combinación de los dos campos únicos que en realidad deberían ser únicos ... Realmente no quiero hacer esto.

¡Ayuda!


Esto es un dolor total. Soluciono este problema ejecutando algo así como

sed -e "s/([0-9]*,/(/gi" export.sql > expor2.sql

en el vertedero para deshacerse de las teclas principales y luego

sed -e "s/VALUES/(col1,col2,...etc.) VALUES/gi" LinxImport2.sql > LinxImport3.sql

para todas las columnas a excepción de la clave principal. Por supuesto, tendrá que tener cuidado de que ([0-9]*, no reemplace nada de lo que realmente quiere).

Espero que ayude a alguien.


La solución que he estado utilizando es hacer una exportación de SQL regular de los datos que estoy exportando, luego eliminar la clave primaria de las instrucciones de inserción usando un editor de encontrar y reemplazar RegEx. Personalmente utilizo Sublime Text, pero estoy seguro de que TextMate, Notepad ++, etc. pueden hacer lo mismo.

A continuación, ejecuto la consulta en la base de datos en la que deben insertarse los datos copiando y pegando la consulta en la ventana de consulta de HeidiSQL o PHPMyAdmin. Si hay MUCHOS datos, guardo la consulta de inserción en un archivo SQL y uso la importación de archivos. Copiar y pegar con grandes cantidades de texto a menudo hace que Chrome se congele.

Esto puede parecer mucho trabajo, pero rara vez uso más de un par de minutos entre la exportación y la importación. Probablemente mucho menos de lo que usaría en la solución aceptada. He usado este método de solución en varios cientos de miles de filas sin problemas, pero creo que sería problemático cuando alcanzas los millones.


Para resolver este problema, busqué esta pregunta, encontré la respuesta de @ pumpkinthehead y me di cuenta de que todo lo que tenemos que hacer es encontrar + reemplazar la clave primaria en cada fila con NULL para que mysql use el valor predeterminado auto_increment.

(your complete mysqldump command) | sed -e "s/([0-9]*,/(NULL,/gi" > my_dump_with_no_primary_keys.sql

Salida original:

INSERT INTO `core_config_data` VALUES (2735,''default'',0,''productupdates/configuration/sender_email_identity'',''general''), (2736,''default'',0,''productupdates/configuration/unsubscribe'',''1''),

Salida transformada:

INSERT INTO `core_config_data` VALUES (NULL,''default'',0,''productupdates/configuration/sender_email_identity'',''general''), (NULL,''default'',0,''productupdates/configuration/unsubscribe'',''1''),

Nota: Esto sigue siendo un truco; Por ejemplo, fallará si su columna de autoincremento no es la primera columna, pero resuelve mi problema el 99% del tiempo.


Puede crear una vista de la tabla sin la columna de la clave principal, luego ejecutar mysqldump en esa vista.

Entonces, si su tabla "usuarios" tiene las columnas: id, nombre, correo electrónico

> CREATE VIEW myView AS SELECT name, email FROM users

Edición: ah, ya veo, no estoy seguro de si hay alguna otra manera entonces.


Use una clave principal temporal ficticia:

Use mysqldump normalmente --opts -c . Por ejemplo, tu clave principal es ''id''. Edite los archivos de salida y agregue una fila "dummy_id" a la estructura de su tabla con el mismo tipo que ''id'' (pero no la clave principal, por supuesto). Luego modifique la INSERT y reemplace ''id'' por ''dummy_id''. Una vez importado, suelte la columna ''dummy_id''.


jimyi estaba en el camino correcto.

Esta es una de las razones por las cuales las claves de autoincrement son un PITA. Una solución no es eliminar datos sino agregarlos.

CREATE VIEW myView AS SELECT id*10+$x, name, email FROM users

(donde $ x es un único dígito que identifica únicamente la base de datos original) ya sea creando la vista en la base de datos fuente (que usted sospecha puede no ser posible) o usando una rutina de extracción como la descrita por Autocracy o cargue los datos en tablas de etapas en el caja de prueba.

Alternativamente, no cree la tabla en el sistema de prueba; en su lugar, colóquela en tablas separadas para los datos de src y luego cree una vista que obtenga de ambos:

CREATE VIEW users AS (SELECT * FROM users_on_a) UNION (SELECT * FROM users_on_b)

DO.


si no le importa cuál será el valor de la columna auto_increment, solo cargue el primer archivo, cambie el nombre de la tabla, luego vuelva a crear la tabla y cargue el segundo archivo. finalmente, usa

INSERT newly_created_table_name (all, columns, except, the, auto_increment, column) SELECT all, columns, except, the, auto_increment, column FROM renamed_table_name


SELECT null as fake_pk, `col_2`, `col_3`, `col_4` INTO OUTFILE ''your_file'' FIELDS TERMINATED BY '','' OPTIONALLY ENCLOSED BY ''"'' LINES TERMINATED BY ''/n'' FROM your_table; LOAD DATA INFILE ''your_file'' INTO TABLE your_table FIELDS TERMINATED BY '','' OPTIONALLY ENCLOSED BY ''"'' LINES TERMINATED BY ''/n'';

Para una mayor sofisticación, puede establecer un desencadenante antes de insertar en su mesa receptora que establece la nueva clave primaria para la fila de alcance antes de que se produzca la inserción, con lo que utiliza los vaciados regulares y sigue borrando su pk. No probado, pero con mucha confianza al respecto.