2012-05-29 6 views
5

Nella riga di comando, questo aggiornerà con successo Tabella 1:Percona pt-table-sync: come eseguire su più di una tabella?

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

Tuttavia se voglio aggiornare più di una tabella, non sono sicuro di come scriverlo. Questo aggiorna solo table1 come bene e ignora le altre tabelle:

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

E questo mi dà un errore:

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

Qualcuno ha un esempio di come per elencare il '-Tavoli' ... così che aggiorni correttamente tutte le tabelle nella lista?

risposta

0

Questa è una vecchia domanda, ma ho cercato ovunque una risposta. pt-table-sync fa solo una tabella. Non esiste uno strumento che faccia la stessa cosa in un elenco di tabelle o in uno schema di database completo. Nello specifico voglio eseguire un server Live ed essere in grado di sincronizzare di nuovo un server di Staging, quindi modificare codice e file nel server di Staging senza timore di rovinare Live o di essere sovrascritto da Live ... e voglio che sia libero:)

ho finito per scrivere uno script di shell chiamato mysql_sync_live_to_stage.sh come segue:

#!/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" 

Questa legge un elenco di nomi di tabella dal sito dal vivo poi esegue una sincronizzazione su ciascuno di essi attraverso il ciclo do. Passa in ordine alfabetico alla lista, quindi consiglio di mantenere il flag --no-foreign-key-checks.

la sua non perfetta ... Non sarà sincronizzare le tabelle che non esistono in entrambi i database, ma quando combinato con un "git tirare maestro origine -f" Ho una sincronizzazione completa in un paio di minuti.

3

L'opzione --tables sembra essere incompatibile con la notazione DSN, si ottiene questo errore:

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.

Come suggerito in quel messaggio di errore, è possibile utilizzare --databases e quindi è possibile utilizzare --tables successo.

Ad esempio, ho creato le tabelle test.foo e test.bar, riempite ciascuna con tre righe, quindi ho eliminato le righe da test.bar sul secondo server dewey.

mi sono imbattuto in questo modo:

$ 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 

E 'successo reinserito le 3 righe mancanti in test.bar.

Altre tabelle nel database test sono state ignorate.

Problemi correlati