2012-05-29 19 views
5

En la línea de comandos, esto actualizará con éxito tabla1:pt-table-sync de Percona: ¿cómo ejecutar en más de una tabla?

pt-table-sync --execute h=host1,D=db1,t=table1 h=host2,D=db2 

Sin embargo, si quiero actualizar más de una tabla, no estoy seguro de cómo se escribe. Este sólo actualiza tabla1 así y hace caso omiso de las otras mesas:

pt-table-sync --execute h=host1,D=db1,t=table1,table2,table3 h=host2,D=db2 

Y esto me da un error:

pt-table-sync --execute h=host1,D=db1 --tables table1,table2,table3 h=host2,D=db2 

Alguien tiene un ejemplo de cómo la lista '-mesas' ... por lo que actualiza con éxito todas las tablas en la lista?

Respuesta

0

Esta es una vieja pregunta, pero busqué una respuesta en todas partes. pt-table-sync solo hace una tabla. No existe una herramienta que haga lo mismo con una lista de tablas o un esquema de base de datos completo. Específicamente quiero ejecutar un servidor en vivo y poder sincronizar de nuevo a un servidor de ensayo, luego edito código y archivos en el servidor de ensayo sin temor a perder Live o ser sobreescrito por Live ... y quiero que sea gratis:)

terminé escribiendo un script de shell llamado mysql_sync_live_to_stage.sh de la siguiente manera:

#!/bin/bash 
# sync db live to staging 

error_log_file='./mysql_sync_errors.log' 
echo $(date +"%Y %m %d %H:%M") > $error_log_file 

function sync_table() 
{ 
    pt-table-sync --no-foreign-key-checks --execute 
     h=DB_1_HOST,u=DB_1_USER,p=DB_1_PASSWORD,D=$1,t=$3 
     h=DB_2_HOST,u=DB_2_USER,p=DB_2_PASSWORD,D=$2,t=$3 >> $error_log_file 
} 

# SYNC ALL TABLES IN name_of_live_database 
mysql -h "DB_1_HOST" -u "DB_1_USER" -pDB_1_PASSWORD -D "DB_1_DBNAME" -e "SHOW TABLES" | 
     egrep -i '[0-9a-z\-\_]+' | egrep -i -v 'Tables_in' | while read -r table ; do 
    echo "Processing $table" 
    sync_table "name_of_live_database" "name_of_staging_database" $table 
done 

# FIX Config Settings For Staging 
echo "Cleanup Queries..." 
mysql -h "DB_2_HOST" -u "DB_2_USER" -pDB_2_PASSWORD -D "DB_2_DBNAME" 
    -e "UPDATE name_of_staging_database.nameofmyconfigtable SET value='bar' 
    WHERE config_id='foo'" 
mysql -h "DB_2_HOST" -u "DB_2_USER" -pDB_2_PASSWORD -D "DB_2_DBNAME" 
    -e "UPDATE name_of_staging_database.nameofmyconfigtable SET value='bar2' 
    WHERE config_id='foo2'" 
echo "Done" 

Esto lee una lista de nombres de tabla desde el sitio en vivo a continuación, ejecuta una sincronización en cada uno de ellos a través del bucle hacer. Pasa por la lista en orden alfabético, por lo que recomiendo mantener el indicador --no-foreign-key-checks.

No es perfecto ... No sincronizará tablas que no existen en ambas bases de datos, pero cuando se combina con un "maestro de origen de git pull -f" obtengo una sincronización completa en un par de minutos.

3

La opción --tables parece ser incompatible con la notación de DSN, se obtiene este error:

You specified a database but not a table in h=localhost,D=test.
Are you trying to sync only tables in the 'test' database?
If so, use '--databases test' instead.

Como se sugiere en ese mensaje de error, puede utilizar --databases y luego se puede utilizar con éxito --tables.

Por ejemplo, creé las tablas test.foo y test.bar, llené cada una con tres filas, luego borré las filas de test.bar en el segundo servidor dewey.

me corrieron esto:

$ pt-table-sync h=huey h=dewey --databases test --tables foo,bar --execute --verbose 

# Syncing h=dewey 
# DELETE REPLACE INSERT UPDATE ALGORITHM START END  EXIT DATABASE.TABLE 
#  0  0  3  0 Chunk  15:26:15 15:26:15 2 test.bar 
#  0  0  0  0 Chunk  15:26:15 15:26:15 0 test.foo 

Se consiguió volver a insertar las 3 filas desaparecidos en test.bar.

Se ignoraron otras tablas en mi base de datos test.

Cuestiones relacionadas