20200913のMySQLに関する記事は13件です。

MySQLのibdファイルはどこにあるだろう[macOS]

表題の通り。

下のコマンドを打ちます。

ps aux | grep mysql

--datadir=/usr/local/var/mysql

ls -l /usr/local/var/mysql/データベース名
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ECCUBEのMySQLでmtbテーブルを削除してしまった場合の対処法

ことのはじまり

配送方法のひとつを削除しようと思い、マスタデータ管理から削除しようとしたがなぜか消せない。ならばPHPMyAdminから直接消そう!と思い削除ボタンを押したものの、間違えてテーブルごと消去してしまった。配送方法のデータが丸々消えたせいで商品ページも管理画面もエラーが出るし、MySQLのバックアップはとっていないし...

対処法

EC-CUBEのマスタデータは外部キー制約というものに基づいて作られています。例えば配送方法のテーブルであるmtb_sale_typeでであれば、それを参照して商品データであるdtb_productsにmtb_sale_type_idというカラムが存在していると思います。このような状態で、GUIから存在しない(僕の場合は消してしまったので)mtb_sale_typeテーブルを作成しようとしても

「外部キー制約を追加できません。」

と出てしまい作成できないのです。この場合、「外部キー制約を無視」してクエリから制作する必要があります。
外部キー制約を無視するためには以下のクエリを使用します。

SET FOREIGN_KEY_CHECKS=0;

最終的に書いたクエリは以下の通りです。

SET FOREIGN_KEY_CHECKS=0;
create table 'mtb_sale_type' (
    'id' smallint(5) UNSIGNED NOT NULL, 
    'name' varchar(255) NOT NULL, 
    'sort_no' smallint(5) UNSIGNED NOT NULL,
    'discriminator_type' varchar(255) NOT NULL
    PRIMARY KEY(id);
)
DEFAULT CHARSET=utf8mb4_general_ci

これで元通りのテーブルを作ることができます。あとは「挿入」からもとあったデータを追加していくだけです。

総括

MySQLのバックアップは、ちゃんととっておこう!

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

mysqldumpでデータベースを指定してdumpする

dumpコマンド

  • dbname = test
mysqldump -uroot -p -h<hostname> -B <dbname> > test.sql

dumpfileの中身

  • データベースが指定される
  20 --
  21 -- GTID state at the beginning of the backup 
  22 --
  23 
  24 SET @@GLOBAL.GTID_PURGED='';
  25 
  26 --
  27 -- Current Database: `test`
  28 --
  29 
  30 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
  31 
  32 USE `test`;
  33 
  34 --

あ、

  • docker-composeで初期データを入れる場合、データベースの指定がないと流し込めないので、こちらのやり方でdumpを取得する必要があるみたいです
  1 db:                                                                                           
  2   image: mysql:latest
  3   volumes:
  4     - ./initdb.d:/docker-entrypoint-initdb.d
  5   environment:
  6     - MYSQL_ROOT_PASSWORD=root
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[heroku] run rails db:migrateがうまくいかない

環境

・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15
・herokuへデプロイ

はじめに

Railsでアプリを作成しherokuへアップロードするときにうまくいかなかった時の対応です。
開発環境ではMySQLherokuではDBがPostgreSQLのためその対応が必要。
その途中段階でエラーが生じた。
順番に書いていきます。

PostgreSQLへの対応

まずはGemfileへ以下を記述。本番環境でPostgreSQLを使うというものです。自分は一番下に書きました。

group :production do
  gem 'pg'
end

Gemfileを変更したので忘れずにbundle installをします。
まずここで一つ目のエラーでました。そのままbundle installすると自分の開発環境にはPostgreSQLがないのでエラー発生。

対応はgroup :produciton endのところを飛ばすコマンドをターミナルで実行します。

$ bundle install --without production 

データベースへ接続する記述をconfigフォルダの中にあるdatabase.ymlへします。
一番下へ追記しました。

production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5

自分の場合は記述は以上でした。
参考になった記事はコチラです!
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39

herokuへデプロイ

今回ここは割愛します。
デプロイ完了まで進みます。

ここでdb:migrate

heroku run rails db:migrateをしますがエラー発生!
いろいろ見ているうちにこのエラーにやっと出会う。。。

ターミナルには中ほどに以下のような記述が。

Caused by:
PG::ConnectionBad: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

原因

調べてみると単純なことでherokuにはデフォルトではPostgreSQLが入ってないので、追加してあげる必要があるということです!
なんと!!!!
まだまだ慣れてないのでこの単純なことに気づけませんでした。。。。

対応

ターミナルでPostgreSQLを追加するコマンド

$ heroku addons:create heroku-postgresql

その後に

$ heroku run rails db:migrate

そうするとマイグレーションが完了しました!

別のところが誤っていると思い全然違うことをして数時間を費やしてしまいましたが、単純なことでした!
無事アプリが動作し完了しました!

参照

【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39

【Rails】「heroku run rake db:migrate」を実行しようとすると発生するエラーについて
https://qiita.com/suzuki-x/items/b878723080aea1a673ed

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

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

環境

mysql 8.0
Catalina 10.15.6

遭遇したエラー

~ ❯❯❯ mysql -u user(ユーザー名) -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

当然、ルートでも入ることできず。

~ ❯❯❯ mysql -u root -p                                                                          ✘ 1 
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

内容的にはpidファイルがアクセス拒否で削除できないと怒ってる模様。
サイトを参考にしながら下記の手順で行ってみました。

~ ❯❯❯ mysql.server restart                                                                      ✘ 1 
touch: /usr/local/var/mysql/ユーザー名.pid.shutdown: Permission denied
cat: /usr/local/var/mysql/ユーザー名.pid: Permission denied
 ERROR! MySQL server process # is not running!
override rw-r-----  _mysql/_mysql for /usr/local/var/mysql/ユーザー名.pid? 
Starting MySQL
 SUCCESS! 
~ ❯❯❯ /usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザー名.err: Permission denied
cat: /usr/local/var/mysql/ユーザー名.pid: Permission denied
rm: /usr/local/var/mysql/ユーザー名.pid: Permission denied
2020-09-13T09:14:24.6NZ mysqld_safe Fatal error: Can't remove the pid file:
/usr/local/var/mysql/ユーザー名.pid.
Please remove the file manually and start /usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe again;
mysqld daemon not started
/usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザー名.err: Permission denied

自らの手で削除してあげる。

~ ❯❯❯ sudo rm /usr/local/var/mysql/ユーザー名.pid.                                                ✘ 1 
Password:
rm: /usr/local/var/mysql/ユーザー名.pid.: No such file or directory
~ ❯❯❯ sudo rm /usr/local/var/mysql/ユーザー名.pid                                                 ✘ 1 

サーバーの立ち上げをしてみましたが、エラーが出ました。

~ ❯❯❯ mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
./usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザー名.err: Permission denied
/usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザー名.err: Permission denied
/usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 199: /usr/local/var/mysql/ユーザー名.err: Permission denied
/usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザー名.err: Permission denied
 ERROR! The server quit without updating PID file (/usr/local/var/mysql/ユーザー名.pid).

今度はpidファイルがないと怒ってるので作成してあげる。
その上でchmodコマンドで権限も弄りましたが、これは考えなしにやってるので必要なければ必要はないと思います。

~ ❯❯❯ sudo touch /usr/local/var/mysql/ユーザー名.pid
~ ❯❯❯ sudo chmod 777 /usr/local/var/mysql/ユーザー名.pid

再度サーバーを立ち上げ直す

~ ❯❯❯ mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
./usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザー名.err: Permission denied
rm: /usr/local/var/mysql/ユーザー名.pid: Permission denied
2020-09-13T09:19:00.6NZ mysqld_safe Fatal error: Can't remove the pid file:
/usr/local/var/mysql/ユーザー名.pid.
Please remove the file manually and start /usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe again;
mysqld daemon not started
/usr/local/Cellar/mysql/8.0.21_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザー名.err: Permission denied
 ERROR! The server quit without updating PID file (/usr/local/var/mysql/ユーザー名.pid).
~ ❯❯❯ sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
.. SUCCESS! 

お疲れ様でした!!

参考にさせていただいたサイト

https://qiita.com/carotene4035/items/e00076fe3990b9178cc0

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

MySQLのユーザー・権限設定

MySQL上でのユーザー・権限設定について必要だったことを纏めました。具体的には、以下について書きました。

  • rootユーザーのユーザー名の変更
  • パスワードの変更
  • 新しいユーザーの作成
  • 権限設定
  • 権限設定の反映

MySQL ver. 8.0.21 で動作確認済みです。

MySQL上のユーザー・権限の仕様について

ユーザーは、ユーザーと接続元がプライマリキーとして mysql.user テーブルに保存されています。コマンドでユーザーに対する操作を行う場合には、「ユーザー名@接続元」という形式を利用します。

例:

  • 'root'@'localhost' - localhostからのアクセスでのrootユーザーの権限設定
  • 'root'@'%' - 全てのHostからのアクセスでのrootユーザーの権限設定

rootユーザーを変更する

rename user 'root'@'localhost' to 'new-root-user'@'localhost';
rename user 'root'@'%' to 'new-root-user'@'localhost';

パスワードを変更する

SET PASSWORD FOR 'new-root-user'@'localhost' = 'new-password';
SET PASSWORD FOR 'new-root-user'@'%' = 'new-password';

新しいユーザーを作成する

CREATE USER 'new-user'@'%' IDENTIFIED BY 'new-password';

権限を付与する

特に、ユーザーを新たに作成した場合は権限が付与されていないため、権限の付与が必須です。

# 例:あるDBに対してのみ、全権限を付与する。指定されたDB内であれば全ての操作ができる)
GRANT ALL PRIVILEGES ON db_schema.* TO 'user'@'%';
# 例:あるDBに対してのみ、テーブルとVIEWのSELECTの権限を付与する。
GRANT SELECT, SHOW VIEW ON db_schema.* TO 'user'@'%';

詳しい権限の設定については、公式ドキュメント内の「Summary of Available Privileges」で確認できます。

本記事では触れませんが、「READ ONLY」の権限を付与するにはどうするか、という問いに対してはこちらの投稿を併せて見ると良いかと思います。

権限関連の設定を反映させる

FLUSH PRIVILEGES;

参考

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

Andoridにwordpressをインストールする

UserLandを用いてAndroidスマートフォンにwordpressをインストールします。

ユーティリティのインストール

sudo apt install wget ;

wordpressの取得

cd /var/www/html ;
wget https://ja.wordpress.org/latest-ja.tar.gz ;
tar xvf latest-ja.tar.gz ;
sudo chown -R www-data:www-data . ;

MySQLのスタート

sudo service mysql start ;

MySQLへ接続

sudo mariadb ;

wordpressのユーザー名をwordpress
パスワードをpasswordにした例

CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;
GRANT ALL ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

ブラウザからアクセス

http://192.168.xxx.xxx:8080/wordpress/

wordpressのインストール画面が表示されます。

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

AndroidスマホにApacheとPHPとMySQLをインストールする

UerLandを使ってAndroidスマホにApacheとPHPとMySQLをインストールします。

UserLandでUbuntuのsshをインストールするとポート2022番号でログインをすることができます。

ssh USERNAME@192.168.xxx.xxx -p2022 ;

ログインをしたらまずは最新にアップデート

sudo apt update ;
sudo apt upgrade -y ;
sudo apt install -y nano ;

Apache2 PHP MySQLをインストール

sudo apt install apache2 php php-mysql mariadb-server ;

Apacheの開放ポートを80から8080へ変更

emacs /etc/apache2/ports.conf ;

下記修正

Listen 80
↓
Listen 8080

サービスとして起動(systemctrlは使用できないため)

service apache2 start ;

他の端末からブラウザで

http://192.168.xxx.xxx:8080

を開く。

/var/www/html/内のファイルにアクセスができます。

PHPの動作確認

mv /var/www/html/index.html /var/www/html/index.html.back ;
nano /var/www/html/index.php ;

index.phpに下記を記述

<?php

phpinfo();

保存

再び

http://192.168.xxx.xxx:8080

を開くとphpの情報がズラリと出ます。

ワードプレスも行けそうです。

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

EC2・RDSでLaravelの環境構築【PHP・MySQL・Nginx】

実現したいこと

既存で作成したLaravelのWebアプリケーションをEC2・RDSの環境にデプロイすることです。

前提

  • GitHubに自身で作成したLaravelのWebアプリケーションがリポジトリに上がっている
  • Laravel6.1
  • PHP7.3
  • MySQL5.7.31
  • Nginx1.17.10

EC2

EC2の作成

ステップ 1: Amazon マシンイメージ (AMI)

スクリーンショット 2020-09-07 7.52.19.png

  • Amazon Linux 2 AMIを選択

ステップ 2: インスタンスタイプの選択

スクリーンショット 2020-09-09 8.12.51.png

  • t2.micro

ステップ 3: インスタンスの詳細の設定

スクリーンショット 2020-09-07 7.54.53.png

  • 全てデフォルト

ステップ 4: ストレージの追加

スクリーンショット 2020-09-07 7.55.31.png

  • 全てデフォルト

ステップ 5: タグの追加

スクリーンショット 2020-09-07 7.56.11.png

  • キー Name
  • 値 適宜好きな名前

ステップ 6: セキュリティグループの設定

スクリーンショット 2020-09-07 7.57.29.png

  • ルールの追加
    • SSH *アクセス元を絞るため、ソースをマイIPを選択しましょう。
    • HTTP

ステップ 7: インスタンス作成の確認

スクリーンショット 2020-09-09 8.21.19.png

  • 起動

スクリーンショット 2020-09-09 8.22.48.png

  • キーペアの作成 *すでに作っているなら既存のキーペアを使用しましょう。ECSにSSHでログインする際に必要になります

SSHで接続

スクリーンショット 2020-09-09 8.34.14.png

  1. キーペアファイルを配置
  2. アクセス権を400に設定
  3. 接続 ssh -i ~/.ssh/[SHHキー.pem] ec2-user@[ドメイン名かIPアドレス(パブリック DNS (IPv4))]

■参考記事
MacのターミナルでEC2にSSHでログインする

Nginxのインストール

yum update

$ sudo yum update -y

Nginxをインストール
*適宜、ローカルのバージョンに合わせてインストールしてください。

$ sudo amazon-linux-extras install nginx1.12 -y

Nginxを起動

$ sudo systemctl start nginx

IPv4パブリックIPをブラウザに入力すると下記の画面が表示されます。

スクリーンショット 2020-09-09 8.59.03.png

PHPのインストール

PHPのインストール
*適宜、ローカルのバージョンに合わせてインストールしてください。

$ sudo amazon-linux-extras install php7.3

下記のコマンドでインストールされているか確認

$ php -v

Nginxを使用するため、PHPの設定情報を変更

$ sudo vi /etc/php-fpm.d/www.conf
/etc/php-fpm.d/www.conf
# 略
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx # デフォルトは「user = apache」
; RPM: Keep a group allowed to write in log dir.
group = nginx # デフォルトは「user = apache」
# 略

Nginxを再起動

$ sudo systemctl restart nginx

■参考記事
AWS EC2 + nginx + Laravel + RDS(PostgreSQL)の環境を構築する

Laraveのリポジトリをclone

Composer

Composerをインストール

$ cd ~
$ sudo curl -sS https://getcomposer.org/installer | php # コンポーザーのインストール
$ sudo chown root:root composer.phar 
$ sudo mv composer.phar /usr/bin/composer # パスを通す
$ composer # インストールされたか確認

php-mbstringとphp-xmlをインストール

$ sudo yum install php-mbstring php-xml -y

Git

Gitのインストール

$ sudo yum install git # インストール
$ git --version # インストールされたかバージョン確認

GitHubのリポジトリからclone

ディレクトリ作成

$ sudo mkdir /var/www
$ cd /var/www

clone
*今回はHTTPS方式でクローンしましたが、もちろんSSH方式でも可能です。

$ sudo git clone https://github.com/[ユーザー名]/[リポトリ名].git

Nginxの設定情報の変更

$ sudo vi /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
# 略
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/リポジトリ名/public; # ここを修正

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            try_files $uri $uri/ /index.php$is_args$args; # ここを修正
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}
# 略

Nginxを再起動

$ sudo systemctl restart nginx

各種インストール、設定

$ cd /var/www/リポジトリ名
$ sudo composer install # composerのインストール
$ sudo chmod -R 777 storage/ # 権限変更

.envファイルの作成

$ sudo touch .env 

.envの情報を適宜変更してください。DBの設定はRDSの設定後に行います。

/var/www/リポジトリ名/.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

これでIPv4パブリックIPをブラウザに入力すればLaravelの画面が表示されると思います。

■参考記事
Laravelのプロジェクトをgit cloneしたときの手順

RDS

設定情報の値は適宜情報を入力し、作成を行ってください。

参考までに私は下記の画像の値を入力しました。

スクリーンショット 2020-09-13 12.01.11.png

スクリーンショット 2020-09-13 12.01.30.png

スクリーンショット 2020-09-13 12.02.08.png

スクリーンショット 2020-09-13 12.02.34.png

スクリーンショット 2020-09-13 12.03.14.png

Virtual Private Cloud (VPC)、サブネットグループ、既存のVPCセキュリティグループはEC2の設定に合わせました。
最初のデータベース名の値は.envファイルを設定する際に使用します。

セキリティグループ

今回のRDSのセキリティグループの設定はEC2と同一のものにしました。

セキリティグループのインバウンドルールの設定は、「HTTP」「SSH」を既存で追加していますので、ここで新たに「MYSQL/Auora」を追加しましょう。

スクリーンショット 2020-09-13 12.42.28.png

.envの設定、マイグーレション

.envの設定に先ほどのRDSの設定した値を入力します。

$ sudo vi .env
/var/www/リポジトリ名/.env
DB_CONNECTION=mysql
DB_HOST=エンドポイント
DB_PORT=3306
DB_DATABASE=最初のデータベース名
DB_USERNAME=マスターユーザー名
DB_PASSWORD=マスターパスワード

私は誤ってDB_DATABASEの値をDBクラスター識別子で設定してかなりハマりました。

最後にマイグレーションを実行

$ sudo php artisan migrate

これでIPv4パブリックIPをブラウザに入力するとデータベースが繋がった状態でLaravelの画面が表示されます。

全体像の参考

ゼロからわかるAmazon Web Services超入門 はじめてのクラウド

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

HerokuにデプロイしたはいいがDBはどうやって使うのだ?(ClearDBの使い方)

先日、開発初期段階でLaravelアプリをHerokuにデプロイしました。→まだ全然しょぼいLaravelアプリをHerokuにデプロイしてみた

デプロイできたのはいいものの、ClearDBの使い方が全然わからず途方に暮れまして、ひょっとしたら僕と同じように悩む初学者の方がいるかもしれないので、参考になればと思いメモしておきます。

使うもの
Heroku, ClearDB MySQL, MacOS

ClearDBにもphpMyAdminみたいにGUIで操作できるツールはあるのか?

→あります。MySQL Workbench、Sequel Proなどです。

Herokuのサイト上の、Resources > Add-ons で ClearDB MySQLをクリックすると、NAVISITEというClearDBらしきサイトにジャンプできます。このページのHow to Connectに下記のように書いてあります。
(このNAVISITEには、ターミナルから$ heroku addons:open cleardbでも行けます。

Managing Your Databases
If you want to manage the tables, data and other settings in your Navisite database, we recommend that you use commonly known Graphical tools such as Oracle's MySQL Workbench, Sequel Pro for Mac OS X, or Navicat. You can also use any of the bundled MySQL tools, such as the mysql and mysqldump command-line utilities.

MySQL Workbench

今回はWorkbenchを使うことにしました。こちらから簡単にダウンロードできます。DB設計に便利なER図を描ける便利ツールもついてます。

Workbenchを開いたら、+ボタンで新しいConnectionを作成します↓
スクリーンショット 2020-09-12 15.13.53.png
開いたら下記項目を書き込みます。基本的には、HerokuのClearDBの情報を入れれば良いですが(Herokuページ > Settings > Config Vars参照)、Connection Nameは適当でいいっぽいです。とりあえず私はプロジェクト名を入れておきました↓
スクリーンショット 2020-09-12 15.14.10.png
作成できたConnectionをクリックすると、私はなんかこんなwarningが出ますが...
スクリーンショット 2020-09-12 15.37.20.png
Continue anywayすると、こんなUIに辿り着きます↓
スクリーンショット 2020-09-12 15.37.57.png
↑やや操作が直感的ではないですが、ここでテーブルの設定を見たり、SQL文を打ち込んだりできます。

というわけで、GUIツールがあることはわかりましたが、ターミナルでも操作できるのでしょうか。

ClearDB MySQLはターミナルでも操作できるのか?

→できます。

ただし、至極当然な話ですがMySQLがPCにインストールされてないとできません。ただし、MAMPのMySQLとは別物です(→私みたいな初学者にはこういうところが至極当然ではなく地味にわからなくて苦労します...!!)。

ターミナルでmysqlコマンドを何か打ってみて(例えばMySQLのバージョンを参照する$ mysql --version $ mysql -Vなど)、command not foundと出てきたらMySQLが入ってないです。HomeBrew(MacOS用のパッケージ管理システム。インストールを簡単にやってくれるやつ)でインストールできます↓(HomeBrewをインストールしてない方はそれが先ですね)

$ brew install mysql

インストールできたら、まずサーバーを立ち上げます。私はログインしてからやるものだと思い、ERROR 2013 (HY000): Lost connection to MySQL server during queryエラーに直面してググりまくったり公式ドキュメント読んだりしても解決せず死にかけてましたが、なんてことはない。まず始めにやる作業だったみたいです。

$ mysql.server start

↑この作業でSUCCESS!と出たらOKです。

次はログイン。ちなみにこの作業を行う時、ディレクトリはLaravelのアプリがある所じゃなくても大丈夫そう(←ここもMAMPと違うところ?)。-uに続けてDB_USERNAME、-hに続けてDB_HOSTを入力。HerokuのSettingsのConfig Varsを見ればよいですね。

$ mysql -u DB_USERNAME -h DB_HOST -p

↑Enterした後に求められるパスワードも同様にDB_PASSWORDを。

ログインすると、プロンプトが>mysqlに変化します。
まず、DBを選択します↓。データベース名がわからなくなってしまったら、Heroku > Settigns > Var Configsを参照しましょう。

use データベース名;

↑これをしないとNo database selectedというエラーになってしまいます。もしくは先ほどMySQLにログインした時に、-pの後にDB名を入れておくっていう手もあるみたいです。

これでHerokuのClearDBがターミナルからでも操作できるようになりました。
めでたし、めでたし。

余談

MySQLを使い始めるのに必要そうなコマンドを少しメモって終わりたいと思います。

テーブルの一覧を見たい時は↓

show tables;

あるテーブルのカラムを見たい時は↓

desc テーブル名;

↑descって読みづらくて覚えにくいですが、descriptionの略みたいです。

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

MySQL入門!基礎編(データベース用語 ~ TABLE作成まで)


環境
 Windows 10
 MySQL : version(5.7.28)
使用アプリ
 コマンドプロンプト(Windowsマーク押して「cmd」って打ったら出てくるやつ)


データベース用語を整理

table

さまざまな情報(データ)が入った一つひとつの表のことを指す用語
スクリーンショット 2020-09-12 105447.jpg

column

列のこと
スクリーンショット 2020-09-12 105447_LI.jpg

row

行のこと
スクリーンショット 2020-09-12 105447_LI.jpg

record

データ(field)が入った一行一行のことを指す(※rowとは別物)
スクリーンショット 2020-09-12 105447_LI.jpg

field

recordを構成する一つ一つのデータのことを指す用語
record.jpg

TABLEを作成するために必要なStep

例 : 投稿に関するテーブルを作成する場合

CREATE TABLE posts (
  message VARCHAR(140),
  likes INT
);
INSERT INTO
  posts (message, likes)
VALUES
  ("HELLO", 22);

1行目 CREATE TABLE でテーブル名をつける
2行目, 3行目 列見出しにあたるfieldの名前を入れる

VARCHAR(140) ⇒ 最大140字までの文字列
INT ⇒ 「likes」には整数が入る

5行目以降 INSERTを使ってrecordを挿入していく

実行結果 >>
スクリーンショット 2020-09-13 090524.jpg

TABLE構造の確認

DESC posts;

実行結果 >>
スクリーンショット 2020-09-13 091454.jpg

TABLEの一覧を表示

SHOW TABLES;

実行結果 >>
スクリーンショット 2020-09-13 091524.jpg

TABLEの中身を確認

SELECT * FROM posts;

複数のレコードを挿入する

INSERT INTO posts (message, likes) VALUES("WORLD", 10), ("hogehoge", 3);

VALUES(○○, ○○),で繋ぐ
実行結果 >>
スクリーンショット 2020-09-13 092949.jpg

クエリを書く際の注意点

  • 慣習的にSQLは大文字で書くとされている
  • 自分で付けるtable名やfield名は小文字で書く
  • 文末(命令の終わり)には必ず;を付ける
  • 文字列や日付データは"もしくは、'で囲む
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Web系の定番ソフトウェアのバージョンを確認する。

次のコマンドを発行する。

CentOS

cat /etc/redhat-release

Apache

httpd -v

Java

java -version

Python

python --version
python3 --version

PHP

php -v

WordPress

cat wordpress/wp-includes/version.php
# $wp_versionの値を確認する。

MySQL

-- MySQL接続後に次のSQL文を発行する。
select version();

Oracle Database

-- OracleDB接続後に次のSQL文を発行する。
select * from v$version;

備考

本記事はブログ「雑用エンジニアの技術ノート」からの移行記事です。先のブログは削除予定です。

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

Rails本番環境に自動デプロイしたらwe're sorry, but something went wrong.

恐怖のwe're sorry, but something went wrong.

個人アプリを開発したぞ!
そして、追加実装したから設定済みの自動デプロイで本番環境のアプリを更新!
さぁ、本番環境への反映をチェックと......。

we're sorry, but something went wrong.
error.png

何.....だと....! ?´д` ;
本番環境でアプリが開かない!? :(;゙゚'ω゚'):

そのエラーに見事にハマった。
という事で、エラー解決に至るまでの死闘を描く。

herokuへデプロイした際の同じエラー解決記事は結構見つかったものの、意外にMySQLでの解決策は見つからなかった。

今回はMySQLでの対処法だが、we're sorry, but something went wrong.エラーの全てが今回の内容で解決する訳ではないので、あくまで参考に留めて欲しい。

特に追加実装などでGemを増やした人は特に注意して欲しい

開発環境

  • Ruby on Rails6
  • DBはMySQL
  • AWSにEC2インスタンスを使用してデプロイ済み
  • Capistranoで自動デプロイ設定済み

というのが前提です。

事件の始まり(自動デプロイ直後)

ふと思い立って追加実装する為にGemを追加した。
記述を終えてローカル環境での動作を確認したので、私はコミットしてマージを終えた.....。

本番環境へ反映させる為に、以下のコマンドをターミナルのローカルディレクトリで入力。

$ bundle exec cap production deploy

無事にデプロイが完了したメッセージがターミナルに表示されたので、本番環境でのチェックをしたところ、上記画像のようにアプリが開かなくなってしまった.....。

何故だ!?((((;゚Д゚)))))))

ローカルでは問題なくても、いざ本番環境となるとエラーが起きてしまうパターンはある。
エラー文はググれば何となく分かっても、肝心の解決策が浮かばない。

となると、エラーが起きている箇所のログをチェックする必要がある。

容疑者Logの捜査(本番環境のlogを追え!)

ローカル環境でLogをチェックする場合は、log/development.rbをチェックする。
ここで自身のLogが追えるので、ファイルを下にスクロールしていけば最新のLogへとたどり着ける。

しかし今回の問題は本番環境なので、本番環境のログをチェックしないといけない。
その為にはEC2へログインする事になる。

しかし、久しぶりでコマンドがうろ覚え.....。

以下を順にローカルのターミナルに入力していく。

①mkdir ~/.ssh

②cd .ssh/

③lsコマンドで、EC2で作成済みの<鍵名>.pemが表示される。

④chmod 600 <鍵名>.pem

⑤ssh -i <鍵名>.pem ec2-user@<EC2で発行したElastic IP>

すると、

  __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

と、上記の表示が出てEC2へのログインが完了。
次がいよいよ本番環境のlogのチェック

①$ cd  /var/www/<リポジトリ名>
アプリのディレクトリへ移動

②ls
再びlsコマンドを入力。

③cd current
複数のファイルの中にcurrentがあるので移動。

④cd log
⑤ls
laコマンドを入力すると、production.log  unicorn.stderr.log  unicorn.stdout.log
これらのlogファイルが表示される。

⑥[ec2-user@****** log]$ cat 'production.log'

今回は本番環境のエラー内容を知りたいので、上記を入力する事で本番環境のlogが追える。
その中で表示されるエラー内容をチェックしましょう!

終わらぬ事件(失敗する自動デプロイ)

エラー内容を見つけ、修正したら改めてmasterへコミット。
そして自動デプロイ!

これがそのまま成功すればエラー解決となるが、そうは問屋がおろさなかった。
困ったことに自動デプロイが失敗するようになってしまった。

何故だ!?((((;゚Д゚)))))))

ふと、ここで思った。
事件(エラー)が発生するようになったのは、Gemを増やしてから。

ならば、bundle installしてみよう。
ただし、ローカルと本番環境の両方で。

その結果、

本番環境
Bundle complete! 34 Gemfile dependencies, 115 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

ローカル
Bundle complete! 36 Gemfile dependencies, 126 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

ローカル環境でのGemが36個に対し、本番環境は34個と反映されていなかった。
bundle installしても更新されない。

どうすればいい?((((;゚Д゚)))))))
そこで参考になったのがこの記事

平和な日常(EC2インスタンスやデータベースの再起動)

つまりは自動デプロイも繰り返すと本番環境に反映しなくなってしまうという事が分かった。

【対処法】
①AWSのマネージメントコンソールにログイン

EC2 → インスタンス → 該当のインスタンスをクリック → アクションのインスタンスの状態 → 再起動 を行います。

②ターミナルからEC2にログイン後、以下のコマンドを実行してnginxとMySQLを再起動しよう。

EC2サーバーで入力
$ sudo service nginx start 
$ sudo service mysqld start

もしも、MySQLではなく、mariaDBを使っていたら下記でデータベースを再起動しよう。

EC2サーバーで入力
$ sudo systemctl restart mariadb 

これらのコマンドで、データベースやAWSインスタンスを再起動すれば自動デプロイが成功し、Gemのbundle installも反映されました。

今回はGemを起因としたエラーだったので、同じエラーでも全く解決策が違う可能性もあり得ます。

あくまで一つの手段として、インスタンスやデータベースの再起動をした上で、再度デプロイする事でサーバーが開かないエラーからは逃れることが出来る事もあるでしょう。

以上です。

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