- 投稿日:2020-03-17T19:55:31+09:00
dockerで突如mysql:5.5系が起動しなくなった
複数のwordpress案件をdockerで開発していたところ、
以前は立ち上がっていたプロジェクトで
docker-compose up
した際、
wpのコンテナは起動するのにmysql:5.5.58
イメージが起動しない(立ち上がった直後強制終了)
という状態に(´;ω;`)試したこと(全部だめ)
コンテナ再スタート
docker-compose stop
→docker-compose up
コンテナ削除・再構築・スタート
docker-compose down
→docker-compose build
→docker-compose up
別フォルダに再度環境構築
git clone
→docker-compose build
→docker-compose up
macのストレージを掃除(メモリ不足かと思った)
mac再起動(※セーフブート後、再構築)
すべて変わらず。
エラーログ
200317 8:52:24 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled 200317 8:52:24 [Note] mysqld (mysqld 5.5.58) starting as process 1 ... 200317 8:52:24 [Note] Plugin 'FEDERATED' is disabled. 200317 8:52:24 InnoDB: The InnoDB memory heap is disabled 200317 8:52:24 InnoDB: Mutexes and rw_locks use GCC atomic builtins 200317 8:52:24 InnoDB: Compressed tables use zlib 1.2.3 200317 8:52:24 InnoDB: Using Linux native AIO 200317 8:52:24 InnoDB: Initializing buffer pool, size = 128.0M 200317 8:52:24 InnoDB: Completed initialization of buffer pool InnoDB: Error: checksum mismatch in data file ./ibdata1 200317 8:52:24 InnoDB: Could not open or create data files. 200317 8:52:24 InnoDB: If you tried to add new data files, and it failed here, 200317 8:52:24 InnoDB: you should now edit innodb_data_file_path in my.cnf back 200317 8:52:24 InnoDB: to what it was, and remove the new ibdata files InnoDB created 200317 8:52:24 InnoDB: in this failed attempt. InnoDB only wrote those files full of 200317 8:52:24 InnoDB: zeros, but did not yet use them in any way. But be careful: do not 200317 8:52:24 InnoDB: remove old data files which contain your precious data! 200317 8:52:24 [ERROR] Plugin 'InnoDB' init function returned error. 200317 8:52:24 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 200317 8:52:24 [ERROR] Unknown/unsupported storage engine: InnoDB 200317 8:52:24 [ERROR] Aborting 200317 8:52:24 [Note] mysqld: Shutdown completeエラーログでググって、下記の記事にたどり着いたのだけど、
Mysql自体はruby案件で必要だったのでHomebrew経由でインストールしたことあるけれど、
色々試した結果、
dockerってmysqlもきっと内部で環境もっているよね・・?
・・となんとなく思い、docker関連で情報集める。解決!
まずはこちらを参考に、docker内をゴミ掃除。
- 使ってないコンテナ
- 使ってないイメージ
- 使ってないネットワーク
を削除後、
docker-compose build --no-cache
を試す。
変わらず。泣きそう・・?はつづく。さらに調べると、こちらの記事を発見。
わたしの場合、docker-compose.ymlは特にいじっていなかったのだけど、
実はこの現象が起こる前、別案件のdockerの環境構築を行っていた。そちらのdocker-compose.ymlを確認すると、
mysqlのバージョンはmysql:5.7.21
になっていて、
(どちらもcontainer_nameちゃんとついていたんだけども、)
なんかdocker内部のmysqlのバージョンのログ?が元になっているのだとすると、
効果あるかも・・・・ということで、先程やっていなかった「ボリュームの削除」を実行。コンソールで出力してみたものの、volume IDがわからなかったので、
Visual Studio CodeのDocker ExtentionのGUIから削除。
↑右クリック+「Remove」その後
docker-compose build --no-cache
すると!!!動いた〜〜〜〜!!!!??✨
終わり
本当に・・3時間位摩耗したので、先人の記事に救われて感謝。
すべての人がこれで解決するのかは謎ですが、困ったら一度お試しを..!御加護を祈ります。(解決はできたけど、結局、内情というか根本的な原因についてはわかってない・・・)
- 投稿日:2020-03-17T13:44:54+09:00
HerokuでMySQLに接続しようとしたら[Error2055]が出た
概要
HerokuのClearDBを使ってMySQLに接続しようとpythonのプログラムをプッシュして動かしてみたのですが、
error 2055 Lost connection~
というメッセージが出て接続できませんでした。結果としてはMySQLに関するエラーではなく、プログラムの書き方が原因だったのですが、同じところで悩んでいる方のためにもまとめておこうと思います。
環境
- macOS
- python3.7.1
- MySQL5.6.47
- mysql-connector-python
この記事で書かないこと
- ClearDBの設定方法
- MySQLの詳しい操作方法
原因
最初はClearDBを追加した後、何か設定が必要なのだと思い色々調べて、マイグレーションなどを試していました。
しかし、ClearDB自体には接続できて、データベースに繋いで操作するプログラム単体で動かしてもエラーは出ず、いまいち原因が分かりませんでした。そんな時にこちらの記事を見つけなんとなく読んでいたのですが、SQL操作が失敗する原因としてコネクション切断後にクエリ実行する場合と書いてありました。
それは当然だよなと思い次に行こうとしたのですが、ふと自分のコードを見てこれこそが原因だと判明しました。というのも、私のコードは下記のような作りになっていました。
main.py#モジュールのインポート #データベース操作のプログラムのインポート import database #メインの処理 #database内の関数呼び出し database.get_data()database.pyimport mysql.connector #接続先を設定して接続 def get_data(): #クエリの実行 connection.commit() connection.close()これを踏まえてこちらの記事を見てみると、
database
をインポートした時点で関数外に記載されているコードが実行されます。つまり、
main.py
のimport database
で一旦SQLに接続されますが、database.py
のget_data()
関数は定義がしてあるだけなので実行はされず、最後のconnection.close()
で接続が切られるという流れになります。その後に、
main.py
内のdatabase.get_data()
で関数を呼び出したところで、既に接続は切られているので当然クエリは実行できずエラーが発生するということです。
database.py
だけ実行しても、接続後何もせず接続を切るという動作をしていただけなのでエラーが出ないのも納得です。対策
というわけでコードを下記のように修正し、関数を呼び出すことで接続を切るようにしたら無事にエラーなく接続できました。
main.py#モジュールのインポート #データベース操作のプログラムのインポート import database #メインの処理 #database内の関数呼び出し database.get_data() #追加 database.close_db()database.pyimport mysql.connector #接続先を設定して接続 def get_data(): #クエリの実行 #修正 def close_db() connection.commit() connection.close()参考
- 投稿日:2020-03-17T09:43:47+09:00
カラムの追加、削除の方法と間違ったマイグレーションを作ってしまった時の対処法。
よくカラムの追加や削除をするのに、その度にやり方を忘れて毎回いろんな記事を検索してしまってるので、備忘録として記事にしました。
カラムの追加方法
$ rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型
↓↓↓↓↓↓↓↓(例)
% rails g migration AddPrefectureToItems prefecture:references
書き方はキャメルケースで書きます。「SampleHogeHuga」のように単語の頭文字を大文字にすることで単語を区切ります。
カラムの消し方
基本的には、
rails g migration Removeカラム名From削除元テーブル名 削除するカラム名:型
を使った方が良いと思います。
しかし、自分の場合、なぜかうまくrails db:migrateが実行できない事が多かったので、直接MySQLテーブルを操作する方法で削除しました。SQL文で指定したカラムを消す方法
まず、
$ mysql -u root
でmysqlに接続。
$ SHOW DATABASES;
で指定するデータベースを探す。
$ USE データベース名;
でデーターベースを指定する。
$ SHOW TABLES;
でテーブルを探す。
$ ALTER TABLE テーブル名 DROP カラム名;
で指定したカラムを削除。
↓↓↓↓↓↓↓↓(例)
$ ALTER TABLE goods DROP stock;
間違ったマイグレーションファイルを作ってしまった時の対処法
まずは、マイグレーションファイルの状況確認。
$ bundle exec rake db:migrate:status
左端が「down」になってるファイルは消せますよ〜という意味。
$ rails db:rollback
で一個手前のファイルをダウン状態にできる。
$ rails db:rollback STEP=○
で現在地を含めた○個前までdown状態にできます。(つまり○+1個前のファイルまで実行された状態)
$ rm -rf db/migrate/マイグレーションファイル名
でマイグレーションファイルを削除。
$ bundle exec rake db:migrate:status
で確認。
削除成功!※本来は最新のマイグレーションから順番に消していく方がいいです。
- 投稿日:2020-03-17T01:03:50+09:00
Mac Homebrewで最新のMySQLをインストールする
目的
- MySQL 8.0.18をインストールする方法をまとめる
実施環境
項目 情報 OS macOS Catalina(10.15.3) ハードウェア MacBook Pro (16-inch ,2019) プロセッサ 2.6 GHz 6コアIntel Core i7 メモリ 16 GB 2667 MHz DDR4 グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB 前提条件
- HomeBrewが使用できる状態になっていること。
実施方法
- 作業中にrootのパスワードが分からなくなってしまった方はこちら→MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法
下記コマンドを実行してbrewのインストールリストを更新する。
$ brew update下記コマンドを実行して最新のMySQLをインストールする。
$ brew install mysql下記コマンドを実行してエラーが出ない事を確認する。
$ mysql --version下記コマンドを実行してMySQLを起動する。
$ mysql.server start >Starting MySQL >. SUCCESS!下記コマンドを実行してMySQLのrootユーザでログインする。エラーが出ない事を確認する。
$ mysql -u root -p >Enter password: 何も入力せずにEnterを押下する。 ・ ・ ・ mysql>下記コマンドを実行してrootユーザのパスワードを設定する。
mysql> USE mysql; >Database changed mysql> ALTER USER 'root'@'localhost' identified BY '任意のパスワード'; >Query OK, 0 rows affected (0.00 sec)下記コマンドを実行して一旦MySQLから出る。
mysql> exit下記コマンドを実行してrootユーザでログインする。
$ mysql -u root -p >Enter password: 先に入力した任意のパスワードを入力する。 ・ ・ ・ mysql>インストール完了である。