RHEL9系ディストリビューション(Rocky Linux 9.7)にMySQLを導入したときのメモです。
そもそもDB(データベース)とは何なのか?
一言で言えば、「特定のルールに従って、整理整頓されたデータの集まり」です。
言うなれば「超高性能な図書館」のようなものです。
閲覧者、借りている人の帳簿を司り、膨大な本から一瞬で目的の1ページを探し出し、同時に何百人もの人が本を借りようとしても混乱が起きないように管理されています。
MySQLなどの「RDBMS」
MySQLは正確には「リレーショナルデータベース管理システム(RDBMS)」と呼ばれます。
- リレーショナル(関係性): データを「表(テーブル)」の形式で管理し、複数の表を関連付けることができます。
- 管理システム: データそのものではなく、データを操作・管理するためのソフトウェアのことです。
何を司るのか(役割と機能)
MySQLが担っている主な役割は、大きく分けて以下の4つです。
- データの格納と検索(CRUD)
- データの登録(Create)、参照(Read)、更新(Update)、削除(Delete)の4つを、膨大な量の中から高速に行います。
- 整合性の維持(つじつまを合わせる)
- 「注文データはあるのに、注文したユーザーのデータがない」といった矛盾(バグの元)が起きないよう、データの整合性を厳しく見張ります。
- 同時実行の制御(排他制御)
- 例えば、残り1つの商品を2人が同時にクリックした際、どちらか一方が確実に買えるように調整し、「1つしかないのに2人に売れてしまった」という事故を防ぎます。
- セキュリティと権限管理
- 「この人は閲覧だけ」「この人は編集もOK」といった具合に、大切なデータへのアクセスをコントロールします。
なぜ大事なのか(存在理由)
なぜExcelファイルやテキストファイルで管理するのではダメなのでしょうか?
データの爆発に対応するため
テキストファイルだと、100万件のデータから1件を探すのに上から順に読み込む必要があり、時間がかかりすぎます。DBは「インデックス(索引)」という仕組みを持ち、瞬時にデータを見つけ出せます。
データの「信頼性」を保証するため(ACID特性)
銀行振込を想像してみましょう。
- Aさんの口座から1万円引く
- Bさんの口座に1万円足す
もし「1」の直後にシステムがダウンしたら、1万円が消えてしまいます。
こうならないよう、DBには「トランザクション」という仕組みがあり、「すべて成功するか、すべてなかったことにするか」のどちらかしか認めません。これが社会インフラを支える信頼性の正体です。
複数のプログラムから共有できるため
Linuxサーバー上で動く
- Webサイト
- スマホアプリ
- 管理画面
など、バラバラな入り口から入ってくる要求を、一つの窓口(MySQL)が交通整理して処理してくれます。
まとめ
MySQLは、システムにおける「記憶の番人」です。
- DBとは: 整理されたデータの基地。
- 司るもの: データの出し入れ、矛盾の防止、アクセスの交通整理。
- 大事な理由: 膨大なデータを「速く」「正確に」「安全に」扱うため。
LinuxにDBを入れるということは、そのサーバーに「確かな記憶力」と「厳格な管理能力」を持たせるということに他なりません。
ここまで踏まえ、LinuxにDBを入れていきましょう。
インストールとディレクトリ準備
MySQLサーバーのパッケージを導入し、MySQLサービスが利用するディレクトリの権限をあらかじめ適正化。
- MySQLサーバのインストール
sudo dnf install -y mysql-server
サービスの起動と初期ログイン
MySQLサービスを有効化し、初期状態でのログインを確認。
- サービスの有効化と起動
sudo systemctl enable --now mysqld
- 初期ログイン(MySQL 8.0では初期状態はパスワードなし)
mysql -u root
rootパスワードの確定
ログイン直後にMySQLのroot顕現のパスワードを設定します。
※先ほどのDBの話に戻ります。DBは「システムのデータそのもの」を管理します。先ほどの図書館の例で言うと
- 利用者
- 所蔵されている本
- その本がどこにあるか(貸し出し中か、書架か)
- どのようなジャンルか、作者は?
まで全て記録されている状態です。ここで、例えば、悪意ある者が「『ハムレット』の作者は『クリストファー・マーロウ』である」としたい場合、悪意ある者はそのような行為ができてしまいます。
そのため、攻撃者はDBのroot権限を真っ先に奪います。それを防ぐためにも最初にrootパスワードを設定します。
- rootユーザーに対して新パスワードを適用
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Your_Strong_Password';
パスワードは自分の環境に合わせます。パスワード設定後、そのデータを適切な方法・手段・保管場所に格納してください。
- 権限設定
FLUSH PRIVILEGES;
- コンソールから抜ける
EXIT
- パスワードで入れるかを確認
mysql -u root -p
設定したパスワードでログインできることを確認します。確認後、EXITで抜けます。
セキュリティの堅牢化 (mysql_secure_installation)
対話型スクリプトを用い、商用・本番環境に耐えうるセキュリティ設定を一括で適用します。 以下のように行ってください。
Enter password for user root:
で、先ほどのrootパスワードが聞かれます。
その後、いくつかの確認事項があるのでYで答えます。
| 設定項目 | 内容 | 理由 |
|---|---|---|
| Remove anonymous users | Yes | 誰でも接続できる穴を塞ぐため |
| Disallow root login remotely? | Yes | ローカル管理に限定し攻撃経路を遮断するため |
| Remove test database and access to it? | Yes | 不要なオブジェクトの排除 |
| Reload privilege tables now? | Yes | 設定内容を有効化するため |