5

コマンド ラインでは、これにより table1 が正常に更新されます。

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

ただし、複数のテーブルを更新したい場合、どのように記述すればよいかわかりません。これは table1 のみを更新し、他のテーブルは無視します。

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

そして、これは私にエラーを与えます:

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

「-tables」をリストする方法の例は誰にもあります...リスト内のすべてのテーブルを正常に更新できますか?

4

2 に答える 2

3

この--tablesオプションは DSN 表記と互換性がないようです。次のエラーが発生します。

h=localhost,D=test でデータベースを指定しましたが、テーブルは指定しませんでした。
「テスト」データベースのテーブルのみを同期しようとしていますか?
その場合は、代わりに「--databases test」を使用してください。

そのエラーメッセージで示唆されているように、使用してから正常--databasesに使用できます--tables

たとえば、テーブルtest.fooとを作成し、それぞれに 3 つの行を入力してから、2 番目のサーバー deweytest.barから行を削除しました。test.bar

私はこれを実行しました:

$ 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

の 3 行が正常に再挿入されましたtest.bar

testデータベース内の他のテーブルは無視されました。

于 2014-03-21T22:27:28.537 に答える
0

これは古い質問ですが、私はどこでも答えを探しました。pt-table-sync は 1 つのテーブルのみを実行します。テーブルのリストまたは完全なデータベース スキーマに対して同じことを行うツールはありません。具体的には、ライブサーバーを実行してステージングサーバーに同期し、ライブを台無しにしたり、ライブによって上書きされたりすることを恐れずにステージングサーバーのコードとファイルを編集したい...そして無料にしたい: )

次のように、mysql_sync_live_to_stage.sh というシェル スクリプトを作成しました。

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

これにより、ライブ サイトからテーブル名のリストが読み取られ、do ループを介して各テーブルの同期が実行されます。リストはアルファベット順に表示されるため、 --no-foreign-key-checks フラグを保持することをお勧めします。

完璧ではありません...両方のデータベースに存在しないテーブルは同期しませんが、「git pull -f origin master」と組み合わせると、数分で完全に同期されます。

于 2014-03-21T22:00:07.387 に答える