суббота, 11 декабря 2010 г.
Indexed Search или эпопея с InnoDB
10:55 |
Автор:
Вадим Гиркало |
Изменить сообщение
Казалось бы, какая связь между Indexed Search и InnoDB? Но...
Переносил я тут недавно один свой TYPO3-сайт на новый хостинг... Как говорится, перенес один в один. Но все пошло не так гладко как казалось на первый взгляд - перестал работать поиск на сайте, организованный экстом - indexed_search.
Слёту я решил переустановить (uninstall+install), а затем и обновить версию indexed_search, но это не помогло.
Правильное направление поиска причин возникновения проблемы, задала такая вещь. Каждый раз, при проверке настроек экста - indexed_search в менеджере расширений, он предлагал мне сделать update некоторых своих таблиц. Причем, суть данного апдейта сводилась не к созданию отсутствующих таблиц или полей, а смене движка для некоторых таблиц на InnoDB. Ну тут и начался несколько пролонгированный и довольно "сексуальный" курс повышения квалификации в области MySQL.
У меня сразу возник вопрос, а поднят ли этот движок на моем хостинге. Зайдя на консоль мускула я набрал следующую команду:
mysql> show engines;
и увидел ответ:
InnoDB |DISABLED
набрал еще другую команду, которая подтвердила наличие трабл с InnoDB:
mysql> show engine innodb status;
ERROR 1235 (42000): Cannot call SHOW INNODB STATUS because skip-innodb is defined
Немного погуглив, я сделал следующее:
1. Остановил MySQL, с помощью команды: /etc/init.d/mysql stop
2. Переименовал 2 лог-файла - ib_logfile0 и ib_logfile1:
mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile0.bak
mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/ib_logfile1.bak
3. Запустил MySQL: /etc/init.d/mysql start. При запуске на консоли стали появляться довольно страшные сообщения:
101027 20:59:45 InnoDB: Error: page 513 log sequence number 0 972453278
InnoDB: is in the future! Current system log sequence number 0 544625838.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: for more information.
Хотя, когда я опять из консоли MySQL выполнил знакомую нам команду:
mysql> show engines;
то увидел более приятное сообщение:
MyISAM | DEFAULT
InnoDB | YES
Таким образом я оживил InnoDB на своем сервере, но моя база оставалась "паламатая".
Вылечил базу мускула я следующими действиями:
1. В конфигурационный файл MySQL - /etc/mysql/my.cnf добавил параметр, который блокирует все Insert и Update на сервере:
innodb_force_recovery = 4
(это позволяет нам, как бы, заморозить базу в исходном состоянии на какое-то время). Заодно можно запомнить или записать значение параметра datadir из my.cnf, указывающий на местонахождение файлов БД и которое будет нужно в дальнейшем.
Если вы не знаете где находится файл my.cnf, то воспользуйтесь командой: find / -name my.cnf.
2. Рестартовал MySQL:
/etc/init.d/mysql stop
/etc/init.d/mysql start
3. Дополнительной утилитой мускула сделал дамп своей базы данных:
mysqldump --force --compress --triggers --routines --create-options -uroot -pROOTPASSWORD --databases DATABASENAME > /usr/mydb.sql
4. В очередной раз остановил сервер MySQL:
/etc/init.d/mysql stop
есть также и другой способ остановки сервиса:
mysqladmin -uroot -pROOTPASSWORD shutdown
5. Нашел физическое местонахождение директории с файлами БД (можно с помощью find / -name DATABASENAME) и записал на листике её имя, имя ее собственника (owner) и сумму прав на неё (rwx------, или 700). Все это может показать команда ls -l
6. Удалил полностью эту директорию (а точнее переместил в другое место - береженого бог бережет, как говорится :):
rm -fdr /var/lib/mysql/DATABASENAME/
БУДЬТЕ ОЧЕНЬ ВНИМАТЕЛЬНЫ, НЕ ЗАХВАТИТЕ НИЧЕГО ЛИШНЕГО!!!
7. Тут же создал директорию с таким же именем и задал её овнера и права:
mkdir /var/lib/mysql/DATABASENAME/
chown -R mysql:mysql /var/lib/mysql/DATABASENAME/
chmod -R 700 /var/lib/mysql/DATABASENAME/
8. Специальной утилитой mysql_install_db создал новые таблицы привилегий MySQL:
/usr/local/bin/mysql_install_db
и на всякий случай повторил присвоение овнера и установку прав:
chown -R mysql:mysql /var/lib/mysql/DATABASENAME/
chmod -R 700 /var/lib/mysql/DATABASENAME/
9. Убрал параметр innodb_force_recovery из конфигурационного файла - my.cnf
10. Запустил mysql:
/etc/init.d/mysql start
11. Импортировал данные обратно в базу данных:
mysql -uroot --compress < /usr/mydb.sql
12. Напоследок, обновил таблицы привилегий mysql:
/usr/bin/mysqladmin -uroot flush-privileges
Ну, вот и всё парни, а точнее мужики если дочитали эту статью до конца. Вы не поверите, но indexed_search у меня заработал.
Неужели для indexed_search так важно иметь движок InnoDB для некоторых своих таблиц?
Чтобы ответить себе на этот вопрос у меня уже не оставалось ни времени, ни сил, ни большого желания.
P.S. Все пути к директориям, которые есть в данной статье, скорее всего у вас будут другими. Поэтому, если вам нужно выполнить какую-то утилиту или найти файл, то используйте команду find / -name file_or_dir_name, она действительно рулит.
Подписаться на:
Комментарии к сообщению (Atom)
О себе
- Вадим Гиркало
- Фрилансер, веб-разработчик сайтов на базе бесплатной, мощнейшей и очень гибкой CMS системы - TYPO3.
Мой сайт
Позвонить мне в Skype
TOP - 3
-
Как я уже писал в одной своей заметке ( SEO и общие рекомендации ), для сайта очень важно, чтобы при обращении к заведомо несуществующей ст...
-
Дорабатывая очередной свой сайт столкнулся с такой проблемкой. В шапке сайта есть две флэш вставки - банер, который вставлен через конструкц...
-
Несмотря на то, что материала по данной тематике вроде бы и достаточно, но весь он носит кусочно-латочно-разрозненный характер, что мешает б...
0 коммент.:
Отправить комментарий