Mysql error in file: /engine/classes/mysqli.class.php at line 52. проблема с бд или cms взломали?

9 ответов

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

Чтобы узнать больше о том, что не удалось, вы можете использовать и найти в разделе ПОСЛЕДНЯЯ ИНОСТРАННАЯ КЛЮЧЕВАЯ ОШИБКА, в котором содержатся сведения о что случилось.

В вашем случае это, скорее всего, причина того, что что-то ссылается на столбец country_id.

Вы также можете получить эту ошибку, пытаясь удалить несуществующий внешний ключ. Поэтому при удалении внешних ключей всегда проверяйте, действительно ли они существуют.

Если внешний ключ существует, и вы все еще получаете эту ошибку, попробуйте следующее:

//Удалите внешний ключ здесь!

Это всегда помогает мне:)

У меня были похожие проблемы однажды. Я удалил первичный ключ из ТАБЛИЦЫ A, но когда я пытался удалить столбец внешнего ключа из таблицы B, мне показалась та же самая ошибка выше.

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

Посмотрите файл ошибок для вашей базы данных mysql. Согласно ошибке # 26305 , мой sql не дает вам причину. Эта ошибка существует с MySQL 4.1; -)

Вероятно, существует другая таблица с внешним ключом, ссылающимся на первичный ключ, который вы пытаетесь изменить.

Чтобы узнать, какая таблица вызвала ошибку, вы можете запустить , а затем посмотрите на раздел

Используйте категории SHOW CREATE TABLE, чтобы показать имя ограничения.

Скорее всего, это будет category_ibfk_1

Используйте имя, чтобы сначала удалить внешний ключ, а затем столбец:

Выполнение

перед операцией тоже можно сделать свое дело.

Я бы предположил проблему ограничения внешнего ключа. Используется ли country_id как внешний ключ в другой таблице?

Я не гуру БД, но мне кажется, что я решил проблему, подобную этой (где было ограничение fk), удалив fk, выполнив изменения таблицы, а затем переделав fk.

Мне будет интересно услышать, каков будет результат — иногда mysql довольно загадочен.

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

  1. Rt. щелкните по своей схеме и выберите «инспектор схемы». Это дает вам различные таблицы, столбцы, индексы и т. Д.

  2. Перейдите на вкладку с именем «Индексы» и найдите имя столбца под столбцом с именем «Столбец». Найдя, проверьте имя таблицы для этой записи под именем столбца «Таблица». Если оно соответствует имени нужной вам таблицы, запишите имя внешнего ключа из столбца с именем «Имя».

  3. Теперь выполните запрос: ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Теперь вы можете выполнить оператор удаления, который будет успешно выполнен.

Я получил эту ошибку с MySQL 5.6, но она не имела ничего общего с внешними ключами. Это было на машине с Windows 7 Professional, действующей в качестве сервера в небольшой локальной сети.

Клиентское приложение выполняло пакетную операцию, которая создает таблицу, заполняет ее некоторыми внешними данными, затем запускает запрос, объединяющий постоянные таблицы, а затем отбрасывает «временную» таблицу. Этот пакет делает это примерно 300 раз, и эта конкретная процедура выполнялась неделя за неделей в течение нескольких лет, когда внезапно мы получаем ошибку 1025, Невозможно переименовать проблему в случайной точке пакета.

В моем случае приложение использовало 4 оператора DDL: CREATE TABLE, затем 3 CREATE INDEX, внешнего ключа нет. Однако только 2 из этих индексов фактически создаются, и фактический файл таблицы .frm был переименован в точке сбоя.

Моим решением было избавиться от отдельных операторов CREATE INDEX и создать их с помощью оператора CREATE TABLE. Это на момент написания статьи решило проблему для меня и моей помощи, когда кто-то почесал голову, когда нашел эту ветку.

7 ответов

18

Ссылка на (представленный в MySQL 5.6.3), вероятно, является отвлечением.

Не похоже, что вы имеете дело с выходным файлом mysqldump. Попробуйте утилиту .

Если вы не получили ответ , вы имеете дело с тем, что не является дамп-файлом из —- +: = 4 =: + —-, или вы имеете дело с чем-то, что было сжато (например, с gzip или bzip2), что вам нужно будет uncompress перед тем, как передать его в .

Если вы видите , то у вас определенно есть свой ответ … это сырая база данных SQLite, а не файл дампа MySQL.

Действительно, первые несколько байтов базы данных SQLite:

Обратите внимание, что 16-й октет здесь 0x00, объясняя сообщение в этом случае. Предполагается, что является ложным сигналом тревоги

Пользователи Windows: утилита «файл» является инструментом Unix, но можно найти версию Windows

5

Окна

Создайте свои файлы дампа с помощью этой команды

Использование:

1

У меня была эта ошибка один раз, после запуска в Windows PowerShell, например:

То, что я сделал, это изменить его на это (pipe вместо Set-Content):

И проблема исчезла!

1

Я тоже в PowerShell

Я столкнулся с этой проблемой, когда я использовал PowerShell для вызова mysqldump и > для вывода вывода в файл. PowerShell использовал неправильную кодировку при создании файла, и мне была предоставлена ​​такая же ошибка, когда я попытался импортировать файл с помощью mysql ..

Я обнаружил, что настройка кодировки по умолчанию для UTF8 в сеансе PowerShell разрешила эту проблему.

Мое разрешение — Тестирование PowerShell 5.1:

Пример: как я производил экспорт (упрощенный) :

Примечание. Обнаружено, что это не работает в PowerShell 4.0

В моей среде разработки было запущено 5.1, но prod — 4.0, и мое первоначальное исправление не работает в более старых версиях PowerShell.

Необходимо использовать

Это уже было предложено Ifedi

Вы пытались открыть в блокноте ++ (или другом редакторе) и преобразовать /сохранить нас в UTF-8?

Смотрите: https://stackoverflow.com/questions/7256049 /блокнота-превращающего ANSI-закодированы-файл-к-UTF-8

Другим вариантом может быть использование textwrangle для открытия и сохранения файла в виде UTF-8: http: //www.barebones.com/products/textwrangler/

Кто-то прислал мне сжатый gtar. Даже не был хорошо знаком с gtar, но это еще один формат сжатия.

Однако, я смог разложить его так же, как обычно:

И затем я мог бы сделать импорт:

Решение: Извлеките файл резервной копии, а затем восстановите извлеченный дамп sql.

Пример:

Резервная копия была взята как файл dump.sql.gz и извлечена с помощью gunzip cmd следующим образом:

И RESTORE извлечен файл dump.sql.

Ссылка: о бинарном и интерактивном режиме MySQL.

Это работает для меня и для всех!

Кластеризация

Кластеризация в общем смысле распределяет нагрузку на многие серверы, которые отображаются внешним приложением как один сервер.

MySQL NDB Cluster

MySQL NDB Cluster — это распределенный механизм хранения в памяти, не имеющий общего доступа, с синхронной репликацией и автоматическим разделением данных (извините, что я беру буквально из книги High Performance, но они там очень красиво). Это может быть высокопроизводительное решение для некоторых приложений, но веб-приложение, как правило, плохо работает на нем.

Основная проблема заключается в том, что помимо очень простых запросов (которые касаются только одной таблицы) кластеру, как правило, приходится искать данные на нескольких узлах, что позволяет латентности сети ползать и значительно замедлять время завершения запросов. Поскольку приложение рассматривает кластер как один компьютер, он не может сказать, с каким node извлечь данные из.

Кроме того, требование к памяти не подходит для многих больших баз данных.

Continuent Sequoia

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

Я прочитал несколько хорошие вещи, и в целом это звучит довольно многообещающе.

Федерация

Федерация похожа на кластеризацию, поэтому я потащил ее и здесь. MySQL предлагает федерацию через объединенный механизм хранения. Подобно кластерному решению NDB, он хорошо работает с простыми запросами, но еще хуже кластер для сложных (поскольку латентность сети намного выше).

Объявление обработчика

Чтобы объявить обработчик мы используем оператор DECLARE HANDLER:

DECLARE action HANDLER FOR condition_value statement;

Если значение условия совпадает со значением condition_value, MySQL выполнит оператор statement и продолжит или завершит текущий блок кода, исходя из значения action.

action может принимать следующие значения:

  • CONTINUE: исполнение блокированного кода (BEGIN … END) продолжается;
  • EXIT: выполнение блокированного кода, в котором был объявлен обработчик, завершается.

condition_value задает конкретное условие или класс условия, которые активируют обработчик.

condition_value может принимать одно из следующих значений:

  • код ошибки MySQL;
  • стандартное значение SQLSTATE. Или это может быть условие SQLWARNING, NOTFOUND или SQLEXCEPTION, которое является сокращением для класса значений SQLSTATE. Условие NOTFOUND используется для курсора или оператора SELECT INTO variable_list;
  • название условия, связанного либо с кодом ошибки MySQL, либо со значением SQLSTATE.

В качестве statement может использоваться простой оператор или составной оператор, вшитый с помощью ключевых слов BEGIN и END.

Ссылка на основную публикацию