Как исправить ошибку 1050 mysql

Mysql 1050 ошибка «таблица уже существует», когда на самом деле это не я добавляю эту таблицу: и я получаю 1050 «таблица уже существует» но таблицы не существует. Есть идеи? EDIT: подробнее, потому что все, кажется, не верят мне:) 1146 — таблица ‘gunzfact_vbforumdb.contenttype ‘ не существует 1050-таблица ‘contenttype’ уже существует 24 ответов серьезно, у вас, […]

Содержание

  1. Mysql 1050 ошибка «таблица уже существует», когда на самом деле это не
  2. 24 ответов
  3. Ошибка Mysql 1050 «Таблица уже существует», хотя на самом деле это не так.

Mysql 1050 ошибка «таблица уже существует», когда на самом деле это не

я добавляю эту таблицу:

и я получаю 1050 «таблица уже существует»

но таблицы не существует. Есть идеи?

EDIT: подробнее, потому что все, кажется, не верят мне:)

1146 — таблица ‘gunzfact_vbforumdb.contenttype ‘ не существует

1050-таблица ‘contenttype’ уже существует

24 ответов

серьезно, у вас, вероятно, сломанный стол. Попробуйте:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • если у вас есть достаточные разрешения, удалите файлы данных (в /mysql/data/db_name)

из журнала MySQL:

я получил эту же ошибку, и таблица восстановления (из ответа @NullUserException) не помогла.

В конце концов я нашел данное решение:

для меня, без sudo , Я получил следующую ошибку:

(работает на OS X 10.6)

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

я боролся с этим весь день: у меня есть скрипт на Perl, который создает набор таблиц, выполнив DROP IF EXISTS . и CREATE ing их. The DROP удалось, но на CREATE Я получил это сообщение об ошибке: table already exists

я, наконец, добрался до сути: новая версия MySQL, которую я использую, имеет движок по умолчанию InnoDB («show engine G;»), я изменил его в my.cnf файл по умолчанию MyISAM, перезапустил MySQL, и теперь я больше не получаю » таблицу уже существует ошибка».

столкнувшись с той же проблемой (создайте таблицу InnoDB), это то, что наконец сработало для меня:

Я проверил на основе файла, разрешения, попытался восстановить и смыть, но ничего не получилось.

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

У меня была эта проблема на Win7 в Sql Maestro для MySql 12.3. Ужасно раздражает, на самом деле, остановка шоу. Ничто не помогало, даже удаление и воссоздание базы данных. У меня такая же настройка на XP, и она работает там, поэтому после прочтения ваших ответов о разрешениях я понял, что это должны быть разрешения Win7. Поэтому я запустил MySql как администратор, и хотя Sql Maestro был запущен нормально, ошибка исчезла. Таким образом, это должно было быть проблемой разрешений между Win7 и Для MySQL.

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

Я сделал «флеш-таблицы», и это очистило проблему.

такая же проблема возникла со мной при создании представления. Представление присутствовало ранее из-за некоторых изменений, которые он удалил, но когда я попытался добавить его снова, он показывал мне сообщение об ошибке «view already exists».

решение:

вы можете сделать одну вещь вручную.

  1. перейдите в папку MySQL, где вы установили его
  2. перейдите в папку данных внутри него.
  3. выберите базу данных и зайдите внутрь он.
  4. базы данных создает «.frm » формат файлов.
  5. удалить файл конкретной таблицы.
  6. Теперь создайте таблицу снова.

Он успешно создаст таблицу.

сначала проверьте, находитесь ли вы в правильной базе данных USE yourDB и Select * from contenttype просто посмотреть, что это такое и существует ли оно на самом деле.

У меня была такая же проблема в Mac OS X и MySQL 5.1.40. Я использовал eclipse для редактирования моего SQL-скрипта, а затем попробовал MySQLWorkbench 5.2.28. Вероятно, он преобразовал символы новой строки в формат Mac. Я понятия не имел, что не так с моим сценарием, пока я не прокомментировал первую строку в файле. После этого этот скрипт был интерпретирован mysql как один единственный комментарий. Я использовал встроенное приложение TextEdit Mac, чтобы исправить это. После того, как разрывы строк были преобразованы в правильный формат, ошибка 1050 ушедший.

обновление для пользователей Eclipse:

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

у меня был такой же случай. Проблема закончилась тем, что разрешения на родительский каталог.

я копировал файлы в mysql и из mysql во время тестирования.

было недостаточно, нужно было:

извините за воскрешение.

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

моим решением было удалить файлы ib_logfil0 , ib_logfile1 , ibdata1 и auto.cnf из папки данных MySQL; убедитесь, что сначала остановите службу MySQL перед удалением этих файлов.

затем после перезапуска службы MySQL воссоздал эти файлы, и я смог запустить сценарий резервного копирования, все мои CREATE s были хранится (файл sqldump).

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

в то время как мой скрипт входит

Как только я изменил имя базы данных на правильный случай, все это, казалось, работало. Использование MySQL Workbench на MAC OSX

эта проблема также возникает, если «представление» (воображаемая таблица) существует в базе данных с тем же именем, что и наше новое имя таблицы.

в моем случае я обнаружил, что это проблема с InnoDB; я никогда не обнаружил, в чем заключалась фактическая проблема, но создание как MyISAM позволило ему построить

вы не верите мне!! Ive просто удалите блок комментариев из моего .sql-файл и теперь все работает.

удаленный блок комментариев был такой:

Я оставил только проблемный стол в одном .sql-файл. После этого я удалил комментарии, остался только код, и ошибка пропадает.

для меня проблема была вызвана при использовании копии файловой системы каталога базы данных mysql вместо mysqldump. У меня есть очень большие таблицы, в основном MyISAM и несколько таблиц кэша InnoDB, и это не практично mysqldump данные. Поскольку мы все еще запускаем MyISAM, XtraBackup не является вариантом.

те же симптомы, что и выше произошло со мной. Таблицы нет, в каталоге нет файлов, относящихся к таблице, но она не может быть создана, потому что MySQL думает его там. Drop table говорит, что его нет, create table говорит, что он есть.

проблема возникла на двух машинах, обе были исправлены путем копирования резервных копий. Тем не менее, я заметил, что в моей резервной копии есть .MYD and .MYI файл, хотя я был под впечатлением, что эти файлы не используются для InnoDB. Этот.MYD and .Файлы MYI имели владельца root, в то время как.frm принадлежал mysql.

Если вы копируете из резервной копии, проверьте права доступа к файлам. Таблицы Flush могут работа, но я решил закрыть и перезапустить базу данных.

боже, у меня была такая же проблема с osCommerce установить скрипт, пока я не выяснил, что система mysql имеет много баз данных и create table запрос копирует себя в каждый и, таким образом, удаление только рабочей таблицы на активной БД не помогло, мне пришлось удалить таблицу из всех dbs

мой оператор CREATE был частью промежуточного дампа env.

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

я натыкаюсь на тот факт, что (один из многих) оператор CREATE прошел, когда я исправил чувствительность к регистру имени базы данных. Что-то щелкнуло. Я повторил то же самое для других столов.

однако на сцену вышла новая ошибка. Прямые кавычки для «комментариев» бросали синтаксическую ошибку. Я был потрясен. заменил их, но новая ошибка начала появляться. Наконец-то я нашел решение.

решение: дамп, который я использовал, мог быть из другой версии MySql. Я получил разрешение подключиться к промежуточному MYsql, используя локальный (установленный на моей машине) MySQL workbench. Я не rdp в промежуточный сервер для входа в промежуточный MySQL workbench. Создал дамп оттуда. Побежал на свалку и это сработало как конфета.

пытался импортировать резервный файл sql, но получал ошибку; 1050 «таблица уже существует»

моя установка была такой:

  1. изменен движок сервера с InnoDB на MyISAM
  2. используя phpMyAdmin удалил базу данных, которую я пытался импортировать в
  3. перезапустил службу mysql
  4. попробовал реимпорт и он работал

у меня были огромные проблемы с ошибкой 1050 и 150.

проблема для меня заключалась в том, что я пытался добавить ограничение с ON DELETE SET NULL как одно из условий.

изменение ON DELETE NO ACTION позволил мне добавить необходимые ограничения FK.

к сожалению, сообщения об ошибках MySql совершенно бесполезны, поэтому мне пришлось найти это решение итеративно и с помощью ответов на вопрос выше.

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

автоматическое решение, которое сработало для меня, — заменить обычную таблицу drop на этот sed во время дампа, чтобы также удалить любые представления, которые могут существовать:

или если вы предпочитаете печатать в файл для резервного копирования

или если вы получили сбросил файл и импортируете его в свой db

Примечание: важно, чтобы вы добавить ^ в начале регулярного выражения замены, потому что есть другие типы DROP TABLE IF EXISTS команды в дампах, которые вы не хотите трогать.

Источник

Ошибка Mysql 1050 «Таблица уже существует», хотя на самом деле это не так.

Я добавляю эту таблицу:

И я получаю 1050 «таблица уже существует»

Но таблицы НЕТ. Любые идеи?

РЕДАКТИРОВАТЬ: подробнее, потому что все, кажется, мне не верят 🙂

1146 — Table ‘gunzfact_vbforumdb.contenttype’ doesn’t exist

1050 — Table ‘contenttype’ already exists

Серьезно, у вас, вероятно, сломанный стол. Пытаться:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • Если у вас достаточно прав, удалите файлы данных (в / mysql / data / db_name)

из журнала MySQL:

У меня такая же ошибка, и REPAIR TABLE (из ответа @ NullUserException) не помогла.

В конце концов я нашел это решение :

У меня без этого sudo была следующая ошибка:

(Работает на OS X 10.6)

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

Я боролся с этим весь день: у меня есть сценарий Perl, который создает набор таблиц, сначала выполняя DROP IF EXISTS . над ними CREATE операцию, а затем вставляя их. DROP Удалось, но CREATE я получил сообщение об ошибке: table already exists

Я наконец дошел до сути: новая версия MySQL, которую я использую, имеет движок по умолчанию InnoDB («show engine G;»). Я изменил его в файле my.cnf на MyISAM по умолчанию, повторно запустил MySQL, и теперь я больше не получаю ошибку «таблица уже существует».

Та же проблема возникла у меня при создании представления. Представление присутствовало раньше, из-за некоторых изменений оно было удалено. Но когда я попытался добавить его снова, он показывал мне сообщение об ошибке «представление уже существует».

Решение :

Одно можно сделать вручную.

  1. Перейдите в папку MySQL, в которую вы его установили.
  2. Перейдите в папку с данными внутри него.
  3. Выберите свою базу данных и войдите в нее.
  4. База данных создает файлы формата «.frm».
  5. удалить файл конкретной таблицы.
  6. Теперь снова создайте таблицу.

Таблица будет успешно создана.

Столкнувшись с той же проблемой (создайте таблицу InnoDB), это то, что наконец сработало для меня:

Я проверил файловую основу, разрешения, попытался ВОССТАНОВИТЬ и ПРОМЫВИТЬ, но ничего не помогло.

Так что, если это вариант, переместите все рабочие таблицы в другую БАЗУ ДАННЫХ, отбросьте старую (возможно, вам придется вручную удалить все файлы из папки базы данных, прежде чем падение заработает) , переименуйте новую, и вы «должны» быть обратно на свой путь. Очевидно, все, что «кэшируется» с помощью InnoDB, удаляется вместе с исходной базой данных.

У меня была эта проблема на Win7 в Sql Maestro для MySql 12.3. Чрезвычайно раздражает, на самом деле препятствие для шоу. Ничего не помогло, даже сброс и воссоздание базы данных. У меня такая же установка на XP, и она там работает, поэтому, прочитав ваши ответы о разрешениях, я понял, что это должны быть разрешения Win7. Итак, я запустил MySql от имени администратора, и хотя Sql Maestro работал нормально, ошибка исчезла. Так что это, должно быть, проблема с разрешениями между Win7 и MySql.

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

Я сделал «ПРОМЫВИТЬ ТАБЛИЦЫ», и это устранило проблему.

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

Мое решение было удалить файлы ib_logfil0 , ib_logfile1 , ibdata1 и auto.cnf из папки данных MySQL; перед удалением этих файлов обязательно остановите службу MySQL.

Затем после перезапуска службы MySQL воссоздала эти файлы, и я смог запустить сценарий резервного копирования, в котором все мои файлы CREATE были сохранены (файл sqldump).

Сначала проверьте, правильно ли вы находитесь в базе данных, USE yourDB и попробуйте Select * from contenttype просто посмотреть, что это такое и существует ли она на самом деле .

У меня была такая же проблема с Mac OS X и MySQL 5.1.40. Я использовал eclipse для редактирования своего SQL-скрипта, а затем попробовал MySQLWorkbench 5.2.28. Вероятно, он преобразовал символы новой строки в формат Mac. Я понятия не имел, что не так с моим скриптом, пока не закомментировал первую строку в файле. После этого этот сценарий был интерпретирован mysql как один-единственный комментарий. Я использовал встроенное приложение TextEdit для Mac, чтобы исправить это. После того, как разрывы строк были преобразованы в правильный формат, ошибка 1050 исчезла.

Обновление для пользователей Eclipse:

Чтобы настроить окончание по умолчанию для новых создаваемых файлов во всей рабочей области:

Window -> Preferences -> General -> Workspace -> New text file line delimiter.

Чтобы преобразовать существующие файлы, откройте файл для редактирования и для текущего редактируемого файла перейдите в меню:

File -> Convert Line Delimiters To

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

Во время тестирования я копировал файлы в mysql и из него.

было недостаточно, нужно было:

Извините, что воскресил.

У меня были огромные проблемы с ошибками 1050 и 150.

Для меня проблема заключалась в том, что я пытался добавить ограничение с ON DELETE SET NULL одним из условий.

Изменение на ON DELETE NO ACTION позволило мне добавить необходимые ограничения FK.

К сожалению, сообщения об ошибках MySql совершенно бесполезны, поэтому мне пришлось искать это решение итеративно и с помощью ответов на вопрос выше.

Вы мне не поверите! Я только что удалил блок комментариев из моего файла .sql, и теперь он работает.

Блок удаленного комментария был следующим:

Я оставил проблемную таблицу в том же файле .sql. После этого я удалил комментарии, остался единственный код, и ошибка исчезла.

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

Пока мой сценарий включен

Как только я изменил имя базы данных на правильный регистр, все, казалось, сработало. Использование MYSQL Workbench в MAC OSX

Эта проблема также возникает, если в базе данных существует «представление» (воображаемая таблица) с тем же именем, что и имя нашей новой таблицы.

В моем случае я обнаружил, что это проблема с InnoDB; Я так и не узнал, в чем была настоящая проблема, но создание MyISAM позволило ему создать

Для меня проблема была вызвана использованием копии файловой системы каталога базы данных mysql вместо mysqldump. У меня есть несколько очень больших таблиц, в основном MyISAM и несколько кеш-таблиц InnoDB, и использовать mysqldump для данных непрактично. Поскольку мы все еще используем MyISAM, XtraBackup не подходит.

Со мной случились те же симптомы, что и выше. Таблицы нет, в каталоге нет файлов, относящихся к таблице, но ее нельзя создать, потому что MySQL считает ее там. Drop table говорит, что его нет, create table говорит, что есть.

Проблема возникла на двух машинах, обе исправили копированием бэкапов. Однако я заметил, что в моей резервной копии были файлы .MYD и .MYI, хотя у меня сложилось впечатление, что эти файлы не используются для InnoDB. Файлы .MYD и .MYI имели владельца root, а файл .frm принадлежал mysql.

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

Источник

If you’re getting an error that reads something like “ERROR 1050 (42S01): Table ‘customers’ already exists” when trying to create a table in MySQL, it’s probably because there’s already a table in the database with the same name.

To fix this issue, either change the name of the table you’re trying to create, or check the existing table to see if it’s the one you actually need.

Example of Error

Here’s an example of code that produces the error:

CREATE TABLE Customers (
  CustomerId int NOT NULL PRIMARY KEY,
  CustomerName varchar(60) NOT NULL
  );

Result:

ERROR 1050 (42S01): Table 'customers' already exists

In this case, I’m trying to create a table called Customers, but it already exists in the database.

Solution 1

The most obvious solution is to change the name of the table we’re creating:

CREATE TABLE Customers2 (
  CustomerId int NOT NULL PRIMARY KEY,
  CustomerName varchar(60) NOT NULL
  );

Result:

Query OK, 0 rows affected (0.02 sec)

Here, I simply renamed the table to Customers2. In practice, we would probably give it a more appropriate name.

We should also be mindful that if there’s already a table with the same name as the one we’re trying to create, there’s a possibility that our desired table has already been created. In this case we wouldn’t need to recreate it (unless we had good reason). We could either just go ahead and use it, or we could alter it to suit our new requirements.

Solution 2

Another way to deal with this error is to suppress it. We can modify our CREATE TABLE statement to only create the table if it doesn’t already exist:

CREATE TABLE IF NOT EXISTS Customers (
  CustomerId int NOT NULL PRIMARY KEY,
  CustomerName varchar(60) NOT NULL
  );

Result:

Query OK, 0 rows affected, 1 warning (0.00 sec)

In this case, we got a warning. Let’s check the warning:

SHOW WARNINGS;

Result:

+-------+------+----------------------------------+
| Level | Code | Message                          |
+-------+------+----------------------------------+
| Note  | 1050 | Table 'Customers' already exists |
+-------+------+----------------------------------+
1 row in set (0.00 sec)

The warning explicitly tells us that the table already exists.

The Table REALLY Doesn’t Exist?

If you believe that the table really doesn’t exist, perhaps there’s something else going on. See this article on Stack Overflow for a discussion on possible solutions.

0 Пользователей и 1 Гость просматривают эту тему.

  • 7 Ответов
  • 21988 Просмотров

Здравствуйте. Извиняюсь заранее, если вопрос идиотский :) Вроде сделал сайт на Joomla, стал переносить хостинг и при импорте базы данных столкнулся с такой штукой:

Ошибка

SQL-запрос:

— phpMyAdmin SQL Dump
— version 2.6.1
— http://www.phpmyadmin.net

— Хост: localhost
— Время создания: Дек 16 2009 г., 11:09
— Версия сервера: 5.0.45
— Версия PHP: 5.2.4

— БД: `goman`

— ———————————————————

— Структура таблицы `jos_banner`

CREATE TABLE `jos_banner` (
`bid` int( 11 ) NOT NULL AUTO_INCREMENT ,
`cid` int( 11 ) NOT NULL default ‘0’,
`type` varchar( 30 ) NOT NULL default ‘banner’,
`name` varchar( 255 ) NOT NULL default »,
`alias` varchar( 255 ) NOT NULL default »,
`imptotal` int( 11 ) NOT NULL default ‘0’,
`impmade` int( 11 ) NOT NULL default ‘0’,
`clicks` int( 11 ) NOT NULL default ‘0’,
`imageurl` varchar( 100 ) NOT NULL default »,
`clickurl` varchar( 200 ) NOT NULL default »,
`date` datetime default NULL ,
`showBanner` tinyint( 1 ) NOT NULL default ‘0’,
`checked_out` tinyint( 1 ) NOT NULL default ‘0’,
`checked_out_time` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`editor` varchar( 50 ) default NULL ,
`custombannercode` text,
`catid` int( 10 ) unsigned NOT NULL default ‘0’,
`description` text NOT NULL ,
`sticky` tinyint( 1 ) unsigned NOT NULL default ‘0’,
`ordering` int( 11 ) NOT NULL default ‘0’,
`publish_up` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`publish_down` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`tags` text NOT NULL ,
`params` text NOT NULL ,
PRIMARY KEY ( `bid` ),
KEY `viewbanner` ( `showBanner` ),
KEY `idx_banner_catid` ( `catid` )
) ENGINE = MYISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT =1;

Ответ MySQL: Документация
#1050 — Table ‘jos_banner’ already exists

Не могли бы вы пояснить в чём тут дело?

Заранее огромное спасибо!

Так sql сама сказала ответ Ответ MySQL: Документация
#1050 — Table ‘jos_banner’ already exists
Что означает что таблица с таким названием уже есть в базе, удалите ее и все пойдет.

Спасибо. Я же говорил, что я …  ;D

« Последнее редактирование: 16.12.2009, 15:31:39 от Ksen »

Записан

Так sql сама сказала ответ Ответ MySQL: Документация
#1050 — Table ‘jos_banner’ already exists
Что означает что таблица с таким названием уже есть в базе, удалите ее и все пойдет.

СПАСИБО, ПОМОГЛО!

СПАСИБО, ПОМОГЛО!

Как решили проблему?

Что означает что таблица с таким названием уже есть в базе, удалите ее и все пойдет.

Хотя всегда предварительно делайте бекапы.

Хотя всегда предварительно делайте бекапы.

Где найти эту таблицу в OSPanel? В панели phpMyAdmin я удалил все лишние базы и все равно выдает ошибку. Если можно поподробнее.

Где найти эту таблицу в OSPanel?  Если можно поподробнее.

примерный путь
OpenServerOSPaneluserdataMySQL-5.6-x64
конкретно зависит от:
1) в какую папку поставлен OSPanel
2) Какая версия MySQL у вас  включена в настройках
MySQL-5.6-x64
MySQL-5.6
MySQL-5.4
по OSPanel  есть подробный хелп на сайте разработчиков

When ALTER TABLE crashes MySQL server it leaves orphaned records in InnoDB dictionary. It is annoying because next time you run the same ALTER TABLE query it will fail with error:

Shell

ERROR 1050 (42S01) at line 1: Table ‘sakila/#sql-ib712’ already exists

1

ERROR 1050 (42S01) at line 1: Table ‘sakila/#sql-ib712’ already exists

The post explains why it happens and how to fix it.

When you run ALTER table InnoDB follows the plan:

Block the original table

Create an empty temporary table with the new structure. The name of the new table is something like #sql-ib712.

Copy all records from the original table to the temporary one

Swap the temporary and original tables

Unblock the original table

The temporary table is a normal InnoDB table except it’s not visible to a user. InnoDB creates a record in the dictionary for the temporary table as for any other table.

If MySQL crashes in the middle of the ALTER process the dictionary ends up with an orphaned table.

We wouldn’t care much if the temporary table name were random. But it’s not and when you run ALTER TABLE again, InnoDB picks up the same name for the temporary table. As long as a record for a table with the same name already exists in the dictionary the subsequent ALTER fails.

How to fix “ERROR 1050 (42S01) at line 1: Table ‘sakila/#sql-ib712’ already exists”

MySQL suggests quite cumbersome method. In short you need to fool MySQL with a fake .frm file so you can DROP the temporary table with an SQL query. It works fine, but the structure of the fake table in .frm file must match the structure in the dictionary. It’s not that easy to find out. Fortunately you don’t need to.

An idea is following.

Not only DROP TABLE removes a records from InnoDB dictionary, DROP DATABASE does it too.

In case of DROP TABLE you need to specify exact name of the table while in case of DROP DATABASE InnoDB will delete all tables for a given database.

To get a clean dictionary for a given database we need to do following:

Create empty temporary database. Let it be tmp1234

Move all tables from the original database to tmp1234

Drop the original database (it’s empty by now, all tables are in tmp1234)

Create the original database again

Move all tables from the temporary database to the original one.

Drop the empty temporary database.

Here’s a script that performs this task. It must be run by root and mysql command should connect to the server without asking the password. Stop all writes to the database before running the script.

#!/usr/bin/env bash

set -eu

for db in `mysql -NBe «SHOW DATABASES» | grep -wv -e mysql -e information_schema -e mysql -e performance_schema`; do

        db_tmp=tmp$RANDOM

        c=`mysql -NBe «select COUNT(*) from information_schema.tables WHERE TABLE_SCHEMA = ‘$db’ AND TABLE_TYPE <> ‘BASE TABLE'»`

        if [ «$c» -ne 0 ]; then

                echo «There are non-base tables (views etc) in $db»

                continue

        fi

        mysql -e «CREATE DATABASE `$db_tmp`»

        IFS=»

«

        for t in `mysql -NBe «SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ‘$db’ AND TABLE_TYPE = ‘BASE TABLE'»`; do

                echo «Moving $db.$t to $db_tmp.$t»

                mysql -e «RENAME TABLE `$db`.`$t` TO `$db_tmp`.`$t`»

        done

        n=`mysql -e «SHOW TABLES» «$db»| wc -l`

        if [ $n -ne 0 ]; then

                echo «there are $n tables in $db , not gonna drop it!»

                exit -1

        fi

        datadir=`mysql -NBe «SELECT @@datadir»`

        rm -f «$datadir/$db/»*

        mysql -e «DROP DATABASE  `$db`»

        mysql -e «CREATE DATABASE `$db`»

        for t in `mysql -NBe «SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ‘$db_tmp’ AND TABLE_TYPE = ‘BASE TABLE'»`; do

                echo «Moving $db_tmp.$t to $db.$t»

                mysql -e «RENAME TABLE `$db_tmp`.`$t` TO `$db`.`$t`»

        done

        n=`mysql -e «SHOW TABLES» «$db_tmp»| wc -l`

        if [ $n -ne 0 ]; then

                echo «there are $n tables in $db_tmp , not gonna drop it!»

                exit -1

        fi

        mysql -e «DROP DATABASE `$db_tmp`»

done

Понравилась статья? Поделить с друзьями:
  • Как исправить ошибку 105 на телевизоре lg
  • Как исправить ошибку 105 на андроид
  • Как исправить ошибку 1020 на сайте
  • Как исправить ошибку 102 на макбуке
  • Как исправить ошибку 102 на андроид