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

M1 Mac で docker mysql を使う

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql Unable to find image 'mysql:latest' locally latest: Pulling from library/mysql docker: no matching manifest for linux/arm64/v8 in the manifest list entries. See 'docker run --help'. 普通に docker run しようとすると、no matching manifest が発生してしまうので、その時は --platform linux/x86_64 を指定する。 docker run -d --platform linux/x86_64 --name mysql -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 mysql この記事によると、別のCPUアーキテクチャのエミュレーションをしているので動いているらしい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XAMPPのMySQLデータベースを起動させるまでの闘いの記録

背景 これはとある夜下がりにとある人間がとある技術書を読みながら手を動かしていくぜと意気込んで読みすすめて行ったところ、序盤のXAMPPを使おうという何気ない記事の所で、全く予想だにしていなかったエラーの波に飲み込まれ、XAMPPのMySQLをRunningにするまでに何時間も悪戦苦闘した闘いの記録である 概要 注)・XAMPPのインストールの部分は省略しています。   ・環境はMacです。 まずはApacheを起動しよう!となってたのでStartをクリックすると簡単に起動。よしよし。 次はMySQLを起動しよう!となってたのでStartをクリックすると簡単に起動・・・・・・しない!!! 何度やっても赤いランプのStoppedになってしまう。 ということで速攻で検索して調べてみました。 はじめにxampp mysql 起動しないで検索したらほとんどがWindowsの場合のページばかりヒットしたので、検索ワードに「mac」を入れることにしました。(自分はMacを使用しています) そしてteratailのこちらのページが役に立ちそうと思って記事の内容を読みながら試してみました。 そしてとりあえずlogを見てみる事にしました。 ・XAMPPのMySQL起動時のエラーログの確認コマンド $ sudo tail /Applications/XAMPP/xamppfiles/var/mysql/自分のMacの名前.local.err /Applications/XAMPP ❯ sudo tail xamppfiles/var/mysql/~Mac.local.err Password: 2021-04-13 22:21:53 0 [Note] InnoDB: Waiting for purge to start 2021-04-13 22:21:53 0 [Note] InnoDB: 10.4.18 started; log sequence number 1764329; transaction id 2369 2021-04-13 22:21:53 0 [Note] InnoDB: Loading buffer pool(s) from /Applications/XAMPP/xamppfiles/var/mysql/ib_buffer_pool 2021-04-13 22:21:53 0 [Note] Plugin 'FEEDBACK' is disabled. 2021-04-13 22:21:53 0 [Note] InnoDB: Buffer pool(s) load completed at 210413 22:21:53 2021-04-13 22:21:53 0 [Note] Server socket created on IP: '::'. 2021-04-13 22:21:53 0 [ERROR] Can't start server: Bind on TCP/IP port. Got error: 48: Address already in use 2021-04-13 22:21:53 0 [ERROR] Do you already have another mysqld server running on port: 3306 ? 2021-04-13 22:21:53 0 [ERROR] Aborting 2021-04-13 22:21:55 16635 mysqld_safe mysqld from pid file /Applications/XAMPP/xamppfiles/var/mysql/~Mac.local.pid ended Can't start server: Bind on TCP/IP port. Got error: 48: Address already in use Do you already have another mysqld server running on port: 3306 ? 上記のエラーログから他のどこかでMySQLのポート番号【3306】が使われていて起動出来ないのだと仮定しました。 そして調べていた所ポート番号の競合を確認出来るコマンドを発見したので使用してみた 使用中のすべてのポートを確認する場合 netstat -an 特定のポートを確認する場合 netstat -an | find ":<ポート番号>" 参考サイト:2.1.3 ポート番号が競合していないことを確認する コマンド実行して検証 $ netstat -an | find "3306" find: 3306: No such file or directory >そんなファイルは無いよと言われてしまいました。 残念ながらこのコマンドでは思った結果が得られませんでした 別のコマンドを見つけたので実行して再度検証 /Applications/XAMPP ❯ netstat -na | grep LISTEN tcp6 0 0 *.64279 *.* LISTEN tcp4 0 0 *.64279 *.* LISTEN tcp46 0 0 *.3306 *.* LISTEN ・・・以下略 >ここでようやくMySQLのポート番号【3306】がどうやらなにかに使われていることが分かりました。 さらに検証を進める $ ps aux | grep mysql このコマンドを打つと【mysql】という検索キーワードでプロセスの一覧を取得出来る。 だが何行にも渡って【mysql】関連のプロセスが出てるのでこのどれが原因なのかよく分からない? ついに起死回生のコマンド見つけた 原因となるmysqlのプロセスを見つけるコマンドを探し回ること数時間、ついにあるコマンドをstack overflowで見つけた! それがこのコマンドlsof -nP -i4TCP:3306である。 > (3306はMySQLのポート番号) さっそく実行 $ lsof -nP -i4TCP:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 16496 user 17u IPv6 0xdaf9973c9634bf6b 0t0 TCP *:3306 (LISTEN) ここでついにプロセスID【16496】が現在MySQLが動いているプロセスであることが判明した。 ※余談だが、上記のコマンドと似たようなコマンドでlsof -i -P | grep 3306というのもあって実行した所、結果は同じだったが結果が返るまでの時間が結構遅かったので自分は前述のコマンドのがオススメ。 killコマンドでプロセスを終了させる ここまでに調べた内容でプロセスを終了するkillコマンドについてはすでに知っていた為、早速該当のプロセスに実行する。 killコマンドの実行 $ kill 16496 (オプションで-9を入れると強制終了になるらしいが今回は使わない。) ようやくXAMPPのMySQLを起動してみるが・・・ これで完全に緑ランプが点くだろうと確信してXAMPPのStartを意気揚々と押してから待つこと数秒。 無慈悲にもstopped(赤いランプ)の状態になり、再び絶望に落とされる。 「そんな・・・、バカな・・・。一体何が悪かったんだ・・・。頭か・・???」と意気消沈してしばらく現実逃避してました。(腕立てとかスクワットとか) 再度MySQLのプロセスを確認 気を取り直して、とりあえずもう一度プロセスを確認することに。 $ lsof -nP -i4TCP:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 16496 user 17u IPv6 0xdaf9973c9634bf6b 0t0 TCP *:3306 (LISTEN) 「なに!?復活してる!?」 「確かに貴様はさっきkillったはずなのに!!!?」 ですが、このことから全てが分かりました。 そう、このMySQLは自動復活のスキルを保有しているということに!!!! MySQLの自動機能について調べる 早速mysql 自動起動で調べた所、答えが全て載っている最高なこちらのサイトを見つけました。 まずはこちらのサイト内から得た知識で、下記のコマンドで自動機能が設定されているかを調べます。 $ brew services list Name Status User Plist mysql@5.6 started user /Users/user/Library/LaunchAgents/homebrew.mxcl.mysql@5.6.plist 完全に自動機能が設定されていました。 というわけで自動機能を停止するコマンドを実行 $ brew services stop mysql@5.6 Stopping `mysql@5.6`... (might take a while) ==> Successfully stopped `mysql@5.6` (label: homebrew.mxcl.mysql@5.6) 念の為MySQLが動いているかを下記コマンドにて確認 $ mysql.server status ERROR! MySQL is not running ちゃんとMySQLが止まっていることが確認出来ました。 再度killコマンドを実行 $ kill 16496 もう一度確認 lsof -nP -i4TCP:3306 →なにも表示されなかった為MySQLが停止していることが分かる。 決着 全ての闘いが終わり、XAMPPのMySQLのStartをクリック。数秒待った後に無事にRunningの緑のランプの点灯に変わることが確認出来ました。嘘ではありません。 これが証拠です!! おわりに この件は冒頭でも述べた通り、昨晩と今日にかけて数時間色々と試行錯誤した結果ようやく解決出来ましたので、緑のランプが点いた時は本当に嬉しかったです また今回の件で自分がMySQLの自動起動の設定をしていたことをすっかり忘れていたことや、起動しているプロセスのポート番号を調べるコマンドを知らなかったりなど多くの事を学習することが出来ました? 今回の学んだ内容を落とし込む意味と他の人への共有のために面倒でしたが今回の記事を書きました。 もしこの記事を見ることで、同じように困っている人達のお役に立つことが出来たならとても光栄です。 この度はこの拙い記事にお付き合いくださり誠にありがとうございました!! 今回の内容をまとめると ・まずはXAMPPのMySQL起動時のエラーログの確認 $ sudo tail /Applications/XAMPP/xamppfiles/var/mysql/自分のMacの名前.local.err →「3306」がすでに使用中なことを確認 ・MySQLのポート番号「3306」の確認 $ lsof -nP -i4TCP:3306 →該当のプロセスIDを確認:今回は「16496」 ・killコマンドの前に自動起動されていないかの確認 $ brew services list →ここで自動起動設定されていたらkillしてもすぐに復活するので止める ・自動起動の停止 $ brew services stop mysql(@~) (なお、自動起動の再開コマンド:brew services start mysql) ・念の為MySQLが停止されていることを確認 $ mysql.server status →「ERROR! MySQL is not running」止まっていることを確認 ($ lsof -nP -i4TCP:3306こちらのコマンドで確認してもよい) ・killコマンドの実行 $ kill (16496) ・これでXAMPPのMySQLが起動出来ます 参考サイト MacOS XAMPP MySQLがStopped 2.1.3 ポート番号が競合していないことを確認する 【MySQL】自動起動の意外な落とし穴
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

flywayをキャッチアップしてみた

flywayキャッチアップメモ 複数人で同じプロジェクトを開発するときに、DB上のテーブル構造が変わった場合に、 それぞれの開発者が自分のローカルのDBを持っている場合に、 各開発者はご自身で何かしらのSQLを流して適用しないといけないです。 開発者同士はお互いに情報を共有し、 もしDBへの変更があれば、 手動でもしくはバッチジョブなどを組んでDBへのスクリプト適用を行う必要があります。 その作業自体は頻繁に発生すると、 かなり手間がかかるし、 またニューマンミスによる別の問題が発生する可能性もあります。 このようなことを防止するために、今回はflywayというフレームワークをキャッチアップし、 自分が勉強したことをメモ書きで共有したいと思います。 Spring initializr Flyway Migration MySQL Driver Spring Data JDBC GENERATEを押下してzipファイルをダウンロードします。 Import to IntelliJ ItelliJを起動し、File > Openで上記解凍したフォルダーを選択すればプロジェクトをインポートできると思います。 ディレクトリ構造 . ├── HELP.md ├── learn-flyway.iml ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │   ├── java │   │   └── com │   │   └── demo │   │   └── learnflyway │   │   └── LearnFlywayApplication.java │   └── resources │   ├── application.properties -> mysqlの情報を入れる │   └── db │   └── migration -> ここにSQLを書く └── test └── java └── com └── demo └── learnflyway └── LearnFlywayApplicationTests.java MySQL Download Add new user and grant privileges $ mysql -u root mysql> create user 'flyway'@'localhost' identified by 'flyway'; mysql> grant all privileges on * . * to 'flyway'@'localhost'; Add new Database $ mysql -u flyway -p # input your password here mysql> create database flywaydemo; mysql> show databases; IntelliJ with MySQL View > Tool Windows > Database プラスボタン > Data Source > MySQLを選択します。 画像のように設定します。 項目 値 Name (任意)flywaydemo@localhost Host localhost User flyway Password flyway Database flywaydemo URL 自動生成される 設定後に、Test Connectionをクリックして接続できるかどうかを確認します。 Add first SQL src/main/resources/db/migration以下にファイルを作成します。 V21.04.14.001__Init.sql create table user ( id bigint unsigned primary key auto_increment, name varchar(255) not null, password varchar(255) not null, create_at datetime default current_timestamp ) Ctrl + Enterを押下し、もしくは緑の三角を押すことでSQLをそのまま実行できます。 画像のように、右側にもflywaydemo > tables > userというテーブルが出てきました。 確認 念のため確認します。 select * from user userテーブルがあるけどまだデータがないですね。 削除 とりあえず作成したuserテーブルを削除します。 drop table user application.properties src/main/resources/application.properties spring.datasource.url=jdbc:mysql://localhost:3306/flywaydemo spring.datasource.username=flyway spring.datasource.password=flyway 上記のコードをapplication.propertiesに追加します。 Run Springboot もろもろ準備ができたspring bootを起動します。 実行後のログを添付します。 2021-04-14 17:12:24.029 INFO 16704 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 JDBC repository interfaces. 2021-04-14 17:12:24.234 INFO 16704 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 7.1.1 by Redgate 2021-04-14 17:12:24.237 INFO 16704 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2021-04-14 17:12:24.332 INFO 16704 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2021-04-14 17:12:24.355 INFO 16704 --- [ main] o.f.c.i.database.base.DatabaseType : Database: jdbc:mysql://localhost:3306/flywaydemo (MySQL 5.7) 2021-04-14 17:12:24.379 INFO 16704 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.012s) 2021-04-14 17:12:24.387 INFO 16704 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table `flywaydemo`.`flyway_schema_history` ... 2021-04-14 17:12:24.835 INFO 16704 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `flywaydemo`: << Empty Schema >> 2021-04-14 17:12:24.838 INFO 16704 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `flywaydemo` to version "21.04.14.001 - Init" 2021-04-14 17:12:25.200 INFO 16704 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema `flywaydemo` (execution time 00:00.369s) 2021-04-14 17:12:25.288 INFO 16704 --- [ main] c.d.learnflyway.LearnFlywayApplication : Started LearnFlywayApplication in 1.702 seconds (JVM running for 2.425) 2021-04-14 17:12:25.292 INFO 16704 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2021-04-14 17:12:25.301 INFO 16704 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 大体このような感じで実行できます。 テーブル確認 spring bootを実行後に、右側のDatabaseを確認し、 flywaydemoをリフレッシュ(↑のフレッシュアイコン)すると、二つのテーブルが作成されました。 userはもちろん私たちが定義したテーブルのはずで、 flyway_schema_historyは一体何者でしょうか? flyway_schema_history select * from flyway_schema_history 項目 値 installed_rank 1 version 21.04.14.001 description Init type SQL script V21.04.14.001__Init.sql checksum 1280597246 V21.04.14.001__Init.sqlが実行された痕跡が残されていますね。 なぜこれがあるかと言いますと、 flywayはSpringbootが実行するたびにとともに実行される機能なので、 二回目Springbootを実行するときにflyway_schema_histoiryのおかげでuserテーブルを重複作成しないようにコントロールできます。 Add Second SQL V21.04.14.002__InsertUserData.sql insert into user (name, password) values ('admin', 'admin'); insert into user (name, password) values ('user', 'user'); 追加後もう一度Spring bootを実行します。 2021-04-14 17:44:01.218 INFO 2632 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.020s) 2021-04-14 17:44:01.227 INFO 2632 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `flywaydemo`: 21.04.14.001 2021-04-14 17:44:01.234 INFO 2632 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `flywaydemo` to version "21.04.14.002 - InsertUserData" Spring bootの実行ログを見ると、 今のバージョンは21.04.14.001、また次のバージョン21.04.14.002 - InsertUserDataが適用していないので適用しますというふうにわかりますね。 user table 確認 右側のuserテーブルをダブルクリックして、user内のデータを確認することができます。 確かに二行のデータがインサートされていますね。 Add Third SQL 今回はアプリケーションの仕様が変更されたのでそれに従ってテーブルも変更します。 修正点 nameを一意にする emailというカラムを追加する V21.04.15.001__AlterUserTable.sql alter table user add column email varchar(255), add unique (name); Spring bootをもう一度実行するとuserテーブルは期待通りになりましたね。 最後 これでDBのテーブルを手動でメンテナンスしなくても楽に開発できるようになりました! 修正後の構造 . ├── HELP.md ├── learn-flyway.iml ├── mvnw ├── mvnw.cmd ├── pom.xml ├── src │   ├── main │   │   ├── java │   │   │   └── com │   │   │   └── demo │   │   │   └── learnflyway │   │   │   └── LearnFlywayApplication.java │   │   └── resources │   │   ├── application.properties │   │   └── db │   │   └── migration + │   │   ├── V21.04.14.001__Init.sql + │   │   ├── V21.04.14.002__InsertUserData.sql + │   │   └── V21.04.15.001__AlterUserTable.sql │   └── test │   └── java │   └── com │   └── demo │   └── learnflyway │   └── LearnFlywayApplicationTests.java Link https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#spring.datasource.url https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql https://www.baeldung.com/database-migrations-with-flyway https://flywaydb.org/documentation/usage/plugins/springboot
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SQLSTATE[HY000] [2002]No route to host CentOS7 でdocker上のMySQLに接続できなくなった

ホストのCentOS-7.3を再起動後、docker上のMySQLに接続できなくなった。 その際の備忘録。 dockerの状態を確認 $ systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) 起動している。 コンテナを確認 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 起動しているコンテナなし 停止しているものも含めてコンテナ確認 sudo docker ps -a 接続したかったコンテナが存在した。 コンテナが停止していたことがわかった。 コンテナの起動 $ sudo docker start コンテナ名 起動失敗。以下エラー文抜粋 iptables: No chain/target/match by that name. iptables(ファイアーウォール)のルール確認 $ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination dockerの設定がない dockerを再起動する $ sudo systemctl restart docker 再度iptables(ファイアーウォール)のルール確認 $ sudo iptables -L dockerの設定が反映された コンテナに接続後、MySQLへ接続できた。 参考サイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SQL】テーブルからデータを読み込む方法 no.4

こんにちは、まゆみです。 SQLについての記事をシリーズで書いています。 今回は第4回目になります。 前回の記事では、テーブルを作って(CREATE)、そこに値(レコード)を入れるところまでを書きました。 今回の記事では、その作ったテーブルからデータを読み込む(READ)方法を書いていきます ではさっそく始めていきますね。 SQLiteOnline で練習 前回と同じく、SQL Online IDEにアクセスすると、気軽にSQLの練習ができるのでおすすめです。 SQL Online IDEを開くと、デモテーブルが一番に表示されます。 そしてコードを書くところに SELECT * FROM demo; と書かれています。 実はこの『SELECT * FROM demo』が書かれているためにデモテーブルが最初に表示されるのです。 w3schools のチュートリアル ではさっそく、w3schoolsのSELECTの説明を見てみましょう SELECTは選択するという意味なので、どのコラムを選択するかを決め、それをSELECTの後ろにスペースを空けてから書きます。 全てのコラムを選択するなら、*(アスタリスク)です。 そのあと、どのテーブルから(FROM)データを読み込みたいのかを指定します。 FROM テーブル名 を続けて書きます。 SELECT FROMを試してみる では、SELECT FROMを使った結果がどうなるのか試してみましょう。 前回の記事で作ったテーブルを使って『SELECT FROM』を使ってみるか、もしテーブルを作るのが面倒であれば、w3schools のサイトでも試してみることができます 少しスクロールすると、上記のような画面になりますので、試してみてくださいね。 WHERE 条件に合う横の列を取り出したいときは、どこ(WHERE)を使います w3schoolsのチュートリアルを参照してみましょう 『どんな条件に合致するデータを取り出したいか』という条件は以下のように書きます。 WHERE id = 1; としたり WHERE address = "Grape Village"; として検索をかけることができます まとめ 今回の記事では、既存のテーブルからデータをどのように欲しいデータにアクセスできるのか書きました。 次回は『UPDATE』データの更新について書いていきますね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む