web-dev-qa-db-ja.com

Perconaサーバーが/etc/init.d/mysql startでタイムアウトする

/etc/init.d/mysql startまたはservice mysql startを使用してmysqlを起動するたびに、常にタイムアウトします。

 * Starting MySQL (Percona Server) database server mysqld                   [fail] 

しかし、私はmysqlに入ることができます。インストールに問題があるかどうかを知りたいだけです。これは、1回限りのエラーではなく、常に発生するためです。

mysql-error.logは以下を示します:

121214 11:25:56 mysqld_safe Starting mysqld daemon with databases from /data/mysql/
121214 11:25:56 [Note] Plugin 'FEDERATED' is disabled.
121214 11:25:56 InnoDB: The InnoDB memory heap is disabled
121214 11:25:56 InnoDB: Mutexes and rw_locks use GCC atomic builtins
121214 11:25:56 InnoDB: Compressed tables use zlib 1.2.3
121214 11:25:56 InnoDB: Using Linux native AIO
121214 11:25:56 InnoDB: Initializing buffer pool, size = 14.0G
121214 11:25:58 InnoDB: Completed initialization of buffer pool
121214 11:26:01  InnoDB: Waiting for the background threads to start
121214 11:26:02 Percona XtraDB (http://www.percona.com) 1.1.8-rel29.2 started; log sequence number 9333955393950
121214 11:26:02 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
121214 11:26:02 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
121214 11:26:02 [Note] Server socket created on IP: '0.0.0.0'.
121214 11:26:02 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.005163' at position 624540946, relay log '/data/mysql/mysql-relay-bin.000043' position: 624541092
121214 11:26:02 [Note] Slave I/O thread: connected to master '[email protected]:3306',replication started in log 'mysql-bin.005180' at position 823447620
121214 11:26:02 [Note] Event Scheduler: Loaded 0 events
121214 11:26:02 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.28-29.2-log'  socket: '/data/mysql/mysql.sock'  port: 3306  Percona Server (GPL), Release 29.2
6
ks_1010

エラーログの表示はかなり正常に見えます

ソケットファイルが作成されましたMySQLレプリケーションが正常に開始されました_/usr/sbin/mysqld: ready for connections._が表示されます

特に_/usr/sbin/mysqld: ready for connections._が表示されるので、先ほど述べたmysqlに接続できるはずです。

Mysqldプロセスは正常です。

エラーは_/etc/init.d/mysql_から発生している可能性がありますが、mysqldが必要な他のすべてを実行する前ではありません。

_/etc/init.d/mysql_の中を見ると2行あります

_[root@***** init.d]$ cat mysql | grep -n "&" | grep "pid-file"
313:      $manager --user=$user --pid-file=$pid_file >/dev/null 2>&1 &
327:      $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &
_

_/etc/init.d/mysql_がタイムアウトした場合、これらの2行の後で間違いなく発生しました。

ここにpidファイルをチェックするコードがあります

_wait_for_pid () {
  verb="$1"
  manager_pid="$2"  # process ID of the program operating on the pid-file
  i=0
  avoid_race_condition="by checking again"
  while test $i -ne $service_startup_timeout ; do

    case "$verb" in
      'created')
        # wait for a PID-file to pop into existence.
        test -s $pid_file && i='' && break
        ;;
      'removed')
        # wait for this PID-file to disappear
        test ! -s $pid_file && i='' && break
        ;;
      *)
        echo "wait_for_pid () usage: wait_for_pid created|removed manager_pid"
        exit 1
        ;;
    esac

    # if manager isn't running, then pid-file will never be updated
    if test -n "$manager_pid"; then
      if kill -0 "$manager_pid" 2>/dev/null; then
        :  # the manager still runs
      else
        # The manager may have exited between the last pid-file check and now.
        if test -n "$avoid_race_condition"; then
          avoid_race_condition=""
          continue  # Check again.
        fi

        # there's nothing that will affect the file.
        log_failure_msg "Manager of pid-file quit without updating file."
        return 1  # not waiting any more.
      fi
    fi

    echo $echo_n ".$echo_c"
    i=`expr $i + 1`
    sleep 1
  done

  if test -z "$i" ; then
    log_success_msg
    return 0
  else
    log_failure_msg
    return 1
  fi
}
_

wait_for_pid()は、mysqld_safeの起動後に呼び出されます

_  # Give extra arguments to mysqld with the my.cnf file. This script
  # may be overwritten at next upgrade.
  pid_file=$server_pid_file
  $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &
  wait_for_pid created $!; return_value=$?
_

最悪の場合、mysqldはpidファイルなしで実行されます。これに照らして、_service mysql stop_および_/etc/init.d/mysql stop_は、pidファイルをチェックしてmysqldのプロセスIDを認識しているため、正しく機能しない可能性があります。

Pidファイルがない場合、mysqldをシャットダウンする適切な方法は次のとおりです。

_# mysqladmin -uroot -h127.0.0.1 --protocol=tcp -p shutdown
_

警告

これは局所的な現象ではありません。これは、標準のMySQLバイナリでも発生します。

3
RolandoMySQLDBA

Initスクリプトはmysqladmin --defaults-file=/etc/mysql/debian.cnf pingを使用してUbuntuで実行中のMySQL/Perconaサーバーをチェックしているようです(この場合は/etc/init.d/mysqlの27行目と77行目を参照してくださいpercona-server-server-5.5パッケージバージョン5.5.28-rel29.2-360.precise)。これはデフォルトの新規インストールで機能しますが、別のマシンからレプリケーションをセットアップするときにデータファイルをコピーすると、debian.cnfで構成されたユーザーが一致しなくなります。

その結果、mysqladminコマンドは失敗し、initスクリプトはreportサービスが失敗しますが、ログで確認できるように、正常に実行されます。

1つの解決策は、initスクリプトが期待するMySQLユーザーを再作成することです。マスターで、次のようにユーザーを追加するだけです(デフォルトですべての権限を持っているようです!)。

GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES,
CREATE USER, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, FILE, INDEX, INSERT,
LOCK TABLES, PROCESS, REFERENCES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE,
SELECT, SHOW DATABASES, SHOW VIEW, SHUTDOWN, SUPER, TRIGGER, UPDATE
ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD 
*replacethiswithaknownhash' WITH GRANT OPTION;

/etc/mysql/debian.cnfファイルを作成/変更します。

[client]
Host     = localhost
user     = debian-sys-maint
password = yourpass
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
Host     = localhost
user     = debian-sys-maint
password = yourpass
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

レプリケーションプロセスが追いつくのを待ってから、再起動を試みる必要がある場合があります。

3
gertvdijk

Debianでもまったく同じ問題がありました。サーバーは実際に起動しますが、initスクリプトは失敗したと言います。

/etc/mysql/debian.cnf has the mysql socket set at /var/run/mysqld/mysqld.sock

一方、my.cnfでは、

/var/lib/mysql/mysql.sock

My.cnfのソケットとpidパスが設定されているものを指していることを確認してください

/etc/mysql/debian.cnf

また、mysqlではなくmysqldを指すようにしてください

0
steven

これは少し古いですが、2015年4月30日で、Percona 5.6でも同じ問題が発生しました。

/etc/init.d/mysqlの「start」関数には、次のものが含まれます(ln:112から開始)。

#wait 10sec before start checking if pid file created or server is dead
if [ $dead_check_counter -lt 10 ]; then
   dead_check_counter=$(( dead_check_counter + 1 ))
else
  if mysqld_status check_dead warn; then break; fi
fi

通常、サーバーの起動には約40〜70秒かかります(97GBのinnodbバッファープールの初期化だけでも約35秒かかります)。ソケットファイルがまだ作成されていないため、当然、「start」は「dead」と報告します。

「10」の値を増やしたところ、うまくいきました。

乾杯

0
Alex Sayegh