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,并test.bar在每个表中填充了三行,然后从test.bar第二台服务器 dewey 中删除了这些行。

我跑了这个:

$ 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 只做一张表。没有工具可以对表列表或完整数据库模式执行相同的操作。具体来说,我想运行 Live 服务器并能够同步回 Staging 服务器,然后在 Staging 服务器中编辑代码和文件,而不必担心会弄乱 Live 或被 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”结合使用时,我会在几分钟内完成同步。

于 2014-03-21T22:00:07.387 回答