Linux設定

MySQLのインストール・設定方法

最終更新日: 2025/04/26

MariaDB(MySQL)とPostgreSQLのどちらを使うのかを決める

MariaDBとMySQLとPostgreSQLどれを選ぶべきか選択フローチャート」を参照して下さい。
その上でMySQLをインストールすると決めたら読み進めて下さい。

そもそも自分でDBを設定・運用する事が妥当なのかの判断

データベースは、業務上ミッションクリティカルな部分であり、またサラリーマン的に働く場合には、その設定・運用・教育の人件費にもコストがかかると考えると、企業人として関わる場合には自分でインストール・設定・運用するよりも、サービス側にDB運用の多くを任せられる、DBAAS(Database As A Service)型のマネージドDBサービスを利用した方が、費用対効果的にも妥当となる事が多い。

ただ、個人の財布でサービスを運用する場合、月数千円/万円でも節約したい、という気持ちになるのも妥当であり、その場合には、ようこそ、データベース運用者の道へ、という事になります。

MySQLのインストール

OS付属のMySQLをインストール

CentOSの公式からインストールするには以下の形で
dnfの部分はCentOS7以前ならyum、Ubuntu系ならapt-getに差し替え

sudo dnf -y install mysql-server mysql;

MySQL公式の版をインストール

OS公式ではなく、MySQL公式の方のを使う場合には、OSの他ソフトとの相性の問題が発生する可能性がありますが、MySQL専用のサーバーにしようとしているのならば、問題はないでしょう。
又、一般的に、OS付属のMySQLより、より新しい版が利用可能です。
公式のmyslqをインストールするには
まず念の為にOS付属のmysqlが入っていたら削除するコマンドを打つ

dnf remove mysql*;

加えて、CentOS8の場合は

dnf module disable mysql;

CentOS7以下の場合は
/etc/yum.repos.d/CentOS-Base.repo

[base]と[updates]のセクションに

exclude=mariadb*
exclude=mysql*

と加えて、CentOSのレポジトリの方からインストールされないようにする。

それからyumのレポジトリでmysql公式を有効にする

# 8.0.35が入る | 将来8.0.xのより新しいのが出たら-9の部分の数値をより上げてNot Foundになるところまで上げてみれば良い
wget https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm;
yes | sudo dnf install mysql80-community-release-el8-9.noarch.rpm;

それからインストール

yes | sudo dnf install -y mysql-server;

バージョンを

mysql --version;

で確認

MySQLの最低限の設定

rootのパスワードを確認

まずMySQLサーバーを起動

systemctl start mysqld;

それからログの場所は場合によっては異なり得ますが

grep 'password' /var/log/mysql/mysqld.log

でrootのパスワードを確認

root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

と書かれているのなら、パスワードは空という事

mysql -u root -p

でログインをしてみて、成功するか確認。

自動起動&起動&セキュリティ設定を行うには

sudo systemctl start mysqld;
sudo systemctl enable mysqld;
sudo mysql_secure_installation;

最後のコマンドで聞かれることは、基本的には全てYesと答えれば良い

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Yes
Success.
匿名ユーザーを削りますか?

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) : Yes
Success.
リモートからのrootログインを禁止しますか?

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) : Yes
テストのデータベースを削除しますか?

 - Dropping test database...
Success.


 - Removing privileges on test database...
Success.

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) : Yes
権限の変更を反映しますか?

Success.

All done!

DBへアクセスできるIPを絞る

MySQLは3306のポートで動いているので、例えば自分のPCかあ

telnet $IP 3306

で繋がってしまうような場合には問題となる。

基本的にはWebサーバー + 必要なサーバーからのみアクセスできるように限定する。

例えば、10.0.0.0/24のサブネットにだけアクセスを認めたいのならば

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" service name="mysql" accept';
firewall-cmd --list-all --permanent;
firewall-cmd --reload;

データベース全体をバックアップ

mysqldump --all-databases --single-transaction --quick --lock-tables=false > full-backup-$(date +%F).sql -u root -p

データベース全体をダンプしたファイルからリストア

mysql -u root -p < $DUMPED.sql

ユーザーの権限の同期には

flush privileges;

を打つ

ファイアーウォールの設定

各VPSがファイアーウォールを提供しているのなら各VPSのファイアーウォールの機能を、そうでなければ firewall-cmd でLinux自体にfirewallを設定する。

DBのポートはWebサーバーに対してだけあけ、sshログインも自分の管理するサーバー等、特定のIPアドレスからのみログインできるようにするのがセキュリティ上良い。

なお、セキュリティとスペックの分離上、WebサーバーとDBサーバーを置くサーバーは出来るのなら分けた方が良いが、コストの削減考えてWebサーバーと同一の所に置くのもあるかと思います。
ただ、その場合でも、DBのポートをインターネットに公開しないように注意(Webサーバーからローカルアクセスでのみアクセスできるように設定すべき)。

ベンチマークを取得する

dnf install -y sysbench;

ログインしてから

create database sbtest;
CREATE USER 'sbtest'@'localhost' IDENTIFIED BY 'sbtesT2020#desu';
GRANT ALL ON `sbtest`.* TO 'sbtest'@'localhost';

下準備

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --table-size=1000000 --mysql-host=localhost --mysql-password=sbtesT2020#desu --time=60 --db-ps-mode=disable prepare;

テストの実行

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --table-size=100000 --mysql-host=localhost --mysql-password=sbtesT2020#desu --time=60 --db-ps-mode=disable --threads=8 run;

結果

sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

Running the test with following options:
Number of threads: 8
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            762664
        write:                           217904
        other:                           108952
        total:                           1089520
    transactions:                        54476  (907.82 per sec.)
    queries:                             1089520 (18156.48 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.0060s
    total number of events:              54476

Latency (ms):
         min:                                    3.19
         avg:                                    8.81
         max:                                   70.44
         95th percentile:                       13.22
         sum:                               479897.71

Threads fairness:
    events (avg/stddev):           6809.5000/23.87
    execution time (avg/stddev):   59.9872/0.00

Mysqlでの開発

MySQLの基本的なコマンド

一番最初のデータベースヘの接続

mysql --user=... --database=... --host=... -p

データベースの作成

CREATE DATABASE データベース名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ユーザーの作成と指定データベースへの権限付与

GRANT ALL ON $DABASENAME.* TO '$DBUSER'@'localhost' identified by "$DBUSERPASSWORD";
GRANT ALL ON $DABASENAME.* TO '$DBUSER'@'10.%' identified by "$DBUSERPASSWORD";
GRANT ALL ON $DABASENAME.* TO '$DBUSER'@'172.%' identified by "$DBUSERPASSWORD";
GRANT ALL ON $DABASENAME.* TO '$DBUSER'@'192.%' identified by "$DBUSERPASSWORD";

データベースのリスト

SHOW DATABASES

使用データベースの切り替え

use データベース名

データベースのテーブルのリスト

SHOW TABLES

テーブルの作りの表示

SHOW CREATE TABLE テーブル名

サーバーで現在実行されているSQLの確認

SHOW PROCESSLIST

実行時間が長いSQLの実行の停止

kill プロセスID

サーバーとの接続の終了

exit

データの型

BIGINT(size)
BINARY(size)
BIT(size)
BLOB(size)
BOOL
BOOLEAN
CHAR(size)
DATE
DATETIME(fsp)
DEC(size, d)
DECIMAL(size, d)
DOUBLE PRECISION(size, d)
DOUBLE(size, d)
ENUM(val1, val2, val3, …)
FLOAT(p)
FLOAT(size, d)
INT(size)
INTEGER(size)
LONGBLOB
LONGTEXT
MEDIUMBLOB
MEDIUMINT(size)
MEDIUMTEXT
SET(val1, val2, val3, …)
SMALLINT(size)
TEXT(size)
TIME(fsp)
TIMESTAMP(fsp)
TINYBLOB
TINYINT(size)
TINYTEXT
VARBINARY(size)
VARCHAR(size)
YEAR

VPS関連最新ニュース
2026/01/30 ConoHa[解説]のv3環境とConoHa for Gameが約30分ダウン(インシデント詳細)。SLA未達による10%料金補償の対象に。翌月末までに申請必要
2026/01/04 シンVPS[解説]の大容量メモリプラン対応 [更に読む]

申込数順上位VPS:おすすめ特徴&注意点1行まとめ ※毎月月初に申し込み数ベースで順位を更新
[日本発VPS] 安い&為替影響なしが最大の特徴
VPS名強み弱み
1Xserver VPS[解説]メモリ6,12,24GBで最安。Disk速度速いコンパネ共同管理非対応&LAN接続無
2WebArena Indigo[解説]メモリ1,16,32GBで最安、4GB以上高速回線。コンパネ共同管理対応CPU性能低め&LAN接続無
3ConoHa[解説]クラウド機能充実&SLA99.99%&下位プランへ変更可コンパネ共同管理非対応&上位プランで容量増えず
4KAGOYA[解説]メモリ2(年割),3,4(年割),8GB最安。性能コスパ高い&LAN接続/LB利用可コンパネ共同管理非対応
5シンVPS[解説]大容量メモリプランにてメモリ単価最安になる場合有り最低契約期間が3ヶ月

[海外発VPS] 日本語サポート無し、為替影響常時受ける。但し全てコンパネ複数人共同管理対応でクラウド機能高い
VPS名強み弱み
1Vultr[解説/無料券]国内DC複数有。高性能物理完全占有VPS初期費0で提供。毎月2TB無料転送枠有。SLA100%
2DigitalOcean[解説/無料券]クラウド機能最充実海外最大手VPS。LBで無料SSL自動更新可。無料DDoS防御提供海外DCのみ
3Linode[解説/無料券]国内DC複数有。クラウド機能充実。無料でDDoS防御。Akamaiと統合で機能向上
4UpCloud[解説/無料券]LBで無料SSL自動更新可。24時間チャットサポート嬉しい海外DCのみ&ユーロ建て
5AWS Lightsail[解説]クラウドの基本機能揃うCPU Credit使い切ると性能落ち