Percona的pt-table-sync:如何在多个表上运行?

时间:2012-05-29 15:38:11

标签: database percona

在命令行中,这将成功更新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'的示例...以便它成功更新列表中的所有表格?

2 个答案:

答案 0 :(得分:3)

--tables选项似乎与DSN表示法不兼容,您收到此错误:

  

你指定了一个数据库,但没有在h = localhost中指定一个表,D = test       您是否尝试仅同步“测试”中的表格?数据库?
      如果是这样,请使用' - 数据库测试'代替。

根据该错误消息的建议,您可以使用--databases,然后就可以成功使用--tables

例如,我创建了表test.footest.bar,每个表都填充了三行,然后从第二个服务器dewey上的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

它成功地重新插入test.bar中的3个缺失行。

我的test数据库中的其他表格被忽略了。

答案 1 :(得分:0)

这是一个老问题,但我到处寻找答案。 pt-table-sync只做一个表。没有工具可以对表列表或完整数据库模式执行相同的操作。具体来说,我想运行一个Live服务器,并能够同步回Staging服务器,然后在Staging服务器中编辑代码和文件,而不用担心搞乱直播或被Live覆盖......我希望它是免费的: )

我最终编写了一个名为mysql_sync_live_to_stage.sh的shell脚本,如下所示:

#!/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"我会在几分钟内完成同步。