在命令行中,这将成功更新表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”的例子......所以,它成功地更新列表中的所有表?
该--tables
的选择似乎是与DSN记号不兼容,你得到这个错误:
您在H =本地主机,d =测试指定的数据库,但不是表。
你们是不是要同步在“测试”仅数据库表?
如果是这样,请使用“测试--databases”来代替。
如该错误信息提示,您可以使用--databases
,然后你可以使用--tables
成功。
例如,我创建的表test.foo
和test.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
数据库中被忽略了。
这是一个老问题,但我到处去寻找答案。 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起源大师,”我在一两分钟获得一个完整的同步。