Я запускаю очень сложный php-скрипт на своей дешевой виртуальной машине, которая просматривает около полумиллиона страниц в неделю, так что это немного проблематично. Я перезапускаю mysql дважды в день. Это не будет проблемой, но при перезапуске mysql
/etc/init.d/mysql restart
он перезапускается, а затем иногда Говорит, что Table './forum/phpbb_posts' is marked as crashed and last (automatic?) repair failed
Эта таблица не имеет ничего общего с этим жестким скриптом, однако это таблица 250 000 (1,8 гигабайт), которая, похоже, вылетает из строя. На ремонт уходит около 14 минут.
Есть ли более безопасный способ остановить mysql? Я знаю, что должен делать резервные копии, и делаю это, но только один раз в день, а объем данных все еще растет (в наши дни не так быстро)
В настоящее время работает на Debian GNU / Linux 6.0
Завершение работы mysqld может занять много времени. Одна из самых больших проблем заключается в том, что все данные правильно очищаются и все таблицы закрываются.
Есть два способа обеспечить правильное закрытие данных. Он делится на две основные категории:
Если абсолютно все данные являются MyISAM, вы должны убедиться, что InnoDB полностью отключен с помощью этого
[mysqld]
skip-innodb
Использование этой опции при запуске позволяет обойти любые протоколы InnoDB для циклов восстановления после сбоя, которые обычно выполняются при запуске. Добавьте к этому тот факт, что данные MyISAM никогда не кэшируются. В кэше ключей MyISAM (размер key_buffer_size) хранятся только страницы индекса. Таким образом, у вас быстрый запуск и быстрое завершение работы.
Если большая часть или все данные относятся к InnoDB, вам нужно следить за объемом пространства, которое вы настроили для innodb_buffer_pool_size. Чем больше innodb_buffer_pool_size, тем больше времени потребуется для очистки грязных страниц.
Примечание: Выполнение mysqldumps таблиц InnoDB автоматически запустит очистку всех оставшихся грязных страниц в пуле буферов, которые принадлежат таблице, которая выгружается.
Независимо от того, используете ли вы mysqldump для всех таблиц InnoDB или просто закрываете mysql, есть только одна, которая ускоряет процесс очистки грязных страниц.
Вы должны установить innodb_max_dirty_pages_pct. По умолчанию для MySQL 5.0 / 5.1 это 90. Для MySQL 5.5 значение по умолчанию - 75. Удивительно, но просто установите innodb_max_dirty_pages_pct равным 0. Это сведет количество грязных страниц в буферном пуле к минимуму. Это может немного увеличить количество операций ввода-вывода на диске, но все еще в пределах допустимого уровня.
Вы должны сделать две вещи:
Поместите его в /etc/my.cnf
[mysqld]
innodb_max_dirty_pages_pct=0
Во-вторых, вам не придется перезапускать mysql. Просто выполните это как пользователь root:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Нагрузка на сервер может немного возрасти и оставаться такой, пока буферный пул не станет менее 1% грязных страниц.
Попробуйте !!!
Вы также должны сначала запустить эту команду MySQL
SET GLOBAL innodb_fast_shutdown = 0;
Это приведет к полной очистке всего журнала транзакций InnoDB (ib_logfile0, ib_logfile1), за которым следует
service mysql stop
503 веб-сайт, чтобы остановить активность (режим обслуживания .htaccess) и запустить верхняя для мониторинга использования процессора mysqld
mysqladmin -p flush-таблицы
наблюдайте за активностью mysql (это может занять несколько минут, в зависимости от вашей установки) и когда она уменьшается
mysqladmin -p flush-таблицы
чтобы быть уверенным, а затем
mysqladmin -p выключение
Эта последовательность гарантирует, что ваш веб-сайт перестанет создавать дополнительные запросы к базе данных, сообщает mysql о необходимости сбросить данные из памяти и файлы журнала транзакций в таблицы базы данных, а затем инициирует надлежащее завершение работы демона базы данных.
А как насчет того, чтобы разбить старт-стоп-полк? Может быть, перезапуск не дает базе данных достаточно времени, чтобы остановиться, прежде чем она инициирует запуск?
т.е.
/etc/init.d/mysql stop;
sync;
sleep 30;
/etc/init.d/mysql start