我必须设置一个新的mysql复制复制两个数据库。所以我有这个脚本来锁定表,进行转储并解锁它们。
runme.sh
mysql -uxxx -pxxx < 1.sql >> logpos.txt
mysqldump -uXXX -pXXX db1 > db1.sql
mysqldump -uXXX -pXXX db2 > db2.sql
mysql -uxxx -pxxx < 2.sql >> logpos.txt
第一个sql文件锁定表并导出主状态:
1.SQL
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
第二个文件导出主状态并解锁表
2.SQL
SHOW MASTER STATUS;
UNLOCK TABLES;
结果如下:
logpos.txt
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000335 49106285 fli_search,flimmit
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000335 49139991 fli_search,flimmit
问题: 表被锁定时,日志位置如何变化?
Server version: 5.0.51a-24+lenny4-log (Debian)
我可以为多个数据库添加mysqldump并添加--master-data,但我感觉不安全,因为涉及不同的数据库格式,我无法真正了解mysqldump --master-data如何与多个数据库一起运行。所以我有这个脚本,并有不同的日志位置....任何想法为什么?我不能用它来设置复制......
更新:
我最终决定使用mysqldump --master-data --databases db1 db2
设置复制
转储是在今晚凌晨1点创建的。
今天上午10点左右我设置了奴隶。我完全清除了数据库(删除了所有表)并导入了转储,这会自动设置主日志文件并正确记录pos。我检查它与sql转储中的相同。一切都很好。
当然我在导入之前停止了奴隶(否则我无法将带有更改主机的转储导入到语句中)。
我开始奴隶和传送看起来很好。日志pos增加,master后面的秒数减少并且变为0并且一些测试数据被正确复制。
但是从今天〜早上7点(转储创建和导入之间的时间窗口)的重大更新刚刚丢失。它从一张桌子上修剪了旧记录,在奴隶身上仍然存在...... 知道为什么吗?
任何其他信息needeD?注释...
答案 0 :(得分:2)
如果要查看在这两个位置值之间写入二进制日志的内容,可以使用mysqlbinlog工具将相关的二进制日志条目转换为SQL。只需使用第一个pos作为起始位置,将第二个pos + 1作为停止位置。通过这种方式,您将看到FLUSH之后发生的所有事件(它还会显示在刷新之前发生的最后一个事件,所以只需忽略第一个事件)。
使用您的示例:
mysqlbinlog --start-position=49106286 --stop-position=49139992 mysql-bin.000335
答案 1 :(得分:1)
看起来我也必须这样做:
FLUSH TABLES WITH WRITE LOCK;
主数据交换机似乎不太明白......
答案 2 :(得分:1)
您看到更改的原因是第一个脚本退出后立即释放锁定。来自manual:
警告 - 让发出FLUSH TABLES语句的客户端保持运行状态,以使读锁定保持有效。如果退出客户端,则会释放锁定。