在命令行中,这将成功更新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'的示例...以便它成功更新列表中的所有表格?
答案 0 :(得分:3)
--tables
选项似乎与DSN表示法不兼容,您收到此错误:
你指定了一个数据库,但没有在h = localhost中指定一个表,D = test 您是否尝试仅同步“测试”中的表格?数据库?
如果是这样,请使用' - 数据库测试'代替。
根据该错误消息的建议,您可以使用--databases
,然后就可以成功使用--tables
。
例如,我创建了表test.foo
和test.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"我会在几分钟内完成同步。