Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / MySQL / Проблемы и распространенные ошибки /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Распространенные ошибки при использовании MySQL - Программирование от RIN.RU
Распространенные ошибки при использовании MySQL



Ошибка Some non-transactional changed tables couldn't be rolled back


Получение ошибки/предупреждения: Warning: Some non-transactional changed tables couldn't be rolled back при попытке сделать ROLLBACK означает, что для некоторых использованных в транзакции таблиц не поддерживаются транзакции. Команда ROLLBACK на эти нетранзакционные таблицы не подействует.


Наиболее типичный случай возникновения такой ошибки связан с попыткой создать таблицу, тип которой не поддерживается бинарником mysqld. Если mysqld не поддерживает тип таблиц (или тип таблиц отключен опцией при запуске), то сервер создаст таблицу с типом, наиболее близким к запрошенному (скорее всего, MyISAM).


Чтобы проверить тип таблицы, следует выполнить:


SHOW TABLE STATUS LIKE 'table_name'. См. раздел SHOW TABLE STATUS.


Можно проверить, какие расширения поддерживает исполняемый файл mysqld, выполнив:


show variables like 'have_%'. См. раздел SHOW VARIABLES.


Ошибка Out of memory


По выданному запросу может быть получена ошибка следующего вида:


mysql: Out of memory at line 42, 'malloc.c'


mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)


ERROR 2008: MySQL client ran out of memory


Как видим, в ней есть ссылка на MySQL-клиент mysql. Причина этой ошибки в том, что клиенту просто не хватает памяти для размещения всего результата.


Чтобы устранить данную проблему, сначала проверьте правильность запроса. Действительно ли есть необходимость в том, чтобы запрос возвращал так много строк? Если да, то можно использовать mysql --quick, где для извлечения результирующего множества применяется mysql_use_result(). При этом уменьшается загрузка клиента (но увеличивается загрузка сервера).


Ошибка Packet too large


Когда клиент MySQL или сервер mysqld получают пакет с размерами, превышающими max_allowed_packet байтов, программа выдает ошибку Packet too large и закрывает соединение.


В MySQL 3.23 размер самого большого возможного пакета составляет 16 Mб (из-за ограничений клиент-серверного протокола). В MySQL 4.0.1 и выше размер пакета ограничивается только количеством имеющейся на сервере памяти (вплоть до теоретического максимума в 2 Гб).


Коммуникационный пакет - это одна команда SQL, посылаемая серверу, или одна строка, посылаемая клиенту.


Когда клиент MySQL или сервер mysqld получают пакет, размеры которого превышают max_allowed_packet байтов, программа выдает ошибку Packet too large и закрывает соединение. Если коммуникационный пакет слишком велик, то в некоторых клиентах может быть выдана ошибка Lost connection to MySQL server during query.


Отметим, что и клиент, и сервер имеют свои собственные переменные max_allowed_packet. Если требуется обрабатывать большие пакеты, то эту переменную необходимо увеличить как для клиента, так и для сервера.


Увеличение переменной не опасно, поскольку память выделяется только при необходимости; эта переменная скорее является мерой предосторожности для "отлавливания" неправильных пакетов между клиентом и сервером, а также для того, чтобы предупредить ситуацию нехватки памяти, вследствие случайного использования больших пакетов.


Если используется клиент mysql, то можно задать больший буфер, запустив клиент посредством mysql --set-variable=max_allowed_packet=8M. Для других клиентов существуют собственные методы установки этой переменной.


Для установки max_allowed_packet большего размера в mysqld можно также использовать файл опций. Например, если в таблице предполагается хранить значение типа MEDIUMBLOB максимальной длины, то нужно запускать сервер с опцией set-variable=max_allowed_packet=16M.


При использовании больших пакетов могут также возникать непредсказуемые проблемы, если вы работаете с большими значениями типа BLOB, и mysqld не был предоставлен доступ к достаточному объему памяти для обработки запроса. Если есть подозрение, что дело в этом, попробуйте добавить ulimit -d 256000 в начале скрипта safe_mysqld и перезапустить mysqld.


Коммуникационные ошибки / Оборванные соединения


Начиная с MySQL 3.23.40 ошибка Aborted connection выдается только в случае, если mysqld запущен с --warnings.


В журнале ошибок могут присутствовать ошибки наподобие этой:


010301 14:38:23 Aborted connection 854 to db: 'users' user: 'josh'


(см. раздел Журнал ошибок).


Такие ошибки сигнализируют об одной из следующих ситуаций:


  • Клиентская программа не выполнила mysql_close() перед выходом.

  • Клиент бездействовал на протяжении более чем wait_timeout или interactive_timeout (См. раздел SHOW VARIABLES).

  • Клиентская программа внезапно завершилась посреди передачи.


В подобных ситуациях увеличивается значение переменной сервера Aborted_clients.


Значение переменной сервера Aborted_connects увеличивается в следующих случаях:


  • Когда пакет соединения содержит неверную информацию.

  • Когда пользователь не имеет привилегий для соединения с базой данных.

  • Когда пользователь использует неверный пароль.

  • Когда на получение пакета соединения уходит более connect_timeout секунд.


Обратите внимание: все перечисленное выше может свидетельствовать о попытке взлома базы данных!


См. раздел SHOW VARIABLES.


Ниже перечислены другие причины проблем, которые могут возникнуть с оборванными клиентами или разорванными соединениями.


  • Использование как полудуплексного, так и полного дуплексного Ethernet-протокола под Linux. Данная ошибка присутствует во многих Linux-драйверах Ethernet. Выполните тест на данную ошибку - для этого следует передать очень большой файл через ftp-соединение между этими двумя машинами. Если передача проходит в режиме всплеск-пауза-всплеск-пауза ..., то можно констатировать наличие дуплексного синдрома Linux. Единственное
    решение проблемы - отключить как полу-, так и полнодуплексную передачу на концентраторах и коммутаторах.

  • Некоторая проблема с библиотекой потоков, вызывающая прерывания при чтении.

  • "Криво" сконфигурированный TCP/IP.

  • Дефектные Ethernet-карты, концентраторы, коммутаторы или кабели... Такие проблемы можно как следует диагностировать только путем замены
    оборудования.

  • max_allowed_packet слишком мала, или запросам требуется памяти больше, чем было выделено для mysqld (см. раздел Ошибка Packet too large).




Ошибка The table is full


Существует несколько случаев, когда выдается эта ошибка:


  • Используется старая версия MySQL (до 3.23.0), а размещенная в памяти временная таблица становится больше, чем tmp_table_size байтов. Для решения этой проблемы можно использовать опцию -O tmp_table_size=#, чтобы mysqld увеличил размер временных таблиц, или опцию SQL SQL_BIG_TABLES, перед тем как выдать сомнительный запрос (см. раздел Синтаксис команды SET). Можно также запускать mysqld с опцией --big-tables - эффект здесь будет таким же, как и от использования SQL_BIG_TABLES для всех запросов. В версии MySQL 3.23 размещенные в памяти временные таблицы после того, как размер таблицы превысит tmp_table_size, автоматически преобразуются в расположенные на диске таблицы типа MyISAM.

  • Используются таблицы InnoDB и исчерпалось место в табличном пространстве InnoDB. В таком случае следует увеличить табличное пространство InnoDB.

  • Используются таблицы ISAM или MyISAM в операционной системе, которая поддерживает файлы размером до 2 Гб, и файл данных или индексный файл достигли этого предела.

  • Используются таблицы MyISAM, и размер требуемых данных или индекса превышает тот, который предусматривался MySQL при выделении указателей (если MAX_ROWS не указано в CREATE TABLE, MySQL выделяет указатели, предусматривающие размещение только 4 Гб данных). Проверить максимальные размеры данных/индекса можно посредством


    SHOW TABLE STATUS FROM database LIKE 'table_name';


    или с помощью myisamchk -dv база_данных/таблица. Если проблема связана с указателями, то это можно исправить с помощью команды наподобие следующей:


    ALTER TABLE table_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;


    Указывать AVG_ROW_LENGTH нужно только для таблиц с полями типа BLOB/TEXT, поскольку в этом случае MySQL не может оптимизировать требуемое пространство, исходя только из количества строк.




Ошибка Can't create/write to file


Получение для некоторых запросов ошибки вида:


Can't create/write to file '\\sqla3fe_0.ism'.


означает, что MySQL не может создать в заданном временном каталоге временный файл для результирующего набора (приведенное сообщение об ошибке типично для Windows, примерно такой же вид имеет сообщение об ошибке Unix). Чтобы решить проблему, запустите mysqld с --tmpdir=path или добавьте в своем файле опций:


[mysqld]
tmpdir=C:/temp


исходя из предположения, что каталог 'c:\\temp' существует (см. раздел Файлы параметров 'my.cnf').


Проверьте также код полученной ошибки с помощью perror. Одной из причин также может быть ошибка переполнения диска;


shell> perror 28
Error code 28: No space left on device




<<<  НазадВперед  >>>
 1  2  3  4 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Как определить, чем вызваны проблемы

Вопросы, связанные с инсталляцией

Вопросы, связанные с администрированием

Проблемы, относящиеся к запросам

Вопросы, связанные с определением таблиц

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь