20200712のMySQLに関する記事は8件です。

Docker環境で複数のSQLを一括実行

目的

EC-CUBE4のDocker環境で特定ディレクトリ内のSQLファイルすべてをコマンドラインで一括実行したい。

方法

  1. SQLファイル置き場を作成するため、docker-compose.ymlに下記のように行を追加する。

    docker-compose.yml
    services:
      mysql:
        volumes:
          - ./additional_sql:/home/additional_sql # この行を追加
    
  2. docker-compose up -dする。

  3. プロジェクトフォルダ直下に「additional_sql」フォルダが作成されるので、そこに実行させたいSQLファイルを保存する。

  4. プロジェクトフォルダ直下に「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
    
  5. 下記コマンドラインをプロジェクトフォルダ直下で実行する。

    # WindowsのGit Bashの場合、TTYエラーを避けるためのお約束
    $ exec winpty bash
    
    # additional_sqlフォルダ内の全SQLファイルを実行するシェルスクリプトを実行
    $ ./additional_sql.sh
    

SQLファイル作成時の注意点

冒頭にCHARSET utf8;を記述しないと、日本語が文字化けしてDB登録されてしまう。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC-CUBE4のDocker環境で複数のSQLを一括実行

目的

EC-CUBE4のDocker環境でSQLをコマンドラインで一括実行したい。

方法

  1. SQLファイル置き場を作成するため、docker-compose.ymlに下記のように行を追加する。

    docker-compose.yml
    services:
      mysql:
        volumes:
          - ./additional_sql:/home/additional_sql # この行を追加
    
  2. docker-compose up -dする。

  3. プロジェクトフォルダ直下に「additional_sql」フォルダが作成されるので、そこに実行させたいSQLを保存する。

  4. プロジェクトフォルダ直下に「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
    
  5. 下記コマンドラインを実行

    # WindowsのGit Bashの場合、TTYエラーを避けるためのお約束
    $ exec winpty bash
    
    # additional_sqlフォルダ内の全SQLファイルを実行するシェルスクリプトを実行
    $ ./additional_sql.sh
    

SQLファイル作成時の注意点

冒頭にCHARSET utf8;を記述しないと、日本語が文字化けしてDB登録されてしまう。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

スクリーンショット 2020-07-12 午後5.32.47.png

コード
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());
  }
}

出力結果
スクリーンショット 2020-07-12 午後5.31.20.png

扱い自体はMySqlに登録された結果を\$r['data1'],\$r['data2]で取得し、scriptタグ内でdata: [<?php echo $data1; ?>],で呼び出しているだけ。

次回はjsonを使用し別ファイルのオブジェクトを呼び出す方法を実装していきたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

あるあるな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でデバッグしたい

できあがったものがこちらです

appdock

くわしくはREADMEをご参照くださいmm


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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で確認したほうがよさそうです。

参考記事

MySQLの初期パスワードのありか

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の初期画面に
mamp.png

書いてあるやん!!!
しかもパスワード間違えてるし。

<?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();
}
?>

これで無事接続できました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.cnf
 socket  = /var/run/mysqld/mysqld.sock

にソケットの指定が。
これを config/database.ymlに
socket: /var/run/mysqld/mysqld.sock
として書き込む。

ちなみにそのほかのdatabase.ymlは以下の通り(#でコメントアウトしているのはsqliteでデフォルトで書かれていた部分)

database.yml
default: &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時間ぐらいかかった。。
昔のインターネッツが無い時代の人たちはすごいと思う。
私は本当に向いてないかもしれない。涙

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む