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

Mysqlを5.7が入っていたパソコンにMySQL8をHomebrewで再インストールした際に起きたエラー

今回は以前homebrewでMySQL5.7を入れていたパソコンにMySQL8を再インストールした際に起きた悲しいエラー

環境

Mac
Homebrew2.0.1
MySQL5.7

悲劇

MySQL8に変更してJSON型のカラムの検証を行おうとしていたため、一旦5.7をアンインストール(ここで安易にコマンドを叩いただけなのが、のちの被害に繋がってしまった。)

$ brew remove mysql@5.7 //5.7削除
⇨/usr/local/Cellar/mysql@5.7 削除

$ brew update //アップデート
$ brew info mysql

$ brew install mysql

$ mysql.server.start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXXnoMacBook-Pro.local.pid).

PIDファイルが無いそうなので、エラー文に出ているファイル階層にPIDファイルを作成
そして再び実行...

$ mysql.server.start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXXnoMacBook-Pro.local.pid).

...???????????????

エラーに書いてあるファイル階層まで入り中を見てみるとPIDファイルが無い。
訳がわからない状態のままもう一度PIDファイルを作成してコマンドを叩いてみた。。がやはりコマンドを叩くたびにPIDファイルが消えてしまう。

訳がわからないので、先人たちの知恵を借りるべく安直にERROR!とか書いてある部分をコピペして流してみると、同じようなエラーが出ている人たちがたくさんいた。

試したこと

権限をPIDファイルに付与する

一番多い解決方法として書かれていたのが、PIDファイルに権限が付与されていないので、書き込みができないのでエラーが出ているそう。

sudo chown -R [ユーザー名] usernoMacBook-Pro.local.pid

試しに権限を与えたのですが、やはりコマンドを叩くとPIDファイルさんがお亡くなりになられてしまう。

mysql.sockファイルを作ってみる

mysql.sockファイルがないとそれも原因で起動しないと書かれていた。
エラー文にはそんなファイル名無いので、ほぼ諦めで作ってみたが、やはり意味がなかった。


PIDファイルさんが生成されては死にを繰り返す状態が1時間続いた。
あーでもないこーでもないと続けていて、冷静に考えてみた。
errファイルがあるってことはエラーログそこに吐かれているのでは?と思い、中身をみてみるとやはり書いてあった

mysqld_safe mysqld from pid file /usr/local/var/mysql/usernoMacBook-Pro.local.pid ended

なるほど!と思い、これを検索窓へペーストして検索してみるとこのような記事にたどり着いた。
mysqlがどうしても起動しない
うん。今の僕と同じ状況だ!と思い藁にもすがる思いで読んでみた。

/usr/local/var/mysql も削除
仕方ない、こちらも削除。DBの実体なんかも含まれているが、丸っと削除(データが無くなると困る場合は、DBと同名のファイルを退避させるなど)

$ sudo rm -rf /usr/local/var/mysql
$ brew uninstall mysql
$ brew install mysql

あ。これもしかしてHomebrewではローカルデータは消してくれないの?とそこで気づき、同じようにローカルデータファイルを削除。
そして起動コマンドを叩いてみると。。。

mysql.server start
Starting MySQL
 SUCCESS! 

本当に助かりました。。

記事に間違っている部分などありましたらコメントお願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails mysql2のインストール時のエラー

gemのmysql2をインストールする際にハマったのでメモ

エラーログ

Fetching mysql2 0.3.21
Installing mysql2 0.3.21 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /path/to/vendor/bundle/ruby/2.4.0/gems/mysql2-0.3.21/ext/mysql2
/path/to/.rbenv/versions/2.4.1/bin/ruby -I /path/to/.rbenv/versions/2.4.1/lib/ruby/site_ruby/2.4.0 -r ./siteconf20190218-87873-15epx9f.rb extconf.rb
--with-cppflags\=-I/usr/local/opt/openssl/include
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/opt/mysql@5.7/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/opt/mysql@5.7/lib
-----
creating Makefile

current directory: /path/to/vendor/bundle/ruby/2.4.0/gems/mysql2-0.3.21/ext/mysql2
make "DESTDIR=" clean

current directory: /path/to/vendor/bundle/ruby/2.4.0/gems/mysql2-0.3.21/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /path/to/vendor/bundle/ruby/2.4.0/gems/mysql2-0.3.21 for inspection.
Results logged to /path/to/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-18/2.4.0-static/mysql2-0.3.21/gem_make.out

An error occurred while installing mysql2 (0.3.21), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.21' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2

パスが通っていないのが原因

bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS X-Rayでmysql-connector-pythonにバッチを当ててリクエストをトレースしてみる

はじめに

アプリケーションが処理する各種リクエストをトレースするため、AWS X-Rayを使用しています。

リクエスト処理に使うライブラリのうち、AWS SDKを含むいくつかについてはX-Ray SDK内でデフォルトでサポートされており、パッチを適用すれば簡単に処理をトレースしてくれます。

今回は、PythonでDBを操作するアプリケーションを想定し、X-Ray SDK for Pythonがサポートしている mysql-connector-python にパッチを適用してみようと思います。

AWS X-Ray - ライブラリを実装ダウンストリーム呼び出しにパッチする

環境

検証は、ローカルで行いました。

OS: macOS High Sierra
Python: 3.6.5
MySQL: 5.6

実行

MySQLサーバー

適当に用意。今回はDockerでmysql:5.6イメージをプルして実行。

データベースとテーブルの用意

以下のクエリを実行。

# データベース
create database xray_test;

# テーブル
create table user (id char(10), name char(20));

X Ray デーモン

トレースした情報をAWS上のX-Rayサービスへ投げるためにX-Rayデーモンを実行させる必要があります。

今回はローカルで検証したため、macOSで実行可能なスクリプトを落として -o オプションをつけて実行。

AWS X-Ray - ローカルで X-Ray デーモンを実行する

./xray_mac -o

Pythonスクリプト実行

今回はSELECT・INSERT・DELETEをトレースしてみます。

import mysql.connector

from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch

# パッチ適用  patch_allでも可
libraries = ('mysql',)
patch(libraries)

# X Ray の設定
xray_recorder.configure(service='mysql-connector',
                        daemon_address="127.0.0.1:2000")

# mysql セグメント開始
segment = xray_recorder.begin_segment('mysql')

# 接続
conn = mysql.connector.connect(user='root', password='password', host='127.0.0.1', database='xray_test')
cur = conn.cursor()

# INSERT
cur.execute("insert into user values ('01', 'hoge');")
conn.commit()

# SELECT
cur.execute("select * from user;")
for row in cur.fetchall():
    print(row[0],row[1])

# DELETE
cur.execute("delete from user where id = '01';")
conn.commit()

cur.close()
conn.close()

# mysql セグメント終了
xray_recorder.end_segment()

結果

AWSコンソールで確認してみます。

トレース詳細に、こんな感じでちゃんと3リクエストがサブセグメントとして乗ってます。

スクリーンショット 2019-02-18 14.07.05.png

試しにサプセグメントを選択すると、SQLタブが出てます。これを開くと、DBのタイプやバージョン、接続したユーザー名が表示されます。

ここの情報はSELECT・INSERT・DELETEとも同じです。

スクリーンショット 2019-02-18 14.07.23.png

注意点

X-Rayにトレースしてもらうためには、 必ず mysql.connector.connect 関数を使ってコネクションを作る必要があります。

当初はコネクションプールの操作のため mysql.connector.pooling.MySQLConnectionPool を使ってましたが全然トレースしてくれませんでした

バッチライブラリの中でも、サポートされている関数/されていない関数があるようなので、ご注意を・・・

まとめ

これでMySQLサーバーへのリクエストがトレースできましたが、基本的には接続先と処理時間くらいしかトレースしてくれないので、より細かい情報を取りたい場合はSQLAlchemy ORMを使うべきかなと思います。また別途検証したいと思います。

参考

MySQL Connector/Python Developer Guide

aws/aws-xray-sdk-python - GitHub

PythonからMySQLへ接続する

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

便利なSQLコマンド

個人的に便利だと思ったSQLコマンドを書きなぐっていきます。備忘録です。

\g

表示結果を縦に表示してくれるとても素晴らしい機能

mysql> select * from test;
+-------+--------+--------+--------+
| id    | hostid | status | type   |
+-------+--------+--------+--------+
|     1 |      1 | true   |    a   |
|     2 |      1 | true   |    b   |
+-------+--------+--------+--------+

mysql> select * from test \G
*************************** 1. row ***************************
   id: 1
  hostid: 1
  status: true
  type: a
*************************** 2. row ***************************
   devid: 2
  hostid: 1
  status: true
  type: b
2 rows in set (0.00 sec)

気になるコマンド見つけたら随時更新予定
他にも皆さんの「こんなのも便利!」などのコメント待ってます。

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

MySQLでデータベース作成ができない時の対処

はじめに

SQL文もある程度覚えたし、実際にMySQLの環境を構築してより実践的な学習をしようと思ったら、いきなり詰まったので備忘録として残しておきます。

何が発生したか

alt

データベース作成がしたいのに、ボタンが押せない状況に。
原因は画像下部にある

Could not connect, server may not be running. Can't connect to MySQL server on '127.0.0.1' (10061)

この部分でした。
「サーバーに接続してねぇぞ」って怒られているようです。

どこを確認すれば良いか

答えはmysqldというプロセスにありました。

windowsのPCの場合は
タスクマネージャー→プロセスでmysqldのプロセスが動いているか確認する。
(Macの場合については未確認のため分かりません。すみません...)

確認してみると該当するプロセスは見当たらず起動していなかったことが分かりました。

どのように起動するか。

※下記実行前にMySQLのbinコマンドが使えるようPathを通しているか確認すること。
通していない場合は環境変数に;C:¥Program Files¥MySQL¥MySQL Server x.x¥binを入れること
(x.xにはバージョンを入れる。今回の場合は5.7)

  1. 管理者権限でコマンドプロンプト起動
  2. net start mysqlxxを実行。 (xx部分にはバージョンの番号を入力します。5.7のバージョンを使用している場合は57)
  3. mysql -u root -pを実行

以上。

net startはサービスの表示/開始を意味し、
mysql -u root -pはmysqlにユーザー名rootでパスワード入力を行う宣言です。

alt]

MySQLサーバーとの接続を切断する場合はquitで抜ける。
(exit\qでもOK)

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