20201010のMySQLに関する記事は9件です。

[Rails5.2] Docker内のMysql 5.7の絵文字対応(文字コードをutf8mb4に変更する)

はじめに

Ruby on Railsでポートフォリオを作成しているRails初学者です。
今回はタイトルの通り、tableに絵文字情報を保存するためのmysqlをutf8mb4にした際の覚書です。

Youtube Data APIから動画タイトルを保存しようとしたらエラーが出た。

ActiveRecord::StatementInvalid in VideosController#refresh
Mysql2::Error: Incorrect string value: '\xF0\x9F\x94\xB5\xE8\x87...'

絵文字が入っているタイトルがいくつかあり、それが影響でエラーが出たようです。
mysql上のdbの文字コードを見るとuft8になっており、これを変更しなければいけない様子・・・
ひとまず色々なコードを参考にして以下の通りに実施しました。

環境

Docker for mac を使ってコンテナ内でRailsを開発しています。

ruby 2.4.5
mysql 5.7.31
Ruby on rails 5.0.7.2

流れ

(準備:dumpする)
1. my.cnfを変更する
2. mysqlをリスタートする
3. ActiveRecordにオプションを追加
4. database.ymlの変更
5. docker-compose.ymlの変更し、コンテナの再起動
6. db:migrate:resetを実行
7. dumpデータのrestore

準備:dumpする

そもそもこの作業を行うまでdumpという言葉を知らなかったのですが、dumpとはDBのテーブル内の情報をSQLの形で出力することだそうです。(ちなみに最後に行うrestoreは、dumpした情報をDBに投入すること)

今回データベース設定を変更し、各テーブルの文字コードをutf8mb4にするので、一旦データをファイルとして落としておいて、設定変更後に投入するという形をとりります。

dump/restoreを簡単に行うために以下のgemを使用します。

Gemfile
gem 'yaml_db'

今回使用するのはyaml_dbという、ダンプでyaml形式ファイルを出力してくれるgemです。
GitHub - yamldb/yaml_db

dumpするには以下のコマンドをすればOK

Terminal
bundle exec rails db:data:dump

コマンド実行後、db/data.ymlにファイルが出力されています。
こんな感じで、基本的にはテーブル名、カラム情報、レコードの順番で出力されます。

data.yml
videos:
  columns:
  - id
  - name
  - url
  - upload_at
  - created_at
  - updated_at
  records:
  - - 1
    - "【衝撃】ボーナス支給額をクイズで決める会社"
    - https://www.youtube.com/watch?v=42ofwfioMFM
    - 2020-10-09 09:00:00.000000000 Z
    - 2020-10-10 08:07:38.000000000 Z
    - 2020-10-10 08:07:38.000000000 Z
 :

以下で準備はOKです。

1. my.cnfを変更する

my.cnfファイルを以下のように設定します。
記載されている内容をきちんと理解したかったため、1行ずつ見ていきました。

my.cnf
[mysql]
default-character-set=utf8mb4 #文字コードの設定

[mysqld] #mysqld Mysqlサーバの設定
character-set-server = utf8mb4 #文字コードの設定
skip-character-set-client-handshake #client側で指定した文字コードを無視するためのもの
collation-server = utf8mb4_general_ci #ソート順の指定
init-connect = SET NAMES utf8mb4 #クライアントからserverへの送信に使用される文字セット指定

各項目について、細かく見ていきます。

[mysql]と[mysqld]
mysqldとは、MySQLサーバとも呼ばれる、mysqlでの各種操作を受け持っているメインプログラムのこと。
mysql側の操作は必ずこのmysqldよりされるため、ここに各種設定が必要。

skip-character-set-client-handshake
character-set-client-handshakeとは、クライアント側の文字コードをMySQL側に反映する行為。これをスキップすることで、uft8mb4への設定ができる。

collation-server = utf8mb4_general_ci
collationは、照合順序:ソート順のこと。_で区切られた各単語でそれぞれ設定。
詳細は以下を参照
【MySQL】照合順序とは?

init-connect = SET NAMES utf8mb4
クライアントからサーバへの送信に使用される文字コードの指定
詳細は以下を参照
10.1.4 接続文字セットおよび照合順序

2. mysqlをリスタートする

ひとまず、この設定を反映するためにmysqlをリスタートします。
Docker内のコンテナに入り以下のコマンドを実行します。

もともとの設定を一応確認しておきます

terminal
mysql>status;
:(中略)
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
:

utf8になっています。
というわけで、一旦リスタートして、もう一度みてみます。

terminal
mysql>service mysql restart
terminal
mysql>status
:(中略)
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
:

設定できました!

3. ActiveRecordにオプションを追加

次に、ActiveRecordのcreate_tableが実行される際に、utf8mb4を使って登録するよう設定していきます。

新しくconfig/initializers/utf8mb4.rbを作成し、以下のコードを記載。
config/initializersにファイルを投入すると、Railsが起動する前に初期設定として読み込まれるようになります。

config/initializers/utf8mb4.rb
#optionを設定するmodule
module Utf8mb4
  def create_table(table_name, options = {})
    table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
    super(table_name, table_options) do |td|
      yield td if block_given?
    end
  end
end

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    class AbstractMysqlAdapter
      #最初にmodule utf8mb4を実行し、その後既存のメソッドを実行(super)      
      prepend Utf8mb4
    end
  end
end

4. database.ymlの変更

以下の内容を追加ないし変更します

config/database.yml
  charset: utf8mb4
  encoding: utf8mb4
  collation: utf8mb4_general_ci

5. docker-compose.ymlの変更

Dockerの設定ファイルも以下のように変更します。

docker-compose.yml
:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci #utf8mb4をセット 
    container_name: コンテナ名
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf #my.cnfを読み込むよう設定
 :

この状態で、一度コンテナを再起動します。

6. db:migrate:resetを実行

ここまでのDBへの設定を反映させるため、DBをリセット→migrateします。

7. dumpデータのrestore

最後に、冒頭でdumpしたデータをもう一度投入すれば完了です。
以下のコマンドでrestoreできます。

terminal
rails db:data:load

以上で設定は完了です!

終わりに

色々と設定してきましたが、dumpなどの機能を知ることができたので、いい勉強になりました。

全面的に参考にさせていただいたサイト様
大変ありがとうございます・・・!
MySQLのencodingをutf8からutf8mb4に変更して寿司ビール問題に対応する
RailsのDBバックアップ(gem:yaml_db)
Rails5で絵文字を保存する utf8mb4 (docker)

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

【MySQL】MySQL Workbench 使い方

この記事の内容

  • MySQL Workbenchのダウンロード方法
  • DB接続方法
  • クエリの実行方法
  • EXPLAINの実行方法
  • テーブルの中身を表形式で確認する方法
  • テーブル定義の確認方法
  • DDLの確認方法
  • DBからER図を作成する方法

前提

  • MySQLがインストール済みであること。
  • DBとテーブルが作成済みであること。

ダウンロード方法

Homebrewでインストールする

$ brew cask install mysqlworkbench

Homebrew Formulaeで検索できます。

公式ページからダウンロードする

公式ページ から、MySQL Workbench をダウンロードする。

1. 「ダウンロードはこちら」を押下。
スクリーンショット 2020-10-10 13.06.49.png

2. 「Download」を押下。
スクリーンショット 2020-10-10 12.04.20.png

3. 「No thanks, just start my download.」を押下。
スクリーンショット 2020-10-10 12.05.11.png

4. FinderからMySQL Workbenchを起動する。
スクリーンショット 2020-10-10 13.52.16.png

起動できない場合

  1. Apple support を参考に、App のセキュリティ設定を確認する。

  2. FinderでControlキーを押しながら、アプリケーションアイコンをクリックし、ショートカットメニューから「開く」を選択、押下する。

基本操作

DB接続

1. MySQL Connections の右側にある「+」ボタンを押下。
スクリーンショット 2020-10-10 12.12.08.png

2. 各項目を入力する。
スクリーンショット 2020-10-10 13.56.44.png

  • HostName : localhostのIPアドレス (デフォルトでフォームに入力されている。)
mysql> show variables like 'hostname';
  • Port : MySQLデフォルトポートの3306 (デフォルトでフォームに入力されている。)
mysql> show variables like 'port'
  • UserName : root(デフォルトでフォームに入力されている。)

  • Connection Name : 識別しやすい名前を入力。(今回はsampleにした。)

3. 「TestConnection」を押下。
UserNameに紐づくパスワードを入力し、接続ができることを確認。
成功するとポップアップが出てきます。
設定が完了したら「OK」を押下。
スクリーンショット 2020-10-10 13.56.44.png

4. MySQL Connectionsに今設定したDBが表示されていることを確認する。
スクリーンショット 2020-10-10 13.58.20.png

5. MySQLサーバーの起動
下記コマンドを実行。

$ mysql.server start
Starting MySQL
 SUCCESS!

6.接続確認
MySQL Connectionsに表示されている設定したDBを押下。
スクリーンショット 2020-10-10 13.58.20.png

パスワードを入力し、下記画面に遷移すれば成功!
スクリーンショット 2020-10-10 16.46.32.png

通常のクエリ実行する

実行したいクエリを入力し、枠線内のかみなりマークを押下。
スクリーンショット 2020-10-10 16.56.48.png

かみなりマークを押下するとクエリが実行され、結果が表示される。
スクリーンショット 2020-10-10 16.56.59.png

クエリの一部分を実行する

入力したクエリの一部分だけを実行したい場合は、実行したい部分をカーソルで選択した状態で、カーソル付きのかみなりマークを押下する。(今回はselect文のみを実行する。)
スクリーンショット 2020-10-10 17.01.57.png

EXPLAINの実行

EXPLAINを実行したい文を記載し、虫眼鏡付きかみなりマークを押下。クエリの一部を実行する場合は、実行したいクエリをカーソルで選択してから、虫眼鏡付きかみなりマークを押下。
スクリーンショット 2020-10-10 17.19.50.png

テーブルの中身を表形式で確認

確認したいテーブルの横の、表マークを押下。
自動でクエリが作成、実行され、結果が表示される。
スクリーンショット 2020-10-10 17.23.46.png

テーブル定義の確認

確認したいテーブル名の横にある、設定マークを押下。
スクリーンショット 2020-10-10 17.28.13.png

DDLの確認

確認したいテーブル名の横にある、設定マークを押下。
表示されたタブから「DDL」を選択する。
スクリーンショット 2020-10-10 17.29.23.png

既存のDBからER図を作成

1. クエリ実行画面から、「Database」->「Reverse Engineer...」を選択。
スクリーンショット 2020-10-10 17.49.30.png

2. DBを選択
ER図を作成したいDBを選択し、「Continue」を押下。
スクリーンショット 2020-10-10 17.52.41.png

3. 「Continue」を押下。
スクリーンショット 2020-10-10 17.52.58.png

4. 接続するDBスキーマを選択し、「Continue」を押下。
スクリーンショット 2020-10-10 17.53.17.png

5. 「Continue」を押下。
スクリーンショット 2020-10-10 17.53.23.png

6. 「Execute」を押下。
スクリーンショット 2020-10-10 17.53.30.png

7. 「Continue」を押下。
スクリーンショット 2020-10-10 17.53.52.png

8. 「Close」を押下。
スクリーンショット 2020-10-10 17.53.57.png

9. ER図が作成できたことを確認する。
スクリーンショット 2020-10-10 17.54.06.png

10. ⌘Sでファイルを保存する。

まとめ

MySQL Workbenchめっちゃ便利!!!!!!!

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

MySQL ユーザ名&ホストの変更

MySQL ユーザ名&ホストの変更

概要

MySQLにおけるユーザ名&ホストの変更について説明します。

手順

構文

RENAME USER 'ユーザー名'@'ホスト名' to '新ユーザー名'@'新ホスト名';

例文

RENAME USER 'admin'@'localhost' TO 'admin'@'%';

「%」を使う場合は'(シングルコーテーション)をつける必要があります。

確認方法

SELECT user, host FROM mysql.user;

参考

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

MySQLで任意の順序でソートしたい場合

はじめに

今回はMySQLを例にして書きますが、PostgreSQLやOracleでも同様のことはできるはずです。

テーブルに持たせる

頻繁にソートを使用する場合、そもそもソート順をテーブルに持たせるのが一般的だと思います。

SELECT * FROM item ORDER BY item.sort_order;

しかし「そこまでするほどでもない」「集計で使いたいだけ」といった場合もあるかと思うので、SQL文の中で順序を決定する方法を紹介します。

CASE文を使う

CASE文で優先順位を決めてあげれば簡単に実現することができます。

SELECT * from item ORDER BY
CASE WHEN item.size = 'SS' THEN 0 
CASE WHEN item.size = 'S'  THEN 1 
CASE WHEN item.size = 'M'  THEN 2
CASE WHEN item.size = 'L'  THEN 3 
CASE WHEN item.size = 'LL' THEN 4 
CASE WHEN item.size = 'XL' THEN 5 
END

しかし、このように値が増えると読みづらくなってしまうのが難点です。順番を変えたくなった時もソート順を1から振り直すのが多少面倒に思えます。

LOCATE()関数を使う

もっと簡潔に記述する方法として、LOCATE()関数を使う方法があります。文字列が見つかった最初のオフセットを返してくれるので、検索文字列の出現順にソートすることができます。しかし下記の例はうまくいきません。

SELECT * from item
 ORDER BY LOCATE(item.size, 'SS S M L LL XL');

文字列が部分一致してしまう場合は要注意

上記の例だと、Sを検索した場合、最初にSSの1文字目に一致してしまい、思った結果が得られないという問題があります。

デリミタを使う

まず思いつく解決策はデリミタを前後につけることです。

SELECT * from item
 ORDER BY LOCATE(CONCAT(' ', item.size, ' '), ' SS S M L LL XL ');
-- 検索対象文字列の前後にもスペースが必要

パディングする

あるいは、この現象はitem.sizeの文字列長が違うことで起こるため、LPAD()などでソートキーの長さを揃えてしまうことでも解決できます。

SELECT * from item
 ORDER BY LOCATE(LPAD(item.size, 2, '_'), 'SS _S _M _L LL XL');

他によい方法があったら教えて下さい。

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

MySQL起動エラーの対処の仕方【Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)】

前回

herokuを使ってデプロイ中に、急にMySQLとの接続が出来なくなった。
原因は、恐らくMySQLのバージョンが、Homebrew で 8.0.をインストールしてしまい MySQLが ver8.0 にアップデートされていた事が原因(だと思う)
奮闘の上、ようやくMySQLの起動に成功した。これでようやくrails sでアプリを起動出来ると思ったが、また新たなエラーが出た。

これは前回の記事の続きになります。
MySQL起動エラーの対処の仕方【Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)】

エラー内容

rails sが上手く行かず、ターミナル上に出たエラー文がこちら

/Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': dlopen(/Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
  Referenced from: /Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle
  Reason: image not found - /Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle

重要な所はここ!
Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)

要は、シンボリックリンクにて/usr/local/opt/mysql/lib/libmysqlclient.21.dylibファイルが見つからない為、エラーが起きている模様。

シンボリックリンクとは、UNIX系のOSにおいて、ファイルやフォルダに対する注文を代わりに受け付けて本来のファイルに中継するのを役目としている仲介役みたいなものです。

これがないから繋がらないっと言っているようです。

なので、/usr/local/opt/mysql/libの中身を下記のコマンドで確認してみましょう。
% ls -l /usr/local/opt/mysql/lib/
すると・・・
あれ!?
ls: /usr/local/opt/mysql/lib: No such file or directory
ファイルがない??
仕方ない、細かく確認してみよう。
% cd /usr/local/opt/
optフォルダに移行したので
% ls
mysql@5.6ってファルダがあった
% cd mysql@5.6
mysql@5.6フォルダに移行したので
% ls
そしたら下記の結果が出た

total 48000
-rw-r--r--   1 hoge  staff   3353852 10  8 05:11 libmysqlclient.18.dylib
-r--r--r--   1 hoge  staff   3866872 11 27  2019 libmysqlclient.a
lrwxr-xr-x   1 hoge  staff        23 11 27  2019 libmysqlclient.dylib -> libmysqlclient.18.dylib
lrwxr-xr-x   1 hoge  staff        23 11 27  2019 libmysqlclient_r.18.dylib -> libmysqlclient.18.dylib
lrwxr-xr-x   1 hoge  staff        16 11 27  2019 libmysqlclient_r.a -> libmysqlclient.a
lrwxr-xr-x   1 hoge  staff        20 11 27  2019 libmysqlclient_r.dylib -> libmysqlclient.dylib
-r--r--r--   1 hoge  staff  17344696 11 27  2019 libmysqld.a
-r--r--r--   1 hoge  staff      3472 11 27  2019 libmysqlservices.a
drwxr-xr-x  21 hoge  staff       672 11 27  2019 plugin

libmysqlclient.21.dylibがなく、代わりにlibmysqlclient.18.dylibがある。

少し調べたところ、5.7 はlibmysqlclient.20.dylib8.0 はlibmysqlclient.21.dylibを使用しているらしいということが分かった。
そして、5.6 はlibmysqlclient.18.dylibを使うみたいだ。

??

上記の理論で有れば ver 5.6 はlibmysqlclient.18.dylibが有ればいいのではないか?

他に問題あるのか?

bundle doctor

他の問題を解決する為に、
bundle doctorを使ってGemfileとgem環境をチェックしてみた。

% bundle doctor
(略)
The following gems are missing OS dependencies:
 * mysql2: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib

エラー内容を確認すると、The following gems are missing OS dependencies:と、
以下のgemたちは、OSへの依存関係がありません、と出ています。

という事で、ここは一先ず、出ているgemsを1つ1つアンインストールしていきます。
今回は一つしか出てこなかったですが、複数出る場合もあります。
やり方は、bundle exec gem uninstall [gem名]です。

なので下記コマンドを打ち込みます。

% bundle exec gem uninstall mysql2
Successfully uninstalled mysql2-0.5.3

最下部に、Successfully uninstalled [gem名] と表示されればアンインストール完了です!


再びbundle doctor

% bundle doctor
(略)
Install missing gems with `bundle install`

とエラーが出るので、bundle installをします。


そして、本当に問題がないか再度bundle doctor

$ bundle doctor
(略)
No issues found with the installed bundle

これで解決!インストールされたbundleに問題はありませんっと
表示された。

なので、rails sでアプリを起動してみると・・・・・

上手くいった!!
ようやくこれで、全てのMySQLエラーの解決です。長がった。

まぁ、正確にはこのエラー解決するのにMySQLを一度アンインストールしているので、
データベースの作成とマイグレーションの実行をしないとダメですね(笑)

なので一応記載しておきます。
% rails db:create
% rails db:migrate
これで本当に終了です!



備考

結局、
Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
のエラーは解決の仕方は、これで良かったのか??
他の記事を見てみても同じやり方の記事が多くあったし、事実解決しているので大丈夫かと思うけど・・・

詳しく知っている方が、もしいらっしゃったら教えてください!

そもそも、根本的な問題としてMySQLのバージョンが、8.0.にアップデートされた原因が正直分からない・・・
プログラミング・・・奥が深すぎる

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

MySQL応用編! いろんなSQL Vol.2

前回の記事で投稿した いろんなSQL Vol.1 のつづきの記事となります。


環境
 Windows 10
 MySQL : version(5.7.28)
使用アプリ
 コマンドプロンプト(Windowsマーク押して「cmd」って打ったら出てくるやつ)


現在のテーブルを表示(相関サブクエリ用にareaカラムのデータを多少変更しています)

mysql> SELECT *, (SELECT AVG(score) FROM test_master) AS avg FROM test_master;
+----+-----------+-------+-----------+---------+
| id | name      | score | area      | avg     |
+----+-----------+-------+-----------+---------+
|  1 | Sato      |    40 | Tokyo     | 56.4444 |
|  2 | Suzuki    |    65 | Fukuoka   | 56.4444 |
|  3 | Takahashi |    45 | Kanagawa  | 56.4444 |
|  4 | Tanaka    |    50 | Osaka     | 56.4444 |
|  5 | Ito       |    88 | Tokyo     | 56.4444 |
|  6 | Watanabe  |    79 | Kanagawa  | 56.4444 |
|  7 | Yamamoto  |    44 | Osaka     | 56.4444 |
|  8 | Nakamura  |    64 | Fukuoka   | 56.4444 |
|  9 | Kobayahsi |    31 | Tokyo     | 56.4444 |
| 10 | Kato      |    92 | Aichi     | 56.4444 |
| 11 | Yoshida   |    67 | Tokyo     | 56.4444 |
| 12 | Yamada    |    77 | Kumamoto  | 56.4444 |
| 13 | Sasaki    |    29 | Hiroshima | 56.4444 |
| 14 | Yamagushi |    15 | Osaka     | 56.4444 |
| 15 | Inoue     |    70 | Kanagawa  | 56.4444 |
| 16 | Kimura    |    55 | Kanagawa  | 56.4444 |
| 17 | Hayashi   |    34 | Saitama   | 56.4444 |
| 18 | Saito     |    71 | Tokyo     | 56.4444 |
+----+-----------+-------+-----------+---------+

10 相関サブクエリ

area_avgカラムを作り、各areaごとの平均点を出す

mysql> SELECT
    -> *,
    -> (SELECT AVG(score) FROM test_master) AS avg,
    -> (SELECT AVG(score) FROM test_master AS t2 WHERE t1.area = t2.area) AS 
area_avg
    -> FROM
    -> test_master AS t1;
+----+-----------+-------+-----------+---------+----------+
| id | name      | score | area      | avg     | area_avg |
+----+-----------+-------+-----------+---------+----------+
|  1 | Sato      |    40 | Tokyo     | 56.4444 |  59.4000 |
|  2 | Suzuki    |    65 | Fukuoka   | 56.4444 |  64.5000 |
|  3 | Takahashi |    45 | Kanagawa  | 56.4444 |  62.2500 |
|  4 | Tanaka    |    50 | Osaka     | 56.4444 |  36.3333 |
|  5 | Ito       |    88 | Tokyo     | 56.4444 |  59.4000 |
|  6 | Watanabe  |    79 | Kanagawa  | 56.4444 |  62.2500 |
|  7 | Yamamoto  |    44 | Osaka     | 56.4444 |  36.3333 |
|  8 | Nakamura  |    64 | Fukuoka   | 56.4444 |  64.5000 |
|  9 | Kobayahsi |    31 | Tokyo     | 56.4444 |  59.4000 |
| 10 | Kato      |    92 | Aichi     | 56.4444 |  92.0000 |
| 11 | Yoshida   |    67 | Tokyo     | 56.4444 |  59.4000 |
| 12 | Yamada    |    77 | Kumamoto  | 56.4444 |  77.0000 |
| 13 | Sasaki    |    29 | Hiroshima | 56.4444 |  29.0000 |
| 14 | Yamagushi |    15 | Osaka     | 56.4444 |  36.3333 |
| 15 | Inoue     |    70 | Kanagawa  | 56.4444 |  62.2500 |
| 16 | Kimura    |    55 | Kanagawa  | 56.4444 |  62.2500 |
| 17 | Hayashi   |    34 | Saitama   | 56.4444 |  34.0000 |
| 18 | Saito     |    71 | Tokyo     | 56.4444 |  59.4000 |
+----+-----------+-------+-----------+---------+----------+

11 抽出条件にサブクエリを使う

scoreが一番高い人を抽出

mysql> SELECT * FROM test_master WHERE score = (SELECT MAX(score) FROM test_master);
+----+------+-------+-------+
| id | name | score | area  |
+----+------+-------+-------+
| 10 | Kato |    92 | Aichi |
+----+------+-------+-------+

12 抽出元にサブクエリを使う

area別に人数を分けて、

mysql> SELECT area, COUNT(*) AS byArea FROM test_master GROUP BY area;
+-----------+--------+
| area      | byArea |
+-----------+--------+
| Aichi     |      1 |
| Fukuoka   |      2 |
| Hiroshima |      1 |
| Kanagawa  |      4 |
| Kumamoto  |      1 |
| Osaka     |      3 |
| Saitama   |      1 |
| Tokyo     |      5 |
+-----------+--------+

エリア別にわけた人数の平均を求めるとき

mysql> SELECT AVG(byArea) FROM (SELECT area, COUNT(*) AS byArea FROM test_master GROUP BY area) AS mean;
+-------------+
| AVG(byArea) |
+-------------+
|      2.2500 |
+-------------+

13 TRANSACTION (COMMIT)

START TRANSACTIONCOMMITで囲まれている間の処理が終わるまでは、これ以外の処理や操作を受け付けない

mysql> START TRANSACTION;
mysql> UPDATE test_master SET score = score - 2 WHERE id = 1;
mysql> UPDATE test_master SET score = score + 5 WHERE id = 2;
mysql> COMMIT;

14 TRANSACTION (ROLLBACK)

プログラムの処理中になにか障害が起こったときは、START TRANSACTIONROLLBACKで囲んだ処理をなかったにできる(更新する前のデータに戻すことができる)

mysql> START TRANSACTION;
mysql> UPDATE test_master SET score = score - 2 WHERE id = 1;
mysql> ROLLBACK;

新しいテーブルを2つ用意しました

mysql> SELECT * FROM カテゴリー;
+----+--------------------+
| id | カテゴリー名       |
+----+--------------------+
|  1 | 和食               |
|  2 | 洋食               |
|  3 | 中華               |
+----+--------------------+

mysql> SELECT * FROM 商品;
+----+-----------------+-----------------------+--------+
| id | カテゴリー       | 商品名                | 価格   |
+----+-----------------+-----------------------+--------+
|  1 |               1 | 肉じゃが定食          |    900 |
|  2 |               1 | すきやき              |   2000 |
|  3 |               1 | 焼き魚定食            |   1200 |
|  4 |               1 | なすのおひたし        |    600 |
|  5 |               2 | オムライス            |   1200 |
|  6 |               2 | ビーフシチュー        |   1800 |
|  7 |               3 | 酢豚定食              |   1200 |
|  8 |               3 | チャーハン            |    500 |
|  9 |               3 | おつまみメンマ        |    250 |
| 10 |               3 | ザーサイ              |    120 |
+----+-----------------+-----------------------+--------+

14 内部結合

カテゴリーテーブルのカテゴリーidを商品テーブルのカテゴリーと紐付ける

mysql> SELECT
->  *
-> FROM
->  商品 INNER JOIN カテゴリー ON 商品.カテゴリー = カテゴリー.id;
+----+-----------------+-----------------------+--------+----+--------------------+
| id | カテゴリー      | 商品名                | 価格   | id | カテゴリー名       |
+----+-----------------+-----------------------+--------+----+--------------------+
|  1 |               1 | 肉じゃが定食          |    900 |  1 | 和食               |
|  2 |               1 | すきやき              |   2000 |  1 | 和食               |
|  3 |               1 | 焼き魚定食            |   1200 |  1 | 和食               |
|  4 |               1 | なすのおひたし        |    600 |  1 | 和食               |
|  5 |               2 | オムライス            |   1200 |  2 | 洋食               |
|  6 |               2 | ビーフシチュー        |   1800 |  2 | 洋食               |
|  7 |               3 | 酢豚定食              |   1200 |  3 | 中華               |
|  8 |               3 | チャーハン            |    500 |  3 | 中華               |
|  9 |               3 | おつまみメンマ        |    250 |  3 | 中華               |
| 10 |               3 | ザーサイ              |    120 |  3 | 中華               |
+----+-----------------+-----------------------+--------+----+--------------------+

15 外部結合

左外部結合

カテゴリーテーブルに入っているデータをすべて抽出したあとに、商品テーブルと結合

mysql> SELECT
    ->  *
    -> FROM
    ->  カテゴリー LEFT OUTER JOIN 商品 ON カテゴリー.id = 商品.id;
+----+--------------------+------+-----------------+--------------------+--------+
| id | カテゴリー名        | id   | カテゴリー       | 商品名             | 価格   |
+----+--------------------+------+-----------------+--------------------+--------+
|  1 | 和食               |    1 |               1 | 肉じゃが定食        |    900 |
|  2 | 洋食               |    2 |               1 | すきやき            |   2000 |
|  3 | 中華               |    3 |               1 | 焼き魚定食          |   1200 |
+----+--------------------+------+-----------------+--------------------+--------+

右外部結合

商品テーブルに入っているデータをすべて抽出したあとに、カテゴリーテーブルと結合

mysql> SELECT
    ->  *
    -> FROM
    ->  カテゴリー right OUTER JOIN 商品 ON カテゴリー.id = 商品.id;
+------+--------------------+----+-----------------+-----------------------+--------+
| id   | カテゴリー名       | id | カテゴリー       | 商品名                 | 価格   |
+------+--------------------+----+-----------------+-----------------------+--------+
|    1 | 和食               |  1 |               1 | 肉じゃが定食          |    900 |
|    2 | 洋食               |  2 |               1 | すきやき              |   2000 |
|    3 | 中華               |  3 |               1 | 焼き魚定食            |   1200 |
| NULL | NULL               |  4 |               1 | なすのおひたし        |    600 |
| NULL | NULL               |  5 |               2 | オムライス            |   1200 |
| NULL | NULL               |  6 |               2 | ビーフシチュー        |   1800 |
| NULL | NULL               |  7 |               3 | 酢豚定食              |   1200 |
| NULL | NULL               |  8 |               3 | チャーハン            |    500 |
| NULL | NULL               |  9 |               3 | おつまみメンマ        |    250 |
| NULL | NULL               | 10 |               3 | ザーサイ              |    120 |
+------+--------------------+----+-----------------+-----------------------+--------+

おわりに

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

MySQL起動エラーの対処の仕方

経緯

herokuを使ってデプロイ中に、急にMySQLとの接続が出来なくなった。。。
原因は、恐らくMySQLのバージョンが、いつの間にか ver 8.0 にアップデートされていた事が原因っぽい。。。
ちなみに今迄使っていたのは ver 5.6

こんな事が起きたのが初めてだったので、色々弄り過ぎて解決するのにかなりの時間を費やしてしまった。
このやり方が有っているのか不明だが、誰かのお役に立つかと思い残しておきます。

ちなみに余談だが、herokuを使ってデプロイするならこの記事が一番良いので紹介だけしておきます。
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

作成中のアプリの画面がエラー画面に!エラー文が以下のもの
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
これは、「ソケット /tmp/mysql.sock を通じてローカルのMySQLサーバーに接続することができません」という意味です(訳しただけですが)

ソケットとは、Unixドメインソケット(ファイルシステムソケット)の事で、ローカルシステム内での通信を行う際に、このファイルの入出力を通じてサーバーとクライアント間での通信を行います。
つまり仲介役ですね。

では、このエラーの対処の方法を説明したいと思います。

MySQLサーバーが起動していない

一番ベターな解決作ですが、只純粋にMySQLが起動していない事が原因かもと思い、
% mysql.server start を打ち込む。

すると

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).

*******は自分のコンピューター名が入ります。
また、多くの記事では******.local.pidって出ているのですが
この違いは不明です(寧ろ誰が教えて!)

ちなみに、このエラーは前のMySQLバージョンで使用したデータを使って起動した時に出るようです。


/usr/local/var/mysql配下のpidファイルが無いって言われているようなのでこのディレクトリを確認
% cd /usr/local/var/mysql
% ls
のコマンドで確認した所、******.local.pidは存在したが、******.pidは無い
ということで、pidファイルを作成する

% sudo touch /usr/local/var/mysql/******.pid

本当に出来たか確認する為、もう一度上記のコマンドでディレクトリを確認
うん!有った!

これで行けるかと思いもう一度

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).

全く変わらずまた同じエラー

ここからの対処

色々エラーを検索して、分かった事だが上記でも記載している通り原因は、
MySQLの ver が5.6 →8.0 のアップデートされてしまい、
ERROR! The server quit without updating PID file は前のMySQLバージョンで使用したデータを使って起動した時に出るという事

ちなみに余談だが、8.0 は良い意味でも悪い意味でセキュリティーが上がっているようで
Sequel pro(ホットケーキがアイコンのもの)の対応できていない。
これらの事から、元の状態に戻す、つまりver を 5.6 に戻す方が早いのではっと考え
8.0 をアンインストール後、5.6 をインストールし直す事にした。

3つの行った事

・ MySQL8.0 をアンインストール
・ プロセスを確認
・ 権限の確認

の3つを行い成功した


MySQL8.0アンインストール&MySQL5.6再インストール

※実行の前に注意する事としては、MySQLのデータが削除されてしまいますので注意
僕はデータが消えても問題なかったのでそのままやっちゃいました。
もし気になる方は下記の記事を参考にして見てください、アンインストールの方法もこの記事を参考にしてます
The server quit without updating PID file mysqlエラー解決方法

brewコマンドを使ってアンインストールします
% brew uninstall mysql
% brew uninstall --force mysql
% brew cleanup -s mysql
% brew prune


続いて、
% rm -rf /usr/local/mysql
% rm -rf /Library/StartupItems/MYSQL
% rm -rf /Library/PreferencePanes/MySQL.prefPane
% rm -rf /Library/Receipts/mysql-.pkg
% rm -rf /usr/local/Cellar/mysql*
% rm -rf /usr/local/bin/mysql*
% rm -rf /usr/local/var/mysql*
% rm -rf /usr/local/etc/my.cnf
% rm -rf /usr/local/share/mysql*
% rm -rf /usr/local/opt/mysql
brew uninstall mysql では削除できないファイル群を削除します。

多くの記事でコマンドのmysqlの後にverを指定いないので大丈夫かと思いますが
僕は心配だったのでverを入れたコマンドも一緒に打ち込みました(笑)
こんな感じですね
% brew uninstall mysql@8.0

ver の確認方法は、
% mysql --version
これでもわかります
% which mysql


そして、インストールしたい ver を指定して打ち込みます。
% brew install mysql@5.6

これで全部スッキリ綺麗に入れ直しが出来たはずです!


そして、このままでは、MySQLのコマンドが一切反応してくれません。なのでパスを通しましょう。
下記の2つのコマンドです。
% echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc

一応MySQLのコマンドが打てるか確認
% which mysql
以下のように表示されれば成功です
/usr/local/opt/mysql@5.6/bin/mysql


もしかしたら、これで起動するかもなので一応確認して見てください
% mysql.server start

僕はダメでしたが、、、変わらずこのエラー
またお前か・・・

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).


プロセスを確認

ここでプロセスを確認です。
要はどういう事かというと、ver 5.6 を起動したいのに 8.0 が起動したままでは、
エラーが出るので、もし起動中のままだったら強制終了しましょうっていう確認です。

下記のコマンドで確認出来ます。
% ps -ef | grep mysql

余計なものが起動していると下記のように表示されます。
1行目、2行目が余計ですね。
3行目は、なきゃいけないものですのでオッケーです。

  501   699     1   0 16 720  ??         0:00.04 /bin/sh /usr/local/opt/mysql@8.0/bin/mysqld_safe --datadir=/usr/local/var/mysql
  501   974   699   0 16 720  ??         1:06.51 /usr/local/opt/mysql@8.0/bin/mysqld --basedir=/usr/local/opt/mysql@8.0 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@8.0/lib/plugin --log-error=XXXX-Air.local.err --pid-file=XXXX-Air.local.pid
  501  3524 81032   0  1:48AM ttys002    0:00.00 grep mysql

問題ない時は下記のような感じで出ます。

501  3524 81032   0  1:48AM ttys002    0:00.00 grep mysql

では、killコマンドで強制終了(-9)させましょう。

% kill -9 974
(974は上記のプロセスIDです)
一個強制終了させれば、上記で言えば699も一緒に消えると思いますが
消えてない場合はもう一回killコマンドで消してください。

最後に確認の為もう一度下記のコマンドを打って確認してください。
% ps -ef | grep mysql

しつこいですが、
もしかしたら、これで起動するかもなので一応確認して見てください
% mysql.server start

僕は、またまたダメでしたが、、、変わらずこのエラー
またまたお前か・・・

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).


権限を確認

権限は、ユーザー名ではないと、Permission denied(アクセス権限がない)と
いう事でエラーが出るらしいのでこれを確認

このコマンドで確認
% ls -la /usr/local/var/mysql

% ls -la /usr/local/var/mysql                                               
total 221232
drwxrwxrwx  10 _mysql  admin       320 10  8 05:19 .
drwxrwxr-x   7 _mysql  admin       224 10  8 05:11 ..
-rw-rw----   1 _mysql  admin        56 10  8 05:19 auto.cnf
-rwxrwxrwx   1 _mysql  admin  50331648 10  8 05:19 ib_logfile0
-rwxrwxrwx   1 _mysql  admin  50331648 10  8 05:11 ib_logfile1
-rwxrwxrwx   1 _mysql  admin  12582912 10  8 05:19 ibdata1
-rwxrwxrwx   1 _mysql  admin     18507 10  8 05:19 ******.err
drwxrwxrwx  81 _mysql  admin      2592 10  8 05:11 mysql
drwxrwxrwx  55 _mysql  admin      1760 10  8 05:11 performance_schema
drwxrwxrwx   2 _mysql  admin        64 10  8 05:11 test



_mysqlの所がユーザー名ではないとダメらしいので変更する
% sudo chown -R $USER /usr/local
$USERのまま打ち込めばユーザー名に変更してくれるのでこのまま打ち込んでください

これで変更されたはずなので、再度確認して見てください。
% ls -la /usr/local/var/mysql

※逆に、_mysqlのままではないとダメという記事も多数見かけますが、
どっちが正解なのか、すみません僕にも分かりません・・・
僕はこっちではないとダメでした。
わかる方が入れば教えて頂ければ有難いです

さぁ、これでどうだ!

・・・・・・またまたまたダメでしたが、、、変わらずこのエラー
またまたまたお前か・・・

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).


が、最後にエラーの通りもう一度
% sudo touch /usr/local/var/mysql/******.pid
をしたら
% mysql.server start

Starting MySQL
. SUCCESS!


やっと、起動した・・・
なんて大変なのだ・・・

しかし、まだ僕の戦いは終わりませんでした。
MySQLは無事起動しましたが、またしてもエラーが出ました・・・・
次の記事では、その対処法について記載します。


余談

余談ですが、
MySQLは本来であればPC再起動のたびに起動し直す必要がありますが、それは面倒であるため、
自動で起動するよう出来ます。それが、下記のコマンドです!
是非知らない方は、やっておいた方が便利ですよ!

% mkdir ~/Library/LaunchAgents 
% ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL起動エラーの対処の仕方【Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)】

経緯

herokuを使ってデプロイ中に、急にMySQLとの接続が出来なくなった。。。
原因は、恐らくMySQLのバージョンが、いつの間にか ver 8.0 にアップデートされていた事が原因っぽい。。。
ちなみに今迄使っていたのは ver 5.6

こんな事が起きたのが初めてだったので、色々弄り過ぎて解決するのにかなりの時間を費やしてしまった。
このやり方が有っているのか不明だが、誰かのお役に立つかと思い残しておきます。

ちなみに余談だが、herokuを使ってデプロイするならこの記事が一番良いので紹介だけしておきます。
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

作成中のアプリの画面がエラー画面に!エラー文が以下のもの
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
これは、「ソケット /tmp/mysql.sock を通じてローカルのMySQLサーバーに接続することができません」という意味です(訳しただけですが)

ソケットとは、Unixドメインソケット(ファイルシステムソケット)の事で、ローカルシステム内での通信を行う際に、このファイルの入出力を通じてサーバーとクライアント間での通信を行います。
つまり仲介役ですね。

では、このエラーの対処の方法を説明したいと思います。

MySQLサーバーが起動していない

一番ベターな解決作ですが、只純粋にMySQLが起動していない事が原因かもと思い、
% mysql.server start を打ち込む。

すると

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).

*******は自分のコンピューター名が入ります。
また、多くの記事では******.local.pidって出ているのですが
この違いは不明です(寧ろ誰が教えて!)

ちなみに、このエラーは前のMySQLバージョンで使用したデータを使って起動した時に出るようです。


/usr/local/var/mysql配下のpidファイルが無いって言われているようなのでこのディレクトリを確認
% cd /usr/local/var/mysql
% ls
のコマンドで確認した所、******.local.pidは存在したが、******.pidは無い
ということで、pidファイルを作成する

% sudo touch /usr/local/var/mysql/******.pid

本当に出来たか確認する為、もう一度上記のコマンドでディレクトリを確認
うん!有った!

これで行けるかと思いもう一度

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).

全く変わらずまた同じエラー

ここからの対処

色々エラーを検索して、分かった事だが上記でも記載している通り原因は、
MySQLの ver が5.6 →8.0 のアップデートされてしまい、
ERROR! The server quit without updating PID file は前のMySQLバージョンで使用したデータを使って起動した時に出るという事

ちなみに余談だが、8.0 は良い意味でも悪い意味でセキュリティーが上がっているようで
Sequel pro(ホットケーキがアイコンのもの)の対応できていない。
これらの事から、元の状態に戻す、つまりver を 5.6 に戻す方が早いのではっと考え
8.0 をアンインストール後、5.6 をインストールし直す事にした。

3つの行った事

・ MySQL8.0 をアンインストール
・ プロセスを確認
・ 権限の確認

の3つを行い成功した


MySQL8.0アンインストール&MySQL5.6再インストール

※実行の前に注意する事としては、MySQLのデータが削除されてしまいますので注意
僕はデータが消えても問題なかったのでそのままやっちゃいました。
もし気になる方は下記の記事を参考にして見てください、アンインストールの方法もこの記事を参考にしてます
The server quit without updating PID file mysqlエラー解決方法

brewコマンドを使ってアンインストールします
% brew uninstall mysql
% brew uninstall --force mysql
% brew cleanup -s mysql
% brew prune


続いて、
% rm -rf /usr/local/mysql
% rm -rf /Library/StartupItems/MYSQL
% rm -rf /Library/PreferencePanes/MySQL.prefPane
% rm -rf /Library/Receipts/mysql-.pkg
% rm -rf /usr/local/Cellar/mysql*
% rm -rf /usr/local/bin/mysql*
% rm -rf /usr/local/var/mysql*
% rm -rf /usr/local/etc/my.cnf
% rm -rf /usr/local/share/mysql*
% rm -rf /usr/local/opt/mysql
brew uninstall mysql では削除できないファイル群を削除します。

多くの記事でコマンドのmysqlの後にverを指定いないので大丈夫かと思いますが
僕は心配だったのでverを入れたコマンドも一緒に打ち込みました(笑)
こんな感じですね
% brew uninstall mysql@8.0

ver の確認方法は、
% mysql --version
これでもわかります
% which mysql


そして、インストールしたい ver を指定して打ち込みます。
% brew install mysql@5.6

これで全部スッキリ綺麗に入れ直しが出来たはずです!


そして、このままでは、MySQLのコマンドが一切反応してくれません。なのでパスを通しましょう。
下記の2つのコマンドです。
% echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc

一応MySQLのコマンドが打てるか確認
% which mysql
以下のように表示されれば成功です
/usr/local/opt/mysql@5.6/bin/mysql


もしかしたら、これで起動するかもなので一応確認して見てください
% mysql.server start

僕はダメでしたが、、、変わらずこのエラー
またお前か・・・

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).


プロセスを確認

ここでプロセスを確認です。
要はどういう事かというと、ver 5.6 を起動したいのに 8.0 が起動したままでは、
エラーが出るので、もし起動中のままだったら強制終了しましょうっていう確認です。

下記のコマンドで確認出来ます。
% ps -ef | grep mysql

余計なものが起動していると下記のように表示されます。
1行目、2行目が余計ですね。
3行目は、なきゃいけないものですのでオッケーです。

  501   699     1   0 16 720  ??         0:00.04 /bin/sh /usr/local/opt/mysql@8.0/bin/mysqld_safe --datadir=/usr/local/var/mysql
  501   974   699   0 16 720  ??         1:06.51 /usr/local/opt/mysql@8.0/bin/mysqld --basedir=/usr/local/opt/mysql@8.0 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@8.0/lib/plugin --log-error=XXXX-Air.local.err --pid-file=XXXX-Air.local.pid
  501  3524 81032   0  1:48AM ttys002    0:00.00 grep mysql

問題ない時は下記のような感じで出ます。

501  3524 81032   0  1:48AM ttys002    0:00.00 grep mysql

では、killコマンドで強制終了(-9)させましょう。

% kill -9 974
(974は上記のプロセスIDです)
一個強制終了させれば、上記で言えば699も一緒に消えると思いますが
消えてない場合はもう一回killコマンドで消してください。

最後に確認の為もう一度下記のコマンドを打って確認してください。
% ps -ef | grep mysql

しつこいですが、
もしかしたら、これで起動するかもなので一応確認して見てください
% mysql.server start

僕は、またまたダメでしたが、、、変わらずこのエラー
またまたお前か・・・

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).


権限を確認

権限は、ユーザー名ではないと、Permission denied(アクセス権限がない)と
いう事でエラーが出るらしいのでこれを確認

このコマンドで確認
% ls -la /usr/local/var/mysql

% ls -la /usr/local/var/mysql                                               
total 221232
drwxrwxrwx  10 _mysql  admin       320 10  8 05:19 .
drwxrwxr-x   7 _mysql  admin       224 10  8 05:11 ..
-rw-rw----   1 _mysql  admin        56 10  8 05:19 auto.cnf
-rwxrwxrwx   1 _mysql  admin  50331648 10  8 05:19 ib_logfile0
-rwxrwxrwx   1 _mysql  admin  50331648 10  8 05:11 ib_logfile1
-rwxrwxrwx   1 _mysql  admin  12582912 10  8 05:19 ibdata1
-rwxrwxrwx   1 _mysql  admin     18507 10  8 05:19 ******.err
drwxrwxrwx  81 _mysql  admin      2592 10  8 05:11 mysql
drwxrwxrwx  55 _mysql  admin      1760 10  8 05:11 performance_schema
drwxrwxrwx   2 _mysql  admin        64 10  8 05:11 test



_mysqlの所がユーザー名ではないとダメらしいので変更する
% sudo chown -R $USER /usr/local
$USERのまま打ち込めばユーザー名に変更してくれるのでこのまま打ち込んでください

これで変更されたはずなので、再度確認して見てください。
% ls -la /usr/local/var/mysql

※逆に、_mysqlのままではないとダメという記事も多数見かけますが、
どっちが正解なのか、すみません僕にも分かりません・・・
僕はこっちではないとダメでした。
わかる方が入れば教えて頂ければ有難いです

さぁ、これでどうだ!

・・・・・・またまたまたダメでしたが、、、変わらずこのエラー
またまたまたお前か・・・

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).


が、最後にエラーの通りもう一度
% sudo touch /usr/local/var/mysql/******.pid
をしたら
% mysql.server start

Starting MySQL
. SUCCESS!


やっと、起動した・・・
なんて大変なのだ・・・

しかし、まだ僕の戦いは終わりませんでした。
MySQLは無事起動しましたが、またしてもエラーが出ました・・・・
次の記事では、その対処法について記載します。
MySQL起動エラーの対処の仕方【Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)】


余談

余談ですが、
MySQLは本来であればPC再起動のたびに起動し直す必要がありますが、それは面倒であるため、
自動で起動するよう出来ます。それが、下記のコマンドです!
是非知らない方は、やっておいた方が便利ですよ!

% mkdir ~/Library/LaunchAgents 
% ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLでrootユーザーのパスワードを設定時にERROR 1064 (42000)で悩まされまんた!

タイトル通りMySQLのrootユーザーのパスワードを変更しようとした所ちょっとハマりました。

terminal
mysql> set password for root@localhost=password('hogehoge');

ググった所このコマンドでrootユーザーのパスワードを設定できるとのことでしたがこんなエラーが...!

terminal
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'password('hogehoge')' at line 1

ぴえん。

syntaxエラーと目に飛び込んできたので、「どうせ''が変だったりそんなオチだろう」と思って色々弄りましたが直らず。

terminal
mysql> update user set password=PASSWORD('hogehoge') where User='root';

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('hogehoge') where user = 'root'' at line 1

こちらのコマンドも試しましたが、やはりERROR 1064(42000) syntax文法エラーがあるとのこと、、

解決方法

色々ググってみた所、同じ症状の人がいました。
どうやらMySQLのバージョン5.6.7で上記のようなパスワード記載方法は廃止になったとのこと。
代わりに以下のコマンドを打ったところ、無事パスワードを設定できました。

terminal
mysql> set password for 'root'@'localhost' = 'hogehoge';

Query OK, 0 rows affected (0.04 sec)

check the manual that corresponds to your MySQL server version
思いっきりエラー文にMySQLのバージョンマニュアルをチェックしてねって書いてました。。。

エラー文、英語ちゃんと読みますぴえんぱおんパオパオチャンネル

参考

https://qiita.com/arm_band/items/12208908041a5506d7f4

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