Автоинкремент, бекапы и денвер

Главные вкладки

Аватар пользователя neochief neochief 29 декабря 2008 в 18:13

Сегодня отловил одну очень неприятную штуку. В таблице users должен всегда находится пользователь с uid=0. Однако под стандартным денвером, при восстановлении бекапов, этот нулевой юзер не создается. Полагаю это все из-за того, что не включен режим NO_AUTO_VALUE_ON_ZERO (отправил запрос на форум денвера).

Решения:
1. Использовать друпаловские средства для бекапов. Это модуль Backup and Migrate.
2. Добавить в файле my.cnf в секции [mysqld] строку

sql-mode = NO_AUTO_VALUE_ON_ZERO

После чего денверский mysql будет делать все правильно.

Для справки. Отсутсвие нулевого значения в users пагубновлияет на некоторые аспекты работы сайта. Модули зачастую джойнят свои таблицы с таблицей users, и в таком случае не будут получать данных по анонимам вовсе.

Сею багу отловил после часовой мороки по поводу того, почему watchdog не показывает всех данных в логах.

Be aware.

Комментарии

Аватар пользователя kodo kodo 29 декабря 2008 в 18:20

Угу, я прочуствовал эту заморочку в первые дни знакомства с Друпалом... Smile
При восстановлении базы выдавало ошибку, ну для себя я решил, просто бэкап делаю этой таблицы отдельно и восстанавливаю сначала структуру, а затем запросом данные.
Правильно/не правильно... пока устраивает. Может кто лучший способ порекомендует восстановления этой таблицы из бэкапа?

Аватар пользователя neochief neochief 29 декабря 2008 в 18:52

Sypex dumper. Он делает правильный бекап, вот к примеру:

INSERT INTO `users` VALUES
(0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, NULL, '', '', '', NULL),
(1, 'admin', '098f6bcd4621d373cade4e832627b4f6', 'me@localhost.com', 0, 0, 0, '', '', 1229873446, 1230558809, 1230504552, 1, NULL, '', '', 'me@localhost.com', 'a:0:{}');

Просто когда нету NO_AUTO_VALUE_ON_ZERO, оно считает ноль за NULL и впихивает ему максимальное значение.

Аватар пользователя PVasili PVasili 30 декабря 2008 в 10:30

Я Sypex dumper использую ограниченно, только при небольших базах. На шаред ограничение на время работы php скриптов :(.

Аватар пользователя gorr gorr 30 декабря 2008 в 11:15

Аналогично, сталкивался с этой проблемой. Поясню тем, кто не сразу понял как это может "пагубно влиять" на своей ситуации. Тоже сделал бекап сайта, разработанного на локальном компе, перенес на сервер. Но затем заказчику потребовалось (в связи с нынешними скачками курса доллара относительно гривны и снижения покупательной способности населения) выставлять курс такой, какой он хочет на сайте, при этом любой пользователь может посмотреть цены на продукты как в долларах, так и в гривнах по такому курсу и кроме того, если пользователь уже выбрал валюту, в которой хочет смотреть цены, то она сохраняется в сессии и в дальнейшем он не будет вынужден опять кликать по кнопке пересчета в нужную валюту. Ну что, написал модуль для этого, под зарегистрированными пользователями работает, а под незарегистрированными - нет Sad
Полез в реализацию сессий в друпале и увидел эти иннер джойн в sess_read(). Смотрю, а нет у меня записи для незарегистрированного пользователя с айди = 0. Создал его и все пошло.

Аватар пользователя nleo nleo 30 декабря 2008 в 19:12

благодарю

"neochief" wrote:
Просто когда нету NO_AUTO_VALUE_ON_ZERO, оно считает ноль за NULL и впихивает ему максимальное значение.

а эта запись не создает никаких проблем, что у нас пользователь с пустыми полями? ну там с безопасностью что-нить

Аватар пользователя Химический Али Химический Али 11 января 2009 в 9:46

Тоже сталкивался несколько раз, только sypex не хотел вставлять 0-запись для анонима, говорил, что данные дублируются. До некоторых пор я просто удалял запись для анонима, пока не вылез баг в капче - она генерировала капча-комбинации на основе данных анонима.

Аватар пользователя Valeratal Valeratal 12 января 2009 в 20:52

да, была такая же проблема, с sypex
а что делать, бекапить то надо. Как быть? Удалять сначало нулевую запись, а потом создавать отдельно?

Аватар пользователя ND ND 2 февраля 2009 в 23:03

Полдня бился, прибэкапе выходила ошибка:
Неправильный запрос.
Duplicate entry '1' for key 1 (256)
Изменил Uid '0' на '2' и думал чем это чревато.
Сейчас зделал изменения в my.cnf и щастье мне перед сном Smile
спасибо neochief за решение и gorr за ссылку на эту тему.

Аватар пользователя Valeratal Valeratal 26 февраля 2009 в 9:55

подскажите, где обычно находится my.cnf
(для полноты темы)
а то в прошлый раз искал яндексом (в смысле искал, где обычно находится этот файл) Smile

Аватар пользователя VeloTaurus VeloTaurus 10 ноября 2015 в 11:46

Не всегда есть возможность изменить конфигурационник MySQL на сервере хостера. Поэтому я бы предложил иное решение этой известной проблемы. Можно выполнить следующий SQL-запрос:

update `users` set uid=0 where name=''

Он найдёт учётку анонима и исправит для неё поле uid на нулевое. Для автоматизации процесса достаточно в скрипт Sypex Dumper после строки 328 добавить такую строку:

$this->fn_write($fp, "update `users` set uid=0 where name='';");

В процессе создания бэкапа нужный SQL-запрос будет добавлен в файл дампа и при восстановлении всё будет ОК.

Подправленный скрипт прилагаю.

Аватар пользователя Sinn Sinn 12 января 2010 в 14:54

с sql-mode = NO_AUTO_VALUE_ON_ZERO
поле id mediumint(7) NOT NULL auto_increment, у меня всегда становится 0, autoincrement перестает работать. база эта у меня не дрюпаловская, но всё-равно - будьте внимательны.

безопаснее в dumper.php добавить
mysql_query('SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";');

Аватар пользователя gorr gorr 2 февраля 2010 в 20:44

Пробовал выставлять через SSH на хостинге:
mysql -u USER -pPASS --sql-mode='NO_AUTO_VALUE_ON_ZERO' MYDATABASE < dump.sql

Не выходит, выдает ошибку mysql: unknown variable 'sql-mode=NO_AUTO_VALUE_ON_ZERO'

Аватар пользователя AndreyL AndreyL 21 июня 2010 в 3:19

"VeloTaurus" wrote:
При прибитии нулевого юзера также перестаёт работать капча для анонимов, ибо сессия не открывается.

а мне старая установка мешала... юзер "0" был, а не работала. пока не удалил модуль (полностью, в т.ч. во вкладке "удалить") не хотела работать.