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
2026/01/30 ConoHa[解説]のv3環境とConoHa for Gameが約30分ダウン(インシデント詳細)。SLA未達による10%料金補償の対象に。翌月末までに申請必要
2026/01/04 シンVPS[解説]の大容量メモリプラン対応 [更に読む]
[日本発VPS] 安い&為替影響なしが最大の特徴
| 順 | VPS名 | 強み | 弱み |
|---|---|---|---|
| 1 | Xserver VPS[解説] | メモリ6,12,24GBで最安。Disk速度速い | コンパネ共同管理非対応&LAN接続無 |
| 2 | WebArena Indigo[解説] | メモリ1,16,32GBで最安、4GB以上高速回線。コンパネ共同管理対応 | CPU性能低め&LAN接続無 |
| 3 | ConoHa[解説] | クラウド機能充実&SLA99.99%&下位プランへ変更可 | コンパネ共同管理非対応&上位プランで容量増えず |
| 4 | KAGOYA[解説] | メモリ2(年割),3,4(年割),8GB最安。性能コスパ高い&LAN接続/LB利用可 | コンパネ共同管理非対応 |
| 5 | シンVPS[解説] | 大容量メモリプランにてメモリ単価最安になる場合有り | 最低契約期間が3ヶ月 |
[海外発VPS] 日本語サポート無し、為替影響常時受ける。但し全てコンパネ複数人共同管理対応でクラウド機能高い
| 順 | VPS名 | 強み | 弱み |
|---|---|---|---|
| 1 | Vultr[解説/無料券] | 国内DC複数有。高性能物理完全占有VPS初期費0で提供。毎月2TB無料転送枠有。SLA100% | |
| 2 | DigitalOcean[解説/無料券] | クラウド機能最充実海外最大手VPS。LBで無料SSL自動更新可。無料DDoS防御提供 | 海外DCのみ |
| 3 | Linode[解説/無料券] | 国内DC複数有。クラウド機能充実。無料でDDoS防御。Akamaiと統合で機能向上 | |
| 4 | UpCloud[解説/無料券] | LBで無料SSL自動更新可。24時間チャットサポート嬉しい | 海外DCのみ&ユーロ建て |
| 5 | AWS Lightsail[解説] | クラウドの基本機能揃う | CPU Credit使い切ると性能落ち |