- 投稿日:2022-02-14T17:22:10+09:00
突然Docker上のMySQLに接続できなくなるが再起動をすると治る
結論 ipv6で接続する。 Javaで接続する場合はjdbcの設定を以下のようにする jdbc:mysql://address=(protocol=tcp)(host=::1)(port=3306)(user=root)/db 事象 Docker上のMySQLにしばらく接続していると、何かのタイミングでMySQLへの接続がけられるようになる。 エラーは以下の通り access denied for user 'root'@'localhost' MySQL Workbenchではなぜか接続できる OSを再起動してもなぜか接続できる ゲストOSを落とすとエラーは変わる 127.0.0.1で設定してみてもダメ Dockerの再起動でもダメ ググってみてもrootの権限が足りないだのなんだの…こちとらさっきまで接続できていたんじゃい! 原因 根本原因がわからん…だれかデバッグ方法教えてくれ ただネットワークがらみっぽい感じではある。 127.0.0.1でだめな理由は多分localhostに勝手に読み替えられていたのだと思う。 対応 ipv6で指定することで無事接続ができた。 なんでやねん…。
- 投稿日:2022-02-14T14:13:45+09:00
重複しているレコードの内、最も古いレコードだけを残すSQL
背景 登録時の重複チェックがうまく効いてなかったのか、同じ内容のレコードが複数登録されてしまっていて、 重複しているレコードのうち登録が一番古いレコードだけを残したかった際に実行したSQL。 ※ここでは「最も古いレコード = idが一番若いレコード」として書いてます。 実行したSQL DELETE FROM `[table_name]` WHERE id NOT IN (SELECT min_id FROM (SELECT min(table1.id) AS min_id FROM `[table_name]` AS table1 GROUP BY table1.[column]) AS table2); [table_name]に対象のテーブル名、[column]に重複が確認できるカラム名を入れて実行すれば、idが一番若いレコード以外のレコードが削除されます。 SELECT文の中の「min(table1.id)」の箇所を変えてあげれば、id以外のカラムでもできます。 そもそもそんなレコードが作られる際にちゃんと対策しとけよと思いますが、何かしらの要因で重複してしまった際の対応策として。。。