- 投稿日:2020-07-12T18:32:02+09:00
Docker環境で複数のSQLを一括実行
目的
EC-CUBE4のDocker環境で特定ディレクトリ内のSQLファイルすべてをコマンドラインで一括実行したい。
方法
SQLファイル置き場を作成するため、
docker-compose.yml
に下記のように行を追加する。docker-compose.ymlservices: mysql: volumes: - ./additional_sql:/home/additional_sql # この行を追加
docker-compose up -d
する。プロジェクトフォルダ直下に「additional_sql」フォルダが作成されるので、そこに実行させたいSQLファイルを保存する。
プロジェクトフォルダ直下に「additional_sql」フォルダ内のSQLファイルを全て実行するシェルスクリプトを作成する。
additional_sql.sh#!/usr/bin/env bash # additional_sqlフォルダ内の全SQLファイルをEC-CUBEのDBにて実行する。 for file in ./additional_sql/*.sql do docker-compose exec mysql bash -c "mysql -u dbuser -psecret eccubedb < /home/${file}" done下記コマンドラインをプロジェクトフォルダ直下で実行する。
# WindowsのGit Bashの場合、TTYエラーを避けるためのお約束 $ exec winpty bash # additional_sqlフォルダ内の全SQLファイルを実行するシェルスクリプトを実行 $ ./additional_sql.shSQLファイル作成時の注意点
冒頭に
CHARSET utf8;
を記述しないと、日本語が文字化けしてDB登録されてしまう。参考
- 投稿日:2020-07-12T18:32:02+09:00
EC-CUBE4のDocker環境で複数のSQLを一括実行
目的
EC-CUBE4のDocker環境でSQLをコマンドラインで一括実行したい。
方法
SQLファイル置き場を作成するため、
docker-compose.yml
に下記のように行を追加する。docker-compose.ymlservices: mysql: volumes: - ./additional_sql:/home/additional_sql # この行を追加
docker-compose up -d
する。プロジェクトフォルダ直下に「additional_sql」フォルダが作成されるので、そこに実行させたいSQLを保存する。
プロジェクトフォルダ直下に「additional_sql」フォルダ内のSQLファイルを全て実行するシェルスクリプトを作成する。
additional_sql.sh#!/usr/bin/env bash # additional_sqlフォルダ内の全SQLファイルをEC-CUBEのDBにて実行する。 for file in ./additional_sql/*.sql do docker-compose exec mysql bash -c "mysql -u dbuser -psecret eccubedb < /home/${file}" done下記コマンドラインを実行
# WindowsのGit Bashの場合、TTYエラーを避けるためのお約束 $ exec winpty bash # additional_sqlフォルダ内の全SQLファイルを実行するシェルスクリプトを実行 $ ./additional_sql.shSQLファイル作成時の注意点
冒頭に
CHARSET utf8;
を記述しないと、日本語が文字化けしてDB登録されてしまう。参考
- 投稿日:2020-07-12T17:36:31+09:00
MySqlとChart.jsの組み合わせ方
Mysqlに登録したデータをchart.jsで出力する方法の備忘録
参考記事;
https://www.youtube.com/watch?v=cREXtrFiJBc
https://www.madsycode.com/download/chartjs-mysql/参考記事ではdb.phpとindex.phpで分けていた部分をindex.phpのみを使用して実装
事前準備
mysqlにてdbとtableを作成
db:chart
table:chart2_tableコード
index.php<?php include("funcs.php"); $pdo = db_conn(); $data1 = ''; $data2 = ''; データ登録SQL作成 //prepare("")の中にはmysqlのSQLで入力したINSERT文を入れて修正すれば良いイメージ $stmt = $pdo->prepare("SELECT* FROM chart2_table"); $status = $stmt->execute(); //loop through the returned data while( $r = $stmt->fetch(PDO::FETCH_ASSOC)){ $data1 = $data1 . '"'. $r['data1'].'",'; $data2 = $data2 . '"'. $r['data2'] .'",'; } $data1 = trim($data1,","); $data2 = trim($data2,","); ?> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js"></script> <title>Accelerometer data</title> <style type="text/css"> body{ font-family: Arial; margin: 80px 100px 10px 100px; padding: 0; color: white; text-align: center; background: #555652; } .container { color: #E8E9EB; background: #222; border: #555652 1px solid; padding: 10px; } </style> </head> <body> <div class="container"> <h1>MySql & Chart.js</h1> <canvas id="chart" style="width: 100%; height: 65vh; background: #222; border: 1px solid #555652; margin-top: 10px;"></canvas> <script> var ctx = document.getElementById("chart").getContext('2d'); var myChart = new Chart(ctx, { type: 'line', data: { labels: [1,2,3,4,5,6,7,8,9], datasets: [{ label: 'Data 1', data: [<?php echo $data1; ?>], backgroundColor: 'transparent', borderColor:'rgba(255,99,132)', borderWidth: 3 }, { label: 'Data 2', data: [<?php echo $data2; ?>], backgroundColor: 'transparent', borderColor:'rgba(0,255,255)', borderWidth: 3 }] }, options: { scales: {scales:{yAxes: [{beginAtZero: false}], xAxes: [{autoskip: true, maxTicketsLimit: 20}]}}, tooltips:{mode: 'index'}, legend:{display: true, position: 'top', labels: {fontColor: 'rgb(255,255,255)', fontSize: 16}} } }); </script> </div> </body> </html>includeしているfuncs.phpは以下
<?php //DB接続 function db_conn(){ try { $db_name = "chart"; //データベース名 $db_id = "root"; //アカウント名 $db_pw = "root"; //パスワード:XAMPPはパスワード無しに修正してください。 $db_host = "localhost"; //DBホスト return $pdo = new PDO('mysql:dbname='.$db_name.';charset=utf8;host='.$db_host, $db_id, $db_pw); } catch (PDOException $e) { exit('DB Connection Error:'.$e->getMessage()); } }扱い自体はMySqlに登録された結果を\$r['data1'],\$r['data2]で取得し、scriptタグ内でdata: [<?php echo $data1; ?>],で呼び出しているだけ。
次回はjsonを使用し別ファイルのオブジェクトを呼び出す方法を実装していきたい。
- 投稿日:2020-07-12T16:12:12+09:00
あるあるなWebアプリの開発環境(PHP、Apache、MySQL)をDockerで構築した話
自社サービスのメンテナをしています。
悩み
- PHP、Apache、MySQLのバージョン上げなアカン
- でも、旧バージョンもメンテし続けなアカン
- ローカルPCでの開発環境がゴチャついてきた
- 顧客ごとにカスタマイズされてて、顧客環境ごとにソース自体が微妙に違ってる・・・
- できたらリモートサーバなしで、ローカルPCだけで完結させたい
Webサーバのディレクトリ構造はこんな感じ
/var/apps/ |-- abc # 株式会社abcさま用アプリ | |-- abc.php | |-- abc.png | `-- ・・・ |-- def # 株式会社defさま用アプリ | |-- def.php | |-- def.png | `-- ・・・ `-- ghi # 株式会社ghiさま用アプリ |-- ghi.php |-- ghi.png `-- ・・・
Dockerでなんとかしたいのですが・・・
- アプリのバージョンで、PHPやMySQLのバージョンが異なる
- アプリのバージョンごとにそれぞれの環境が必要
- 顧客ごとにDBのインスタンスが異なる
- MySQLの公式Dockerイメージって、初回起動のときにしかDB初期化スクリプト走らない
- なので、初回起動以降は、いちいちDBコンテナに入ってDB作ったりテーブル作ったりラジバンダリ
- 開発環境なので、デバッグを容易にできるようにしたい
Docker Composeでなんとかする
- アプリが依存するPHP、Apache、MySQLのバージョンを切り替えられるようにする
- 各アプリが使用するMySQLのDBインスタンスの生成を手軽に行いたい
- Xdebugでデバッグしたい
できあがったものがこちらです
くわしくはREADMEをご参照くださいmm
- 投稿日:2020-07-12T15:48:57+09:00
docker: mysql
terminal# launch docker run --name mysqldb -p 3306:3306 -v `pwd`/db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=p -d mysql # mysql client docker exec -it mysqldb mysql -uroot -pp # stop db docker rm -f mysqldb
- 投稿日:2020-07-12T15:29:23+09:00
MySQLのrootの初期パスワードについて
VPSでLAMP環境構築中、初期設定でrootのパスワードを設定しようとしたところ、パスワードなしでMySQLを使用することができず
調べたところバージョン5.7以降は自動生成されるようになったとのこと。参考記事を見てみると/var/log配下のmysqld.logにパスワードが出るとのことで確認してみる
どうしてこうなった
構築環境
VPS:さくらのVPS
OS:CentOS7
MySQL:バージョン8.0記事では上述の通り/var/log/mysqld.logに自動生成された一時パスワードが出力されると記載があったのですが・・・
[root@Tristar ~]# ls -la /var/log | grep mysqld -rw-r----- 1 mysql mysql 0 Jul 12 12:11 mysqld.log [root@Tristar ~]#0バイト
ログ出力されてねぇ・・・起動していないのかと思いrestartさせるもログファイルのサイズが変わらず
一旦、statusを確認してみると[root@Tristar ~]# systemctl status mysqld * mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2020-07-12 12:13:37 JST; 2h 31min ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 23317 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 23396 (mysqld) Status: "Server is operational" CGroup: /system.slice/mysqld.service `-23396 /usr/sbin/mysqld Jul 12 12:13:33 ik1-301-10960.vs.sakura.ne.jp mysqld_pre_systemd[23317]: 2020-07-12T03:13:33.681328Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. Jul 12 12:13:34 ik1-301-10960.vs.sakura.ne.jp mysqld_pre_systemd[23317]: 2020-07-12T03:13:34.720654Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: j!l,>g)*w7oU [root@Tristar ~]#何故かログに出力されずにstatusのlogの部分に[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: j!l,>g)w7oU*の記載が
今度からはログファイルではなくstatusで確認したほうがよさそうです。
参考記事
- 投稿日:2020-07-12T11:14:20+09:00
MAMPでDB接続にハマったときの話
最近PHPの学習始めました。
学習言語の雑食感が半端ないですが、必要に駆られてやっていることで、挫折したとかではありません。動画でPHPを学習していたときのMAMP環境でDB接続するときにMySQLに接続できなかったときの話です。
教材では<?php try{ $db=new PDO('mysql:host=127.0.0.1;dbname=mydb;charset=utf8','root',''); }catch(PDOException $e){ echo 'DB接続エラー: ',$e->getMessage(); } ?>とするように説明されていたのですが、MySQL SQLSTATE[HY000] [1049] Unknown database 'mydb'
とのこと。いや、あるし。で、色々ググってたらhostにポート番号いれて...というのを見つけたので、
host=127.0.0.1:3306ん?そもそもMAMP環境でMySQLのポートは3306でいいのか?と思いながら指定するも、案の定変わらず。
とりあえず再起動するか、と思ってやってみると、立ち上がってきたMAMPの初期画面に
書いてあるやん!!!
しかもパスワード間違えてるし。<?php try{ $db=new PDO('mysql:host=127.0.0.1:8889;dbname=mydb;charset=utf8','root','root'); }catch(PDOException $e){ echo 'DB接続エラー: ',$e->getMessage(); } ?>これで無事接続できました。
- 投稿日:2020-07-12T02:45:49+09:00
Rails で MySQL を使うよう設定する (sqlite => mysql)
環境
Ubuntu 18.04 on windows 10 by VirtualBox
rbenv 1.1.2-30-gc879cb0
Rails 5.2.4.3
Ruby 2.6.4
rails new hoge
をした更地の状態から環境構築。
まずGemfileに mysql2を書いてbundleすると
gem install mysql2
をしてくださいと怒られます。
その通り実行すると... Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. ...こんな分を含むエラーが。エラー文でググった記事を参考にするとどうも部品が足りてないとのことなので
sudo apt install libmysqld-devで必要なものをインストール。
これでgem install mysql2
が通り、bundle
を実行して無事MySQLに移行できたかと思いきや、
rails db:create
が通らない。エラー文は
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)どうやらソケットというものが無いので怒られたようだ。
https://teratail.com/questions/78685
を参考に、/var/run/mysqld/mysqld.sock
というディレクトリとファイルを作成。
されども同じエラーがでるので、
chmod 777 /var/run/mysqld/mysqld.sock
で権限を設定しても変わらず。いろいろ調べると、mysql と mysqldというのがあって、自分の環境(ubuntu)に両者がインストールされていないことが原因だとわかる。
そこで、https://stackoverflow.com/questions/41147609/unable-to-start-the-mysql-server-in-ubuntu
を参考に、sudo apt-get update sudo apt-get install mysql-server mysql-clientでmysqldとmysqlをインストール。
これでローカル環境に必要なものはそろったはず。しかし、同じエラー。
調べると、データベースを立ち上げていないよと。
そりゃそうだ。
なのでぐぐって出てきたsudo mysql.server start
を実行するもmysql.server: コマンドが見つかりませんと言われる。インストールしたmysqlがubuntuと合わないのかと思ったけど、
どうやらubuntuだとこのコマンドではなく、
/etc/init.d/mysql start
または
service mysql start
らしい。
参照:https://qastack.jp/ubuntu/82374/how-do-i-start-stop-mysql-serverこれで
sudo mysql -v
にてmysqlが使えることを確認!
ふぅ、、これまでで3時間ぐらい。そして念願の
rails db:create
をするもMysql2::Error: Can't connect to local MySQL server through socket 'var/run/mysqld/mysqld.sock' (2)調べるとソケットの指定があってない可能性があるとのこと。
ソケットの位置はmy.confというファイルに指定されているらしく、
参照:https://qastack.jp/ubuntu/82374/how-do-i-start-stop-mysql-server/etc/mysql/mysql.conf.d/mysqld.cnfsocket = /var/run/mysqld/mysqld.sockにソケットの指定が。
これを config/database.ymlに
socket: /var/run/mysqld/mysqld.sock
として書き込む。ちなみにそのほかのdatabase.ymlは以下の通り(#でコメントアウトしているのはsqliteでデフォルトで書かれていた部分)
database.ymldefault: &default #adapter: sqlite3 #pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> #timeout: 5000 #database: db/development.sqlite3 adapter: mysql2 encoding: utf8 pool: 5 username: root password: password host: localhost socket: /var/run/mysqld/mysqld.sock development: <<: *default database: myapp_development test: <<: *default #database: db/test.sqlite3 database: myapp_test production: <<: *default #database: db/production.sqlite3 database: myapp_production password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>よし!さすがにこれで通るだろ。と
rails db:create
しかし、非情にもAccess denied for user 'root'@'localhost' Couldn't create 'myapp' database. Please check your configuration.今度はmysqlのデフォルトでrootがauth_socketを設定しているため、rootユーザー以外で
username: root
に設定したDBはパスワードが合致していても呼び出せないよう。
また、初期パスワードが設定されていないため、
sudo mysql_secure_installation
でパスワードを設定後、
sudo mysql
でログイン(ほかのコマンドでもログインは可能)
更にmysqlにログインした状態で
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
これでauth_socketをオフ。
参照 https://hysryt.com/archives/1697
https://yukituna.com/1613/この状態で
rails db:create
で漸く成功。。。疲れた、、、試行錯誤して合計5時間ぐらいかかった。。
昔のインターネッツが無い時代の人たちはすごいと思う。
私は本当に向いてないかもしれない。涙