SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.03.2018 22:54:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2421

Генерация и хранение uuid в MySQL

Доброго дня, Коллеги!

Ситуация у меня следующая - есть одна табличка в БД (mysql 5.7), которую я хочу со временем реплицировать на другой сервер (именно эту табличку).
Именно поэтому не хочу делать id автоинкрементным, думаю сделать guid или что-то такое.
Стал смотреть в сторону функции uuid()
, прочел в документации
UUID() does not work with statement-based replication.
По ссылке
http://mechanics.flite.com/blog/2014/12 … -in-mysql/
описан механизм, который предписывает делать вот так:

Код:

master > set @uuid = uuid();
Query OK, 0 rows affected (0.00 sec)

master > insert into uuid_test (binlog_format,uuid_string) values(@@binlog_format,@uuid);
Query OK, 1 row affected, 1 warning (0.00 sec)

update по той же схеме.

Возникает вопрос - а в чем разница-то? Ведь значение одно и то же пишется.
Почему необходимо запускать функцию uuid() именно на мастере и что будет, если запускать на слейве?

И второе - не налетал ли кто на подводные камни при использовании такой схемы?
Поделитесь, у кого был опыт пожалуйста.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 14.03.2018 23:05:01

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3879

Re: Генерация и хранение uuid в MySQL

Если выполнить функцию на слейве, то получится другой uuid. Это недетерменистическая функция, поэтому для statement-based репликации не подходит.

Неактивен

 

#3 14.03.2018 23:14:37

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2421

Re: Генерация и хранение uuid в MySQL

Благодарствую )


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 14.03.2018 23:24:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5838

Re: Генерация и хранение uuid в MySQL

deadka написал:

И второе - не налетал ли кто на подводные камни при использовании такой схемы?

дока рекомендует (гарантия качества)
https://dev.mysql.com/doc/refman/5.6/en … tions.html

дока написал:

As a workaround for the preceding limitations when statement-based replication is in effect, you can use the strategy of saving the problematic function result in a user variable and referring to the variable in a later statement. For example, the following single-row INSERT is problematic due to the reference to the UUID() function:

INSERT INTO t VALUES(UUID());

To work around the problem, do this instead:

SET @my_uuid = UUID();
INSERT INTO t VALUES(@my_uuid);

That sequence of statements replicates because the value of @my_uuid is stored in the binary log as a user-variable event prior to the INSERT statement and is available for use in the INSERT.

The same idea applies to multiple-row inserts, but is more cumbersome to use....

Неактивен

 

#5 15.03.2018 00:05:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2421

Re: Генерация и хранение uuid в MySQL

Ну доке верить надо. )
Отпишу, если будет что-то нештатное.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 15.03.2018 01:18:13

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Генерация и хранение uuid в MySQL

vasya написал:

deadka написал:

И второе - не налетал ли кто на подводные камни при использовании такой схемы?

дока рекомендует (гарантия качества)
https://dev.mysql.com/doc/refman/5.6/en … tions.html

дока написал:

As a workaround for the preceding limitations when statement-based replication is in effect, you can use the strategy of saving the problematic function result in a user variable and referring to the variable in a later statement. For example, the following single-row INSERT is problematic due to the reference to the UUID() function:

INSERT INTO t VALUES(UUID());

To work around the problem, do this instead:

SET @my_uuid = UUID();
INSERT INTO t VALUES(@my_uuid);

That sequence of statements replicates because the value of @my_uuid is stored in the binary log as a user-variable event prior to the INSERT statement and is available for use in the INSERT.

The same idea applies to multiple-row inserts, but is more cumbersome to use....

Ну кстати изящное решение. Я ведь правильно понял, что при statement-based репликации, в отличие от запросов, которые пишутся как есть, переменные перед попаданием в лог вычисляются?

Отредактированно Shopen (15.03.2018 01:18:36)

Неактивен

 

#7 15.03.2018 04:05:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5838

Re: Генерация и хранение uuid в MySQL

Судя по https://dev.mysql.com/doc/refman/5.6/en … gging.html

A statement to be logged might contain references to user-defined variables. To handle this, MySQL writes a SET statement to the binary log to make sure that the variable exists on the slave with the same value as on the master. For example, if a statement refers to a variable @my_var, that statement will be preceded in the binary log by the following statement, where value is the value of @my_var on the master:

SET @my_var = value;

сам INSERT, использующий переменную, останется неизменным. Но перед ним в логе будет SET, содержащий константное значение @my_uuid, чтобы гарантировать существование на слейве переменной с тем же именем и значением.

Неактивен

 

#8 15.03.2018 13:25:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2421

Re: Генерация и хранение uuid в MySQL

А касательного самого типа репликации? Ограничения, в контексте которых тред и начался - они  касаются statement-based. В случае mixed-реплакации мы, получается, также должны учитывать это ограничение на uuid() (и только в случае row-based репликации можем ""расслабиться)?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 15.03.2018 17:11:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5838

Re: Генерация и хранение uuid в MySQL

В случае mixed-реплакации тоже можем расслабиться, она как раз и предназначена для обработки таких случаев: если можем пишем в лог statement, в случае неоднозначности - row.
Теоретически mixed берет лучшее от statement и row. Но, почему-то, по дефолту mixed стоял только в 5.1 (потом вернули statement, сейчас row).

Неактивен

 

#10 15.03.2018 17:17:22

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2421

Re: Генерация и хранение uuid в MySQL

Мм, так все же, получается, нужно "читерить" с set @uuid = uuid();
в случае mixed-репликации? Раз уж она "по умолчанию" использует statement?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 15.03.2018 17:29:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5838

Re: Генерация и хранение uuid в MySQL

нет, не нужно
у mixed-репликации смешанный лог (в нем и  statement, и row вперемешку)
везде где возможно используется statement, но недетерминированные запросы (например, с uuid()) запишет в виде row

Неактивен

 

#12 15.03.2018 17:35:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2421

Re: Генерация и хранение uuid в MySQL

Спасибо большое!


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson