20210221のMySQLに関する記事は5件です。

The server quit without updating PID fileを解決する【MySQLエラー】

はじめに

mysql.server startmysql.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やプロセスをチェックするのがいいのかもしれません。

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

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 setup

Laravel8サーバー条件

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-mysqlnd

php.iniにてタイムゾーンだけ設定しておく

/etc/php/7.4/apache2/php.ini
timezone = Asia/Tokyo

nodejs アップグレード

nvmで入っているので、インストールするだけ

nvm install v15.8.0
nvm 

Laravel8 インストール

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/composer

composer インストール

composer create-project laravel/laravel example-app 

Apache2設定

デフォルトのドキュメントルートを付け替える

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/ad819d06ea0cd31411df

sudo 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/

ここまでで画面でる
スクリーンショット 2021-02-16 16.50.45.png

データベース設定

# 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
.env
DB_DATABASE=devdb
DB_USERNAME=devuser
DB_PASSWORD=1234

Laravel Starter Kits (Breeze)インストール

cd example-app
php artisan migrate
composer require laravel/breeze --dev
php artisan breeze:install
npm install
npm run dev

Apache2のrewriteが効かない

a2enmod rewrite して、/var/wwwのoverride Allする
https://qiita.com/ryokurosu/items/7bae243614c0894e048d
/dashboardへアクセス
スクリーンショット 2021-02-16 18.09.36.png

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

【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)
image (11).png

※オレンジ塗りつぶし部は本番環境用データベース情報の<ユーザー名>が記載されています。

以下、エラー文抜粋

Actions
CREATE DATABASE IF NOT EXISTS 'my_project(ローカル環境データベース名)' DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci

Message
Error Code: 1044. Access denied for user '<本番環境ユーザー名>'@'%'to database 'my_project(ローカル環境データベース名)'

解決策

手順

  1. インポートするsqlファイルを開く
  2. 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」押下後に出る下記エラー
image (2).png

後に、
Successfully made the MySQL connection
の表示があればDBとの接続はできているので、問題ありません。

2. 「MySQL Connection」からDBをクリックした時のエラー

image (3).png
DBとの接続後、「MySQL Connection」から接続済のDBをクリックした時の警告文ですが、特に悪さはしないので問題ないです。

3. 「Error Code: 1062」や「Error Code: 1075」…etcの発生

「テーブルの重複」や「テーブルの重複によるPrimary KeyやAutoIncrement設定の失敗」など色々発生しました。
こちらはたくさん記事がありましたので、自力で調べていただければと思います。

最後まで読んでいただきありがとうございました!

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

【 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.3
php
$ bundle install

これでGemfileは完了です。

2. config/datebase.ymlの設定

Gemfileの設定でこのアプリは本番環境でMysqlを使います、という宣言は完了しました。
しかし実際にデータベースと接続する記述はまだ完了していません。
その接続の設定をする箇所がconfigフォルダの中にあるdatabase.ymlというファイルです。

ファイル内の下の方にあるproduction環境についての設定を、以下のように変更してください。

config/database.yml
production:
  <<: *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.0

PCからherokuにログイン

ターミナル
$heroku login

herokuに登録した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/verify

Herokuアプリの環境変数設定

以下のコマンドで、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:          <ユーザー名>

上の情報を入力しましょう。
スクリーンショット 2021-02-21 16.10.56.png

・ポートは空欄でも大丈夫なようですが、一応3306を入力
・標準を選択

終わりに

最後まで読んでいただきありがとうございました!
お役に立てれば幸いです。。

参考記事

【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
Herokuへのデプロイ方法【Heroku+Rails+MySQL】
mysqlを使ったRailsアプリをHerokuにデプロイする流れ
Rails4 + MySQL のアプリケーションを Heroku で動かすまで
Heroku で 'DATABASE_URL' を変更する方法
herokuでデプロイしたDBにSequelProで接続してみる

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

Mysql2::Error::ConnectionErrorについて

現在プログラミングスクールにてフリマアプリを作成しております。
モデル単体テストコードを実施した際に遭遇した下記エラー。苦戦したので備忘録として。

「Mysql2::Error::ConnectionError: Lost connection to MySQL server during query」

63e0767931af109eefa7956d9696b158.png

上図のように、テストの途中でエラーが発生してるんですね.
でもこれ、コード的には特に問題ないと思うのです。それゆえに悩みました。
また、何度かテストを実施すると、図よりテスト成功ログが増えたりもしまして、これはおかしいと思いました。

エラー内容的には「Mysqlへ繋がらなかったよ。繋ぐまで時間がかかりすぎてタイムアウトしちゃったよ」
という意味合いのようですね。他の方の記事をみてみたところ、「Mysqlの処理量がテスト途中でいっぱいいっぱいになってしまって、時間までに処理できませんでした」ということのようですね

今回行っているモデルの単体テストコードですが、単体ではあるのですが、そのテストには複数モデルが必要だったのです。下記のように、item_orderだけではなく、それに付随するitem_id、user_idも必要なため、それぞれFactoryBotを追加しました。(これを追加するまではテスト通ってたのです)

qiita.rb
require '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.rb
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)
    sleep(1)
  end

すると・・・・
b269dbf0d4d12c209d6d4f8f5b5a328a.png

成功しました!!!
今回の厄介な所は、コード自体に誤りはなかった、という所ですね。
コードに何か誤りがあるせいでエラーが発生してしまう、と考えていた私にとっては衝撃な点でした。
そもそもテスト中に処理落ちしないテストコードを書ければいい話なのかもしれませんが・・・・それは今後精進していきます!
改善点やダメ出しあれば是非お願いします!

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