的Percona的PT-表同步:如何在多个表上运行?(Percona's pt-table-

2019-09-17 14:36发布

在命令行中,这将成功更新表1:

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

但是,如果我想更新多个表,我不知道怎么写。 这只表1的更新,以及并忽略其他表:

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”的例子......所以,它成功地更新列表中的所有表?

Answer 1:

--tables的选择似乎是与DSN记号不兼容,你得到这个错误:

您在H =本地主机,d =测试指定的数据库,但不是表。
你们是不是要同步在“测试”仅数据库表?
如果是这样,请使用“测试--databases”来代替。

如该错误信息提示,您可以使用--databases ,然后你可以使用--tables成功。

例如,我创建的表test.footest.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数据库中被忽略了。



Answer 2:

这是一个老问题,但我到处去寻找答案。 PT-表同步只做一个表。 没有工具,做同样的事情到表的列表或一个完整的数据库模式。 具体来说,我想运行一个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"

这读取来自现场直播表名的列表,然后执行每一个通过做循环同步。 它穿过名单按字母顺序,所以我建议保持--no-外键的检查标志。

它并不完美......它不会同步没有在两个数据库中存在的表,但与组合“混帐拉-f起源大师,”我在一两分钟获得一个完整的同步。



文章来源: Percona's pt-table-sync: how to run on more than one table?