1

Тема: Ошибка при импорте дампа: MySQL: Duplicate entry

Здравствуйте.

Ситуация:

1. Есть форум (phpBB+MySQL), с базы которого делается дамп.
a. Доступа к phpMyAdmin, SSH на исходном форуме НЕТ (пожалуйста, не спрашивайте, почему).
b. Дамп делается из админки форума phpBB через стандартную опцию "резервное копирование БД".

2. Предполагается восстановить дамп на хостинге, где доступен phpMyAdmin и - по запросу - SSH

3. Размер дампа - более 20 мегабайт.
a. Восстановление делаем с помощью скрипта BigDump, предварительно применив DROP ко всем таблицам БД на новом хостинге.
b. В процессе восстановления BigDump выдаёт сообщение об ошибке:

Error at the line 17667: INSERT INTO udbb_search_wordlist (word_text, word_id, word_common) VALUES('????????', '2654', '0');

Query: INSERT INTO udbb_search_wordlist (word_text, word_id, word_common) VALUES('????????', '2654', '0');

MySQL: Duplicate entry '????????' for key 1

c. Прооблема заключается именно в секции «INSERT INTO udbb_search_wordlist»: если её закомментить, импортирование проходит без проблем (но зато и форум в результате не запускается).

Что делать?

Заранее всем спасибо.

2

Re: Ошибка при импорте дампа: MySQL: Duplicate entry

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

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

Вопросы:
1) Уточните кодировку страниц форума. Как я понимаю это widnows-1251.
2) Выполните на обоих серверах запрос и покажите результат:

SHOW GLOBAL VARIABLES LIKE 'char%';

3) Скопируйте и покажите структуру любой таблицы из дампа (текущего, с крякозябами) в которой есть поля с кириллицей. Кроме структуры покажите пример крякозябов. Дамп желательно открывать с помощью Notepad++. В статусной строке посмотрите кодировку файла дампа: ANSI или UTF8.
4) Желательно установить phpMyAdmin (это не сложно), иначе могут быть сложности с BigDump, так как я не знаю этот скрипт.

3 (изменено: Elijah, 2009-06-10 16:25:18)

Re: Ошибка при импорте дампа: MySQL: Duplicate entry

Hanut сказал:

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

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

Вопросы:
1) Уточните кодировку страниц форума. Как я понимаю это widnows-1251.
2) Выполните на обоих серверах запрос и покажите результат:

SHOW GLOBAL VARIABLES LIKE 'char%';

3) Скопируйте и покажите структуру любой таблицы из дампа (текущего, с крякозябами) в которой есть поля с кириллицей. Кроме структуры покажите пример крякозябов. Дамп желательно открывать с помощью Notepad++. В статусной строке посмотрите кодировку файла дампа: ANSI или UTF8.
4) Желательно установить phpMyAdmin (это не сложно), иначе могут быть сложности с BigDump, так как я не знаю этот скрипт.

Дело вот в чём ещё.

1. Никаких крякозябров в самом дампе не наблюдается. Для сравнения даю кусок дампа: строчки, которые импортируются без проблем, и с ними (закомментированная) — строчка, на которой срывается импорт:

INSERT INTO udbb_search_wordlist (word_text, word_id, word_common) VALUES('МНОГОДЕТНОЙ', '2653', '0');
#INSERT INTO udbb_search_wordlist (word_text, word_id, word_common) VALUES('МУЖСКОГО', '2654', '0');
INSERT INTO udbb_search_wordlist (word_text, word_id, word_common) VALUES('МУЖСКОМ', '2655', '0');

2. Кодировка дампа — cp1251

3. Образец таблицы:

#
# TABLE: udbb_banlist
#
DROP TABLE IF EXISTS udbb_banlist;
CREATE TABLE udbb_banlist(
    ban_id mediumint(8) unsigned NOT NULL auto_increment,
    ban_userid mediumint(8) NOT NULL,
    ban_ip varchar(8) NOT NULL,
    ban_email varchar(255), 
    PRIMARY KEY (ban_id), 
    KEY ban_ip_user_id (ban_ip, ban_userid)
);

#
# Table Data for udbb_banlist
#

INSERT INTO udbb_banlist (ban_id, ban_userid, ban_ip, ban_email) VALUES('17', '0', '', '*@gawab.com');
INSERT INTO udbb_banlist (ban_id, ban_userid, ban_ip, ban_email) VALUES('16', '0', '', '*@cashette.com');
INSERT INTO udbb_banlist (ban_id, ban_userid, ban_ip, ban_email) VALUES('13', '0', '', 'nastyfastydo@mail.ru');
INSERT INTO udbb_banlist (ban_id, ban_userid, ban_ip, ban_email) VALUES('15', '0', '', '*@skorpmax.info');

4. Ничего на исходном хостинге установить не могу (так сложились звёзды). Мне доступна только админка phpBB-форума. По этой же причине мне просто некуда ввести там команду «SHOW GLOBAL VARIABLES LIKE 'char%';».

Сообщение добавлено Wed Jun 10 17:26:19 2009
Да, вот: BigDump Home Page: http://www.ozerov.de/bigdump.php (очень полезная вещь, по-моему.)

4

Re: Ошибка при импорте дампа: MySQL: Duplicate entry

Elijah
Дамп хороший, с ним нет проблем и это все значительно упрощает.

Надо было выполнить запрос SHOW GLOBAL VARIABLES LIKE 'char%'; на том сервере, куда импортируете. Импорт следует сделать с помощью phpMyAdmin выбрав кодировку файла windows-1251.

Чтобы нормально импортировать 20МБ дамп с помощью phpMyAdmin добавьте в конфигурационный файл config.inc.php строку:

$cfg['UploadDir'] = './upload';

Создайте в корне phpMyAdmin каталог upload и загрузите в него дамп по FTP, после чего сможете выбрать его на странице импорта.
Перед импортом дампа, вероятно необходимо будет создать базу данных, проверьте, чтобы она была в кодировке cp1251 (cp1251_general_ci).

Дальше все будет зависеть от текущей кодировки соединения с MySQL и возможно потребуется еще один шаг. Еще раз повторю: SHOW GLOBAL VARIABLES LIKE 'char%';

5

Re: Ошибка при импорте дампа: MySQL: Duplicate entry

Спасибо за подробный ответ!