Найрізший спосіб відключення 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
тому, що має аніме, старше встановленого порогу.