20191128のMySQLに関する記事は8件です。

Node.jsでMySQLに接続するのをDockerでやってみた

この記事は富士通クラウドテクノロジーズ Advent Calendar 2019 5日目の記事です。
4日目は @tmtms さんの MySQL Parameters を拡張した でした。

はじめに

  • ※本記事は、 Node.js超入門[第2版] のサンプルコードをDocker上で動かす趣旨のものです。 よって、書籍で言及されている階層は触れません。

はじめまして。Node.jsを勉強中の新卒エンジニアです。
配属したてホヤホヤです。
今回は Node.js超入門[第2版] を使って勉強したときの話をします。

この書籍の内容をDockerで実現しようとした経緯ですが、そのまま「Dockerを理解したかったから」です。
弊社の研修でもDockerについて触れていただいたのですが、一度教わっただけでは理解が難しいものでした。
というわけで、サンプルコードを写経するだけになりがちだった(主観です)プログラミングの本で、ついでに理解を深めようという魂胆です。

今回は、書籍の Chapter5「値とデータをマスターしよう!」の、Section5-3~5-4 で書かれている、Node.jsでDBにアクセスして情報を取得し、ブラウザに表示するプログラムを紹介します。書籍が手元にある方はぜひ確認してみてください。

環境構築

必要な環境

参考記事:

解説

  • 今回は、Node.jsもMySQLも、Dockerコンテナとして生成しています。
  • Node.jsサーバーは、 docker-compose.yml から Dockerfile を呼び出す形で書き、MySQLサーバーは docker-compose.yml 内で定義しています。
  • docker-compose.yml で指定するMySQLのDockerイメージは、MySQLのバージョンが8よりも前になるように古いものを使っています。 8以降はそのままだとNode.jsとの連携ができないようです。
  • init-mysql.sh は、ローカル環境から、データベース用のコンテナにアクセスし、テーブル作成->データ挿入までを行っています。
  • 実は、docker/db/my.cnfdocker-compose.yml の2か所で mysqld を設定しているのですが、どちらかを消すとなぜかエラーになってしまうため(!)そのままにしてあります。いい方法ががありましたら教えていただけると幸いです・・・。
  • 余談ですが、今回のコードは、いままで述べてきたものとは別のDockerfileでExpress-generatorを実行し、 docker cp でローカルにファイルをコピーしてから作成していきました。 めんどうくさいことをしたなと自分で思います。

動作確認

  • 上記のリポジトリをcloneします。
  • リポジトリに移動
  • docker-compose up -d でコンテナを立ち上げます。
  • すこし(10秒ほど)時間をおきます。(コンテナが出来上がるまで待つ)
  • ローカルで ./init-mysql.sh を実行します。
  • localhost/hello にアクセスし、 docker/db/sql/002-insert-records.sql で入れたデータが表示されていることを確認してください。
  • ↓ こんなふうに表示されます。

image.png

おわりに

まず、Node.jsについての書籍を読み、サンプルを実行してみることで、Node.jsの挙動についてざっくりと理解できるようになりました。
加えて、それらをDocker上の環境で行うことで、
いままで「VirtualBoxより軽い仮想化するアプリケーション?」という認識だったDockerについての理解も深まりました。
Linuxのコンソールの扱いも以前よりわかるようになってきました。
やっと .profile.vimrc をカスタマイズできるようになり、快適なUbuntu生活をしております。

また、試行錯誤して、調べたり人に聞いたりしていくことが学びへの近道だと実感しました。
例えば、MySQLのバージョンに関しては自分では調べきれず、先輩方の知恵をお借りしました。
ありがとうございました。

まだまだエンジニアとしては若輩者ですが、これからもっと勉強してスキルをつけ、開発をたくさんしていけたらと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのHerokuへのデプロイ、DBはMySQL。

データベースにMYSQLを使う

HerokuではデータベースとしてPostgreSQLになっているため、アプリごとにClearDBを入れなければならない。利用にはクレジットカードが必要。(ClearDBの利用自体は無料)

$ heroku addons:add cleardb

上記にコマンドの入力またはHerokuのサイトのsettingタブから導入できる。

Procfile を作成する

ProcfileというHerokuの設定ファイルを作成。サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。アプリフォルダの直下に作成する。

Procfile
web: vendor/bin/heroku-php-apache2 public/

中身は上記のように。

環境変数の設定

どの項目を登録すべきかよくわからなかったためいろいろやってみたが注意すべきはDBに関する項目。

DB_DATABASE=[データベース名]
DB_HOST=[ホスト名]
DB_USERNAME=[ユーザー名]
DB_PASSWORD=[パスワード]

これらはenvファイルの設定ではなくclearDBの設定で、そのURL内にある。下記コマンドで表示。

heroku config:get CLEARDB_DATABASE_URL

#URLが表示される
mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

またセキュリティ関連のAPP_KEYの設定も必須。

heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)

envファイルのAPP_KEYの項目をartisanコマンドで取得

HerokuのMYSQLにmigrateする

自分はここに一番時間を取られた。マイグレーションがうまくいかない。

Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

何度やってもこのエラーメッセージが出てくる。訳すと「指定されたキーは長すぎます。キーの長さは最大767バイトです。」

調べていくとvarchar型の文字数を191に制限しなければこのエラーが出るらしい。

app\Providers\AppServiceProvider.phpに以下を追加。

AppServieProvider.php
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

自分はSchemaクラスをuseするのを忘れていたため時間がとられてしまった。
use Illuminate\Support\Facades\Schema;を忘れないように。

デプロイする

HerokuではアプリをGitを利用してデプロイする。自分はGitも初心者だったためここでもかなり時間を要した。

まずはHerokuのアプリをリモートとして登録

git init
heroku git:remote -a <herokuのアプリ名>

ローカルリポジトリにコミットし

git add .
git commit -m "コミットメッセージ"

プッシュすることによりデプロイする

git push heroku master

問題がなければheroku openでサイトを開くことができる

heroku open


思った以上に時間がかかってしまった。自分が犯していた間違いはdevelopブランチにProcfileファイルを作成し、マージしないままmasterをプッシュをしていたこと。そのほかにもGitの基本的な操作ができていなかった。HerokuよりもGitに慣れていないことを痛感させられた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL/PostgreSQLに対応したdump/recreate/validateツールを作りました

概要

  • MySQL/PostgreSQLに対応したdump/recreate/validateツールを作りました。
  • Dump機能はデータベース単位でDDLを生成し、テーブル毎にDDL+Insert文を出力します。
  • Recreate機能はデータベースをDrop and Restoreすることでdumpファイルが正常に復元できることをチェックします。
  • Validate機能はテーブル単位でCheckSumまたはMD5値を取得して保存し、リストア前後でデータの欠損や変更がないことをチェックします。
  • github.com/m22r/chronicleにてコードを公開してます。

インストール方法

$ git clone git@github.com:m22r/chronicle.git
$ make build

使い方

dump

Store dump files of all databases and tables

Usage:
  chronicle dump [flags]

Flags:
  -h, --help        help for dump
      --only-info   Create only information file
      --skip-info   Skip creating information file

Global Flags:
      --bucket string    Bucket which store dump and information files (required only if store at not local)
      --dbms string      Type of the database management system (choice "mysql", "postgres")) (default "mysql")
      --dir string       Directory which store dump and information files (required)
  -H, --host string      Hostname of database (default "127.0.0.1")
  -p, --pass string      Password of database
  -P, --port int         Port of database (default 3306)
      --retry int        Maximum number of tries (default 5)
      --storage string   Type of storage which store dump and information files (choice "s3", "local") (default "local")
      --thread int       Maximum number of threads (default 10)
  -u, --user string      Username of database (default "root")

recreate

Recreate all databases and tables with dumped files and informations.

Usage:
  chronicle recreate [flags]

Flags:
  -h, --help   help for recreate

Global Flags:
      --bucket string    Bucket which store dump and information files (required only if store at not local)
      --dbms string      Type of the database management system (choice "mysql", "postgres")) (default "mysql")
      --dir string       Directory which store dump and information files (required)
  -H, --host string      Hostname of database (default "127.0.0.1")
  -p, --pass string      Password of database
  -P, --port int         Port of database (default 3306)
      --retry int        Maximum number of tries (default 5)
      --storage string   Type of storage which store dump and information files (choice "s3", "local") (default "local")
      --thread int       Maximum number of threads (default 10)
  -u, --user string      Username of database (default "root")

validate

Validate all restored tables and databases.

Usage:
  chronicle validate [flags]

Flags:
  -h, --help   help for validate

Global Flags:
      --bucket string    Bucket which store dump and information files (required only if store at not local)
      --dbms string      Type of the database management system (choice "mysql", "postgres")) (default "mysql")
      --dir string       Directory which store dump and information files (required)
  -H, --host string      Hostname of database (default "127.0.0.1")
  -p, --pass string      Password of database
  -P, --port int         Port of database (default 3306)
      --retry int        Maximum number of tries (default 5)
      --storage string   Type of storage which store dump and information files (choice "s3", "local") (default "local")
      --thread int       Maximum number of threads (default 10)
  -u, --user string      Username of database (default "root")

想定しているユースケース

  • テーブル毎のdumpファイルをテキストベースで取得したい
  • 取得したdumpファイルがきちんと復元できることをチェックしたい
  • MySQLとPostgreSQLを両方利用しているが、同じようなフォーマットでdumpファイルを取得したい

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLにアクセスしようとすると、接続エラーが発生しアクセスできない。

プログラミング超初心者のtoshizuという者です。

プログラミングを学習していく中でデータベースに興味を持ち、自分のPCに導入しようとしてみたのですが、
MySQLをインストールし、実行してみようとすると、接続エラーになる問題で困っています。
原因または解決策をご存知の方はいらっしゃいませんか。

私の行った手順は以下の通りです。
(1)MySQLのサイト(https://dev.mysql.com/downloads/mysql/) から「Windows (x86, 64-bit), ZIP Archive」 をダウンロード。

(2)PCのDドライブに、MySQL専用のフォルダを作成し、フォルダ内にzipファイルを展開

(3)同フォルダ内に、「data」、「logs」、「temp」、「mydata」フォルダを作成。さらに「my.ini」ファイルを作成し、参考記事に記載されていたコードをコピーペースト。

(4)管理者モードでコマンドプロンプトを起動。MySQLをインストールしたフォルダに移動し、以下のコマンドでMySQLを初期化。

bin\mysqld --initialize-insecure --user=mysql

(5)以下のコマンドでMySQLを起動。

bin\mysqld --defaults-file=".\my.ini" --console

(6)新たにコマンドプロンプトを立ち上げて、以下のコマンドを実行し、MySQLにアクセスしようとしました。

D:\myplace\01_server\mysql\bin>mysql -u root --skip-password

すると、以下のような結果になりました。

ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10060)

私はこの手順でMySQLに接続できると思いました。
なぜなら、今回参考にさせていただいた記事(https://qiita.com/KOJI-YAMAMOTO/items/02af20e7b5cd27932a27) の内容を、忠実に踏襲させていただいたからです。

原因を確かめるため、以下のようなテストを行ってみましたが、
問題の解決には至りませんでした。

(a) D:\myplace\01_server\mysqlに作ったmy.iniファイル内にある「basedir」、「datadir」といった変数を、「mysql」、「mysqldir」などといった名前に変更してみた。
→上記と同じ結果になった

(b) my.iniファイルを、binフォルダにコピーしてみた。
→最終的には、上記と同じ結果になった

(c)ネットで調べた結果、ファイアウォールの設定を変える必要がある場合がある、という結果を見たので、windows10のファイアウォールの設定を変えようとしましたが、MySQLフォルダの中身が混沌としすぎていて何をどうすればいいのか理解できなかった。

ちなみに、上記の手順のうち、(5)の手順を踏んだ際に、参考にした記事とは違う、以下のようなメッセージが表示されます。


D:\myplace\01_server\mysql\bin>mysqld --defaults-file=".\my.ini" --console
2019-11-28T07:37:10.128011Z 0 [System] [MY-010116] [Server] D:\myplace\01_server\mysql\bin\mysqld.exe (mysqld 8.0.18) starting as process 19708
2019-11-28T07:37:10.128106Z 0 [ERROR] [MY-010338] [Server] Can't find error-message file 'C:\00_myspace\01_server\mysql\share\errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
2019-11-28T07:37:10.129126Z 0 [Warning] [MY-010091] [Server] Can't create test file C:\00_myspace\01_server\mysql\data\mysqld_tmp_file_case_insensitive_test.lower-test
2019-11-28T07:37:10.129212Z 0 [Warning] [MY-010091] [Server] Can't create test file C:\00_myspace\01_server\mysql\data\mysqld_tmp_file_case_insensitive_test.lower-test
2019-11-28T07:37:10.129348Z 0 [ERROR] [MY-013276] [Server] Failed to set datadir to 'C:\00_myspace\01_server\mysql\data\' (OS errno: 2 - No such file or directory)
2019-11-28T07:37:10.146477Z 0 [ERROR] [MY-010119] [Server] Aborting
2019-11-28T07:37:10.146598Z 0 [System] [MY-010910] [Server] D:\myplace\01_server\mysql\bin\mysqld.exe: Shutdown complete (mysqld 8.0.18) MySQL Community Server - GPL.


なお、私の環境は以下の通りです。
【PC:Inspiron3471, メモリ:8GB, OS:Windows 10 Home(64ビット)】

検索エンジンでエラーメッセージをペーストし検索しましたが、
解決に役立つ情報は見つかりませんでした。
初歩的な質問で申し訳ありませんが、よろしくお願い致します。

toshizu

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsでデータ抽出時、シンボルとクエリのSQL発行文の違い

環境

  • Rails: 6.0.0
  • Mysql: 5.7
  • Ruby: 2.6.3

やりたいこと

where句を使ってのデータ抽出

シンボル

hogehoge_controller.rb
ids = [1, 3]
message = Message.where(id: ids)

#=> SELECT `messages`.* FROM `messages` WHERE `messages`.`id` IN (1, 3) ORDER BY `messages`.`created_at` DESC

SQL文ベタ書き

hogehoge_controller.rb
ids = [1, 3]
message = Message.where(id: ids)

#=> SELECT `messages`.* FROM `messages` WHERE (id = 1,3) ORDER BY `messages`.`created_at` DESC
# "Mysql2::Error: Operand should contain 1 column(s)"というエラー発生

結論

シンボルだとIN句を使ってクエリを発行してくれる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのデータをダンプしてコンテナ上のMySQLにデータを取り込む方法

似たようなことを何回も調べてる気がするのでめも :pencil:

ダンプする

mysqldump -u [ユーザー名] -p -h [ホスト名] [DB名] >> dump.sql

Dockerコンテナ上のmysqlにダンプファイルを読み込む

$ docker cp dump.sql sample_mysqldb_1:/tmp/
$ docker exec -it sample_mysqldb_1 sh
# mysql -u[ユーザー名] -p[パスワード] -h[ホスト名] [DB名] < /tmp/dump.sql
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

A5:SQL Mk-2 に頼らない MySQL のテーブル定義出力

こちらは ZYYX Advent Calendar 2019 2日目の記事です。

テーブル定義書の生成といえば、おなじみの A5:SQL Mk-2 でエクセルベースのテーブル定義書をエクスポートするのが定番ですが、残念ながら Windows のみで Mac に対応していません。
Wine で強引に exe を実行するという方法もありますが、今回はよりカジュアルに Mac でHTML・Markdownでテーブル定義書を書き出す方法をご紹介します。

  • mysqldump で DDL をXML形式で出力
  • XSLT をあててHTMLやMarkdown に変換

以上の流れになります。

DDLのエクスポート

まずは mysqldump コマンドでXML形式のDDLをエクスポートします。

mysqldump -u <ユーザー名> -p <パスワード> --no-data --xml <データベース名> > <出力ファイル名(XML)>

XSLT のアタッチ

dump した XML に xsltproc で変換したいフォーマット用のXSLTをあてて変換します。

# HTMLに変換
xsltproc -o <出力ファイル名(HTML)> htmlstyle.xslt <XMLファイルパス>

# Markdownに変換
xsltproc -o <出力ファイル名(md)> mdstyle.xslt <XMLファイルパス>

htmlstyle.xsl(HTMLに変換)

<?xml version="1.0" encoding="utf8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://sqlfairy.sourceforge.net/sqlfairy.xml">
    <xsl:output method="html" encoding="utf8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>

    <xsl:template match="database">
        <html lang="ja">
            <head>
                <meta charset="utf-8"/>
                <title><xsl:value-of select="@name"/> テーブル定義</title>
                <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"/>
                <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css"/>
                <style>
                    table.htable {
                        margin: 3em auto 1em auto !important;
                    }
                    table.htable th {
                        border-left: 10px solid #e5e5e5 !important;
                    }
                    footer {
                        border-top: 1px solid #e5e5e5;
                        padding: 0.5em;
                    }
                </style>
            </head>

            <body>
                <div class="container">
                    <h1 class="page-header"><xsl:value-of select="@name"/> テーブル定義</h1>
                    <xsl:apply-templates select="table_structure"/>
                </div>
                <footer class="text-center">
                    your company
                </footer>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="table_structure">
        <h2 class="table-header"><xsl:value-of select="@name"/></h2>
        <table class="table table-bordered htable">
            <tbody>
                <tr class="active">
                    <th>論理テーブル名</th>
                    <td>
                        <xsl:value-of select="options/@Comment"/>
                    </td>
                </tr>
                <tr class="active">
                    <th>物理テーブル名</th>
                    <td><xsl:value-of select="@name"/></td>
                </tr>
            </tbody>
        </table>
        <table class="table table-condensed">
            <thead>
                <tr>
                    <th class="text-right">#</th>
                    <th>論理名</th>
                    <th>物理名</th>
                    <th>データ型</th>
                    <th>NULL</th>
                    <th>デフォルト値</th>
                    <th>主キー</th>
                    <th>ユニーク</th>
                </tr>
            </thead>
            <tbody>
                <xsl:apply-templates select="field"/>
            </tbody>
        </table>
        <table class="table table-condensed">
            <thead>
                <tr>
                    <th>インデックス名</th>
                    <th>カラム</th>
                    <th>複合キー順序</th>
                    <th>NULL</th>
                    <th>UNIQ</th>
                </tr>
            </thead>
            <tbody>
                <xsl:apply-templates select="key"/>
            </tbody>
        </table>
    </xsl:template>

    <xsl:template match="field">
        <tr>
            <td class="text-right"><xsl:value-of select="position()"/></td>
            <td><xsl:value-of select="@Comment"/></td>
            <td><xsl:value-of select="@Field"/></td>
            <td><xsl:value-of select="@Type"/></td>
            <td><xsl:if test="@Null='YES'"><span class="glyphicon glyphicon-ok"></span></xsl:if></td>
            <td><xsl:value-of select="@Default"/></td>
            <td><xsl:if test="@Key='PRI'"><span class="glyphicon glyphicon-ok"></span></xsl:if></td>
            <td><xsl:if test="@Key='UNI'"><span class="glyphicon glyphicon-ok"></span></xsl:if></td>
        </tr>
    </xsl:template>

    <xsl:template match="key">
        <tr>
            <td><xsl:value-of select="@Key_name"/></td>
            <td><xsl:value-of select="@Column_name"/></td>
            <td><xsl:value-of select="@Seq_in_index"/></td>
            <td><xsl:choose><xsl:when test="@Null != ''"><xsl:value-of select="@Null"/></xsl:when><xsl:otherwise>NO</xsl:otherwise></xsl:choose></td>
            <td><xsl:choose><xsl:when test="@Non_unique = '0'">YES</xsl:when><xsl:otherwise>NO</xsl:otherwise></xsl:choose></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

mdstyle.xsl(Markdownに変換)

<?xml version="1.0" encoding="utf8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://sqlfairy.sourceforge.net/sqlfairy.xml">
<xsl:output method="text" encoding="utf8"/>

<xsl:template match="database">
# <xsl:value-of select="@name"/> テーブル定義
<xsl:apply-templates select="table_structure"/>
</xsl:template>

<xsl:template match="table_structure">

## <xsl:value-of select="@name"/>
物理テーブル名|論理テーブル名
--------|--------
<xsl:value-of select="@name"/>|<xsl:value-of select="options/@Comment"/>

#### カラム情報
#|論理名|物理名|データ型|NULL|デフォルト値|主キー|Extra
----|----|----|----|----|----|----|---|
<xsl:apply-templates select="field"/>

#### インデックス情報
インデックス名|カラム|複合キー順序|NULL|UNIQ
----|----|----|----|----
<xsl:apply-templates select="key"/>
</xsl:template>

<xsl:template match="field">
<xsl:value-of select="position()"/>|<xsl:value-of select="@Comment"/>|<xsl:value-of select="@Field"/>|<xsl:value-of select="@Type"/>|<xsl:value-of select="@Null"/>|<xsl:choose><xsl:when test="@Default != ''"><xsl:value-of select="@Default"/></xsl:when><xsl:otherwise>n/a</xsl:otherwise></xsl:choose>|<xsl:choose><xsl:when test="@Key != ''"><xsl:value-of select="@Key"/></xsl:when><xsl:otherwise>n/a</xsl:otherwise></xsl:choose>|<xsl:choose><xsl:when test="@Extra != ''"><xsl:value-of select="@Extra"/></xsl:when><xsl:otherwise>n/a</xsl:otherwise></xsl:choose>|<xsl:text>
</xsl:text>
</xsl:template>

<xsl:template match="key">
<xsl:value-of select="@Key_name"/>|<xsl:value-of select="@Column_name"/>|<xsl:value-of select="@Seq_in_index"/>|<xsl:choose><xsl:when test="@Null != ''"><xsl:value-of select="@Null"/></xsl:when><xsl:otherwise>NO</xsl:otherwise></xsl:choose>|<xsl:choose><xsl:when test="@Non_unique = '0'">YES</xsl:when><xsl:otherwise>NO</xsl:otherwise></xsl:choose>|<xsl:text>
</xsl:text>
</xsl:template>

</xsl:stylesheet>

変換文書のイメージ

HTML
image.png

Markdown
image.png

HTML では bootstrap を読み込んでいるので、Webフォントなどのアイコンも利用できます。
MySQL テーブル仕様書メーカー的な何か の XSLT をベースにさせていただきました。

まとめ

XML と XSLT を使用して様々なフォーマットに変換することができました。
標準では対応していない形式でもちょっとした応用をするだけで変換できそうですね。

外部キー制約とかトリガーが XML にダンプされていませんが、これは --xml モードの場合、mysqlsump 内部で show keys from <テーブル名> コマンドを使った出力をしているためです。
バグとして公式のバグトラッカーに起票されていますが、結構昔なので対応されることはなさそうですね(笑)https://bugs.mysql.com/bug.php?id=66821

テーブル定義書としては「片手落ち」なので、あくまでカジュアルに定義を確認したい時などに使用範囲はとどめておきましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pleskで管理されたCentOS6のMySQLを5.1から5.6にアップグレードする

はじめに

Pleskで管理されたCentOS6.10のMySQL5.1を5.6までアップグレードしたので、その記録になります。

Pleskのサポートでは、以下の2記事がありますので、これを見ながら5.1から5.6へアップグレードしました。

CentOS7の方がMariaDB5.5を更新する場合は、以下を御覧ください。
https://qiita.com/idani/items/fc16cf52d487cacd6fcb

アップグレード手順

OSのバージョン確認

plesk version | grep "OS version"

2019-11-22_09h08_39.png

MySQLのデータをバックアップ

MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysqldump -u admin --all-databases --routines --triggers > /tmp/all-databases-5.1.sql

MySQLを停止

service mysqld stop

DBデータ自体をバックアップ

mkdir /var/lib/mysqlcopy-5.1
cp -aR /var/lib/mysql/* /var/lib/mysqlcopy-5.1/

yumにMySQL5.5を提供しているAtomicリポジトリを追加

wget -q -O - http://www.atomicorp.com/installers/atomic | sh

2019-11-22_09h09_32.png

2019-11-22_09h09_45.png

mysqlをアップグレードする

途中、何度か確認事項がありますが、全て「y」で進み、最後に「Complete!」表示で完了です。

yum upgrade mysql

2019-11-22_09h10_03.png

2019-11-22_09h10_15.png

2019-11-22_09h10_20.png
2019-11-22_09h10_55.png

2019-11-22_09h11_04.png

2019-11-22_09h11_12.png

2019-11-22_09h11_53.png

MySQL5.5を起動

service mysqld start

DBデータをアップグレード

mysql_upgrade -uadmin -p`cat /etc/psa/.psa.shadow`

2019-11-22_09h12_34.png
2019-11-22_09h12_42.png

MySQL5.5で動作確認

すでにMySQLで稼働中のWebアプリがある場合は、この時点で一旦、動作確認を行ってください。
問題ないようでしたら、MySQL5.6にアップグレードするために、次へ進みます。

MySQL5.5から5.6にアップグレードするのでバックアップを再度、取得します。

MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysqldump -u admin --all-databases --routines --triggers > /tmp/all-databases-5.5.sql

MySQL5.5を停止

service mysqld stop

DBデータを再度、バックアップします。

mkdir /var/lib/mysqlcopy-5.5
cp -aR /var/lib/mysql/* /var/lib/mysqlcopy-5.5/

Atomicリポジトリを無効化

「/etc/yum.repos.d/atomic.repo」の「enabled = 1」を「enabled = 0」に変更します。

vi /etc/yum.repos.d/atomic.repo

# Name: Atomic Rocket Turtle RPM Repository for CentOS / Red Hat Enterprise Linux 6 -
# URL: http://www.atomicrocketturtle.com/
[atomic]
name = CentOS / Red Hat Enterprise Linux $releasever - atomic
mirrorlist = http://updates.atomicorp.com/channels/mirrorlist/atomic/centos-$releasever-$basearch
enabled = 0 <= ここを1から0に変更
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY.art.txt
        file:///etc/pki/rpm-gpg/RPM-GPG-KEY.atomicorp.txt
gpgcheck = 1

# Almost Stable, release candidates for [atomic]
[atomic-testing]
name = CentOS / Red Hat Enterprise Linux $releasever - atomic - (Testing)
mirrorlist = http://updates.atomicorp.com/channels/mirrorlist/atomic-testing/centos-$releasever-$basearch
enabled = 0
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY.art.txt
        file:///etc/pki/rpm-gpg/RPM-GPG-KEY.atomicorp.txt
gpgcheck = 1
~

2019-11-22_09h13_54.png

MySQLのリポジトリを追加

yum install http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm

2019-11-22_09h14_11.png

2019-11-22_09h14_19.png

2019-11-22_09h14_29.png

MySQL5.7を無効化

「/etc/yum.repos.d/mysql-community.repo」を開いて、[mysql56-community]の「enabled=0」を「enabled=1」に変更し、 [mysql57-community]の「enabled=1」を0に変更します。

2019-11-22_09h15_03.png

MySQLパッケージを更新します。

途中の選択肢は、全て「y」で問題ないです。

yum install mysql

2019-11-22_09h15_35.png

2019-11-22_09h15_42.png

2019-11-22_09h16_15.png

2019-11-22_09h17_02.png

MySQLを再起動

service mysqld start

MySQLのデータをアップグレードします。

MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql_upgrade -uadmin psa

2019-11-22_09h17_35.png

2019-11-22_09h18_04.png

以上でMySQLの更新が完了です。
Plesk上でも確認ができます。

2019-11-22_09h20_11.png

【補足】/var/lib/php/sessionのパーミション確認

MySQLの更新にともなって、HttpdとPHPが再インストールされる場合があります。
この時に、「/var/lib/php/session」のパーミションが変更となってしまい、PHPをFastCGIで動かしている場合は、セッションが保存ができなくなる障害に直面しました。

このため以下の確認を行ってください。

以下の状態なら変更不要です。

ls -al /var/lib/php/
total 44
drwxr-xr-x  3 root root  4096 Aug 24  2016 .
drwxr-xr-x 39 root root  4096 Nov 27 03:50 ..
drwx-wx-wt  4 root root 36864 Nov 28 01:32 session

この状態だと修正が必要です。

ls -al /var/lib/php/
total 44
drwxr-xr-x  3 root root  4096 Aug 24  2016 .
drwxr-xr-x 39 root root  4096 Nov 27 03:50 ..
drwxrwx---  5 root apache 36864 Nov 20 10:50 session

修正する

cd /var/lib/php
chown root:root session
chmod 733 session/
chmod +t session

この設定だとsessionに書き込んだ情報がRoot以外は削除できなくなります。
Cronで定期的に掃除する必要があるそうです。
https://support.plesk.com/hc/en-us/articles/115004023093

【補足】perfonmance_schemaとtable_definition_cacheの調整

MySQL5.6にアップグレード後、メモリが急増しました。
アップグレード前が60MBぐらいだったのに、570MBまで増加しました(汗)

2019-11-22_09h40_58.png

調査をしてみると、MySQL5.6から「table_definition_cache」の初期値が変更になったことが原因のようです。

「/etc/my.cnf」に以下を追加し、mysqlを再起動しました。

vi /etc/my.cnf

[mysqld]
performance_schema=0
table_definition_cache=400

2019-11-22_10h00_47.png

メモリが激減しました。

2019-11-22_10h40_29.png

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む