検証済みのドキュメントです
クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。
- OS
- Ubuntu 24.04.5 LTS · x86_64
- インストールしたバージョン
- MySQL 8.4.11 LTS (8.4.11-1ubuntu24.04)
- テストサーバー
- DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
- 最終確認
- 2026-10-10
このドキュメントにはアフィリエイトリンクが含まれています。リンクから登録するとコードサンドが手数料を受け取ることがありますが、内容や評価には影響しません。
Ubuntu 24.04 サーバーに MySQL の公式リポジトリを追加して MySQL 8 の最後のバージョンであり LTS バージョンでもある MySQL 8.4 をインストールし、ファイアウォールと基本のセキュリティ設定、外部接続用のユーザー・データベースを作成したあと、自分の PC から接続できるか確認します。
1. 準備するもの
- Ubuntu 24.04 LTS サーバー 1 台(メモリ 1GB 以上を推奨)
sudo権限のあるアカウントで SSH 接続できること- 外部から接続する PC のグローバル IP アドレス(例:
203.0.113.10)
サーバーがない場合は、DigitalOcean の最小構成の Droplet(1 vCPU・1GB)を作成してみてください。この Droplet でも MySQL 8.4 は十分にインストールできます。このドキュメントのすべての手順は、Droplet(1 vCPU・メモリ 1GB・25GB SSD・Ubuntu 24.04・シンガポール)でサーバーを作成して確認しました。
2. MySQL 公式リポジトリの追加
Ubuntu 24.04 の標準リポジトリでインストールされる MySQL は 8.0 です。
apt-cache policy mysql-server | head -3mysql-server:
Installed: (none)
Candidate: 8.0.46-0ubuntu0.24.04.4MySQL 8.4 は、MySQL の公式リポジトリ(repo.mysql.com)を追加してインストールします。MySQL は、長期間サポートされる LTS バージョン(8.4、9.7)と、数か月ごとに新機能を出す Innovation バージョンを別々に配布しています。8.4 は MySQL 8 の最後のバージョンであり、LTS バージョンでもあります。
公式リポジトリは mysql-apt-config パッケージで登録します。まず、パッケージ一覧を更新して mysql-apt-config をダウンロードします。
sudo apt update
wget https://repo.mysql.com/mysql-apt-config_0.8.40-1_all.debmysql-apt-config は、インストール時にどのバージョンのリポジトリを登録するかを尋ねます。1 行目で mysql-8.4-lts をあらかじめ指定し、2 行目の DEBIAN_FRONTEND=noninteractive で質問画面を表示せずに、指定した値でインストールします。
echo "mysql-apt-config mysql-apt-config/select-server select mysql-8.4-lts" | sudo debconf-set-selections
sudo DEBIAN_FRONTEND=noninteractive dpkg -i mysql-apt-config_0.8.40-1_all.debSelecting previously unselected package mysql-apt-config.
(Reading database ... 75073 files and directories currently installed.)
Preparing to unpack mysql-apt-config_0.8.40-1_all.deb ...
Unpacking mysql-apt-config (0.8.40-1) ...
Setting up mysql-apt-config (0.8.40-1) ...登録されたリポジトリを確認します。mysql-8.4-lts が表示されていれば正常です。
cat /etc/apt/sources.list.d/mysql.list### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out entries below, but any other modifications may be lost.
# Use command 'dpkg-reconfigure mysql-apt-config' as root for modifications.
deb [signed-by=/usr/share/keyrings/mysql-apt-config.gpg] http://repo.mysql.com/apt/ubuntu/ noble mysql-apt-config
deb [signed-by=/usr/share/keyrings/mysql-apt-config.gpg] http://repo.mysql.com/apt/ubuntu/ noble mysql-8.4-lts
deb [signed-by=/usr/share/keyrings/mysql-apt-config.gpg] http://repo.mysql.com/apt/ubuntu/ noble mysql-tools
deb-src [signed-by=/usr/share/keyrings/mysql-apt-config.gpg] http://repo.mysql.com/apt/ubuntu/ noble mysql-8.4-ltsパッケージ一覧を更新してから、インストールされるバージョンをもう一度確認します。Candidate が 8.4 で始まっていれば正常です。
sudo apt update
apt-cache policy mysql-server | head -3mysql-server:
Installed: (none)
Candidate: 8.4.11-1ubuntu24.043. MySQL 8.4 のインストール
sudo DEBIAN_FRONTEND=noninteractive apt install -y mysql-serverDEBIAN_FRONTEND=noninteractive は、インストール中に設定の質問画面を表示せず、デフォルト値で進めるオプションです。このようにインストールすると MySQL の root にはパスワードが設定されず、手順 4 で説明する auth_socket 方式で接続することになります。
インストールが終わったら、インストールされたバージョンを確認します。
mysql --versionmysql Ver 8.4.11 for Linux on x86_64 (MySQL Community Server - GPL)4. サービスの状態確認
インストールが終わると、mysql サービスが自動で起動します。
sudo systemctl status mysql --no-pager● mysql.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
Active: active (running) since Sat 2026-10-10 08:21:19 UTC; 21s agoどのアドレスとポートで接続を受け付けているか確認します。
sudo ss -tlnp | grep mysqldLISTEN 0 151 *:3306 *:* users:(("mysqld",pid=3789,fd=22))
LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=3789,fd=19))3306 は通常の MySQL クライアントが接続するポートで、33060 は MySQL Shell などが使う X プロトコルのポートです。アドレス欄の * は、サーバーのすべてのアドレスで接続を受け付けるという意味です。Ubuntu の標準リポジトリの MySQL 8.0 は 127.0.0.1 でしか接続を受け付けませんが、公式リポジトリの MySQL はインストール直後から外部からの接続を受け付けます。設定ファイルに bind-address の項目がないためです。
grep -v '^#' /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v '^$'[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.logこの状態で外部の PC から接続すると、次のエラーになります。ポートは開いていますが、外部のアドレスから接続できる MySQL ユーザーがまだいないためです。
ERROR 1130 (HY000): Host '203.0.113.10' is not allowed to connect to this MySQL server次に、MySQL に接続できるか確認します。インストール直後は、sudo mysql でパスワードなしに root として接続できます。
sudo mysql -e "SELECT VERSION();"+-----------+
| VERSION() |
+-----------+
| 8.4.11 |
+-----------+パスワードなしで接続できる理由は、MySQL のユーザー一覧で確認できます。
sudo mysql -e "SELECT user, host, plugin FROM mysql.user;"+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | auth_socket |
+------------------+-----------+-----------------------+MySQL の root は auth_socket 方式で認証します。auth_socket はパスワードの代わりに、MySQL に接続した Linux アカウント名を確認する方式なので、Linux の root 権限(sudo)で実行した場合にだけ MySQL の root として接続できます。
5. ファイアウォール(ufw)の設定
手順 4 で見たように、3306 番ポートはすでに外部に開いています。ユーザーを作成する前にファイアウォールを先に設定し、自分の PC の IP だけが 3306 番ポートに接続できるようにします。33060 番ポートは許可しないので、外部からは接続できなくなります。ファイアウォールを有効にする前に、必ず先に SSH を許可してください。SSH を許可せずにファイアウォールを有効にすると、サーバーへの接続が切れてしまいます。
sudo ufw allow OpenSSH
sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp
sudo ufw --force enable
sudo ufw statusStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
3306/tcp ALLOW 203.0.113.10
OpenSSH (v6) ALLOW Anywhere (v6)6. 基本のセキュリティ設定
MySQL には、基本のセキュリティ設定を質問形式で進める mysql_secure_installation ツールがあります。このツールは、パスワード検証機能の設定、root パスワードの設定、匿名ユーザーの削除、外部から接続できる root の削除、test データベースの削除を順に尋ねます。このドキュメントでは、このうちユーザーとデータベースを整理する作業を SQL で直接実行します。root は auth_socket を使うので、パスワードは設定しません。
まず、現在のデータベース一覧を確認します。
sudo mysql -e "SHOW DATABASES;"+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+公式リポジトリのパッケージでインストールすると、上のユーザー一覧とデータベース一覧のように匿名ユーザーと test データベースはなく、root は localhost からしか接続できません。ほかの方法でインストールした場合や設定を変更したことがある場合は、以下のコマンドで同じ状態にします。すでに上と同じ状態であれば、実行しても何も変わらず、出力もありません。
sudo mysql -e "DELETE FROM mysql.user WHERE User='';"
sudo mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
sudo mysql -e "DROP DATABASE IF EXISTS test;"
sudo mysql -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';"
sudo mysql -e "FLUSH PRIVILEGES;"1 行目は名前のない匿名ユーザーを、2 行目はサーバーの外から接続できる root を削除します。3 行目と 4 行目は test データベースとそのアクセス権限を削除し、最後の行は変更した権限をすぐに反映します。
7. ユーザーとデータベースの作成
アプリケーションでは、管理者アカウントである root ではなく専用ユーザーで接続するほうが安全です。データベース appdb とユーザー appuser を作成します。パスワードは必ず自分で決めた値に置き換え、203.0.113.10 は接続する PC のグローバル IP に置き換えてください。
sudo mysql -e "CREATE DATABASE appdb;"
sudo mysql -e "CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'change-this-password';"
sudo mysql -e "CREATE USER 'appuser'@'203.0.113.10' IDENTIFIED BY 'change-this-password';"
sudo mysql -e "GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost', 'appuser'@'203.0.113.10';"MySQL はユーザーを ユーザー名@接続元のアドレス で区別します。'appuser'@'localhost' はサーバー上から接続するとき、'appuser'@'203.0.113.10' は自分の PC から接続するときに使われます。どちらのユーザーも appdb のすべての権限だけを持ち、ほかのデータベースにはアクセスできません。
ユーザーが作成されたか確認します。
sudo mysql -e "SELECT user, host, plugin FROM mysql.user WHERE user = 'appuser';"+---------+----------------+-----------------------+
| user | host | plugin |
+---------+----------------+-----------------------+
| appuser | 203.0.113.10 | caching_sha2_password |
| appuser | localhost | caching_sha2_password |
+---------+----------------+-----------------------+サーバー上で appuser として接続してみます。-p オプションはパスワードの入力を受けるという意味で、最後の appdb は接続するデータベースです。
mysql -u appuser -p appdb -e "SELECT CURRENT_USER(), DATABASE();"Enter password:
+-------------------+------------+
| CURRENT_USER() | DATABASE() |
+-------------------+------------+
| appuser@localhost | appdb |
+-------------------+------------+8. 自分の PC からの接続確認
PC に mysql クライアントがない場合は、Docker で MySQL クライアントを実行して接続できます。203.0.113.20 はサーバーの IP に置き換えてください。--rm オプションを付けているので、コマンドが終わるとコンテナは自動で削除されます。-it は、パスワードを入力できるように端末を接続するオプションです。
docker run --rm -it mysql:8.4 mysql -h 203.0.113.20 -u appuser -p appdb -e "SELECT CURRENT_USER(), DATABASE();"Enter password:
+------------------------+------------+
| CURRENT_USER() | DATABASE() |
+------------------------+------------+
| appuser@203.0.113.10 | appdb |
+------------------------+------------+appuser@ の後ろに自分の PC の IP が表示されれば、外部接続は正常です。接続が暗号化されているかも確認します。
docker run --rm -it mysql:8.4 mysql -h 203.0.113.20 -u appuser -p appdb -e "SHOW STATUS LIKE 'Ssl_version';"Enter password:
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Ssl_version | TLSv1.3 |
+---------------+---------+TLSv1.3 は、接続が TLS で暗号化されているという意味です。MySQL は初回起動時に自己署名証明書を作成し、クライアントはサーバーが対応していれば暗号化された接続を使います。
9. トラブルシューティング
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
MySQL の root は auth_socket 方式なので、パスワードでは接続できません。サーバー上で sudo mysql で接続してください。アプリケーションや外部ツールでは、手順 7 で作成した appuser を使ってください。
ERROR 1130 (HY000): Host '203.0.113.10' is not allowed to connect to this MySQL server
接続した PC の IP で登録された MySQL ユーザーが 1 つもないという意味です。手順 7 の前に外部から接続すると、このエラーが出ます。自宅や会社のグローバル IP が変わったときにも同じエラーが出ます。sudo mysql -e "SELECT user, host, plugin FROM mysql.user WHERE user = 'appuser';" で登録されているアドレスを確認してください。
ERROR 1045 (28000): Access denied for user 'appuser'@'203.0.113.10' (using password: YES)
パスワードが間違っているか、接続した ユーザー@アドレス の組み合わせのユーザーが存在しないという意味です。このドキュメントの設定で外部の PC から root に接続しても、Access denied for user 'root'@'203.0.113.10' と同じエラーが出ます。
10. 削除
MySQL とデータをすべて削除するには、以下のコマンドを実行します。データベースファイルまですべて削除されるため、必要なデータは先に mysqldump でバックアップしてください。
sudo DEBIAN_FRONTEND=noninteractive apt purge -y 'mysql-*'
sudo apt autoremove -y
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql'mysql-*' を引用符で囲んでいるのは、シェルが * をファイル名に置き換えずに、そのまま apt に渡すようにするためです。実行すると Package 'mysql-server-5.7' is not installed, so not removed のように、インストールされていないパッケージ名が何行も表示されます。名前が mysql- で始まるパッケージをすべて確認するためで、正常です。手順 2 でインストールした mysql-apt-config もこのコマンドで一緒に削除され、そのときに公式リポジトリの設定ファイル(/etc/apt/sources.list.d/mysql.list)と署名鍵も削除されます。
ファイアウォールに追加した 3306 番ポートのルールも削除します。
sudo ufw delete allow from 203.0.113.10 to any port 3306 proto tcpRule deletedMySQL のパッケージが残っていないか確認します。0 が表示されれば、すべて削除されています。
dpkg -l | grep -c mysql0実際に試してみる
サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。
このドキュメントは役に立ちましたか? 間違いや変わった点があればお知らせください。
内容の修正を依頼