Самый простой способ выключить MySQL - просто запустить
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Вот почему:
Сервисный файл mysql ( /etc/init.d/mysql) зависит от наличия файла сокета. Исторически говоря, возвращаясь к MySQL 4.0, файл сокета иногда исчезает необъяснимым образом. Это мешает стандарту service mysql stopработать.
Недостаточно сказать
mysqladmin -uroot -p -h127.0.0.1 shutdown
потому что туздЫ будет маршрутизировать пользователь подходит как root@127.0.0.1для , root@localhostесли TCP / IP явным образом не включен. По умолчанию туздЫ будет выбирать наименьший путь сопротивления и подключиться root@127.0.0.1к root@localhostчерез файл сокета. Тем не менее, если нет файла сокета, root@localhostникогда не будет подключаться.
Даже Документация MySQL на mysqladmin говорит это:
Если вы выполняете завершение работы mysqladmin при подключении к локальному серверу с помощью файла сокета Unix, mysqladmin будет ждать, пока файл идентификатора процесса сервера не будет удален, чтобы убедиться, что сервер остановился правильно.
Вот почему необходимо включить TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Вернувшись 30 сентября 2011 года, я написал собственную версию mysqld_multicall mysqlservice(см. Мой пост: запуск нескольких экземпляров на одном хосте ). Он служит виртуальным движком для подключения к mysqld из разных портов. Вы просто должны принести свой собственный my.cnfс настроенными параметрами. В этом сценарии я выполняю выключения, как это:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
Но что это ${MYSQLD_STOP}?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
Обратите внимание, я использую 127.0.0.1и явный порт. Таким образом, я не полагаюсь на файл сокета.
Я всегда использовал mysqladmin --protocol=tcp shtudownкак правильную альтернативу отключениям mysql, если service mysql stopзависает. Делать kill -9дальше mysqldи mysqld_safeследует последним из последних из последних курортов. (Да, я сказал последние три раза).
Много раз mysqld удалял mysql.sock без предупреждения. У других людей была эта проблема также за эти годы:
Эпилог
Секрет в том, что я уже говорил: подключитесь к mysql с помощью mysqladmin через TCP / IP ( --protocol=tcp) и выполните команду shutdown. Это должно работать , потому что отключение привилегии находятся в mysql.userисключительно с целью удостоверенных остановов. Это несколько раз спасло мой рабочий день, когда я смог выполнить удаленное отключение с моего компьютера с Windows при завершении работы mysqld на сервере Linux.
ОБНОВЛЕНИЕ 2013-03-06 22:48 EST
Если вы беспокоитесь о том, что происходит во время выключения, есть способ манипулировать временем выключения и способом переноса данных на диск, особенно если у вас много данных InnoDB в пуле буферов
ПРЕДЛОЖЕНИЕ № 1
Если у вас много грязных страниц, вы можете понизить innodb_max_dirty_pages_pct до 0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Установите это примерно за 15-30 минут до выключения. Это даст mysqld минимально возможное количество грязных страниц для записи на диск.
ПРЕДЛОЖЕНИЕ № 2
По умолчанию innodb_fast_shutdown равен 1. Для этой опции есть три значения
- 0: InnoDB выполняет медленное выключение, полную очистку и объединение буфера вставки перед выключением.
- 1: InnoDB пропускает эти операции при завершении работы, процесс, известный как быстрое завершение работы.
- 2: InnoDB сбрасывает свои журналы и выключается, как будто MySQL потерпел крах; зафиксированные транзакции не теряются, но операция восстановления после сбоя делает следующий запуск более длительным.
Документация далее говорит это:
Медленное отключение может занять минуты или даже часы в крайних случаях, когда значительные объемы данных все еще буферизируются. Используйте метод медленного завершения работы перед обновлением или понижением версии между основными выпусками MySQL, чтобы все файлы данных были полностью подготовлены на случай, если процесс обновления обновит формат файла.
Используйте innodb_fast_shutdown = 2 в экстренных ситуациях или при устранении неполадок, чтобы получить максимально быстрое отключение, если данные подвергаются риску повреждения.
Значения по умолчанию для innodb_max_dirty_pages_pct и innodb_fast_shutdown должны быть очень хорошими в большинстве случаев.
tmpwatchудаляет его вместе со всем остальным/tmp, у которого время больше заданного порога.