Ok — Trying out the docker container version of Zabbix for the first time and using this as the reference: https://www.zabbix.com/documentation/4.0/manual/installation/containers
I brought up a mysql container using mysql:5.7.
I then deployed a zabbix-server-mysql:alpine-latest and pointed it to the mysql instance.
I got a log stating:
** Creating ‘zabbix’ user in MySQL database
8/20/2018 11:55:45 AM ** Database ‘zabbix’ already exists. Please be careful with database COLLATE!
8/20/2018 11:55:45 AM ** Creating ‘zabbix’ schema in MySQL
8/20/2018 11:55:45 AM ERROR 1050 (42S01) at line 1: Table ‘users’ already exists
I guess the DB would exist since the mysql container instructions had you create a DB named zabbix. What I don’t expect is that the table ‘users’ already to exist.
A little further down in the logs, I get:
cannot use database «zabbix»: its «users» table is empty (is this the Zabbix proxy database?)
It seems like the initial mysql container deployment either shouldn’t specify a zabbix database, since the zabbix-server-mysql instance tries to create it, or the zabbix-server-mysql instance needs to work some magic if the table already exists.
Содержание
- forum.lissyara.su
- Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Услуги хостинговой компании Host-Food.ru
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
- Database.Guide
- Beginners
- Categories
- Fix ERROR 1050 (42S01) “Table … already exists” in MySQL
- Example of Error
- Solution 1
- Solution 2
- The Table REALLY Doesn’t Exist?
- Mysql 1050 ошибка «таблица уже существует», когда на самом деле это не
- 24 ответов
forum.lissyara.su
Если проблема не решается сама, значит она неразрешима
Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Здравствуйте.
Установил apache, mysql, и zabbix. Создал пользователя zabbix, и добавил его в группу zabbix.
Устанавливал zabbix следующим образом:
cd /usr/ports/net-mgmt/zabbix2-server
make install clean
В mysql создал DB:
CREATE DATABASE zabbix CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY ‘zabbix’;
FLUSH PRIVILEGES;
А вот зайти в /usr/local/share/zabbix2/server/create
не могу, так как в /usr/local/share/zabbix/server/
нет каталога create. Есть только database и upgrades.
Как быть?
Услуги хостинговой компании Host-Food.ru
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Непрочитанное сообщение Гость » 2013-12-24 15:00:58
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Решил.
1. Поставил с помощью команды sysinstall.
В меню configuration->networking->Zabbix
2. Файлы *.sql нашел в каталоге /usr/local/share/zabbix2/server/database/mysql
3. Создал пользователя и группу в FreeBSD
4. Выполнил в mysql:
CREATE DATABASE zabbix CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY ‘zabbix’;
FLUSH PRIVILEGES;
5. В FreeBSD:
cat schema.sql data.sql images.sql | mysql -uroot -p zabbix
Отправить содержимое файлов в базу данных под именем zabbix под паролем администратора системы управления базой данных.
По умолчанию админ — root, пароль пустой.
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Спасибо за подсказку с путем!
только у меня проблема с подключение базы sql . выдает ошибку
65559:20131226:154107.530 [Z3001] connection to database ‘zabbix’ failed: [1045] Access denied for user ‘zabbix’@’localhost’ (using password: YES)
65559:20131226:154107.530 Database is down. Reconnecting in 10 seconds.
в файле zabbix прописал и хост и юзера, пароль от бызы и саму базу.
а при вводе команды : cat schema.sql data.sql images.sql | mysql -uroot -p zabbix
такая ошибка : ERROR 1050 (42S01) at line 1: Table ‘maintenances’ already exists
не пойму куда смотреть. логи читаю не чего такого нет. то что sql не подключается и не понятно из за чего. Если не трудно опиши настройку sql. и этой командой. вожусь уже неделю)) я знаю что просить это все равно что сказать сделай за меня)) но выхода нет.
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
К тебе под телнетом можно зайти?
такая ошибка : ERROR 1050 (42S01) at line 1: Table ‘maintenances’ already exists
Обозначает, что таблицы описанные в файлах *.sql уже созданы
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
Re: Не получается настроить MySQL для Zabbix на FreeBSD 9.2
я так пробывал он валит такую ошибку:
[Z3005] query failed: [1054] Unknown column ‘alert_history’ in ‘field list’ [select alert_history,event_history,refresh_unsupported,discovery_groupid,snmptrap_logging,severity_name_0,severity_name_1,severity_name_2,severity_name_3,severity_name_4,severity_name_5 from config where 1=1 and configid between 0 and 99999999999999]
76588:20131230:070616.881 no records in table ‘config’
76588:20131230:070616.881 [Z3005] query failed: [1054] Unknown column ‘t.value_flags’ in ‘field list’ [select distinct t.triggerid,t.type,t.value,t.value_flags,t.error from hosts h,items i,functions f,triggers t where h.hostid=i.hostid and i.itemid=f.itemid and i.lastclock is not null and f.triggerid=t.triggerid and h.status in (0) and i.status in (0) and i.type not in (2,17) and t.status in (0) and t.triggerid between 0 and 99999999999999]
76588:20131230:070616.881 [Z3005] query failed: [1054] Unknown column ‘alert_history’ in ‘field list’ [select alert_history,event_history,refresh_unsupported,discovery_groupid,snmptrap_logging,severity_name_0,severity_name_1,severity_name_2,severity_name_3,severity_name_4,severity_name_5 from config where 1=1 and configid between 0 and 99999999999999]
76588:20131230:070616.881 [Z3005] query failed: [1054] Unknown column ‘i.lastclock’ in ‘field list’ [select i.itemid,i.hostid,h.proxy_hostid,i.type,i.data_type,i.value_type,i.key_,i.snmp_community,i.snmp_oid,i.port,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authpassphrase,i.snmpv3_privpassphrase,i.ipmi_sensor,i.delay,i.delay_flex,i.trapper_hosts,i.logtimefmt,i.params,i.status,i.authtype,i.username,i.password,i.publickey,i.privatekey,i.flags,i.interfaceid,i.lastclock from items i,hosts h where i.hostid=h.hostid and h.status in (0) and i.status in (0,3) and i.itemid between 0 and 99999999999999]
76588:20131230:070616.881 [Z3005] query failed: [1054] Unknown column ‘t.value_flags’ in ‘field list’ [select distinct t.triggerid,t.description,t.expression,t.error,t.priority,t.type,t.value,t.value_flags from hosts h,items i,functions f,triggers t where h.hostid=i.hostid and i.itemid=f.itemid and f.triggerid=t.triggerid and h.status in (0) and i.status in (0,3) and t.status in (0) and t.flags not in (2) and h.hostid between 0 and 99999999999999]
76588:20131230:070616.882 no records in table ‘config’
меня смущает то что ему не хватает какой то записи в таблице ‘config’!
Источник
Database.Guide
Beginners
Categories
- Azure SQL Edge (16)
- Database Concepts (48)
- Database Tools (70)
- DBMS (8)
- MariaDB (420)
- Microsoft Access (17)
- MongoDB (265)
- MySQL (375)
- NoSQL (7)
- Oracle (296)
- PostgreSQL (255)
- Redis (184)
- SQL (588)
- SQL Server (887)
- SQLite (235)
Fix ERROR 1050 (42S01) “Table … already exists” in 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:
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:
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:
In this case, we got a warning. Let’s check the warning:
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.
Источник
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».
решение:
вы можете сделать одну вещь вручную.
- перейдите в папку MySQL, где вы установили его
- перейдите в папку данных внутри него.
- выберите базу данных и зайдите внутрь он.
- базы данных создает «.frm » формат файлов.
- удалить файл конкретной таблицы.
- Теперь создайте таблицу снова.
Он успешно создаст таблицу.
сначала проверьте, находитесь ли вы в правильной базе данных 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 «таблица уже существует»
моя установка была такой:
- изменен движок сервера с InnoDB на MyISAM
- используя phpMyAdmin удалил базу данных, которую я пытался импортировать в
- перезапустил службу mysql
- попробовал реимпорт и он работал
у меня были огромные проблемы с ошибкой 1050 и 150.
проблема для меня заключалась в том, что я пытался добавить ограничение с ON DELETE SET NULL как одно из условий.
изменение ON DELETE NO ACTION позволил мне добавить необходимые ограничения FK.
к сожалению, сообщения об ошибках MySql совершенно бесполезны, поэтому мне пришлось найти это решение итеративно и с помощью ответов на вопрос выше.
в моем случае проблема заключалась в том, что было представление с тем же именем, что и моя таблица, поэтому мне пришлось удалить представление, чтобы позволить импорту продолжаться.
автоматическое решение, которое сработало для меня, — заменить обычную таблицу drop на этот sed во время дампа, чтобы также удалить любые представления, которые могут существовать:
или если вы предпочитаете печатать в файл для резервного копирования
или если вы получили сбросил файл и импортируете его в свой db
Примечание: важно, чтобы вы добавить ^ в начале регулярного выражения замены, потому что есть другие типы DROP TABLE IF EXISTS команды в дампах, которые вы не хотите трогать.
Источник
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.
I’m adding this table:
CREATE TABLE contenttype (
contenttypeid INT UNSIGNED NOT NULL AUTO_INCREMENT,
class VARBINARY(50) NOT NULL,
packageid INT UNSIGNED NOT NULL,
canplace ENUM('0','1') NOT NULL DEFAULT '0',
cansearch ENUM('0','1') NOT NULL DEFAULT '0',
cantag ENUM('0','1') DEFAULT '0',
canattach ENUM('0','1') DEFAULT '0',
isaggregator ENUM('0', '1') NOT NULL DEFAULT '0',
PRIMARY KEY (contenttypeid),
UNIQUE KEY packageclass (packageid, class)
);
And I get a 1050 «table already exists»
But the table does NOT exist. Any ideas?
EDIT: more details because everyone seems to not believe me
DESCRIBE contenttype
yields:
1146 — Table ‘gunzfact_vbforumdb.contenttype’ doesn’t exist
and
CREATE TABLE gunzfact_vbforumdb.contenttype(
contenttypeid INT UNSIGNED NOT NULL AUTO_INCREMENT ,
class VARBINARY( 50 ) NOT NULL ,
packageid INT UNSIGNED NOT NULL ,
canplace ENUM( '0', '1' ) NOT NULL DEFAULT '0',
cansearch ENUM( '0', '1' ) NOT NULL DEFAULT '0',
cantag ENUM( '0', '1' ) DEFAULT '0',
canattach ENUM( '0', '1' ) DEFAULT '0',
isaggregator ENUM( '0', '1' ) NOT NULL DEFAULT '0',
PRIMARY KEY ( contenttypeid ) ,
Yields:
1050 — Table ‘contenttype’ already exists
At the time of database startup, I accidentally deleted the data file, and then I kept working on this table and kept reporting errors. The query report did not exist, but a new table with the same name already existed. The solution is to create a table with the same name in another database and copy its data files.
mysql> show databases;
+ — — — — — — — — — — — — — — — — — — — — +
| Database |
+ — — — — — — — — — — — — — — — — — — — — +
| information_schema |
| mysql |
| performance_schema |
| test |
+——————–+
mysql> use test
mysql> create table t1(id int);
ERROR 1813 (HY000): Tablespace for table ‘`test`.`t1`’ exists. Please DISCARD the tablespace before IMPORT.
mysql> alter table t1 DISCARD tablespace;
ERROR 1146 (42S02): Table ‘test.t1’ doesn’t exist
mysql> create database gg;
mysql> show databases;
+ — — — — — — — — — — — — — — — — — — — — +
| Database |
+ — — — — — — — — — — — — — — — — — — — — +
| information_schema |
| gg |
| mysql |
| performance_schema |
| test
| + — — — — — — — — — — — — — — — — — — — — +
mysql> use gg
Database changed
mysql> create table t1(id int);
go to the database gg
cp-a t1.frm.. /test/t1.frm
mysql> select * from t1;
ERROR 1146 (42S02): Table ‘test.t1’ doesn’t exist
mysql> Alter TABLE T1, TABLESPACE;
Query OK, 0 rows affected, 2 warnings (0.01 SEC)
goes to database gg
cp -a t1.ibd .. /test/t1.ibd
mysql> use test
mysql> select * from t1;
ERROR 1814 (HY000): Tablespace has been discarded for table ‘t1’
mysql> Alter TABLE T1 Import TABLESpace;
Query OK, 0 rows affected, 1 warning (0.04 SEC)
mysql> select * from t1;
Empty set (0.00 SEC)
Read More:
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
I am attempting to migrate from local MariaDB to Docker version which should in essence be as simple as migrating to a new SQL Server. I have setup the Docker container fine via but can’t seem to import my «all-databases» dump.
This is what I get:
mysql -u root -p < mariadb_alldb_*.sql
Enter password:
ERROR 1050 (42S01) at line 8022: Table 'user' already exists
Dump generated via :
mysqldump -u root -p --all-databases --skip-lock-tables > mariadb_alldb_"$(date '+%F')".sql
Update: This is run on a fresh docker container each time and I have created backups in a directory that I am importing from.
ls * | grep mariadb_alldb_
mariadb_alldb_2020-05-04.sql
Update2: Perhaps it’s related to my docker setup?
Here is my docker cmd:
docker stop mariadb && docker rm mariadb
docker run -d --name="mariadb"
-p 3306:3306
-e TZ="America/Whitehorse"
-v "/opt/mariadb/conf/conf.d":"/etc/mysql/conf.d"
-v "/opt/mariadb/backups":"/mnt/"
--mount type=volume,dst=/var/run/mysqld,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/var/run/mysqld
mariadb:latest
I am doing this import from the local machine, I have reproduced results from inside the container.
I’m trying to import an older (~version 5) server into a MariaDB docker container.
I created a dump using the mysqldump command (with —all-databases), and when I try to import it I get the following error:
ERROR 1050 (42S01) at line 2071: Table 'user' already exists
I’m trying to import into a brand new container, using the standard command:
mysql -uroot -p < [sqldump].sql
I’m a novice when it comes to SQL and was wondering if I’m missing something obvious, or if there is some real incompatibility.
I’d really appreciate your advice.
Thanks!
asked Dec 24, 2020 at 17:04
2
It sounds like your dump script wants to overwrite the system «mysql» database that contains users and privilege information. If that’s really what you want to do, you can run mysqldump
again with the --add-drop-database
option, then FLUSH PRIVILEGES
after import. I wouldn’t recommend that though, especially if the databases are running different versions.
A better option would be to explicitly choose which databases you want to export by passing their names to the --databases
argument, excluding DBs like «mysql», «information_schema» and «performance_schema». You would then grant privileges to the newly imported DBs as needed.
Another quick option would be to edit your existing dump file in a text editor and just take out the part that wants to create the «mysql» tables (including «user» and others).
answered Dec 24, 2020 at 18:56
3