Mysql master log pos меняется во время глобальной блокировки? - PullRequest
1 голос
/ 22 сентября 2010

Я должен установить новую репликацию 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 ведет себя с несколькими базами данных. Итак, у меня был этот сценарий, и я получил разные позиции в журнале .... есть идеи, почему? Я не могу использовать это для настройки репликации ...

UPDATE:

Я наконец решил настроить репликацию с mysqldump --master-data --databases db1 db2 свалка была создана сегодня вечером в 1 час ночи. сегодня около 10 часов утра я установил раба. Я полностью очистил базы данных (удалил все таблицы) и импортировал дамп, который автоматически установил основной файл журнала и правильно записал pos. я проверил, что это так же, как в дампе sql. все выглядело хорошо. конечно, я остановил ведомое устройство перед импортом (иначе я не смог бы импортировать дамп с мастером изменений в инструкцию). я завел раба и все выглядело просто отлично. позиция журнала увеличилась, количество секунд после мастера уменьшилось и стало равным 0, и некоторые тестовые данные были правильно реплицированы.

, но серьезное обновление с сегодняшнего дня ~ 7 утра (промежуток времени между созданием дампа и импортом) просто отсутствовало. он удалял старые записи из таблицы, на рабе они все еще присутствовали ... есть идеи почему?

любая дополнительная информация нужна? комментарии ...

Ответы [ 3 ]

2 голосов
/ 23 сентября 2010

Если вы хотите увидеть, что было записано в двоичный журнал во время между этими двумя значениями позиции, вы можете использовать инструмент mysqlbinlog для преобразования соответствующих двоичных записей журнала в SQL. Просто используйте первую позицию в качестве начальной позиции, а вторую позицию + 1 в качестве позиции остановки. Таким образом, вы увидите все события, которые произошли после вашего сброса (он также покажет вам последнее событие, которое произошло перед сбросом, поэтому просто игнорируйте первое событие).

Используя ваш пример:

mysqlbinlog --start-position=49106286 --stop-position=49139992 mysql-bin.000335
1 голос
/ 07 декабря 2011

Причина, по которой вы увидели изменения, заключается в том, что блокировка снимается, как только выходит первый скрипт. Из руководства :

Предупреждение. Оставьте клиент, от которого вы выполнили инструкцию FLUSH TABLES, таким образом, чтобы блокировка чтения оставалась в силе. Если вы выходите из клиента, блокировка снимается.

1 голос
/ 05 ноября 2010

похоже, что я тоже должен сделать:

FLUSH TABLES WITH WRITE LOCK;

переключатель основных данных кажется ненадежным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...