Найрізший спосіб відключення 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 явним чином не включений. За замовчуванням mysqld вибере найменший шлях опору та підключиться root@127.0.0.1до root@localhostфайлу socket. Однак, якщо файлу сокета немає, root@localhostвін ніколи не підключиться.
Навіть документація MySQL на mysqladmin говорить про це:
Якщо ви виконуєте відключення mysqladmin під час підключення до локального сервера за допомогою файлу сокет Unix, mysqladmin чекає, поки файл ідентифікаційного процесу сервера буде видалено, щоб переконатися, що сервер належним чином зупинився.
Ось чому необхідно ввімкнути TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Повернувшись 30 вересня 2011 року, я написав власну версію mysqld_multiзакликаного 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тому, що має аніме, старше встановленого порогу.