Сегодня отловил одну очень неприятную штуку. В таблице users должен всегда находится пользователь с uid=0. Однако под стандартным денвером, при восстановлении бекапов, этот нулевой юзер не создается. Полагаю это все из-за того, что не включен режим NO_AUTO_VALUE_ON_ZERO (отправил запрос на форум денвера).
Решения:
1. Использовать друпаловские средства для бекапов. Это модуль Backup and Migrate.
2. Добавить в файле my.cnf в секции [mysqld] строку
После чего денверский mysql будет делать все правильно.
Для справки. Отсутсвие нулевого значения в users пагубновлияет на некоторые аспекты работы сайта. Модули зачастую джойнят свои таблицы с таблицей users, и в таком случае не будут получать данных по анонимам вовсе.
Сею багу отловил после часовой мороки по поводу того, почему watchdog не показывает всех данных в логах.
Be aware.
Комментарии
Угу, я прочуствовал эту заморочку в первые дни знакомства с Друпалом...
При восстановлении базы выдавало ошибку, ну для себя я решил, просто бэкап делаю этой таблицы отдельно и восстанавливаю сначала структуру, а затем запросом данные.
Правильно/не правильно... пока устраивает. Может кто лучший способ порекомендует восстановления этой таблицы из бэкапа?
А когда возникала ошибка? В смысле чем делали backup
Sypex dumper. Он делает правильный бекап, вот к примеру:
(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 и впихивает ему максимальное значение.
Я Sypex dumper использую ограниченно, только при небольших базах. На шаред ограничение на время работы php скриптов :(.
Аналогично, сталкивался с этой проблемой. Поясню тем, кто не сразу понял как это может "пагубно влиять" на своей ситуации. Тоже сделал бекап сайта, разработанного на локальном компе, перенес на сервер. Но затем заказчику потребовалось (в связи с нынешними скачками курса доллара относительно гривны и снижения покупательной способности населения) выставлять курс такой, какой он хочет на сайте, при этом любой пользователь может посмотреть цены на продукты как в долларах, так и в гривнах по такому курсу и кроме того, если пользователь уже выбрал валюту, в которой хочет смотреть цены, то она сохраняется в сессии и в дальнейшем он не будет вынужден опять кликать по кнопке пересчета в нужную валюту. Ну что, написал модуль для этого, под зарегистрированными пользователями работает, а под незарегистрированными - нет
Полез в реализацию сессий в друпале и увидел эти иннер джойн в sess_read(). Смотрю, а нет у меня записи для незарегистрированного пользователя с айди = 0. Создал его и все пошло.
благодарю
а эта запись не создает никаких проблем, что у нас пользователь с пустыми полями? ну там с безопасностью что-нить
нет
Тоже сталкивался несколько раз, только sypex не хотел вставлять 0-запись для анонима, говорил, что данные дублируются. До некоторых пор я просто удалял запись для анонима, пока не вылез баг в капче - она генерировала капча-комбинации на основе данных анонима.
да, была такая же проблема, с sypex
а что делать, бекапить то надо. Как быть? Удалять сначало нулевую запись, а потом создавать отдельно?
Ох люди... В статье описано корректное решение.
Полдня бился, прибэкапе выходила ошибка:
Неправильный запрос.
Duplicate entry '1' for key 1 (256)
Изменил Uid '0' на '2' и думал чем это чревато.
Сейчас зделал изменения в my.cnf и щастье мне перед сном
спасибо neochief за решение и gorr за ссылку на эту тему.
При прибитии нулевого юзера также перестаёт работать капча для анонимов, ибо сессия не открывается.
подскажите, где обычно находится my.cnf
(для полноты темы)
а то в прошлый раз искал яндексом (в смысле искал, где обычно находится этот файл)
В Денвере: usr/local/mysql5/my.cnf
а на хостинге?
/etc/mysql/my.cnf
/etc - папка конфигов
спасибо, а то каждый раз вспоминаю, где файлы, где конфиги
Не всегда есть возможность изменить конфигурационник MySQL на сервере хостера. Поэтому я бы предложил иное решение этой известной проблемы. Можно выполнить следующий SQL-запрос:
Он найдёт учётку анонима и исправит для неё поле uid на нулевое. Для автоматизации процесса достаточно в скрипт Sypex Dumper после строки 328 добавить такую строку:
В процессе создания бэкапа нужный SQL-запрос будет добавлен в файл дампа и при восстановлении всё будет ОК.
Подправленный скрипт прилагаю.
Спасибо!
Ничего не помогло... опять эта же ошибка....
может кто-нибудь знает как ее можно исправить...?
bug_l очень информативно... Какая ошибка и что ты делал, чтобы ее исправить, что не помогло?
Мне хостер сказал что не может поставить такой парамент - NO_AUTO_VALUE_ON_ZERO... Как бекапить?
Бекапьте как обычно, удаляйте учетку гостя из дампа - потом вручную восстановите.
Ого, хорошо, что нашла эту статью. Буду копаться
У друпалеров Британии тоже такие проблемы: http://www.drupaler.co.uk/blog/missing-anonymous-user/463
с 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";');
Пробовал выставлять через 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'
а мне старая установка мешала... юзер "0" был, а не работала. пока не удалил модуль (полностью, в т.ч. во вкладке "удалить") не хотела работать.