- 投稿日:2021-02-21T23:42:25+09:00
The server quit without updating PID fileを解決する【MySQLエラー】
はじめに
mysql.server startやmysql.server restartの際に出るエラー、ERROR! The server quit without updating PID fileこのエラーにかなり手こずりました。
・PCを再起動する
・touchコマンドでPIDファイルを作る
・ファイルの権限を変更する
・MySQLをアンインストールしインストールし直すググッて調べた上記の方法がどれも上手くいかず途方にくれていましたが、
何とか解決できたので忘備録を兼ねて解決方法をまとめておきます。解決方法
①
まずはエラー解決の過程でMySQLのインストールとアンインストール繰り返してしまい、
MySQLのpathを増やしすぎてしまったので、増えすぎたpathを整理する。% cat .zshrc #.zshrcファイルの中身を表示実行結果
eval "$(rbenv init -)" export PATH="/usr/local/opt/mysql@5.6/bin:$PATH" export PATH="/usr/local/opt/mysql@5.7/bin:$PATH" export PATH="/usr/local/opt/mysql@5.6/bin:$PATH" export PATH="/usr/local/opt/mysql@5.6/bin:$PATH" export PATH="/usr/local/opt/mysql@5.6/bin:$PATH" export PATH="/usr/local/opt/mysql@5.6/bin:$PATH" eval "$(nodenv init -)" export PATH="/usr/local/opt/node@14/bin:$PATH" export PATH="/usr/local/opt/mysql@5.6/bin:$PATH" export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"MySQL5.6とMySQL5.7のpathが多すぎるので整理する。
VSコードを使ってpathを整理する時は新規ウィンドウを立ち上げ、
「コマンド+O」でホームディレクトリを選択。
ホームディレクトリの「.zshrcファイル」の中身を編集しMySQLのpathを一つに減らす。.zshrcファイル編集後
eval "$(rbenv init -)" eval "$(nodenv init -)" export PATH="/usr/local/opt/node@14/bin:$PATH" export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"その後、下記のコマンドで編集を保存する。
% source .zshrc②
次に不要なプロセスを確認します。
varディレクトリに移動しpsコマンドを実行。var % ps -e | grep mysql実行結果
534 ?? 0:00.03 /bin/sh /usr/local/opt/mysql@5.7/bin/mysqld_safe --datadir=/usr/local/var/mysql 638 ?? 0:11.43 /usr/local/opt/mysql@5.7/bin/mysqld --basedir=/usr/local/opt/mysql@5.7インストールしているMySQLのバージョンは@5.6なのに、@5.7のプロセスが残っていました。
これがエラーの原因であり、これをkillしてあげると解消されるはず。var % kill 534 var % kill 638これで不要なプロセスをkillすることができました。
% mysql.server start Starting MySQL . SUCCESS!改めて
mysql.server startすると上手く行きました。終わりに
MySQLは予期せぬエラーが多いとのことで、
MtSQLが立ち上がらない系のエラーはpathやプロセスをチェックするのがいいのかもしれません。
- 投稿日:2021-02-21T22:36:45+09:00
UbuntuでLaravel8
AWS EC2にて
Ubuntu 18.04.5 LTS
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionicパッケージ確認
ii php7.2 7.2.24-0ubuntu0.18.04.7 all server-side, HTML-embedded scripting language (metapackage) ii php7.2-cli 7.2.24-0ubuntu0.18.04.7 amd64 command-line interpreter for the PHP scripting language ii apache2 2.4.29-1ubuntu4.14 amd64 Apache HTTP Server ii mysql-server-5.7 5.7.33-0ubuntu0.18.04.1 amd64 MySQL database server binaries and system database setupLaravel8サーバー条件
php7.3以上
MySQL5.7以上(migrationの ('email')->unique()がこけるので実質5.7)
nodejs v12.14以上(npmでこけるものがあるのでこれも実質12.14)php7.4をインストール
php7.2を残したまま切り替えできる
https://www.souichi.club/wordpress/php-version-up/
何故か入っていない、mbstringとdomをインストールapt install php7.4-mbstring php7.4-xml php7.4-mysqlndphp.iniにてタイムゾーンだけ設定しておく
/etc/php/7.4/apache2/php.initimezone = Asia/Tokyonodejs アップグレード
nvmで入っているので、インストールするだけ
nvm install v15.8.0 nvmLaravel8 インストール
composerインストールする
composerコマンド、ここから(https://getcomposer.org/download/)
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');" mkdir ~/bin mv composer.phar ~/bin/composercomposer インストール
composer create-project laravel/laravel example-appApache2設定
デフォルトのドキュメントルートを付け替える
ubuntu:~/example-app $ sudo mv /var/www/html /var/www/html_org ubuntu:~/example-app $ sudo ln -s /home/ubuntu/example-app/public /var/www/htmlパーミッション設定
https://qiita.com/engulisyu/items/ad819d06ea0cd31411dfsudo usermod -a -G www-data ubuntu sudo chown -R ubuntu:www-data ~/example-app sudo find ~/example-app -type d -exec chmod 750 {} \; sudo find ~/example-app -type f -exec chmod 640 {} \; sudo chmod -R 770 ~/example-app/storage/ ~/example-app/bootstrap/cache/データベース設定
# mysql mysql> GRANT ALL PRIVILEGES ON *.* TO devuser@localhost IDENTIFIED BY '1234' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql> CREATE DATABASE devdb CHARACTER SET utf8mb4; mysql> \q.envDB_DATABASE=devdb DB_USERNAME=devuser DB_PASSWORD=1234Laravel Starter Kits (Breeze)インストール
cd example-app php artisan migrate composer require laravel/breeze --dev php artisan breeze:install npm install npm run devApache2のrewriteが効かない
a2enmod rewrite して、/var/wwwのoverride Allする
https://qiita.com/ryokurosu/items/7bae243614c0894e048d
/dashboardへアクセス
- 投稿日:2021-02-21T16:43:40+09:00
【MySQL】MyAdminのsqlファイルをWorkbenchにインポート
初めに
・開発したアプリをデプロイしようとHerokuを使用(人生初デプロイ)
・参考にした記事はこちらやりたいこと
MyAdmin(ローカル環境)にあるデータベース上のテーブルやカラムや行(値)を全てMySQL Workbench(本番環境)上にインポートしたい
やったこととそのエラー
1.手順の通りインポート
<内容>
冒頭の参考記事の「Workbenchにデータベースをインポート」内でAdministrationの中にあるData Import/Restoreを選択
(手順の通りやって…)
Start Importを押してインポートまで実行
<結果>
Workbenchが落ちる...2.SQLでインポート
<内容>
MyAdminからエクスポートした「〇〇.sql」ファイルがあると思います。
そのファイルにエクスポートしたデータを生成するSQLが入っているので、コピー&ペーストし、SQLを実行
※詳細は以下参考記事<結果>
Workbenchの「ActionOutput」に以下エラーが発生(#9)
※オレンジ塗りつぶし部は本番環境用データベース情報の<ユーザー名>が記載されています。
以下、エラー文抜粋
Actions
CREATE DATABASE IF NOT EXISTS 'my_project(ローカル環境データベース名)' DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ciMessage
Error Code: 1044. Access denied for user '<本番環境ユーザー名>'@'%'to database 'my_project(ローカル環境データベース名)'解決策
手順
- インポートするsqlファイルを開く
- 24行目付近にある以下SQLを探す
CREATE DATABASE IF NOT EXISTS
<ローカル環境データベース名>DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE<ローカル環境データベース名>;3.以下のように記載
CREATE DATABASE IF NOT EXISTS
<ローカル環境データベース名>DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE<ローカル環境データベース名>;要は<ローカル環境データベース名>を<本番環境データベース名>に変更します。
これで「やったこと」で書いたどちらの手順を踏めばSQlが実行され、インポートができます。
<参考>ちなみに
DB情報は環境変数を使うのがベター
僕はこれで一度デプロイしたデータベースアカウントを削除し、新しく作り直しました。
理由はこちらの記事の通り、Githubにデータベース情報を公開してしまったためです…
これから僕と同じように、エンジニアを目指されている方は、こういった機密情報の扱いは気を付けた方がいいと思います。(経験談)環境変数の設定については参考記事①、参考記事②を張っておきます。
その他エラー
ここまで作業を進める中で色々警告文が表示されましたがデプロイする上で特に問題はありませんので、無視し続ければいいです。
1. TestConnection時のエラー
Workbench起動して「MySQL Connection」からDBの接続先を入力⇒DB情報を入力して「TestConnection」押下後に出る下記エラー
後に、
Successfully made the MySQL connection
の表示があればDBとの接続はできているので、問題ありません。2. 「MySQL Connection」からDBをクリックした時のエラー
DBとの接続後、「MySQL Connection」から接続済のDBをクリックした時の警告文ですが、特に悪さはしないので問題ないです。3. 「Error Code: 1062」や「Error Code: 1075」…etcの発生
「テーブルの重複」や「テーブルの重複によるPrimary KeyやAutoIncrement設定の失敗」など色々発生しました。
こちらはたくさん記事がありましたので、自力で調べていただければと思います。最後まで読んでいただきありがとうございました!
- 投稿日:2021-02-21T16:17:51+09:00
【 Ruby on Rails 6.0 】heroku + Mysqlで本番環境にデプロイするよ
始めに
railsアプリをherokuを使って本番環境にデプロイする過程をまとめます。
herokuとMysqlの環境でデプロイを考えている人の助けになれば幸いです。
ちなみに今回はGithub Desktopを導入している、railsアプリを作成済みという前提で話を進めていくので、gitとアプリ作成の説明は省略します。。開発環境
- macOS Catalina
- Ruby 2.6.5
- Ruby on Rails 6.0.0
- heroku
- Mysql
- Github Desktop
目次
1.Gemfileの設定
2.config/datebase.ymlの設定
3.config/environments/production.rbの設定
4.bin以下のフォルダの設定
5.herokuの登録・設定
6.おまけ1. Gemfileの設定
デプロイ予定であるherokuでは
PostgreSQL(略してpg)というデータベースがデフォルトでインストールされているため通常はpgを用いますが、今回はMysqlをデータベースとして使います。まず、gem 'sqlite3'と、書いてある箇所があると思うのですが、それをコメントアウトします。
Gemfile# sqlite3代わりにMysqlをインストールします。
Gemfile# 記述場所は本番環境でも適用されるように末尾にでも書きましょう。 gem 'mysql2', '>= 0.5.3' # バージョン0.5.3php$ bundle installこれでGemfileは完了です。
2. config/datebase.ymlの設定
Gemfileの設定でこのアプリは本番環境でMysqlを使います、という宣言は完了しました。
しかし実際にデータベースと接続する記述はまだ完了していません。
その接続の設定をする箇所がconfigフォルダの中にあるdatabase.ymlというファイルです。ファイル内の下の方にあるproduction環境についての設定を、以下のように変更してください。
config/database.ymlproduction: <<: *default database: app_production username: root password: <%= ENV['DATABASE_PASSWORD'] %> # 環境変数を設定していない場合は空欄で socket: /var/lib/mysql/mysql.sockこれでデータベースの接続の記述は完了です。
3. config/environments/production.rbの設定
Railsは本番環境での動的な画像の表示がデフォルトでオフになっています。
画像を表示するために以下の記述をfalseからtrueに変更してください。
この記述により、assets以下のフォルダから動的にコンパイルしながらページを読み込みます。config/environments/production.rb#デフォルトでfalseとなっている以下の箇所をtrueに変更 config.assets.compile = trueこの工程を踏まないと、全ての設定が完了してブラウザを開くと"We're sorry, but something went wrong."というエラーと遭遇してしまいますので注意してください。
4. bin以下のフォルダの設定
アプリ内にbinというフォルダがあるのですが、その中のファイル全て(bundle,rails,rake,setup,spring, update,yarn)の一番上に
#!/usr/bin/env rubyという記述があると思います。ここの記述が、
#!/usr/bin/env ruby 2.3.1などバージョン指定されてしまっているファイル全てのバージョンを削除してください。つまり、上の記述から
#!/usr/bin/env rubyこのように数字を削除しましょう。(今回は2.3.1の部分)
ここまででrailsアプリ側の設定は終了です。
Github Desktop上でmasterにpushしておきましょう。
ここからはターミナルを主に操作していきます。5. herokuの登録・設定
AWSだとRailsアプリはデプロイが難しいことが多いのですが、このherokuを使うと比較的簡単にデプロイすることができます。
機能的には物足りない部分もあるのですが、その場合は有料版を使えば問題なくサービスを立ち上げることができます。就活用にポートフォリオを管理している場合、アプリ起動時間は重要だと思うので、あまりにも遅い場合はその期間だけでも、有料版を使うようにしたほうがいいと思います。
↓
herokuに登録会員登録が完了したら、今度はherokuの機能を自分のPCに紐付けましょう。cliをダウンロードします。
https://devcenter.heroku.com/articles/heroku-cliターミナル$curl https://cli-assets.heroku.com/install-ubuntu.sh | sh $echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.profile # インストールしたherokuのバージョンが確認できたら成功です $heroku --version >>heroku/7.0.47 darwin-x64 node-v10.1.0PCからherokuにログイン
ターミナル$heroku loginherokuに登録したemailとpasswordの入力
ターミナルEnter your Heroku credentials: Email: ~~~~~@example.com (herokuに登録したアドレス打ってください) Password: ********** (herokuに登録したパスワード打ってください) Logged in as ~~~~~@example.com無事、ログインしたら、以下のコマンドを打ってください。
このコマンドはherokuとアプリを紐づけるコマンドなので、最初の一回だけで大丈夫です。ターミナル$heroku create 任意の名前 (「任意の名前」に入力する文字列はアプリのurlになるものです。記号は使用不可)「Name is already taken...」というエラーが表示されたら、残念ながらそのアプリ名は他の方にurlを使われているので名前を変更してもう一度createしてみましょう。
herokuのDB設定
heroku上でMysqlを使うにはクレジットカードの登録が必要です。
といっても無料プランでの登録なので料金はかかりませんので安心してください。
クレジットカードの登録はherokuのアカウントから行います。
↓
https://signup.heroku.com/loginカードを登録したら、下記のコマンドを入力します。
ターミナル$ heroku addons:create cleardb:igniteもしカード登録前に上のコマンドをうった場合はこのようなエラーが返って来ます。
ターミナル▸ Please verify your account to install this add-on plan (please enter a credit card) For more ▸ information, see https://devcenter.heroku.com/categories/billing Verify now at ▸ https://heroku.com/verifyHerokuアプリの環境変数設定
以下のコマンドで、ClearDBのURLが確認できます。
ターミナル$ heroku config === <アプリの名前> Config Vars CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true上記コマンドで表示されたそれぞれの値を変数に設定しましょう。
ターミナル$ config:add DB_NAME='<データベース名>' $ heroku config:add DB_USERNAME='<ユーザー名>' $ heroku config:add DB_PASSWORD='<パスワード>' $ heroku config:add DB_HOSTNAME='<ホスト名>' $ heroku config:add DB_PORT='3306' $ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'最後のDATABASE_URLは先程のGemfileで'mysql2'をインストールしているので、mysql2://で始める必要があります。
設定が終わったら以下のコマンドで確認しましょう。ターミナル$ heroku config # 実行結果 === <アプリの名前> Config Vars CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true DATABASE_URL: mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true DB_HOSTNAME: <ホスト名> DB_NAME: <データベース名> DB_PASSWORD: <パスワード> DB_PORT: 3306 DB_USERNAME: <ユーザー名>ここまでくればもう少しです!
Herokuへデプロイ
ローカルリポジトリをHerokuへpushします。
ターミナル$ git push heroku master次に本番環境にマイグレーションします。
ターミナル$ heroku rub rails db:migrateこの時、Rubyのバージョンによっては、RubyのバージョンとHerokuのStack(HerokuのOSイメージ)のバージョンが合わずにエラーが出ることがあります。(2.6.5ではエラー出ました)
なのでRubyのバージョンを新しくするか、以下のコマンドでstackのバージョンをHeroku-16からHeroku-18に変更する必要があります。(2021年2月現在は20がデフォルトのようです。)
(Heroku公式ドキュメント)ターミナル$ heroku stack:set heroku-18 # herokuのバージョン変更エラーが出たらもう一度、
$ heroku rub rails db:migrateしてみましょう。以下のコマンドを実行すると、ブラウザでアプリケーションが開きます。
ターミナル$ heroku openこれでブラウザに表示されるはずです!
6. おまけ
アプリケーションの情報を確認したいときのコマンド
ターミナル$ heroku apps:infoここで出てくるWeb URLが完成したURLがブラウザに打ち込むURLです。
herokuでデプロイしたDBにSequelProで接続する
heroku configのコマンドで接続情報が出てくるので確認
ターミナル$ heroku config # 実行結果 === <アプリの名前> Config Vars CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true DATABASE_URL: mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true DB_HOSTNAME: <ホスト名> DB_NAME: <データベース名> DB_PASSWORD: <パスワード> DB_PORT: 3306 DB_USERNAME: <ユーザー名>・ポートは空欄でも大丈夫なようですが、一応3306を入力
・標準を選択終わりに
最後まで読んでいただきありがとうございました!
お役に立てれば幸いです。。参考記事
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
Herokuへのデプロイ方法【Heroku+Rails+MySQL】
mysqlを使ったRailsアプリをHerokuにデプロイする流れ
Rails4 + MySQL のアプリケーションを Heroku で動かすまで
Heroku で 'DATABASE_URL' を変更する方法
herokuでデプロイしたDBにSequelProで接続してみる
- 投稿日:2021-02-21T13:32:08+09:00
Mysql2::Error::ConnectionErrorについて
現在プログラミングスクールにてフリマアプリを作成しております。
モデル単体テストコードを実施した際に遭遇した下記エラー。苦戦したので備忘録として。「Mysql2::Error::ConnectionError: Lost connection to MySQL server during query」
上図のように、テストの途中でエラーが発生してるんですね.
でもこれ、コード的には特に問題ないと思うのです。それゆえに悩みました。
また、何度かテストを実施すると、図よりテスト成功ログが増えたりもしまして、これはおかしいと思いました。エラー内容的には「Mysqlへ繋がらなかったよ。繋ぐまで時間がかかりすぎてタイムアウトしちゃったよ」
という意味合いのようですね。他の方の記事をみてみたところ、「Mysqlの処理量がテスト途中でいっぱいいっぱいになってしまって、時間までに処理できませんでした」ということのようですね今回行っているモデルの単体テストコードですが、単体ではあるのですが、そのテストには複数モデルが必要だったのです。下記のように、item_orderだけではなく、それに付随するitem_id、user_idも必要なため、それぞれFactoryBotを追加しました。(これを追加するまではテスト通ってたのです)
qiita.rbrequire 'rails_helper' describe ItemOrder do before do user = FactoryBot.create(:user) item = FactoryBot.create(:item) @item_order = FactoryBot.build(:item_order, item_id: item.id, user_id: user.id) end describe '商品購入手続き' do context '商品購入が成功する時' do it '全ての項目が入力されていれば登録できる' do expect(@item_order).to be_valid endつまり、明らかにこれが原因です。itemとuserから引っ張ってくるデータ量が多すぎたと思われます。
テスト途中にbinding.pryを差し込みまくればテストが通った、という記事も拝見しましたが、私はそれでもテスト成功しませんでした。そこで登場するのが、sleepメソッドです。
sleepメソッドは、処理速度を指定時間に合わせて行ってくれます。
今回は元々の指定時間に合わせて行ったところ、それに間に合わず、途中で失敗してしまっている、と考えられます。
そこで下図のようにsleepメソッドを挿入してみました。「一つの処理に1秒かける」、という設定ですね。sleep.rbdescribe ItemOrder do before do user = FactoryBot.create(:user)。 item = FactoryBot.create(:item) @item_order = FactoryBot.build(:item_order, item_id: item.id, user_id: user.id) sleep(1) end成功しました!!!
今回の厄介な所は、コード自体に誤りはなかった、という所ですね。
コードに何か誤りがあるせいでエラーが発生してしまう、と考えていた私にとっては衝撃な点でした。
そもそもテスト中に処理落ちしないテストコードを書ければいい話なのかもしれませんが・・・・それは今後精進していきます!
改善点やダメ出しあれば是非お願いします!







