20200602のMySQLに関する記事は15件です。

マイグレーション実行時にmysqlでユーザーを作成していなかった為エラー

マイグレーション実行時エラー

laravel7で新しくプロジェクトを作成したので
とりあえずマイグレーションの実行ししてみたら

エラー発生

  SQLSTATE[HY000] [1045] Access denied for user 'user_name'@'172.20.0.4' (using password: YES) (SQL: select * from information_schema.tables where table_schema =table_name and table_name = migrations and table_type = 'BASE TABLE')

原因

ただ単に.envに設定したユーザーとパスワードを登録していなかっただけ

解決方法

mysqlでユーザーを作成をする

create user 'user_name' identified by 'pass';

権限の確認
新規作成したユーザには
何も権限がないことを意味するUSAGEが付いている

mysql> show grants for user_name@'%';
+---------------------------------------+
| Grants for phper@%                    |
+---------------------------------------+
| GRANT USAGE ON *.* TO `user_name`@`%` |
+---------------------------------------+
1 row in set (0.00 sec)

全てのDBが対象となるグローバル権限【CREATE権限】の付与

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'user_name'@'%' WITH GRANT OPTION;

実行後もう一度マイグレーションを実行したら成功

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

【Rails・MySQL】Mac環境構築

MacのRails・MySQL環境構築について

目次

  1. ログインシェルの設定
  2. Command Line Toolsのインストール
  3. Homebrewのインストール・設定
  4. Rubyのインストール・設定
  5. MySQLのインストール・設定
  6. Railsのインストール・設定

1.ログインシェルの設定

※ OSがCatalina以降の場合、zshを利用するため、設定の確認・変更を行います。

ターミナル

# zshをデフォルトに設定
$ chsh -s /bin/zsh

# ログインシェルを表示
$ echo $SHELL
# 以下のように表示されれば成功
/bin/zsh

echo $SHELL コマンドで、 /bin/zsh と表示されない場合は、
一度ターミナルを閉じて、再度開いた上でもう一度 echo $SHELL コマンドを打ってください。

2.Command Line Toolsのインストール

Command Line ToolsはWebアプリケーション開発に必要なソフトウェアをダウンロードするために必要な機能となります。(コマンドでプログラムを操作するもの)

Command Line Toolsのインストール

以下のコマンドを入力します。

ターミナル

$ xcode-select --install

コマンド入力後にモーダルが表示されるので以下の順に操作します。
①「インストール」をクリック
②「同意する」をクリック
③Command Line Toolsのダウンロードが始まるので、完了まで待機
④ダウンロードが完了したら、「完了」をクリック

以上でCommand Line Toolsのインストールは完了となります。

3.Homebrewのインストール・設定

3-1. Homebrewのインストール

Homebrewというソフトウェア管理ツールをインストールします。
以下のコマンドを入力します。

ターミナル

$ cd  # ホームディレクトリに移動
$ pwd  # ホームディレクトリにいるかどうか確認
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  # コマンドを実行

※ 処理に時間がかかるので、ゆっくり待ちましょう。
途中でエンターキーの入力を求められるので入力をしましょう。

ターミナル

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  # コマンドを実行
...
...
...
Pres RETURN to continue or any other key to abort

また、途中でパスワードの入力を求められますので入力をしましよう。
(パスワードを入力しても文字は表示されませんが、間違いなく入力はされています)

ターミナル

Pres RETURN to continue or any other key to abort
...
...
...
Password:

ダウンロードが完了し、再びコマンドを入力できるようになれば成功です。

2-2. Homebrewがインストールされているか確認

以下のコマンドを入力します。

ターミナル

$ brew -v
Homebrew 2.2.12  # このバージョンはインストールのタイミングで異なります

3-3. Homebrewをアップデート

Homebrewを最新の状態にアップデートします。
以下のコマンドを入力します。

ターミナル

$ brew update

3-4. Homebrewの権限を変更

Homebrewの権限を変更します。
以下のコマンドを入力します。

ターミナル

$ sudo chown -R `whoami`:admin /usr/local/bin

4.Rubyのインストール・設定

4-1. rbenvとruby-buildをインストール

rbenvとruby-buildを、Homebrewを用いてインストールします。
以下のコマンドを入力します。

ターミナル

$ brew install rbenv ruby-build

4-2. rbenvをどこからも使用できるように設定

PCにおけるどこのディレクトリからも使用できるようにするため、
以下のコマンドを入力します。

ターミナル

$ echo 'eval "$(rbenv init -)"' >> ~/.zshrc

zshrcというのは、設定ファイルの名称です。
(CatalinaかMojave以前の方で、設定ファイルの場所が異なるのでご注意してください)

4-3. zshrcの変更を反映

設定ファイルであるzshrcを修正したので、以下のコマンドでzshrcを再読み込みし、変更を反映させます。
以下のコマンドを入力します。

ターミナル

$ source ~/.zshrc

4-4. readlineをinstall

ターミナルのirb上で日本語入力を可能にする設定を行うためにインストールします。
以下のコマンドを入力します。

ターミナル

$ brew install readline

こちらについてはコマンドを実行すると、すでにインストール済みと表示されることがあります。
(特に問題はありませんので、そのまま次に進みましょう。)

4-5. readlineをどこからも使用できるように設定

readlineをどこからでも使用できるようにするため、
以下のコマンドを入力します。

ターミナル

$ brew link readline --force

4-6. rbenvを利用してRubyをインストール

Webアプリケーション開発用のRubyをインストールします。(Rubyのversionは任意のversionを設定して下さい)
以下のコマンドを入力します。

ターミナル

$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.7.1

※ 処理に時間がかかるので、ゆっくり待ちましょう。(約10分くらい)

4-7. 利用するRubyのバージョンを設定

インストールしたRuby 2.7.1を使用するために、
以下のコマンドを入力します。

ターミナル

$ rbenv global 2.7.1

これまで使用していた、デフォルトでPCに入っていたRubyから、先ほどインストールしたRubyを使用するように切り替えることができました。

4-8. rbenvを読み込んで変更を反映

Rubyのバージョンを切り替えたので、変更を反映させます。
以下のコマンドを入力します。

ターミナル

$ rbenv rehash

4-9. Rubyのバージョンを確認

バージョンを切り替えることができたか、確認をします。
以下のコマンドを入力します。

ターミナル

$ ruby -v

Rubyのバージョンが、先ほどインストールした2.7.1であることが表示されれば完了です。

5. MySQLのインストール・設定

5-1. MySQLのインストール

MySQLをインストールします。(MySQLのversionは任意のversionを設定して下さい)
以下のコマンドを入力します。

ターミナル

$ brew install mysql@5.7

※ 処理に時間がかかるので、ゆっくり待ちましょう。

5-2. MySQLの自動起動設定

MySQLは本来であればPC再起動のたびに起動し直す必要がありますが、それでは面倒であるため、自動に起動するように設定します。
以下のコマンドを入力します。

ターミナル

$ mkdir ~/Library/LaunchAgents 
$ ln -sfv /usr/local/opt/mysql\@5.7/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.7.plist

5-3. mysqlコマンドをどこからでも実行できるように設定

rbenvやreadlineの時と同様に、どこからでもMySQLを操作するためのコマンドmysqlを実行できるように設定します。
以下のコマンドを入力します。

ターミナル

# mysqlのコマンドを実行できるようにする
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
# mysqlのコマンドが打てるか確認する
$ which mysql
# 以下のように表示されれば成功
/usr/local/opt/mysql@5.7/bin/mysql

6. Railsのインストール・設定

6-1. bundlerをインストール

Rubyの拡張機能(gem)を管理するためのbundler(バンドラー)をインストールします。
以下のコマンドを入力します。

ターミナル

$ gem install bundler

6-2. Railsをインストール

Railsをインストールします。(Railsのversionは任意のversionを設定して下さい)
以下のコマンドを入力します。

ターミナル

$ gem install rails --version='6.0.3'

※ 処理に時間がかかるので、ゆっくり待ちましょう。

6-3. rbenvを再読み込み

一通り開発に必要なものはインストールできたので、以下のコマンドでrbenvを読み込んで、変更を反映させましょう。
以下のコマンドを入力します。

ターミナル

$ rbenv rehash

6-4. Railsが導入できたか確認

以下のコマンドを実行して、Rails 6.0.3が表示されれば問題なくインストールが完了しています。

ターミナル

$ rails -v

以上で、Macでの【Rails・MySQL】の環境構築は完了です。

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

ERROR 1267 (HY000): Illegal mix of collationsとなった時の対応方法

  • 環境 : MySQL 8.0.20

事象:変数を条件に使ったSQLを書いたファイルを実行したら怒られた

hoge.sql
SET @no = "0531";
select * from person_table WHERE person_no = @no;
mysql> source hoge.sql
Query OK, 0 rows affected (0.01 sec)

ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

原因 : 照合順序がカラムと変数で不一致だから

対応 : 変数をSETするときに照合順序も指定する

hoge.sql
SET @no = "0531" COLLATE utf8mb4_general_ci;
select * from person_table WHERE person_no = @no;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【CREATE VIEW】条件によってVIEWの表示結果を分岐する ~ case when ~

条件によってVIEWの表示結果を分岐させる書き方のサンプル集です。

環境

  • OS:Windows10
  • RDBMS:MySQL5.7

case whenサンプル

1. 条件によって表示結果を分岐する

合計得点に応じて、成績表記を分岐します。
テーブルとその関係性は以下の通り。
※実際にはこんなテーブルはないと思いますが、サンプルのためご容赦を。
image.png

create view score_reports
as select
sr.*,
case 
when sr.total_score >= 85 then '優'
when sr.total_score >= 70 then '良'
when sr.total_score >= 60 then '可'
else '不可' end as grade
from 
(select
st.student_name,
su.subject_name,
sc.score,
(select sum(score) from scores group by student_id and test_month) as total_score
from students st 
left outer join scores sc on st.student_id = sc.student_id
cross join subjects su) as sr;

2. 結果の有無によって表示結果を分岐する

対象が存在すれば1、なければ0を表示させます。
以下は、とあるユーザーの対象店舗に対するブックマークの有無になります。
テーブルとその関係性は以下の通り。
image.png

create view shop_informations
as select
si.*,
case when exists (select * from bookmarks b where b.shop_id = si.shop_id and b.user_id = si.user_id) then 1 else 0 end as is_bookmarked
from
(select
s.shop_id,
s.shop_name,
u.user_id
from shops s cross join users u) as si;

終わりに

case式を使えば、アプリケーションの実装をシンプル&わかりやすくできそうですね。
DB負荷の考慮は必要ですが、うまく使っていきたいと思います。

参考

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

mysql: VARCHARの列幅の差と TEXT型とでINSERT性能には殆ど違いない

なにこれ (tl;dr)

mysql5.7にて、VARCHAR(10)とVARCHAR(30000)ではINSERTなどで差が出る、という話を聞いたのと、よく言われている TEXT型は遅い、という話をベンチマークしてみたら少なくともINSERTは全然差がないことがわかった、という話

ただしTEXT型は検索する場合は当然差が出て来るが、割愛。

測定用スクリプト

    con = ActiveRecord::Base.connection

    # utf8mb4が検証環境のため 65535/4=16383
    length_set = [255, 4096, 16383, :text]
    string_set = [250, 4090, 16380]
    try_count = 10000

    demostr = "123456789A"

    raw_con = con.raw_connection

    Benchmark.bm 40 do |bm|
      length_set.each do |length|
        column_type = length == :text ? "text" : "varchar(#{length})"
        con.execute("create table length_test (str #{column_type})")
        insert_sql = raw_con.prepare("insert into length_test values(?)")
        begin
          string_set.each do |strlen|
            next if length != :text && strlen > length

            insertstr = demostr * (strlen / 10)
            bm.report "#{column_type} <-- string(#{strlen})" do
              try_count.times do
                insert_sql.execute(insertstr)
              end
            end
          end
        ensure
          insert_sql.close
          con.execute('drop table length_test')
        end
      end
    end

結果

INSERT10000回

文字列長250 文字列長4090 文字列長16380
varchar(255) 13.229861
varchar(4096) 13.623846 18.922998
varchar(16383) 13.380692 18.426866 45.27052
text 12.739086 18.534715 46.134611

考察

  • varcharの列幅による有意な違いはない
  • ただし、INSERTする文字列の長さには相関関係がある(正比例ではないのもやっかい)
  • text型へのINSERT性能は悪くない (繰り返しになるが SELECT では別。WHEREの対象になるとさらに遅いかもしれない)
  • 現状、1レコードの総バイト数が65535を超えることが出来ない? ようなので、こんな長さの文字列を複数持つことは出来ない
  • utf8mb4 だと1文字表現するのに4bytes使うので、VARCHAR(65535)とは出来ない。4でdivすることになる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL】1分おきに取得したデータから1時間おきのデータを抽出

注意事項

  • 自分用の簡単なまとめであり,説明はほとんどありません.
  • 内容は時間があるときに補充します.

データ例

  • 元データ:1分おきの datevalue
date value
2020-01-01 00:00:00 0
2020-01-01 00:01:00 1
2020-01-31 23:58:00 58
2020-01-31 23:59:00 59
  • 抽出データ:1時間おきの datevalue
date value
2020-01-01 00:00:00 0
2020-01-01 01:00:00 0
2020-01-31 22:00:00 0
2020-01-31 23:00:00 0

value 値は特に意味はありませんが, date 値 の [分] に対応していると思ってください.

使用コード

SELLECT date, value
FROM hogehoge
GROUP BY DATE_FORMAT(date,'%Y-%m-%d %H:00:00')
ORDER BY date ASC;

コメント

  • DATE_FORMATによって [分] や [秒] のデータを落とし,GROUP BY でまとめています.
  • [分] を指定することはできず,毎時最初のデータが取得されます.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「失敗から学ぶRDBの正しい歩き方」を読んだ

0. はじめに

こんにちは。都内でエンジニアをしている、@gkzvoiceです。
今回は、ajitofm 44: RDB The Right Wayをきっかけに、以下の本↓を読みました。

何度も読み返す一冊となりそうなので、本記事が道しるべとなればいいなと思い、記事を起こすことにしました。

※「書評」というほど私のRDBの理解力がなく、考察まで含んだ内容にはできておりません。

※お時間が無い方、本書がどんな本か、チラ見されたい方は、著者の登壇資料をご参照されることをオススメします。

1. 本書の目次

  • 第1章 データベースの迷宮
  • 第2章 失われた事実
  • 第3章 やり過ぎたJOIN
  • 第4章 効かないINDEX
  • 第5章 フラグの闇
  • 第6章 ソートの依存
  • 第7章 隠された状態
  • 第8章 JSONの甘い罠
  • 第9章 強過ぎる制約
  • 第10章 転んだ後のバックアップ
  • 第11章 見られないエラーログ
  • 第12章 監視されないデータベース
  • 第13章 知らないロック
  • 第14章 ロックの功罪
  • 第15章 簡単過ぎる不整合
  • 第16章 キャッシュ中毒
  • 第17章 複雑なクエリ
  • 第18章 ノーチェンジ・コンフィグ
  • 第19章 塩漬けのバージョン
  • 第20章 フレームワーク依存症

2. 本書のおすすめポイント

  • RDSに関連するアンチパターンを学ぶことに重きを置いている。
    • 「はじめに」ではアンチパターンを学ぶ意義についてこのように解説されています。

データベースは長く付き合っていかねばならない相手であり、開発者はその特性ゆえの問題にぶつかることがあります。そういった、開発の現場で実際に起こっている、発生しやすいリレーショナルデータベース(RDB)全般の問題をアンチパターンとして紹介していきます。

  • 各章ごとに、構成が同じでテンポよく読みやすい。
    • 起きがちなアンチパターンの紹介
    • 取り上げられたアンチパターンの問題点と再発防止策を解説
    • 章末にて、アンチパターンのポイントが解説されている。
    • これにより、読み返す際、あるいは読み始める前に自分のなかにインデックスを設けることができた。

3. 読んだ感想

  • トレードオフの関係となっている手段が多く、一様にポリシーを決めて対処できるものではない。
  • Amazon RDSなどマネージドサービスを使った場合、本書で取り上げられているアンチパターンはどこまで未然に防ぐことが出来るのか、また別のアンチパターンが生まれるのか気になった。
    • そのような資料などをご存知の方がいらっしゃれば、コメントにてご連絡いただけるとうれしいです。

4. 章ごとに気になったこと

「第2章 失われた事実」より

  • ステータスの遷移など時系列で情報を追いたい場合、その情報を上書きすることは望ましくない。
  • 情報を追うことを優先しすぎると、レコードの保存量は増え、ひいてはテーブルサイズの肥大化を招く。
  • 履歴の保存とパフォーマンスの向上はトレードオフの関係。

「第3章 やり過ぎたJOIN」より

  • MYSQLとPostgresqlとでサポートしているjsonのアルゴリズムが異なるので注意。
  • JSONのアルゴリズムに注意して実装する以外の方法として、そもそも別テーブルに分けることでシンプルに出来ないか考えることも。

「第4章 効かないINDEX」より

  • INDEXが有効的に活用されているか
  • 本問題に関連するアンチパターンとして、『SQLアンチパターン』で取り上げられている「インデックスショットガン」も紹介
  • 本問題と「インデックスショットガン」いずれも MENTORの原則 と呼ばれる対策が有効
    • Measure(測定)
    • Explain(解析)
    • Nominate(指名)
    • Test(テスト)
    • Optimize(最適化)
    • Rebuild(再構築)

「第5章 フラグの闇」より

  • 基本的にテーブルには状態を持たせることは避けたい。
  • 削除済データが増えるとパフォーマンスが低下する。
  • 削除フラグを利用したくなるケースとして、削除したデータを検索したい などいくつか紹介しているるが、できるだけテーブルに状態を持たせないことを推奨。

「第6章 ソートの依存」より

  • ORDER BY区狙い v.s. WHERE句狙い
    • WHERE句がINDEXを活用でき、データを十分に小さく出来るか
  • INDEXから高速にデータを取得する手段としてのORDER BY句は、Redisと似ている
    • Redisはデータの永続化が苦手と棲み分けが必要。

「第7章 隠された状態」より

  • 1つのデータに複数の属性を付与すると、コード上、実態が見えづらくなる。
    • 交差テーブルが使えないか

「第8章 JSONの甘い罠」より

  • JSONデータ型のメリットとデメリット

「第9章 強過ぎる制約」より

  • 制約はRDBMSとアプリケーションのうち、どちらが担うか
    • アプリケーションが担うメリットはデプロイも含めて変更が容易な点

「第10章 転んだ後のバックアップ」より

  • バックアップとリストアは自動化出来ないか
    • Amazon RDSはそれらのアウトソース先の候補
  • リストアの定期化は、チーム全体でシステムへの理解を深めることに寄与

「第11章 見られないエラーログ」より

  • ログの吐き出しすぎは、「見られなくなる」一因に

「第12章 監視されないデータベース」より

  • ミドルウェアの監視項目として、以下の3つを紹介
    • サービスの死活監視
    • 特定条件のチェック監視
    • 時系列データでのメトリックス監視

「第13章 知らないロック」より

  • MYSQLとPostgresqlとでロックの仕様が異なる

「第14章 ロックの功罪」より

  • 4つのトランザクション分離レベル
    • READ UNCOMMITTED(並列度が高い)
    • READ COMMITTED
    • REPEATABLE READ
    • SERIALIZABLE(並列度が低い)

serializableは完全な直列処理になるためIsolationを担保していると言えますが、その分並列処理はできなくなります。逆に、read uncommittedはIsolationを犠牲にする代わりに並列度を高めています。

  • 左記のトランザクション分離レベルと現象との関係性

-19-638.jpg

出所:こわくない同時実行制御

「第15章 簡単過ぎる不整合」より

  • 外部キー制約のせいでデッドロックに悩まされても安易に非正規化にしない
  • 非正規化の代替案
    • CHECK制約
    • ENUM型

「第16章 キャッシュ中毒」より

  • キャッシュを使うと以下の面倒なトラブルを招くことも。
    • エラーの原因の切り分け
    • キャッシュはいつ、どのデータを参照したのかの特定が難しい

「第17章 複雑なクエリ」より

  • 構文やサブクエリ、JOINなどを分け、不要なものがあれば排除

「第18章 ノーチェンジ・コンフィグ」より

  • パフォーマンスが出ない原因は、コンフィグがデフォルトのまま?

「第19章 塩漬けのバージョン」より

  • マイナーバージョンアップをサボらず

「第20章 フレームワーク依存症」より

  • ライブラリを選定する際、それがテーブルに悪影響を与えないか確認
    • インプリシットカラム
    • キーレスエントリー

P.S. Twitterもやってるのでフォローしていただけると泣いて喜びます:)

@gkzvoice

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

あともう少し…MySQLサービス起動後、Railsサーバが起動しない3

発生した背景

MySQLサービスが復旧したところで、Railsを起動すると以下のエラーが発生した。

/Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': dlopen(/Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
  Referenced from: /Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle
  Reason: image not found - /Users/ichikawadaisuke/projects/krown/vendor/ruby/2.5.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle

対応手順

MySQLサービスを再インストールしたため、既存のGemが動作しなくなったと判断。
Gemの再セッティングを実施する。
①以下コマンドにて原因を多角的に調査する

$ bundle update
$ rails s
(これで復旧するかを試してみるも、Railsサーバは起動しなかった)
$ bundle doctor
(MySQLに紐つくような目立ったエラーは発生していない)

②以下のコマンドでGemを入れ替える

$ bundle exec gem uninstall mysql2
Successfully uninstalled mysql2-0.5.2
$ bundle install --path vendor
(同コマンドで改めてGemを入れなおす)

③やっと…Railsが起動した…

Use Ctrl-C to stop
Started GET "/" for ::1 at 2020-06-02 18:46:42 +0900
ActiveRecord::NoDatabaseError (Unknown database 'krown_development'):

④あとはお決まりのコマンドを実行して、無事終了しました?

$ bundle exec rake db:create
$ bundle exec rake db:migrate
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

道のりは長い…( ´Д`)y━・~~ MySQLが起動しない事象への対応

Railsを起動するため、Gem、bundleの再設定を行いました。ようやくアプリケーションを起動することができたのですが、アプリケーションにアクセスするとエラー出力され、アプリが動きません。
非常に道のりが長いですが、1つ1つ対応を進めていきます。

エラー内容:

* Listening on tcp://localhost:3000
Use Ctrl-C to stop
Started GET "/" for ::1 at 2020-06-02 11:31:07 +0900

Mysql2::Error::ConnectionError (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)):
(省略)

①そもそもサービスが起動していなかった。(mysql.server statusで確認)

②ログを確認すると、プロセスを起動する際にファイルのオープンに失敗している
(ichikawadaisukenoMacBook-Air.local.err )

200602 11:51:16 mysqld_safe mysqld from pid file /usr/local/var/mysql/ichikawadaisukenoMacBook-Air.local.pid ended

③そういえば、先日Mysqlが稼働しなかったため、homebrewコマンドでインストールしなおした経緯がある。/usr/local/Cellar配下をみると、v5.6系とv8.0が存在していた。
競合している可能性もあるので、先日追加したv8.0系はアンインストールした。

④さらにリンクも再設定すれば復旧するかもしれないと考え、以下を試した。

CMD> brew unlink mysql@5.6
Unlinking /usr/local/Cellar/mysql@5.6/5.6.42... 0 symlinks removed
CMD> brew link --force mysql56
Linking /usr/local/Cellar/mysql@5.6/5.6.42... 99 symlinks created

⑤この後、以下のファイルで直接5.6系のサービスを起動しようとするも
/usr/local/Cellar/mysql@5.6/5.6.42/support-files/mysql.server start

 ERROR! The server quit without updating PID file (/usr/local/var/mysql/ichikawadaisukenoMacBook-Air.local.pid).

⑥出来るだけ、mysqlの再インストールは選択したくなかったのですが、時間を消耗してしまうので、以下のコマンドからまず環境をクリーンにしました。

※ファイルが存在している場合はバックアップを取得する
brew uninstall mysql56
$ sudo rm -rf /usr/local/mysql
$ sudo rm -rf /Library/StartupItems/MYSQL
$ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
$ sudo rm -rf /Library/Receipts/mysql-.pkg
$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*  ※ここにはファイルが存在したため、bk取得
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*

⑦最後にインストールを実行し、希望のサービスが稼働していることを確認しました。

[\W staff@term]brew install mysql56
Updating Homebrew...
==> Downloading https://homebrew.bintray.com/bottles/mysql%405.6-5.6.47.catalina.bottle.tar.gz
Already downloaded: /Users/ichikawadaisuke/Library/Caches/Homebrew/downloads/c270819d76ed326059143e1b4c6c6c0ab672e4259c328c140ec71d917babc348--mysql@5.6-5.6.47.catalina.bottle.tar.gz
==> Pouring mysql@5.6-5.6.47.catalina.bottle.tar.gz
==> /usr/local/Cellar/mysql@5.6/5.6.47/bin/mysql_install_db --verbose --user=ichikawadaisuke --basedir=/usr/local/Ce
==> Caveats
A "/etc/my.cnf" from another install may interfere with a Homebrew-built
server starting up correctly.

MySQL is configured to only allow connections from localhost by default

To connect:
    mysql -uroot

mysql@5.6 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have mysql@5.6 first in your PATH run:
  echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc

For compilers to find mysql@5.6 you may need to set:
  export LDFLAGS="-L/usr/local/opt/mysql@5.6/lib"
  export CPPFLAGS="-I/usr/local/opt/mysql@5.6/include"


To restart mysql@5.6 after an upgrade:
  brew services restart mysql@5.6
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/mysql@5.6/bin/mysql.server start
==> Summary
?  /usr/local/Cellar/mysql@5.6/5.6.47: 344 files, 155.2MB
[\W staff@term]/usr/local/opt/mysql@5.6/bin/mysql.server status
 SUCCESS! MySQL running (37799)

次はまたRailsが動かなくなりました…?

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

トランザクションの中にエラーとなるSQLがあると自動的にロールバックされる?

はじめに

SQL勉強中です。MySQLとPostgreSQLにおけるトランザクションの挙動が大きく違うということを学んだのでアウトプットします。

MySQL

MySQLにおいてトランザクションの中でエラーとなるSQL文があった場合はどうなるでしょうか?

create table test (id int, name varchar(10));
-- => Query OK, 0 rows affected 
begin;

insert into test values (1,'hoge');
-- => Query OK, 1 row affected (0.00 sec)

insert into test values (2,'huga');
-- => Query OK, 1 row affected (0.00 sec)

insert into test values ('three',3);
-- => ERROR 1366 (HY000): Incorrect integer value: 'three' for column 'id' at row 1

insert into test values (4,'bar');
-- => Query OK, 1 row affected (0.00 sec)

commit;
-- => Query OK, 0 rows affected (0.00 sec)

select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | hoge |
|    2 | huga |
|    4 | bar  |
+------+------+
-- => 3 rows in set (0.00 sec)

結果はご覧の通り、エラーとなるSQL文だけが実行されず、他のSQL文はデータベースに反映されています。

つまりデータベースの原子性(トランザクションが終わった時、そこに含まれている更新処理は全て実行されるか、全て実行されない状態で終わることを保証する性質)が守られていません。かなり注意が必要です。

PostgreSQLでは?

ではPostgreSQLではどうなるのでしょうか。

create table test (id int, name varchar(10));

begin transaction;

insert into test values (1,'hoge');

insert into test values (2,'huga');

insert into test values ('three',3);
-- => invalid input syntax for type integer: "three"
-- => LINE 1: insert into test values ('three',3)

insert into test values (4,'bar');
-- =>current transaction is aborted, commands ignored until end of transaction block

commit;
-- => ROLLBACK

select * from test;
+------+--------+
| id   | name   |
|------+--------|
+------+--------+

ロールバックされました!MySQLと全く違います。PostgreSQLは親切ですね。

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

アリババクラウドデータベースバックアップサービスを利用したデータベースのバックアップと復元

アリババクラウドデータベースバックアップサービス(DBS)は、継続的なデータ保護のための安全でコスト効率の高いソリューションです。このサービスは、企業のデータセンター、ハイブリッドクラウド、パブリッククラウド、サードパーティのクラウドベンダーなど、複数の環境に保存されたデータを強力に保護します。

この記事では、新しいデータベースバックアップサービスを活用して、データベースのバックアップと復元処理を行う方法をご紹介します。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

前提条件

DBSを使用するには、実行可能なデータベースインスタンスが必要です。データベースインスタンスは、Elastic Compute Service (ECS) ベースのデータベース、ApsaraDB for RDSインスタンス、またはオンプレミスやパブリックアクセス可能なデータベースインスタンスのいずれかになります。DBSは現在、MySQL、MongoDB、Oracle、SQL Serverデータベース管理システムをサポートしています。

バックアップタスクの設定

Alibaba CloudコンソールでDatabase Backup Serviceを探します。
670887b7312fb504c394b9e9e59c7dfbee296931.png

DBSコンソールで、[スケジュールの作成]をクリックします。
1.png

ご希望のDBS地域、データベースタイプ、仕様、期間を選択してください。

12c94573e5e068824a71ab04907501b11b9122ee.png

選択内容を確認したら、[今すぐ購入]をクリックします。データベース・バックアップ・コンソールに戻り、[バックアップ・スケ ジュール]をクリックします。構成されていないDBSインスタンスが表示されます。
eda946a5ad67dc99ea97c1bb96df51c695ef4343 (1).png

[バックアップの構成]をクリックすると、DBSの構成ページが表示されます。
2.png

データベースの場所、データベースの種類、アドレス、ポート、データベースアカウント、パスワード、SSL暗号化の設定など、必要な情報をすべて入力します。オプションで、接続をテストして、入力したデータが正しいことを確認することができます。データベースがファイアウォールの背後に設定されている場合は、[ホワイトリストの設定]をクリックして、DBSがデータベースにアクセスできるようにするために必要なIP範囲のリストをホワイトリストにする必要があります。

この例では、ECSで動作するMySQLサーバを用意したので、データベースの場所としてECS-Hosted Databaseを選択し、ドロップダウンリストでECSインスタンスIDを検索します。

3.png

香港のOSSバケットにバックアップ先として設定されました。

4.png

[次へ]をクリックして、次のステップに移動します。
5.png

[すべて選択] をクリックして、すべてのテーブルを選択したリストに移動します。
6.png

[次へ]をクリックして、バックアップ時間の設定画面に移動します。
7.png

DBSは、シングルバックアップまたは定期的なバックアップモードをサポートしています。この例では、Single Backupを選択しています。
8.png

[次へ]をクリックして続行します。最後に、バックアップの保持ポリシーを設定する必要があります。
9.png

構成を保存し、[バックアップ スケジュール]ページに戻ります。バックアッププロセスを開始するには、[開始]をクリックしてプロセスを開始します。
10.png

DBSはバックアップ処理を開始すると、まず事前チェックを行います。
11.png

エラーがなければ、[Start Task]をクリックしてバックアップを実行します。タスクはコンソール上で「起動していない」から「実行中」の状態に切り替わります。選択した実行中のタスクの概要は、[管理] をクリックすることで確認できます。
12.png

13.png

[フルデータのバックアップ]をクリックすると、実行中のタスクプロセスが表示されます。
14.png

ステータスが「完了」に変わるまで待ちます。「完了」のステータスが表示されたら、バックアップは完了です。
15.png

View Backup Setをクリックすると、OSSバケットにバックアップされていたデータが表示されます。
16.png

データベースの復元を実行する

データベースの復元を実行するには、使用するバックアップデータを選択し、[データベースの復元]を選択します。
17.png

[復元タスクの作成] ページが表示されます。このページでは、どの復元ポイントにロールバックするか、および保存先のデータベース情報を定義する必要があります。
18.png
19.png

[次へ]をクリックして次のステップに進みます。
20.png

「復元するオブジェクト」ステップでは、まず競合解決オプションを選択する必要があります。既存のデータベースの名前を変更するようにDBSに依頼するか、データベーステーブルがすでに存在する場合に失敗するかを選択できます。この例では、バックアップをソースデータベースに復元しようとしているので、同じ名前のオブジェクトの名前を変更することを選択しています。
21.png

次に、復元するテーブルを選択します。完了したら、[事前チェック]をクリックして、データベース接続が正常に行われているかどうかを確認します。
22.png

DBS は、復元タスクの依存関係が満たされているかどうかを確認します。すべてのステータスが「成功」と表示された場合は、[Start Task] をクリックしてデータベースの復元を開始します。

タスクのステータスが「初期化中」から「実行中」、「完了」に変わります。タスクが完了するまで待ちます。
23.png

24.png
25.png

データベースの復元タスクの詳細を表示するには、タスクIDをクリックして、「Restore Schema」をクリックします。実行したテーブルの作成 DDL が表示されます。復元された行数を表示するには、[Restore Full Data] をクリックします。
26.png
27.png

以上がDBSを使用してデータベースをバックアップ、復元する方法となります。
アリババクラウドデータベースバックアップサービスの詳細については、以下を参照してください。
https://www.alibabacloud.com/products/database-backup

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ

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

事務員として入社したのにCentOSにLAMPをインストールすることになったときの備忘録

前提:未経験初心者事務入射なのに社内唯一のバックエンドエンジニアになってしまった

 わたし「やってらんね~~~~!!!事務として入ったんですけどどうしてこうなった??」

ある日

上司「新しいVPSサーバにLAMP入れといて…えっ、LAMP知らない?ハ~~~~~~マジで?(クソデカため息)」

 上司「これ読んでインストールよろしく」
 わたし「ぴえん…webなんて何も知らないよう、そもそも私は事務で入ったはず……。いやそんなこと言ってても誰も助けてくれんからね…調べるか…。」

LAMPとは

LAMP(ランプ)とは、OSであるLinux、WebサーバであるApache HTTP Server、データベースであるMySQL、スクリプト言語であるPerl、PHP、Pythonを総称した頭文字から成る造語である。※1 

わたし「上司オジはアパッチアパッチ言ってたな。これ入れればいいんですね」

インストールしていく

Apache httpd のインストール

 # yum -y install httpd
 # httpd -v

わたし「うまくいくじゃん、余裕だわ。」

MySQL Community Server のインストール

 # yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # httpd -v

わたし「なんで…?さっき上司が渡してきた資料どおりやったけどコマンドが通らないよぅ。
    これってもしかして、令和対応じゃないのかも…。」
わたし「コマンドよくわかんないけど壊してもいいって言ってたしいろんなの試してこ。当たったらラッキーや。」

 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # rpm -Uvh mysql-community-release-el7-5.noarch.rpm
 # yum -y install mysql-community-server
 # mysqld --version

わたし「通った!なんでだろ。知らんけど、パッケージがyumのリポジトリに登録されていないまたはバージョンが古いためwgetによってパッケージをダウンロードして何らかのコマンドでインストールされたんかな。」2

PHPのインストール

 # yum -y install php php-mysql
 # php --version

サーバーの起動

 # systemctl start httpd.service
 # systemctl start mysqld.service

上司「サーバの再起動でサーバが自動的に起動するようにしておいてね。」
わたし「(ふつう再起動したら起動するんじゃないんか?再起動とは?)はい。」

↑サーバ(=CentOS)の再起動でサーバ(=httpd・MySQL)が自動的に起動するようにしておいてね。

わたし「分かるか。」

サーバーを再起動しても起動時に自動的にサーバーが起動するように設定
 # systemctl enable httpd.service
 # systemctl enable mysqld.service

わたし「インストールおわりました!」
上司「遅いね。どれどれ…。」
わたし「(事務なのでね。じゃあご自分でやれ)すみません。」
上司「Apacheが起動してないんだけど?httpdはあるの?」
わたし「アパッチが起動してないんですか…?」

httpdがないとダメらしいので調べる

# yum info httpd

わたし「(は~?あるやんけ)httpdあります。」
上司「起動して。」

# systemctl start httpd.service
# systemctl status httpd.service

わたし「この後にhttp ://IPアドレスで検索すると、初期画面が表示されるんやね。OK。…あれ?真っ白やね…。」
わたし「もしかしてファイアウォールの設定がかかってるのかもしれへん。いっつもとなりの席のフロントエンドの人がワフワフ言ってるしたぶんそれや。」

一時的にファイアウォールを無効にする
# systemctl stop firewalld

わたし「『Failed to issue method call: Unit firewalld.service not loaded.』…?じゃあこれはどや。」

 firewalld に httpd (80番ポート)への通信を許可
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload

わたし「『-bash: firewall-cmd: command not found』…。詰んだ…。」
上司「まだ?」
わたし「自分でやってくださ~~い!(まだです。)」

コマンド実行ファイルがないっぽいので、インストールする

わたし「sudoも効かないし、なんか色々なんも入ってないんやな。FW入れればいいんしょ。」
わたし「iptablesとfirewalldは共存できない…だと…。」3

わたし「デフォルトがFWならFWでいいか…?iptablesのメリット調べるか。」
image.png

わたし「FWでよくない?」

firewalldをインストールする

IPTABLES停止
# systemctl stop iptables
# systemctl disable iptables
# systemctl is-enabled iptables

firewalldインストール
# yum -y install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# systemctl is-enabled firewalld
→enabledと出力される
# firewall-cmd --list-all #設定確認

再度firewallにhttpdの通信許可に挑戦

# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

わたし「できた~~~~!!!!!!!!!!!!!!!!!!!」
image.png

わたし「上司~~!できたよ~~!」
上司「遅かったな。じゃあこれからそのVPSサーバの構成について説明していくで。」
わたし「ぴえん…。」

まとめ(ここだけ読めばいい)

Apacheインストール
 # yum -y install httpd
 # httpd -v
MySQLインストール
 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # rpm -Uvh mysql-community-release-el7-5.noarch.rpm
 # yum -y install mysql-community-server
 # mysqld --version
PHPインストール
 # yum -y install php php-mysql
 # php --version
サーバーの起動
 # systemctl start httpd.service
 # systemctl start mysqld.service
サーバーを再起動しても起動時に自動的にサーバーが起動するように設定
 # systemctl enable httpd.service
 # systemctl enable mysqld.service
IPTABLES停止
# systemctl stop iptables
# systemctl disable iptables
# systemctl is-enabled iptables
firewalldインストール
# yum -y install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# systemctl is-enabled firewalld
→enabledと出力される
# firewall-cmd --list-all #設定確認
Firewallにhttpdの通信許可
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

以上

次はphpmyadminのインストール
ゲーーーーーーーーーー吐きそう!!!!!!!!!

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

未経験初心者がCentOSにLAMPをインストールしたときの忘備録

前提:未経験初心者なのに社内唯一のバックエンドエンジニアになってしまった

 わたし「やってらんね~~~~!!!事務として入ったんですけどどうしてこうなった??」

ある日

上司「新しいVPSサーバにLAMP入れといて…えっ、LAMP知らない?ハ~~~~~~マジで?(クソデカため息)」

 上司「これ読んでインストールよろしく」
 わたし「ぴえん…webなんて何も知らないよう、そもそも私は事務で入ったはず……。いやそんなこと言ってても誰も助けてくれんからね…調べるか…。」

LAMPとは

LAMP(ランプ)とは、OSであるLinux、WebサーバであるApache HTTP Server、データベースであるMySQL、スクリプト言語であるPerl、PHP、Pythonを総称した頭文字から成る造語である。※1 

わたし「上司オジはアパッチアパッチ言ってたな。これ入れればいいんですね」

インストールしていく

Apache httpd のインストール

 # yum -y install httpd
 # httpd -v

わたし「うまくいくじゃん、余裕だわ。」

MySQL Community Server のインストール

 # yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # httpd -v

わたし「なんで…?さっき上司が渡してきた資料どおりやったけどコマンドが通らないよぅ。
    これってもしかして、令和対応じゃないのかも…。」
わたし「コマンドよくわかんないけど壊してもいいって言ってたしいろんなの試してこ。当たったらラッキーや。」

 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # rpm -Uvh mysql-community-release-el7-5.noarch.rpm
 # yum -y install mysql-community-server
 # mysqld --version

わたし「通った!なんでだろ。知らんけど、パッケージがyumのリポジトリに登録されていないまたはバージョンが古いためwgetによってパッケージをダウンロードして何らかのコマンドでインストールされたんかな。」2

PHPのインストール

 # yum -y install php php-mysql
 # php --version

サーバーの起動

 # systemctl start httpd.service
 # systemctl start mysqld.service

上司「サーバの再起動でサーバが自動的に起動するようにしておいてね。」
わたし「(ふつう再起動したら起動するんじゃないんか?再起動とは?)はい。」

↑サーバ(=CentOS)の再起動でサーバ(=httpd・MySQL)が自動的に起動するようにしておいてね。

わたし「分かるか。」

サーバーを再起動しても起動時に自動的にサーバーが起動するように設定
 # systemctl enable httpd.service
 # systemctl enable mysqld.service

わたし「インストールおわりました!」
上司「遅いね。どれどれ…。」
わたし「(事務なのでね。じゃあご自分でやれ)すみません。」
上司「Apacheが起動してないんだけど?httpdはあるの?」
わたし「アパッチが起動してないんですか…?」

httpdがないとダメらしいので調べる

# yum info httpd

わたし「(は~?あるやんけ)httpdあります。」
上司「起動して。」

# systemctl start httpd.service
# systemctl status httpd.service

わたし「この後にhttp ://IPアドレスで検索すると、初期画面が表示されるんやね。OK。…あれ?真っ白やね…。」
わたし「もしかしてファイアウォールの設定がかかってるのかもしれへん。いっつもとなりの席のフロントエンドの人がワフワフ言ってるしたぶんそれや。」

一時的にファイアウォールを無効にする
# systemctl stop firewalld

わたし「『Failed to issue method call: Unit firewalld.service not loaded.』…?じゃあこれはどや。」

 firewalld に httpd (80番ポート)への通信を許可
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload

わたし「『-bash: firewall-cmd: command not found』…。詰んだ…。」
上司「まだ?」
わたし「自分でやってくださ~~い!(まだです。)」

コマンド実行ファイルがないっぽいので、インストールする

わたし「sudoも効かないし、なんか色々なんも入ってないんやな。FW入れればいいんしょ。」
わたし「iptablesとfirewalldは共存できない…だと…。」3

わたし「デフォルトがFWならFWでいいか…?iptablesのメリット調べるか。」
image.png

わたし「FWでよくない?」

firewalldをインストールする

IPTABLES停止
# systemctl stop iptables
# systemctl disable iptables
# systemctl is-enabled iptables

firewalldインストール
# yum -y install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# systemctl is-enabled firewalld
→enabledと出力される
# firewall-cmd --list-all #設定確認

再度firewallにhttpdの通信許可に挑戦

# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

わたし「できた~~~~!!!!!!!!!!!!!!!!!!!」
image.png

わたし「上司~~!できたよ~~!」
上司「遅かったな。じゃあこれからそのVPSサーバの構成について説明していくで。」
わたし「ぴえん…。」

まとめ(ここだけ読めばいい)

Apacheインストール
 # yum -y install httpd
 # httpd -v
MySQLインストール
 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # rpm -Uvh mysql-community-release-el7-5.noarch.rpm
 # yum -y install mysql-community-server
 # mysqld --version
PHPインストール
 # yum -y install php php-mysql
 # php --version
サーバーの起動
 # systemctl start httpd.service
 # systemctl start mysqld.service
サーバーを再起動しても起動時に自動的にサーバーが起動するように設定
 # systemctl enable httpd.service
 # systemctl enable mysqld.service
IPTABLES停止
# systemctl stop iptables
# systemctl disable iptables
# systemctl is-enabled iptables
firewalldインストール
# yum -y install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# systemctl is-enabled firewalld
→enabledと出力される
# firewall-cmd --list-all #設定確認
Firewallにhttpdの通信許可
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
最後に

自分用にログ残しておいてって言われたからQiitaに書いたんですけど書いたことないので雑雑で本当にすみません。
※あくまでも自分用の忘備録です。
怒らないでください。間違ってるところと事務の転職先は教えてください。

以上

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

事務員として入社したのにCentOSにLAMPをインストールすることになったときの忘備録

前提:未経験初心者事務入射なのに社内唯一のバックエンドエンジニアになってしまった

 わたし「やってらんね~~~~!!!事務として入ったんですけどどうしてこうなった??」

ある日

上司「新しいVPSサーバにLAMP入れといて…えっ、LAMP知らない?ハ~~~~~~マジで?(クソデカため息)」

 上司「これ読んでインストールよろしく」
 わたし「ぴえん…webなんて何も知らないよう、そもそも私は事務で入ったはず……。いやそんなこと言ってても誰も助けてくれんからね…調べるか…。」

LAMPとは

LAMP(ランプ)とは、OSであるLinux、WebサーバであるApache HTTP Server、データベースであるMySQL、スクリプト言語であるPerl、PHP、Pythonを総称した頭文字から成る造語である。※1 

わたし「上司オジはアパッチアパッチ言ってたな。これ入れればいいんですね」

インストールしていく

Apache httpd のインストール

 # yum -y install httpd
 # httpd -v

わたし「うまくいくじゃん、余裕だわ。」

MySQL Community Server のインストール

 # yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # httpd -v

わたし「なんで…?さっき上司が渡してきた資料どおりやったけどコマンドが通らないよぅ。
    これってもしかして、令和対応じゃないのかも…。」
わたし「コマンドよくわかんないけど壊してもいいって言ってたしいろんなの試してこ。当たったらラッキーや。」

 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # rpm -Uvh mysql-community-release-el7-5.noarch.rpm
 # yum -y install mysql-community-server
 # mysqld --version

わたし「通った!なんでだろ。知らんけど、パッケージがyumのリポジトリに登録されていないまたはバージョンが古いためwgetによってパッケージをダウンロードして何らかのコマンドでインストールされたんかな。」2

PHPのインストール

 # yum -y install php php-mysql
 # php --version

サーバーの起動

 # systemctl start httpd.service
 # systemctl start mysqld.service

上司「サーバの再起動でサーバが自動的に起動するようにしておいてね。」
わたし「(ふつう再起動したら起動するんじゃないんか?再起動とは?)はい。」

↑サーバ(=CentOS)の再起動でサーバ(=httpd・MySQL)が自動的に起動するようにしておいてね。

わたし「分かるか。」

サーバーを再起動しても起動時に自動的にサーバーが起動するように設定
 # systemctl enable httpd.service
 # systemctl enable mysqld.service

わたし「インストールおわりました!」
上司「遅いね。どれどれ…。」
わたし「(事務なのでね。じゃあご自分でやれ)すみません。」
上司「Apacheが起動してないんだけど?httpdはあるの?」
わたし「アパッチが起動してないんですか…?」

httpdがないとダメらしいので調べる

# yum info httpd

わたし「(は~?あるやんけ)httpdあります。」
上司「起動して。」

# systemctl start httpd.service
# systemctl status httpd.service

わたし「この後にhttp ://IPアドレスで検索すると、初期画面が表示されるんやね。OK。…あれ?真っ白やね…。」
わたし「もしかしてファイアウォールの設定がかかってるのかもしれへん。いっつもとなりの席のフロントエンドの人がワフワフ言ってるしたぶんそれや。」

一時的にファイアウォールを無効にする
# systemctl stop firewalld

わたし「『Failed to issue method call: Unit firewalld.service not loaded.』…?じゃあこれはどや。」

 firewalld に httpd (80番ポート)への通信を許可
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload

わたし「『-bash: firewall-cmd: command not found』…。詰んだ…。」
上司「まだ?」
わたし「自分でやってくださ~~い!(まだです。)」

コマンド実行ファイルがないっぽいので、インストールする

わたし「sudoも効かないし、なんか色々なんも入ってないんやな。FW入れればいいんしょ。」
わたし「iptablesとfirewalldは共存できない…だと…。」3

わたし「デフォルトがFWならFWでいいか…?iptablesのメリット調べるか。」
image.png

わたし「FWでよくない?」

firewalldをインストールする

IPTABLES停止
# systemctl stop iptables
# systemctl disable iptables
# systemctl is-enabled iptables

firewalldインストール
# yum -y install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# systemctl is-enabled firewalld
→enabledと出力される
# firewall-cmd --list-all #設定確認

再度firewallにhttpdの通信許可に挑戦

# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

わたし「できた~~~~!!!!!!!!!!!!!!!!!!!」
image.png

わたし「上司~~!できたよ~~!」
上司「遅かったな。じゃあこれからそのVPSサーバの構成について説明していくで。」
わたし「ぴえん…。」

まとめ(ここだけ読めばいい)

Apacheインストール
 # yum -y install httpd
 # httpd -v
MySQLインストール
 # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
 # rpm -Uvh mysql-community-release-el7-5.noarch.rpm
 # yum -y install mysql-community-server
 # mysqld --version
PHPインストール
 # yum -y install php php-mysql
 # php --version
サーバーの起動
 # systemctl start httpd.service
 # systemctl start mysqld.service
サーバーを再起動しても起動時に自動的にサーバーが起動するように設定
 # systemctl enable httpd.service
 # systemctl enable mysqld.service
IPTABLES停止
# systemctl stop iptables
# systemctl disable iptables
# systemctl is-enabled iptables
firewalldインストール
# yum -y install firewalld
# systemctl start firewalld
# systemctl enable firewalld
# systemctl is-enabled firewalld
→enabledと出力される
# firewall-cmd --list-all #設定確認
Firewallにhttpdの通信許可
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

以上

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

MySQL ↔︎ MongoDB 早見表

Terminology

用語です。

MySQL                 MongoDB              
databases database
table collection
row document
column field

Commands

MySQL                 MongoDB                
show databases; show dbs
create database new_db; use new_db
use new_db; use new_db
create table users (name varchar(20)); db.createCollection("users")
drop table users db.users.drop()
desc users; なし
insert into users (name) values ("taro"); db.users.insertOne( { name: "hoge" } )
update users
  set name = "maro"
  where name = "taro";
db.users.updateMany(
  { name: "taro" },
  { $set: { name: "maro" } }
)
select * from users; db.users.find()
select * from users order by name asc; db.users.find().sort( { name: 1 } )
select * from users order by name desc; db.users.find().sort( { name: -1 } )
select * from users limit 1; db.users.find().limit(1)
select count(*) from users; db.users.count()
select name from users where age = 90; db.users.find(
  { age: 90 },
  { name: 1 }
)

Null and Missing field

MySQL の場合はシンプル

MySQL                
select * from users where age is null;
select * from users where age is not null;

MongoDB の場合は null と missing があるので少し複雑

users
{ name: "100",  age: 100 }
{ name: "null",  age: null }
{ name: "missing" }
MongDB                   users.name  
db.users.find( { age: null } ) null, missing
db.users.find( { age: { $ne: null } } ) 100
db.users.find( { age: { $exists: true } } ) 100, null
db.users.find( { age: { $exists: false } } ) missing
db.users.find( { \$and: [
  { age: { $exists: true } },
  { age: null }
] } )
null
db.users.find({ age: { $type: 10 } }) null
db.users.find( { age: { \$not: { $type: 10 } } } ) 100, missing

Docker

Docker のおかげで、それぞれの環境がすぐ使えます。

MySQL
$ docker run --name study-mysql --rm -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:8.0

$ docker exec -it study-mysql bash
root@51c68a47680f:/# mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
MongoDB
$ docker run --name study-mongo --rm mongo:4.2

$ docker exec -it study-mongo bash
root@c2ab8e8878c3:/# mongo
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

GUI

この辺が王道かと。MongoDB Compass 使いやすいです。

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