5.1.16 Процесс завершения работы сервера
Процесс завершения работы сервера происходит следующим образом:
-
Инициализируется процесс завершения работы.
Это может произойти несколькими способами. Например, пользователь с привилегией
SHUTDOWNможет выполнить команду mysqladmin shutdown. Команда mysqladmin может быть использована на любой платформе, поддерживаемой MySQL. Также возможны другие методы запуска завершения работы, специфичные для операционной системы: сервер на Unix завершается, когда он получает сигналSIGTERM. Сервер, работающий как служба в Windows, завершается, когда менеджер служб сообщает ему об этом. -
При необходимости сервер создает поток завершения.
В зависимости от того, как был инициирован процесс завершения, сервер может создать поток для обработки этого процесса. Если завершение запрошено клиентом, создаётся поток завершения. Если завершение вызвано получением сигнала
SIGTERM, поток обработки сигнала может сам обрабатывать завершение или может создать отдельный поток для этого. Если сервер пытается создать поток завершения, но не может (например, если память исчерпана), он выводит диагностическое сообщение, которое появляется в журнале ошибок:Error: Can't create thread to kill server
-
Сервер прекращает принимать новые подключения.
Для предотвращения запуска новых операций во время завершения работы, сервер прекращает принимать новые подключения клиентов, закрывая обработчики сетевых интерфейсов, на которых он обычно прослушивает подключения: порт TCP/IP, файл сокета Unix, именованную трубу Windows и общую память в Windows.
-
Сервер завершает текущую активность.
Для каждого потока, связанного с подключением клиента, сервер разрывает подключение к клиенту и помечает поток как завершённый. Потоки умирают, когда обнаруживают, что они помечены таким образом. Потоки для простаивающих подключений умирают быстро. Потоки, которые в настоящее время обрабатывают операторы, периодически проверяют своё состояние и умирают дольше. Дополнительную информацию о завершении потоков см. в разделе 13.7.6.4, «Оператор KILL», в частности, для инструкций по завершению убитых операций
REPAIR TABLEилиOPTIMIZE TABLEна таблицахMyISAM.Для потоков, имеющих открытую транзакцию, транзакция отменяется. Если поток обновляет нетранзакционную таблицу, операция, такая как обновление нескольких строк
UPDATEилиINSERT, может оставить таблицу частично обновлённой, поскольку операция может завершиться до завершения.Если сервер является сервером репликации источника, он обрабатывает потоки, связанные с текущими подключёнными репликами, как другие клиентские потоки. То есть каждый из них помечается как завершённый и завершается при следующей проверке его состояния.
Если сервер является репликой, он останавливает потоки ввода-вывода и потоки SQL, если они активны, прежде чем помечать клиентские потоки как завершенные. Потоку SQL разрешается завершить текущий оператор (чтобы избежать проблем с репликацией), а затем он останавливается. Если поток SQL находится в середине транзакции на этом этапе, сервер ждёт, пока не завершится текущая группа репликации (если таковая имеется) или пока пользователь не выполнит оператор
KILL QUERYилиKILL CONNECTION. См. также раздел 13.4.2.6, «Оператор STOP SLAVE». Поскольку нетранзакционные операторы отменить нельзя, для обеспечения безопасности репликации при сбоях следует использовать только транзакционные таблицы.ПримечаниеДля обеспечения безопасности репликации при сбоях реплики необходимо запускать реплику с включённым
--relay-log-recovery.См. также раздел 16.2.4, «Журнал репликации и хранилища метаданных репликации».
-
Сервер завершает или закрывает хранилища данных.
На данном этапе сервер сбрасывает кэш таблиц и закрывает все открытые таблицы.
Каждое хранилище данных выполняет необходимые действия для таблиц, которые оно управляет.
InnoDBсбрасывает свой пул буферов на диск (еслиinnodb_fast_shutdownне равно 2), записывает текущий LSN в табличное пространство и завершает свои внутренние потоки.MyISAMсбрасывает все ожидающие записи индексов для таблицы. Сервер завершает работу.
Для предоставления информации процессам управления сервер возвращает один из кодов выхода, описанных в следующем списке. Фраза в скобках указывает действие, выполняемое systemd в ответ на код, для платформ, на которых systemd используется для управления сервером.
0 = успешное завершение (перезапуска не требуется)
1 = неуспешное завершение (перезапуска не требуется)
2 = неуспешное завершение (перезапуск требуется)
© 2025 Oracle
Licensed under the GPLv2 License.