Вероятно сте запознати с двата формата на двоичен журнал , базиран на изрази – който регистрира действителните заявки, които променят данните на главния, така че да могат да бъдат изпълнени на подчинения, и базиран на редове – който регистрира преди и/или след изображения на действителните данни за ред, които са били променен от заявката, така че подчинения може директно да приложи тези промени към своите данни... и смесен режим, при който оптимизаторът и механизмът за съхранение определят кой формат е оптималният формат на база заявка по заявка.
Изявлението, което изпълнявате, не е безопасно по принцип защото използвате INSERT ... SELECT
в таблица с колона с автоматично увеличение. Ако заявка от тази обща форма бяха използвани в STATEMENT
-базирана среда и SELECT
не върна редовете в същия ред на главен и подчинен, редовете могат да бъдат избрани в различен ред и по този начин да се получат различни стойности за автоматично увеличение.
На практика специфичното заявката, която изпълнявате е детерминиран, защото вмъквате само един ред и изрично указвате стойността за автоматично увеличение. Подозирам, че това е причината за вашето объркване. Изглежда обаче, че все още задействате предупреждението, защото правите INSERT ... SELECT
в таблица с автоматично увеличение и изглежда, че сървърът прилага обобщеното „небезопасно“ определяне към заявката по принцип, а не по прецизност.
Превключване на вашия binlog_format
до MIXED
трябва да накара предупреждението да изчезне, тъй като сървърът може да превключва режимите по своя преценка... и е много малко вероятно да има отрицателни странични ефекти. Ако не беше фактът, че STATEMENT
винаги е бил по подразбиране (тъй като първоначално това беше единственият наличен вид репликация), подозирам, че биха направили MIXED
по подразбиране отдавна... всъщност, ако се запознаете с вътрешните елементи на двоичните регистрационни файлове, вероятно ще сте склонни да правите както аз и да използвате ROW
за почти всичко... има тенденция да прави много по-полезен двоичен дневник за отстраняване на неизправности и спасяване от проблеми, тъй като "старите" данни от ред се регистрират в DELETE
и UPDATE
.