2012-05-29 17 views
5

In der Befehlszeile wird dies erfolgreich tabelle1 aktualisieren:Percona pt-table-sync: Wie läuft man auf mehr als einem Tisch?

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

Allerdings, wenn ich mehr als eine Tabelle aktualisieren mag, ich bin nicht sicher, wie es zu schreiben. Dies ist nur Updates tabelle1 auch und ignoriert die anderen Tabellen:

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

Und das gibt mir eine Fehlermeldung:

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

Wer ein Beispiel davon, wie die ‚-tables‘ zur Liste ... so dass es alle Tabellen in der Liste erfolgreich aktualisiert?

Antwort

0

Dies ist eine alte Frage, aber ich suchte überall nach einer Antwort. pt-table-sync führt nur eine Tabelle aus. Es gibt kein Tool, das dasselbe mit einer Liste von Tabellen oder einem vollständigen Datenbankschema tut. Insbesondere möchte ich einen Live-Server ausführen und in der Lage sein, auf einen Staging-Server zurückzusynchronisieren, Code und Dateien im Staging-Server zu bearbeiten, ohne Angst zu haben, Live zu durcheinander zu bringen oder von Live überschrieben zu werden ... und ich möchte es kostenlos haben:)

endete ich wie folgt genannt mysql_sync_live_to_stage.sh ein Shell-Skript auf das Schreiben:

aus der Live-Website
#!/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" 

Dieser liest eine Liste von Tabellennamen dann über die Schleife tun auf jeder eine Synchronisierung ausführt. Es geht alphabetisch durch die Liste, also empfehle ich, das Flag --no-foreign-key-checks zu behalten.

Es ist nicht perfekt ... Es wird keine Tabellen synchronisieren, die nicht in beiden Datenbanken vorhanden sind, aber in Kombination mit einem "git pull -f origin master" bekomme ich eine vollständige Synchronisierung in ein paar Minuten.

3

Die --tables Option scheint mit der DSN-Notation unvereinbar zu sein, können Sie diese Fehlermeldung erhalten:

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.

Wie in dieser Fehlermeldung vorgeschlagen, können Sie --databases verwenden und dann können Sie --tables erfolgreich nutzen.

Zum Beispiel erstellte ich Tabellen test.foo und test.bar, jeweils mit drei Zeilen gefüllt, löschte dann die Zeilen von test.bar auf dem zweiten Server dewey.

Ich lief dies:

$ 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 

großen Erfolg die drei fehlenden Zeilen in test.bar wieder eingesetzt.

Andere Tabellen in meiner test Datenbank wurden ignoriert.