Самый простой способ выключить 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_multi
call 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
, у которого время больше заданного порога.