Перенос базы Mediawiki – решение проблемы с кодировками

Опубликовал mvs3d | Дата 05.01.2009 – 03:07 |

Так сложилось, что я уже несколько лет веду все личные и рабочие заметки в локально установленной Mediawiki. Как показал мой опыт это весьма удобно – можно набросать по-быстрому статью, в которую затем добавить дополнительную информацию (например графику), дополнить ссылками как внутренними так и внешними. И поиск есть. Получается такая википедия для внутреннего пользования, ценность которой с годами все возрастает и возрастает.

На днях я решил перенести мою Wiki на другой сервер, и столкнулся с неожиданными проблемами, которые растянули этот процесс на 3 дня.

Сначала застрял на том, что при попытке отображении статей мне выдавалась ошибка mysql:

MySQL returned error “1267: Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘=’ (localhost)”.

Избавиться от ошибки получилось после того, как я задал в рабочей базе кодировку utf8 вместо latin1 для столбцов с типом VARCHAR (рецепт взят отсюда). При этом, пришлось модифицировать индекс “cl_to” в таблице “categorylinks” (уменьшить число символов, учавствующих в индексе), потому что иначе выдавалось сообщение об ошибке:

Specifiend key was too long; max key length is 1000 bytes

После обновления полей базы сделал дамп, загрузил его на сервер назначения, и столкнулся с другой засадой – русский текст в статьях показывается “кракозябами”, а статьи с русскими названиями вообще не находятся. Танцы с бубном не помогли:

  1. выгружал дамп с опцией –default-character-set=utf8;
  2. пытался сконвертировать дамп различными утилитами в utf8 (в итоге так и не нашел ни одной программы, которая корректно бы показала то что создается с помощью mysqldump);

В конце-концов, наткнулся на рецепт в блоге, который мне помог: создал дамп базы с помощью утилитки Sypex Dumper (написанной на PHP, кстати), и развернул его с её же помощью на сервере. Надо только явно задать значения констант CHARSET и RESTORE_CHARSET внутри скрипта перед его запуском:

define(’CHARSET’, ‘latin1′);
define(’RESTORE_CHARSET’, ‘utf8_general_ci’);

И это действительно работает! Mediawiki успешно перенесена на другой сервер, проблема с кодировками решена!

Да, саму Wiki я не переинсталлировал, просто скопировал директорию и поправил файл LocalSettings.php – поменял пути к базе и установил значение TRUE для переменной $wgDBmysql5.

  1. 18 коммент. к “Перенос базы Mediawiki – решение проблемы с кодировками”

  2. Дмитрий - Янв 6, 2009 | Ответить

    Здравствуйте, Владимир

    Спасибо за ссылку. Опыты с Медиавики действительно нечто незабываемое, думаю такие танцы с бубном – что-то вроде “расплаты” за широкие возможности движка. (Справедливости ради замечу, что несмотря на то, что администрирую один сайт на сабже, моя персональная вики работает на oddmuse.)

    С праздниками!

  3. mvs3d - Янв 7, 2009 | Ответить

    Если говорить о кодировках, то тут скорее расплата не за широкие возможности движка, а за его возраст :)

    Дело в том, что у меня есть собственный проект которому потребовалась ровно эта же операция чтобы получить читаемый UTF-8 текст в базе после ее миграции на MySQL 5.x

  4. yurand - Апр 5, 2009 | Ответить

    При создании бэкапа вики в dumper возникает ошибка:

    2009.04.05 17:50:19
    Возникла ошибка!
    Undefined index: archive (8)

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

  5. mvs3d - Апр 5, 2009 | Ответить

    Ну, судя по тексту ошибки база не находит индекс “archive” который пытается забакапить. Странно это все. Попробуйте запустить ремонт таблиц. Только перед этим на всякий случай скопируйте файлы с данными куда-нибудь отдельно (сервер надо при этом остановить).

  6. yurand - Апр 6, 2009 | Ответить

    mvs3d, спасибо за ответ!

    У меня есть несколько установленных вики, в том числе один на нормальном хостинге. Ошибка “Undefined index” для таблицы archive возникает при попытке создать дамп для всех этих вики.
    При этом дамп спокойно создается для других баз (интернет-магазин). Не может ли это быть особенностью новой версии вики?

  7. mvs3d - Апр 6, 2009 | Ответить

    Упс.. речь то действительно идет о таблице “archive” а не о индексе с таким именем. Что-то дурь какая то :) Там в этой таблице у меня 1 индекс только:
    KEY `name_title_timestamp` (`ar_namespace`, `ar_title`, `ar_timestamp`)

    что означает в вашем сообщении об ошибке цифра 8 в скобках мне не понятно.

    А если попробовать создать таблицу тестовую, в нее данные перекинуть и только ее задампить, что будет?

    create table archive_test like archive;
    insert into archive_test select * from archive;

    Починку для этой таблице пробовал пускать, так, на всякий случай чтоб не думалось :) ?

  8. yurand - Апр 6, 2009 | Ответить

    Я когда устанавливал вики то установил:
    Database character set на MySQL 4.1/5.0 binary.
    Так вот именно для таких таблиц дампер и выдает ошибку.
    Не подскажете, что можно с этим поделать?

  9. mvs3d - Апр 6, 2009 | Ответить

    Честно говоря, не знаю :( Утилитку Sypex Dumper которая упомянута в этом посте наверное пробовали?

  10. yurand - Апр 6, 2009 | Ответить

    Именно в ней ошибка и возникает.

  11. yurand - Апр 6, 2009 | Ответить

    Еще раз проинсталлировал вики. На этот раз с Database character set = UTF-8. Теперь дампер работает без ошибок.
    Интересно, как заставить работать его с binary? :-/

  12. mvs3d - Апр 6, 2009 | Ответить

    Блин, вот я не въехал сразу что это вы дампером делаете, – думал mysqldump у вас такое пишет :)

    Попробуйте написать в его коде (заменить define(’CHARSET’ который там был):

    define(’CHARSET’, ‘binary′);

  13. mvs3d - Апр 6, 2009 | Ответить

    А нафига базу в binary создавать, кстати? Чем UTF-8 не устраивает?

  14. yurand - Апр 6, 2009 | Ответить

    Формат binary стоял по умолчанию (как рекомендуемый). Поэтому и не стал его менять. А define(’CHARSET’… к сожалению не помогает. Та же ошибка.
    Sypex заявил о выходе нового дампера. Может он потянет.

  15. majestic - Май 10, 2009 | Ответить

    У меня также binary и также ошибка в дампере Undefined index: archive (8)
    Кстати, бекап в phpmyadmin создаю, на локальном сервере пробую поднять из бекапа, пишет “нет запроса SQL”. Как-нибудь еще можно попробовать создать бекап? Есть варианты?

  16. mvs3d - Май 10, 2009 | Ответить

    Версии MySQL (удаленная и локальная) совпадают? Чем скрипт из бакапа поднимаете?

  17. Денис - Май 10, 2009 | Ответить

    бекапил с phpmysql 2.11.9.1 переносил в локал на phpmysql 2.6.1, видимо в этом дело

    Проблему решил…Для тех у кого бд в бинари и дампер показывает ошибку archive (8) используйте mysqldumper 1.22. Без проблем снял бекап базы с сервера, попробовал восстановить на другую перварительно созданную базу на сервере, изменил настройки локалсетингс, работет. Также пробовал в локале, на денвере, все работает!

  18. mvs3d - Май 10, 2009 | Ответить

    Ясно. Спасибо что отписались!

  19. Денис - Май 10, 2009 | Ответить

    update:
    phpmysql 2.11.9.1 -> phpmyadmin 2.11.9.1
    phpmysql 2.6.1 -> phpmyadmin 2.6.1

    версия mysql сервера
    на сервере 4.1.22-log
    в локале 5.0.45-community-nt

Оставить комментарий или два

Об авторе

Меня зовут Владимир. Я живу в России, в г.Тольятти Самарской области. C 2004 года активно занимаюсь Web-разработками. Интересуюсь развитием сервисов Сети, технологиями создания и продвижения Интернет-ресурсов, компьютерными железками.. и не только ;)

Подпишись на обновления!

 RSS-канал / Email-рассылка
Поиск :