- 投稿日:2019-11-28T21:36:59+09:00
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にアクセスして情報を取得し、ブラウザに表示するプログラムを紹介します。書籍が手元にある方はぜひ確認してみてください。
環境構築
必要な環境
- Linux
- Docker https://docs.docker.com/install/
- docker-compose https://docs.docker.com/compose/install/
- 今回のコードは GitHub にpushしました。以降、これを読んでいるものとして話を進めます。
参考記事:
解説
- 今回は、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.cnf
とdocker-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
で入れたデータが表示されていることを確認してください。- ↓ こんなふうに表示されます。
おわりに
まず、Node.jsについての書籍を読み、サンプルを実行してみることで、Node.jsの挙動についてざっくりと理解できるようになりました。
加えて、それらをDocker上の環境で行うことで、
いままで「VirtualBoxより軽い仮想化するアプリケーション?」という認識だったDockerについての理解も深まりました。
Linuxのコンソールの扱いも以前よりわかるようになってきました。
やっと.profile
や.vimrc
をカスタマイズできるようになり、快適なUbuntu生活をしております。また、試行錯誤して、調べたり人に聞いたりしていくことが学びへの近道だと実感しました。
例えば、MySQLのバージョンに関しては自分では調べきれず、先輩方の知恵をお借りしました。
ありがとうございました。まだまだエンジニアとしては若輩者ですが、これからもっと勉強してスキルをつけ、開発をたくさんしていけたらと思います。
- 投稿日:2019-11-28T20:25:24+09:00
LaravelのHerokuへのデプロイ、DBはMySQL。
データベースにMYSQLを使う
HerokuではデータベースとしてPostgreSQLになっているため、アプリごとにClearDBを入れなければならない。利用にはクレジットカードが必要。(ClearDBの利用自体は無料)
$ heroku addons:add cleardb上記にコマンドの入力またはHerokuのサイトのsettingタブから導入できる。
Procfile を作成する
ProcfileというHerokuの設定ファイルを作成。サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。アプリフォルダの直下に作成する。
Procfileweb: 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.phpuse 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に慣れていないことを痛感させられた。
- 投稿日:2019-11-28T18:37:21+09:00
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ファイルを取得したい
参考資料
- 投稿日:2019-11-28T17:06:58+09:00
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
- 投稿日:2019-11-28T11:34:01+09:00
Railsでデータ抽出時、シンボルとクエリのSQL発行文の違い
環境
- Rails: 6.0.0
- Mysql: 5.7
- Ruby: 2.6.3
やりたいこと
where句を使ってのデータ抽出
シンボル
hogehoge_controller.rbids = [1, 3] message = Message.where(id: ids) #=> SELECT `messages`.* FROM `messages` WHERE `messages`.`id` IN (1, 3) ORDER BY `messages`.`created_at` DESCSQL文ベタ書き
hogehoge_controller.rbids = [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句を使ってクエリを発行してくれる。
- 投稿日:2019-11-28T10:46:08+09:00
MySQLのデータをダンプしてコンテナ上のMySQLにデータを取り込む方法
- 投稿日:2019-11-28T09:40:33+09:00
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 では bootstrap を読み込んでいるので、Webフォントなどのアイコンも利用できます。
MySQL テーブル仕様書メーカー的な何か の XSLT をベースにさせていただきました。まとめ
XML と XSLT を使用して様々なフォーマットに変換することができました。
標準では対応していない形式でもちょっとした応用をするだけで変換できそうですね。外部キー制約とかトリガーが XML にダンプされていませんが、これは
--xml
モードの場合、mysqlsump
内部でshow keys from <テーブル名>
コマンドを使った出力をしているためです。
バグとして公式のバグトラッカーに起票されていますが、結構昔なので対応されることはなさそうですね(笑)https://bugs.mysql.com/bug.php?id=66821テーブル定義書としては「片手落ち」なので、あくまでカジュアルに定義を確認したい時などに使用範囲はとどめておきましょう。
- 投稿日:2019-11-28T01:44:04+09:00
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"MySQLのデータをバックアップ
MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysqldump -u admin --all-databases --routines --triggers > /tmp/all-databases-5.1.sqlMySQLを停止
service mysqld stopDBデータ自体をバックアップ
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 | shmysqlをアップグレードする
途中、何度か確認事項がありますが、全て「y」で進み、最後に「Complete!」表示で完了です。
yum upgrade mysqlMySQL5.5を起動
service mysqld startDBデータをアップグレード
mysql_upgrade -uadmin -p`cat /etc/psa/.psa.shadow`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.sqlMySQL5.5を停止
service mysqld stopDBデータを再度、バックアップします。
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 ~MySQLのリポジトリを追加
yum install http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
MySQL5.7を無効化
「/etc/yum.repos.d/mysql-community.repo」を開いて、[mysql56-community]の「enabled=0」を「enabled=1」に変更し、 [mysql57-community]の「enabled=1」を0に変更します。
MySQLパッケージを更新します。
途中の選択肢は、全て「y」で問題ないです。
yum install mysql
MySQLを再起動
service mysqld startMySQLのデータをアップグレードします。
MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql_upgrade -uadmin psa以上でMySQLの更新が完了です。
Plesk上でも確認ができます。【補足】/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まで増加しました(汗)調査をしてみると、MySQL5.6から「table_definition_cache」の初期値が変更になったことが原因のようです。
「/etc/my.cnf」に以下を追加し、mysqlを再起動しました。
vi /etc/my.cnf [mysqld] performance_schema=0 table_definition_cache=400メモリが激減しました。
参考文献