- 投稿日:2019-02-18T17:38:40+09:00
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!本当に助かりました。。
記事に間違っている部分などありましたらコメントお願いします。
- 投稿日:2019-02-18T16:55:24+09:00
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"
- 投稿日:2019-02-18T15:00:37+09:00
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 -oPythonスクリプト実行
今回は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リクエストがサブセグメントとして乗ってます。
試しにサプセグメントを選択すると、SQLタブが出てます。これを開くと、DBのタイプやバージョン、接続したユーザー名が表示されます。
ここの情報はSELECT・INSERT・DELETEとも同じです。
注意点
X-Rayにトレースしてもらうためには、 必ず
mysql.connector.connect
関数を使ってコネクションを作る必要があります。当初はコネクションプールの操作のため
mysql.connector.pooling.MySQLConnectionPool
を使ってましたが全然トレースしてくれませんでしたバッチライブラリの中でも、サポートされている関数/されていない関数があるようなので、ご注意を・・・
まとめ
これでMySQLサーバーへのリクエストがトレースできましたが、基本的には接続先と処理時間くらいしかトレースしてくれないので、より細かい情報を取りたい場合はSQLAlchemy ORMを使うべきかなと思います。また別途検証したいと思います。
参考
MySQL Connector/Python Developer Guide
- 投稿日:2019-02-18T12:15:11+09:00
便利な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)気になるコマンド見つけたら随時更新予定
他にも皆さんの「こんなのも便利!」などのコメント待ってます。
- 投稿日:2019-02-18T01:18:04+09:00
MySQLでデータベース作成ができない時の対処
はじめに
SQL文もある程度覚えたし、実際にMySQLの環境を構築してより実践的な学習をしようと思ったら、いきなり詰まったので備忘録として残しておきます。
何が発生したか
データベース作成がしたいのに、ボタンが押せない状況に。
原因は画像下部にある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)
- 管理者権限でコマンドプロンプト起動
net start mysqlxx
を実行。 (xx
部分にはバージョンの番号を入力します。5.7のバージョンを使用している場合は57
)mysql -u root -p
を実行以上。
net start
はサービスの表示/開始を意味し、
mysql -u root -p
はmysqlにユーザー名rootでパスワード入力を行う宣言です。MySQLサーバーとの接続を切断する場合は
quit
で抜ける。
(exit
、\q
でもOK)