在全局锁定期间mysql主日志pos发生了变化?

时间:2010-09-21 22:41:19

标签: mysql locking replication

我必须设置一个新的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?注释...

3 个答案:

答案 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语句的客户端保持运行状态,以使读锁定保持有效。如果退出客户端,则会释放锁定。