技術   MySQL

CentOS 6 に MySQL 5.7 をインストールしようとしてトラブった話

やろうとしたことと原因

やろうとしたことは、CentOS 6 に対して、MySQL 5.7 をインストールして、mysqld 起動させることで、結論から話すと原因は、MySQL 5.1 で構築されていた時のデータが残っていて、新規にインストールしたMySQL 5.7 とデータが一致しなかったことや、mysql.user テーブルが壊れてしまっていたことにありました。
実施した内容を順を追って説明します。

実施した内容

  1. 既存の MySQL(5.1.73)を削除する。
    まず最初に実施したのは、CentOS 6系にデフォルトでインストールされているバージョン 5.1.73 を削除しました。
    下記コマンドでインストールされている MySQL 5.1.73 のパッケージ一覧を表示します。
    $ rpm -qa | grep mysql
    mysql-libs-5.1.73-8.el6_8.x86_64
    mysql-5.1.73-8.el6_8.x86_64
    mysql-devel-5.1.73-8.el6_8.x86_64
    php-mysql-5.3.3-49.el6.x86_64
    mysql-server-5.1.73-8.el6_8.x86_64
    確認後、削除します。
    $ sudo yum -y remove mysql*
  2. yum リポジトリを追加して、MySQL 5.7 をインストールする。
    $ sudo rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm
    $ sudo yum -y install mysql-community-server
    インストール完了後、mysqld を起動するも失敗。。。まずはここでトラブりました。
  3. エラーログ(/var/log/mysqld.log)を確認する。
    すると、下記のようなエラーが発生してました。
    2018-09-21T07:26:06.967894Z 0 [ERROR] InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
    2018-09-21T07:26:06.971955Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
    2018-09-21T07:26:07.572795Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
    2018-09-21T07:26:07.572836Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
    2018-09-21T07:26:07.572855Z 0 [ERROR] Failed to initialize builtin plugins.
    2018-09-21T07:26:07.572870Z 0 [ERROR] Aborting

    下記参考サイトによると、バージョン5.1で構築していた時のデータが残っていて、新しくインストールしたバージョン5.7と一致しないのが原因だそうで、/var/lib/mysql ディレクトリにある下記ファイルを削除すると解消できるとありました。
    参考サイト: CentOS 6.4 で MySQL を 5.1 から 5.6 に上げる

    # cd /var/lib/mysql
    # rm -rf ib_logfile0
    # rm -rf ib_logfile1
    # rm -rf ibdata1

    3つのファイルを削除し、mysqld を起動。。。また失敗。再度エラーログを確認すると、違うエラーが発生してました。

    [Warning] System table 'plugin' is expected to be transactional.
    2018-09-21T07:57:52.747339Z 0 [Note] Salting uuid generator variables, current_pid: 3622, server_start_time: 1537516671, bytes_sent: 0,
    2018-09-21T07:57:52.747414Z 0 [Note] Generated uuid: '0aa88bba-bd74-11e8-a25a-005056922110', server_start_time: 1019502367183516325, bytes_sent: 72642880
    2018-09-21T07:57:52.747451Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 0aa88bba-bd74-11e8-a25a-005056922110.
    2018-09-21T07:57:52.757983Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
    2018-09-21T07:57:52.758133Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
    2018-09-21T07:57:52.758502Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
    2018-09-21T07:57:52.758577Z 0 [Note] IPv6 is available.
    2018-09-21T07:57:52.758612Z 0 [Note]   - '::' resolves to '::';
    2018-09-21T07:57:52.758690Z 0 [Note] Server socket created on IP: '::'.
    2018-09-21T07:57:52.772347Z 0 [Warning] Failed to open optimizer cost constant tables
    
    2018-09-21T07:57:52.804460Z 0 [ERROR] Fatal error: mysql.user table is damaged. Please run mysql_upgrade.
    2018-09-21T07:57:52.804541Z 0 [ERROR] Fatal error: Failed to initialize ACL/grant/time zones structures or failed to remove temporary table files.
    2018-09-21T07:57:52.804636Z 0 [ERROR] Aborting

    今度は少し多いですが、注目すべき点は Fatal error: mysql.user table is damaged. Please run mysql_upgrade. の部分で、どうやら mysql.user テーブルが壊れている模様でした。mysql_upgrade コマンドを使用して、アップグレードを実施してくれとのこと。。。ここでまた、トラブル。あれ、そもそも mysqld が起動しないのでコマンドを実行できない。正直詰んだと思いましたが、まだ方法はありました。

  4. セーフモードで MySQL を起動する。
    参考サイト: MySQL5.1→5.7へアップグレード
    mysqld が起動できなくてもセーフモードだと立ち上げることが可能だそうで、セーフモードで起動後アップグレードを実施しました。
    # mysqld をセーフモードで起動する(パスワード入力無しでログインできるように skip-grant-tables オプションをつける)。
    $ sudo mysqld_safe --skip-grant-tables &
    [2] 15394
    $ 2018-09-21T08:13:41.431477Z mysqld_safe Logging to '/var/log/mysqld.log'.
    2018-09-21T08:13:41.507063Z mysqld_safe A mysqld process already exists
    
    # プロンプトが表示されないのでわかりづらいですが、ここで下記コマンドにてアップグレードを実施する(root パスワードは無しにしたので何も入力せずにそのまま実行)。
    mysql_upgrade -u root -p
    Enter password:
    Checking if update is needed.
    Checking server version.
    Running queries to upgrade MySQL server.
    Checking system database.
    mysql.columns_priv                                 OK
    mysql.db                                           OK
    mysql.engine_cost                                  OK
    mysql.event                                        OK
    mysql.func                                         OK
    mysql.general_log                                  OK
    mysql.gtid_executed                                OK
    mysql.help_category                                OK
    mysql.help_keyword                                 OK
    mysql.help_relation                                OK
    mysql.help_topic                                   OK
    mysql.host                                         OK
    mysql.innodb_index_stats                           OK
    mysql.innodb_table_stats                           OK
    mysql.ndb_binlog_index                             OK
    mysql.plugin                                       OK
    mysql.proc                                         OK
    mysql.procs_priv                                   OK
    mysql.proxies_priv                                 OK
    mysql.server_cost                                  OK
    mysql.servers                                      OK
    mysql.slave_master_info                            OK
    mysql.slave_relay_log_info                         OK
    mysql.slave_worker_info                            OK
    mysql.slow_log                                     OK
    mysql.tables_priv                                  OK
    mysql.time_zone                                    OK
    mysql.time_zone_leap_second                        OK
    mysql.time_zone_name                               OK
    mysql.time_zone_transition                         OK
    mysql.time_zone_transition_type                    OK
    mysql.user                                         OK
    Upgrading the sys schema.
    Checking databases.
    sys.sys_config                                     OK
    Upgrade process completed successfully.
    Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13
    [2]+  終了 1                sudo mysqld_safe --skip-grant-tables

    無事にアップグレードが完了したので、mysqld を起動すると。。。今度こそ立ち上がりました!

  5. root の初期パスワードを更新する。
    最後に root のパスワードを変更します。mysqld が起動しないトラブルでガチャガチャしていたせいか、本来確認できるはずの root の初期パスワードがログに記されていなかったので、下記参考サイトの通りに対処して root のパスワードを更新しました。
    参考サイト: MySQL 5.7でrootユーザのパスワードを再設定

反省点

  • 事前にもっとよく確認しておけば良かった。 今回サーバーが【tattch】が触る段階ですでに MySQL 5.1 で誰かの手によって構築されていたわけですが、受け取った時にもっとよく確認しておけば良かったと思いました。いつもは自分が一番最初にサーバーに触っていたので、自分がやったことを把握していたので、トラブルが起きることはあまりなかったですが、今回のように一度誰かが触ったサーバーを触る場合はもっといろんなことを考えて慎重に作業をしていかないといけないと反省しました。
  • サーバー周りのことは後回しにしない。 そもそも CentOS 7 だったらこんなことにはなっていなかった!!。。。はずです。 案件の始めに CentOS 7 でお願いしますとサーバー会社に伝えましたが、なぜか CentOS 6 で構築されたものを受け取ることになりました。別に6でも動くのでいっかと軽く考え実装を優先した結果、後々サーバー周りでトラブってしまいました。実装も大事ですが、サーバー周りをちゃんと固めてからの方が良かったと反省。
目次へ戻る

終わりに

一体誰の役に立つ記事なのか微妙な感じのする記事な気がしますが、現に【tattch】が過去に同様なことでトラブった参考サイトに助けられたので、この記事もいつか誰かの役に立つこともあると信じてます。

目次へ戻る