Вопросы СУБД MySQL

Версия для печати

Материал из База знаний Joomla

Перейти к: навигация, поиск

Содержание

У меня случилось так, что все новые статьи/пользователи/категории/… приобретают ID=0. С чего вдруг?

Все дело в наличии аттрибута auto_increment в таблице, отвечающей за хранение заданных объектов. Для пользователей это таблица #__users и ее поле id. В phpMyAdmin надо всего лишь выставить данный аттрибут для заданного поля (чаще всего оно называется id). При работе на высоких версиях MySQL может возникать ошибка вроде «Duplicate entry '0' for key XXX». Как выставить авто_инкремент для какого-то поля написано в этом FAQ’е, прочитайте его до конца.


Я получаю ошибку «DB function failed with error number 1016 Can’t open file: 'XXXXXX.MYI'.»

Надо в phpMyAdmin или консоли MySQL выбрать базу где стоит джумла и выполнить запрос

REPAIR TABLE XXXXXX

В случае если ошибка не исчезла — обратитесь к хостинговой компании.


При установке/экспорте дампа происходит ошибка «You have an error in your SQL syntax near 'ENGINE=MyISAM DEFAULT CHARSET=latin1' at line XXX»

Эта ошибка означает, что вы ставите параною на старую версию MySQL или восстанавливаете дамп от более новой версии MySQL на более старую. Этого можно избежать двумя способами:

  • Правильно настроить параметры экспорта дампа (что-то про версии, там должен быть select-box со списком СУБД). Более точно это может быть переведено как совместимость (MYSQL40).
  • Руками в уже готовом дампе удалить все фразы вроде «DEFAULT CHARSET=latin1» и заменить «ENGINE=MyISAM» на «TYPE=MyISAM»


При переносе дампа возникает ошибка "You have an error in your SQL syntax ... use near 'DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1' at line XX"

Этот вопрос аналогичен предыдущему. Новый MySQL не понимает старых конструкций определяющих кодировки таблиц (в 4.1 и 4.0 кодировки задаются разными командами). Надо руками удалить все вхождения "DEFAULT CHARSET = cp1251" или выбирать правильный тип экспорта дампа.


Как создать автоинкремент (auto_increment) для некоторых полей посредством phpMyAdmin

Заходим в phpMyAdmin. Выбираем нашу базу и нашу таблицу. Видим список полей доступных в этой таблице. Слева галочкой выбираем нужное нам поле и внизу нажимаем на карандашик, то есть переходим к редактированию поля. В столбике «Дополнительно» выбираем опцию auto_increment и нажимаем кнопку Сохранить. Теперь у поля должен появиться флаг auto increment.

Хочу заметить, что это только для разовых операций, намного проще сделать правильные настройки при создании дампа.


У моего провайдера, нестандартный порт MySQL (не 3306 как обычно, а 666). Как мне установить Joomla

При указании хоста MySQL надо указать порт через двоеточие, например

localhost:666


Может ли Joomla работать с СУБД отличными от MySQL

Нет. Поддержки других СУБД в ней нет. Это планируется в следующих версиях. Сложность внедрения mySQL в текущую версию обусловлена тем, что под J написано очень-очень-очень много всяких расширений, использующих враппер-класс database. Но этот класс не более чем обертка над функциями mysql_*, хотя и очень удобная. Ни о какой абстракции речи не идет. Везде и всюду используются чисто mysql-конструкции, которые легко не переносимы на другие диалекты. Так пошло со времен мамбы. В коде 1.5 никаких подвижек на данный момент нет. Хотя, собственно, никто и не обещал это именно в этой версии.


Возникает ошибка "Warning: mysql_query(): Unable to save result set in /xxx/includes/database.php on line 289"

Эта ошибка означает, что у вас испорчена одна из таблиц. Для ее устранения надо открыть phpMyAdmin и посмотреть список таблиц. Испорченная таблица будет выделена специальным сообщением (про нее что-то будет написано). Для примерной идентификации таблицы можно посмотреть какой компонент запущен, если это статья, то возможно это com_content или таблица com_categories. После определения таблицы стоит в окне исполнения SQL-запроса выполнить запрос "REPAIR TABLE имя_таблицы". Но помните, что операция восстановления может удалить данные, которые были испорчены и которые невозможно восстановить. Если есть бэкап (резервная копия) то лучше восстановить базу данных оттуда (но это в случае, если вы точно знаете, что таблица зависела от других таблиц), если же таблица ни от кого не зависела, то смысла восстанавливать базу целиком нет. О том, сколько строк было удалено вам будет сообщено в сообщении после исполнения данного запроса.


Как сделать дамп базы данных и что такое дамп

Дамп ("Dump", англ) - это слепок, образ базы данных на определенный момент времени записанный при помощи SQL-инструкций вставки/удаления данных. По сути это набор инструкций для СУБД как и куда она должна вставлять тот или иной текст. Задача создания дампа возникает при создании резервной копии сайта. Т.е. сайт на Joomla состоит из двух частей - базы данных и файлов написанных на php с программным кодом. И если вторые можно легко заархивировать на хостинге и скопировать домой, то резервную копию базы данных можно сделать в следующих программах-скриптах:

  • PhpMyAdmin - сейчас установлен практически на любом хостинге.
  • Sypex Dumper - скрипт для создания дампов, написанный русским программистом.
  • Staggered MySQL Dump Importer - создан для импорта больших объемов баз данных.

Очень важно обратить внимание на то, в какой кодировке делается дамп. Для Joomla RE (ветки 1.0.х) кодировкой, в которой она работает, является cp1251. Во-первых сам текстовый файл дампа должен быть в этой кодировке (заведите себе нормальный текстовый редактор, не пользуйтесь блокнотом, а используйте, например, Bred3, он умеет читать как минимум четыре кодировки), а во вторых в параметрах конструкции CREATE TABLE явно должна быть указана кодировка таблицы.


Ошибка - mosmenu::store failed "Incorrect integer value: for column 'published' at row 1 SQL= ..."

Смотри следующий вопрос.


Ошибка - mosmenu::store failed "Out of range value adjusted for column 'id' at row 1 SQL=INSERT INTO ..."

Данная ошибка возникает вследствие того, что Joomla не правильно работает с MySQL высоких верий (например, 5.0 и далее). Для решения данной проблемы можно изменить версию MySQL (в случае если вы отлаживаете сайт дома) или обратиться к хостеру для того, что бы он настроил MySQL и она разрешала использовать старый синтаксис.


Ошибка - moscontent::store failed "Duplicate entry '0' for key i SQL=..."

У столбца id (скорее всего) какой-либо таблицы потерялся параметр auto_increment. Такое может произойти, например, при переносе дампа базы данных, когда вы невнимательно выставляете параметры импорта в файл. Решением проблемы является выставление параметра auto_increment для нужной таблицы. Имя таблицы можно увидеть в теле запроса. Начинается оно (по умолчанию) со строки jos_, например jos_users. О том как выставить данный атрибут написано чуть выше.


DB function failed with error number 145 Table xxx is marked as crashed and should be repaired SQL = ...

В phpMyAdmin выполните следующий SQL-запрос:

REPAIR TABLE xxx

В случае если ошибка не исчезла — обратитесь к хостинговой компании. Причиной же возникновения самой такой ситуации может быть все что угодно. Начиная от сбоя файловой системы или зависания MySQL. Joomla или попытка взлома тут совершенно ни при чем. Просто сбой.


Ошибка - mossession::store failed DB function failed with error number 1044 Access denied for user 'XXX'@'%' to database 'ZZZ'

Эта ошибка означате, что возможно при переносе сайта вы забыли указать правильный логин или пароль в файл конфигурации configuration.php для доступа Joomla к базе данных MySQL. Если переводить дословно - доступ запрещен. А запрещен он может быть либо потому что не правильно указан пользователь, либо неправильно указан пароль. Скорее всего проблему можно решить установив для пользователя новый пароль или создав нового пользователя БД и наделив его правами на доступ к вашей базе данных.

К этой странице обращались 61 946 раз.
Последнее изменение этой страницы: 20:37, 22 октября 2008.