Назад | Перейти на главную страницу

Время ожидания «service mysqld stop» истекло (затем выяснилось, что «mysqld мертв, но subsys заблокирована»)

Я установил mysql и сервер через yum на свой 64-битный сервер CentOS 5. Он запускается нормально, но когда я пытаюсь его остановить, он останавливается, и мне приходится нажимать «Ctrl-C». Затем я запускаю «service mysqld status», и он показывает:

mysqld dead but subsys locked

Я запускаю ps aux, а mysql нигде нет. Запуск mysqld снова через "запуск службы mysqld" работает нормально. Попытка остановить это создает ту же проблему.

Затем я понял, что /var/lock/subsys/mysqld все-еще существует. При запуске mysqld я проверил /var/run/mysqld/mysqld.pid и он соответствует идентификатору запущенной службы.

Я попытался переустановить mysql и удалить все файлы и конфигурации, но безрезультатно.

Что делать?

РЕДАКТИРОВАТЬ:

Я добавил несколько эхо-операторов в файл /etc/init.d/mysqld, особенно в функцию остановки:

stop(){
        if [ ! -f "$mypidfile" ]; then
            # not running; per LSB standards this is "ok"
            action $"Stopping $prog: " /bin/true
            return 0
        fi  
        echo "beginning stop sequence"
        MYSQLPID=`cat "$mypidfile"`
        if [ -n "$MYSQLPID" ]; then
            /bin/kill "$MYSQLPID" >/dev/null 2>&1
            echo "killing pid $MYSQLPID"
            ret=$?
            if [ $ret -eq 0 ]; then
                echo "return code $ret after kill attempt"
                TIMEOUT="$STOPTIMEOUT"
                echo "timeout is set to $STOPTIMEOUT"
                while [ $TIMEOUT -gt 0 ]; do
                    /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
                    sleep 1
                    let TIMEOUT=${TIMEOUT}-1
                    echo "timeout is now $TIMEOUT"
                done
                if [ $TIMEOUT -eq 0 ]; then
                    echo "Timeout error occurred trying to stop MySQL Daemon."
                    ret=1
                    action $"Stopping $prog: " /bin/false
                else
                    echo "attempting to del lockfile: $lockfile"
                    rm -f $lockfile
                    rm -f "$socketfile"
                    action $"Stopping $prog: " /bin/true
                fi
            else
                action $"Stopping $prog: " /bin/false
            fi
        else
            # failed to read pidfile, probably insufficient permissions
            action $"Stopping $prog: " /bin/false
            ret=4
        fi
        return $ret
}

Вот результат, который я получаю, когда пытаюсь остановить службу:

[root@server]# service mysqld stop
beginning stop sequence
killing pid 9145
return code 0 after kill attempt
timeout is set to 60
timeout is now 59
timeout is now 58
timeout is now 57
timeout is now 56
timeout is now 55
timeout is now 54
timeout is now 53
timeout is now 52
timeout is now 51
timeout is now 50
timeout is now 49

Глядя на код, мне кажется, что он никогда не выйдет из этого цикла while и не сможет удалить файл блокировки. Я неправильно это понимаю? Я проверил тот же файл на другом сервере, и он использует тот же код. Я ошарашен.

РЕДАКТИРОВАТЬ: В части цикла while

 /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break

По какой-то причине он не распознает код возврата. Когда вызывается служба mysqld stop, процесс уже был остановлен, но не уверен, почему он не позволяет циклу разорваться.

РЕДАКТИРОВАТЬ: Дальнейшее тестирование показывает странное поведение между вызовами /bin/kill и просто звоню kill, очевидно, они возвращают разные коды, почему ??????:

[root@server]# /bin/kill 25200
kill 25200: No such process
[user@server]# echo ${?}
0
[root@server]# kill 25200
-bash: kill: (25200) - No such process
[root@server]# echo ${?}
1

РЕДАКТИРОВАТЬ: Я вошел в систему как пользователь без полномочий root и попытался выполнить «kill» и «/ bin / kill» с неожиданными результатами:

[notroot@server ~]$ kill -0 23232
-bash: kill: (23232) - No such process
[notroot@server ~]$ echo $?
1
[notroot@server ~]$ /bin/kill -0 23232
kill 23232: No such process
(No info could be read for "-p": geteuid()=501 but you should be root.)
[notroot@server ~]$ echo $?
0

Ошибка «Информация не может быть прочитана» не появляется на других моих серверах при выполнении kill и bin / kill от имени пользователя, не являющегося пользователем root.

РЕДАКТИРОВАТЬ: Добавлен журнал, описанный квантами, а также проверен журнал mysql:

После запуска и остановки журнал mysql показывает следующее:

110918 00:11:28 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
110918  0:11:28 [Note] Plugin 'FEDERATED' is disabled.
110918  0:11:28  InnoDB: Initializing buffer pool, size = 16.0M
110918  0:11:28  InnoDB: Completed initialization of buffer pool
110918  0:11:29  InnoDB: Started; log sequence number 0 44233
110918  0:11:29 [Warning] 'user' entry 'root@server' ignored in --skip-name-resolve mode.
110918  0:11:29 [Warning] 'user' entry '@server' ignored in --skip-name-resolve mode.
110918  0:11:29 [Note] Event Scheduler: Loaded 0 events
110918  0:11:29 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.1.58-ius'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Distributed by The IUS Community Project
110918  0:11:34 [Note] /usr/libexec/mysqld: Normal shutdown

110918  0:11:34 [Note] Event Scheduler: Purging the queue. 0 events
110918  0:11:34  InnoDB: Starting shutdown...
110918  0:11:39  InnoDB: Shutdown completed; log sequence number 0 44233
110918  0:11:39 [Note] /usr/libexec/mysqld: Shutdown complete

110918 00:11:39 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

Затем в tmp / mysql.log:

kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process
kill 23080: No such process

Я остановил процесс остановки на полпути, поэтому мне не нужно ждать тайм-аута. Похоже процесс убили. Думаю, проблема все еще в разных кодах возврата из "kill" и "/bin/kill"

Перво-наперво: очень хорошо сделанная, систематическая и тщательная отладка, хорошая работа.

В моем поле RHEL 5.6 я всегда получаю код возврата 1, если пытаюсь убить несуществующий pid. Я пробовал использовать как root, так и непривилегированный пользователь, используя полный путь и только имя команды. Я также говорю только кратко kill XXX: No such process, без подробных сообщений об ошибках.

Может быть хорошей идеей запустить rpm -Vv util-linux и посмотреть, не заменил ли кто-нибудь /bin/kill с новой улучшенной версией. Даже если проверка rpm говорит, что файл нетронутый, я бы попробовал переименовать /bin/kill и копирование двоичного файла с рабочей машины. Если замена файла поможет и вы не обнаружите законный источник изменения, то независимо от результатов проверки rpm я бы предположил, что машина была взломана.