- 投稿日:2019-04-15T17:46:28+09:00
MacでMySQL使用準備あれこれ
MySQLを使用する準備作業の説明機会が最近多かったためそのメモ作業環境:macOS Mojave 10.14.4
0. はじめに
インストールをHomebrewで行うため、まだない場合はその準備
0-1. Homebrewをインストール
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
0-2. Homebrewのコマンド一覧が出るか確かめる
$ brew help
1. インストール
1-1. Homebrewを使いMySQLをインストールする
$ brew install mysql
1-2. インストールしたMySQLを確認する$ brew info mysql
1-3. MySQLを起動する$ mysql.server start以下のメッセージが出力されたら成功
Starting MySQL .. SUCCESS!
1-4. MySQLの状態を確認する$ mysql.server status以下のメッセージが表示される
SUCCESS! MySQL running (1253)
1-5. MySQLを停止する$ mysql.server stop以下のメッセージが表示されたら成功
Shutting down MySQL .. SUCCESS!
1-6. MySQLをもう一度起動する$ mysql.server start
1-7. 起動中のMySQLで再起動する$ mysql.server restart以下のメッセージが表示されたら成功
Shutting down MySQL ... SUCCESS! Starting MySQL ... SUCCESS!
- 以後、MySQLが起動しているということを前提としての説明
2. rootユーザーの設定
2-1. 初期設定を開始する
$ mysql_secure_installation
2-2. パスワードの強度チェックを行うVALIDATE PASSWORDコンポーネントをセットアップするか質問される
y
を入力しセットアップをするVALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? Press y|Y for Yes, any other key for No:
- もし強度が低いパスワードでも良い場合は
n
を入力する
n
を入力した場合は下記の2-3.は省略される
- その場合パスワードの文字数などの制限がなくなる
2-3. パスワードの強度に関して質問される
- このパスワードの強度は他のユーザーを追加する際にも適応される
- パスワードの強度は以下の通り
- 0(LOW):任意の8文字以上
- 1(MEDIUM):数字・大文字小文字英字・特殊文字をそれぞれ含んだ任意の8文字以上
- 2(STRONG):数字・大文字小文字英字・特殊文字をそれぞれ含んだ任意の8文字以上
- STRONGの場合、4文字以上の文字列が辞書ファイル内の単語と一致してはならない
There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0, 1 or 2
2-4. 選択した強度の条件に合致したパスワードを2回入力するNew password: Re-enter new password:
2-5. 入力したパスワードの強度が出力される
- 今入力したパスワードで確定するなら
y
を、再度入力し直すならn
を入力する
n
を入力した場合は*2-4. *に戻るEstimated strength of the password: 50 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y or n
2-6. 匿名ユーザーーを削除するか質問される
y
と入力し削除するBy default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y以下のメッセージが出力されたら成功
Success.
2-7. リモートからrootユーザーでのログインを禁止にするか質問される
y
と入力し禁止にするNormally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
2-8. デフォルトで作成されているtestデータベースを削除するか質問される
y
と入力し削除するBy default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y以下のメッセージが表示されたら成功
- Dropping test database... Success. - Removing privileges on test database... Success.
2-9. 権限テーブルの再ロードをすぐに行うか質問される
y
と入力し変更内容を反映させるReloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y以下のメッセージが表示されたら成功
Success. All done!
3. rootユーザーでログイン
3-1. MySQLにrootユーザーでログインする
$ mysql -u root -p
3-2. 設定したパスワードを入力するEnter password:以下の表示に変われば成功
mysql>
3-3. MySQLのポート番号を確認するmysql> show variables like 'port';以下のようにポート番号が3306になっていれば成功
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3306 | +---------------+-------+
3-4. 確認できたためログアウトするmysql> quit
4. データベースを作成
rootユーザーでログインしている状態で以下のデータベースを作成する
- データベース名:sample
4-1. データベースを作成する
mysql> CREATE DATABASE sample;
4-2. データベース一覧を確認するmysql> SHOW DATABASES;以下のようにデータベース名がsampleのデータベースが存在すれば成功
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sample | | sys | +--------------------+
5. ユーザーを追加
rootユーザーでログインしている状態で以下のユーザーを追加する
- ユーザー名:yamada
- ホスト名:localhost
- パスワード:abcd1234
- パスワードの強度は2. で設定した強度に準ずる
5-1. ユーザーを追加する
mysql> CREATE USER 'yamada'@'localhost' IDENTIFIED BY 'abcd1234';
5-2. ユーザー名とポート名を確認するmysql> select User, Host from mysql.user;以下のようにユーザー名がyamada、ホスト名がlocalhostのユーザーが存在していれば成功
+------------------+-----------+ | User | Host | +------------------+-----------+ | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | yamada | localhost | +------------------+-----------+
5-3. ログアウトし追加したユーザーでログインする$ mysql -u yamada -pabcd1234
ログイン時のユーザー名の入力は
ユーザー名@ホスト名
であるが、localhostに限りホスト名は省略できるログイン時、
-p
に続けてパスワードを入力しておくとパスワードの要求をスキップできる
5-4. 設定したパスワードを入力するEnter password:以下の表示に変われば成功
mysql>
6. 追加したユーザーにデータベースの接続権限を付与
6-1. 追加したユーザーでログインする
$ mysql -u yamada -pabcd1234
6-2. 作成したsampleデータベースに接続してみるmysql> USE sample以下のエラーが表示される
ERROR 1044 (42000): Access denied for user 'yamada'@'localhost' to database 'sample'
6-3. ログアウトするmysql> quit
6-4. rootユーザーでログインする$ mysql -u root -p
6-5. 追加したユーザーがsampleデータベースに接続できる権限を与えるmysql> GRANT ALL PRIVILEGES ON sample.* TO 'yamada'@'localhost';
6-6. ログアウトするmysql> quit
6-7. 追加したユーザーでログインする$ mysql -u yamada -pabcd1234
6-8. 再度sampleデータベースに接続してみるmysql> USE sample以下のメッセージが出力されたら成功
Database changed
7. MySQL Workbenchをインストール
- MySQLのGUIのツールをインストール
7-1. MySQLを起動する
$ mysql.server start
7-2. このページにアクセスする
7-3. ページ下部のDownloadボタンをクリック
7-4. 遷移先のページ下部のNo thanks, just start my download.をクリックここでダウンロードが開始する
7-5. ダウンロードされたファイルを開き、Applicationsディレクトリにコピー
7-6. ApplicationsディレクトリからMySQL Workbenchを起動
7-7. 画面左にあるLocal instance 3306
をクリック
7-8. rootユーザーのパスワードを入力しSave password in keychainにチェックをつける
ex1. ユーザーーの認証方式をmysql_native_password
PHPでMySQLを使用したい場合に必要
ex1-1. rootユーザーでログインし各ユーザー名と認証方式を確認する
mysql> select User, Plugin from mysql.user;以下のように各ユーザー名と認証方式が表示される
+------------------+-----------------------+ | User | Plugin | +------------------+-----------------------+ | mysql.infoschema | caching_sha2_password | | mysql.session | caching_sha2_password | | mysql.sys | caching_sha2_password | | root | caching_sha2_password | | yamada | caching_sha2_password | +------------------+-----------------------+デフォルトでは
caching_sha2_password
になっているが、この認証方式ではPHPのMySQL接続ライブラリが対応していないため接続できない
ex1-2. 追加したユーザーの認証方式をmysql_native_password
に変更するmysql> ALTER USER 'yamada'@'localhost' IDENTIFIED WITH mysql_native_password BY 'abcd1234';
ex1-3. 再度各ユーザー名と認証方式を確認するmysql> select User, Plugin from mysql.user;以下のようにユーザーyamadaの認証方式が
mysql_native_password
になっていれば成功+------------------+-----------------------+ | User | Plugin | +------------------+-----------------------+ | mysql.infoschema | caching_sha2_password | | mysql.session | caching_sha2_password | | mysql.sys | caching_sha2_password | | root | caching_sha2_password | | yamada | mysql_native_password | +------------------+-----------------------+
ex2. アンインストール
ex2-1. MySQLを停止する
$mysql.server stop
ex2-2. HomebrewでMySQLをアンインストールする$ brew remove mysql
ex2-3. Homebrewのキャッシュを削除する$ brew cleanup
ex2-4. MySQLで使っていたファイル群を削除するrm -rf /usr/local/var/mysql/
ex2-5. mysqlコマンドが使えないことを確認する$ mysql -v以下のメッセージが出力されたら成功
-bash: /usr/local/bin/mysql: No such file or directory
- 投稿日:2019-04-15T17:26:30+09:00
[MySQL][ERROR] Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root!と言われた時の行動
概要
レンタルしているサーバーがメンテナンスされることになったため、サーバーを一時停止。
メンテナンス後、サーバーを起動したらなぜかMySQLが起動していない・・・
ログを見てみても、一時停止まではログに記載されていて、それからの再開処理はどこにも書かれてない・・・
とりあえず直接コマンドをたたいて(sudo mysqld
)みたところ、以下のことを言われます。[ERROR] Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root!
というわけで、開始です。
なお手元の環境は
CentOS 6
MySQL 5.7になっております。
そもそもこのエラーって何よ
[ERROR] Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root!
雑に翻訳すると「mysqldをrootで動かしたかったらマニュアルの「Security」を読んでね!」とのこと。
そういうわけで読みに行きます。
6.1.5 How to Run MySQL as a Normal User再び雑に翻訳すると「rootユーザーでの実行は禁止! そのかわりrootでもmy.cnfに書くか、--user={user_name}に一般ユーザーを指定するとそのユーザーを使って起動するよ!」と書いてあります。
いちいち設定するのも面倒なので、my.cnfに書きに行きましょう。
すでにmysqlというユーザーがサーバー内に存在することを確認後、以下を追記します。[mysqld] ...(いろいろ書いてある) user=mysqlというわけでもう一度
sudo mysqld
。少なくともSecurityについては言われなくなるかと思われます。余談:ところで何が問題だったの?
さて、それではと勇んで
service mysqld start
を行ったところ、やっぱり起動しない…
ログを見てみたところ、ログにも何も書き込まれていない…
ふと、思い立ってログの権限を確認してみたところ、なんとroot
というわけで、chown mysql:mysql mysql.log
を実行。そうしてもう一度実行したところ、今度はログが記載されました。can't create/write to mysql.pidpidってのが触れないようです。
もしや・・・と疑いながら今度はpidに対してchown mysql:mysql mysql.pid
実行後serviceから起動したら、mysqldが正常に起動されました。そしてその後、
/etc/init.d/mysqld
を確認したら、開始ユーザーにもきちんと--user=mysql
の記載が。どうもmysql5.7、導入方法によっては初回起動がrootでされてしまい、そのままrootユーザーとして各種ファイルを作りながら実行成功してしまうようです。
そして再起動したときに改めてmysqlユーザーで起動し、各種ファイルにパーミッションエラーで弾かれる、と。あほの子かな?そんなわけで、よくわからないエラーは解決しました。
とりあえず、logのパーミッションを疑うところから始めよう!という教訓でした。
- 投稿日:2019-04-15T17:22:43+09:00
Railsのエラーが何なのか辿り着くまでの思考プロセス
●●のエラーだなこれ・・・と正しい推測まで到達するために・・・
undefined hogehoge_methodまずこんな感じでRailsサーバーと立ち上げても長いエラーが出るばかりで、画面が出てこない状況になります。
ここからバトルスタートですね。やりたいこと
エラーがなんなのかを特定する。例えば、DBなのか、リダイレクト関係なのか、ルーティングミスなのかなどのタイポとかと比べて、根の深そうなエラー周りなのかどうかを先ず知りたい
手順
1. こけているメソッドのインスタンスを見てみる
メソッドに問題がない場合、そのさらに先で定義されているかコールされているものがこけているので、そのインスタンスが宣言されているファイルを探しに行きます。2.ファイルを探す
$ find ./探したいディレクトリ -type f -print | xargs grep '検索文字列'findコマンドでファイルを特定し、xargsコマンドに渡して検索文字列がヒットしたファイルを弾きだします。
ここでページが多く作成されていたりすると、あちこちで同名インスタンスが呼ばれているので分からなくなりそうですが、表示できていないページがどこに当たるのかと、ファイルの命名規則が合致していれば、探しやすいはずです。ここで、、viewの名前が分かり易いもの、(Restfullに作られていると、このファイル探査がしやすいですね。)そうやってネストしているメソッドを伝っていくと、最終的に落ちているメソッドがなんなのか理解できる。
後は、そこを修正するだけ。
- 投稿日:2019-04-15T11:45:19+09:00
AWSを使ってLAMP環境を構築する手順
自己学習のメモとして。
AWS上にLAMP環境を作成する手順を書いておきます。Linux仮想マシン(EC2)を起動
1、AWSのマネジメントコンソールからEC2を選択。
※この段階でリージョンを日本にしておく2、インスタンスの作成を選択
・AMAZON Lunux AMIを選択
・無料利用枠のt2.microを選択
→インスタンスを作成キーペアが生成できるのでダウンロードしておく。
パブリックIPアドレスを設定
パブリックIPアドレスが毎回変化してしまうので固定する。
・左のメニューからElastic IPを選択
・新しいアドレスの割り当てをクリック
・出来上がったアドレスを選択し、アクション→アドレスの関連付け
・インスタンスをクリックし、先ほど設定したLinuxのIDが出るので選択して紐づけ
・インスタンスからセキュリティグループをクリッ
アクション→インバウンドルールの編集を選択
・ルールの追加→http→保存リモートアクセス
・ターミナル(コマンドプロンプト)を起動
・.sshフォルダがあるか確認する。(無ければmkdirでユーザーディレクトリの中に作っておく)
・.sshの中に先ほどのKey.pemファイルを移動しておく
・以下のsshコマンドでAWSにアクセスssh -i ~/.ssh/xxx.pem ec2-user@xx.xxx.xxx.xxx※デフォルトで名前はec2-userになっている
初回はyesを選択して接続今後接続するときは毎回このコマンドを打つので覚えておきたい
exitで接続を終了できる
Apacheを導入
・Linuxをアプデしておく
sudo yum -y update※-yをつけると確認画面なしにできる
・Apacheをインストールする
sudo yum -y install httpd・Apacheを起動する
sudo service httpd start・今後自動で立ち上がるように設定する
sudo chkconfig httpd on※ブラウザに切り替えてIPアドレスからapacheが見られるか確認するとよい
おまけ1
htmlファイルを作って試しに見てみる方法
htmlを作成
sudo vi /var/www/html/index.html1、編集画面になったら「i」を打って適当にhtmlファイルを作成する
2、「esc」を押してから「:wq」で上書き保存しenter※:q!で保存せず終了できる
ファイルの確認方法
ls /var/www/htmlブラウザにIPアドレスを打ち込んで確認できる
おまけ2
scpコマンドで、ローカルで作成したhtmlファイルを転送する
※scpはPC間で安全に転送するコマンドおまけ1でAWSに作ったhtmlファイルをローカルにダウンロードする(デスクトップの場合)
scp -i ~/.ssh/xxx.pem ec2-user@xx.xxx.xxx.xxx:/var/www/html/index.html ~/Desktop適当にhtmlファイルを編集し、AWSに転送する
scp -i ~/.ssh/xxx.pem ~/Desktop/index.html ec2-user@xx.xxx.xxx.xxx:成功したかどうかsshコマンドで接続して確認
(pwd、lsで見られる。)現状htmlファイルはec2-userの中にあるので正しい保存先に移動させる
sudo mv ~/index.html /var/www/htmlこれでブラウザで見ることができるようになる
この流れは面倒なのでもう少し簡略化できるよう設定する
EC2にリモートアクセスしている状態でwwwというグループを作成する
sudo groupadd wwwこのグループに自分のユーザー名を追加する
sudo usermod -a -G www ec2-userいったんexitでログアウトし、もう一度ログイン→グループの権限が有効になっているはず
groupsで確認すると
ec2-user wheel wwwとなっているはず
htmlを保存するディレクトリのグループ所有権を変更する
sudo chown -R root:www /var/www/var/www以下のディレクトリに書き込み許可を設定する
sudo chmod 2775 /var/www将来のサブディレクトリにグループIDを設定
find /var/www -type d -exec sudo chmod 2775 {} \;/var/www及びサブディレクトリのファイル許可を繰り返し、グループの書き込み許可を与える
find /var/www -type f -exec sudo chmod 0664 {} \;今後は転送先に直接/var/www/htmlを指定できる
scp -i ~/.ssh/xxx.pem ~/Desktop/index.html ec2-user@xx.xxx.xxx.xxx:/var/www/htmlPHPをインストール
※お決まりのコマンドでリモートログインしておく
管理者権限に切り替えておく
sudo suユーザー名の部分に#がつけばOK。
切り替えておけばsudoコマンドを打つ必要が無くなる。時間の設定
dateロンドンの時間になっていたりすると、掲示板などのサービスを作った際におかしくなるので日本時間に修正
ln -sf /usr/share/zoneinfo/Japan /etc/localtimedateコマンドで確認して問題なければOK
・PHPをインストールする
yum install -y php動作確認
・PHPの設定をしておく
※バックアップを取っておくと良いcp /etc/php.ini /etc/php.bakもしバックアップの必要が出た場合は
cp /etc/php.bak /etc/php.iniviでphp.iniの設定をいじる
vi /etc/php.ini行番号を表示させると見やすくなるのでescキーを押して
:set number520行目あたりを編集したいので
:520iモードにして
error_reporting = E_ALL &E_DEPRECATEDに追記をすれば、phpの余分なエラーメッセージを表示させずに済む
error_reporting = E_ALL &E_DEPRECATED & ~E_NOTICE次に537行目を編集。
ディスプレイエラーをOnにしておく
これでphpのエラーがブラウザに表示されるようになるdisplay_errors = Onターミナルに戻り、apacheを再起動
service httpd restartviでindex.phpを作って動作確認をすると良い
ブラウザでxx.xxx.xxx.xxx/index.php、(または番号のみで閲覧できる?)で確認できる。MySQLのインストール
※sshでリモートアクセスし、sudo suで管理者にしておく。
yumでmysqlをインストールする
yum install -y mysql-serverphpからmysqlをコントロールするため追加プログラムを入れる
yum install -y php-mysqlndmysqlを起動してみる
service mysqld start・mysqlの設定
mysql_secure_installationパスワードを聞かれるが無いのでそのままenter
すると新しくパスワードを設定するかを聞かれるのでyを押し、パスワードを設定する
※パスワードは忘れないように
確認のためにもう一度打ち込む
そしてRemove anonyemous users?(ゲストユーザーを消しますか?)と尋ねられるのでyを押す。
そのあとはすべてyでOK。・mysqlの文字コードをviで設定
vi /etc/my.cnf11行目あたりにある[mysqld_safe]の前に
character-set-server = utf8を追加。:wqで保存
再起動して確認service mysqld restartOKと表示されているればOK。
phpMyAdminを導入
phpMyAdminをインストールするためにyumコマンドの設定を変更する
yum-config-manager --enable epelこれで準備ができたので、phpmyadminをインストールする
yum install -y phpmyadmin・自分のローカルPCのみでphpmyadminにログインできるよう設定する
自分のPCのグローバルIPアドレスを確認する
→確認くん確認できたらviで設定をいじる
vi /etc/httpd/conf.d/phpMyAdmin.conf※大文字に注意
127.0.0.1の部分をグローバルIPアドレスに書き換えればOK
せっかくなので置換機能を使ってみる
:%s/127.0.0.1/xxx.xx.xx.xx/g全4か所が修正されていればOK
設定を反映させるために再起動するservice httpd restart確認のためxx.xx.xx.xx/phpmyadminをブラウザで確認する
ユーザー名はroot、パスワードはmysqlで設定したものを入力。これにてLAMP環境が完成!
今後はLaravel環境を作る方法を書けるようになれればと思っています!
ありがとうございました。
- 投稿日:2019-04-15T00:10:36+09:00
エンジニア初心者がRailsでランキング機能実装の際につまづいたところ
CDの発売日を管理できるサービスを作っていて、発売日が過ぎたときにランキングから除外しなきゃ!と思ったものの微妙に詰まったのでここに備忘録として書き残しておきます。?
環境:cloud9(IDE)EC2(仮想サーバー)rails(rubyFW)mysql(DB)
まず大前提の知識としてModelはDBの情報を引っ張ってくるということです!(今更)
MVCのそれぞれの役割をしっかり理解しておくことは本当に重要で、理解してプログラミングをしていると今自分が何をやっているのか頭の中で整理できます。今回は実際に色々試した過程を書きます。
大まかな流れとして、
1.DB設計を考える 2.mysql(DB)でコマンドを色々試す→3.処理が成功したらmodelに実装
という形で行いました。1.DB設計を考える
ランキングは中間テーブル(relationships)で集計しているので、中間テーブルに発売日カラムを登録することで発売日でフィルターをかけることができるのでは?
2.mysqlでコマンドを色々試す
▼カラム追加(mysql)
alter table relationships add sales_date date;
楽天apiから発売日情報を文字列型で引っ張って来ているのでエラーになってしまった。
alter table relationships add sales_date varchar(255);
文字列型で登録〜うん良さそう▼発売日を過ぎたものは非表示にするコマンドをチェック
私が実際にやったときはmodelの記述を先に行ってしまったのですごい時間を食ってしまった…先にこっちで確認すべきだった…良い学び
select * from relationships where sales_date > date_format(current_date(),'%Y年%m月%d日');
処理内容としては、現在日時をdate_formatを用いて年月日に変更し、sales_dateと比較演算子を用いて比較しています。これをそのままmodelに実装します。3.処理が成功したらmodelに実装
▼記述方法
relationship.rbdef Relationship.ranking Relationship.where().group().order().limit().count() end前述の通り、modelはdbから情報を引っ張ってくるので書き方としてはかなりdbに近いです。
まずwhereで絞り込み、groupで重複した値をまとめ、orderで並べ替え、limitで表示制限をして最後のcountでCDの登録された数を数えるといった流れです。実際のコードを書いていきます。relationship.rbdef self.ranking self.where("sales_date > date_format(current_date(),'%Y年%m月%d日')").group(:item_id).order('count_item_id DESC').limit(12).count(:item_id) endwhere以外はそこまで特別なことはしていないので省きます。
結論から書くとwhereにdbで成功した文をダブルクォーテーションで囲むだけでOKです!笑
これでできたときは拍子抜けしました…それと同時にMVCの理解度が低かったとかなり痛感しました。
modelはdbの情報を引っ張ってくるわけだからdbで実際に成功した文をそのまま書けば確かに間違いはないですねwまとめ
MVCの役割を理解することの重要性を書きたかったのですがシッチャカメッチャカになっちゃった感。。。
まあそれなりに自分の考えは整理できた気がするので良しとします笑
反省点としては何を書くのか考えていなかったこと、考えをまとめていなかったことの二点ですかね?精進します!