業務で商用版のMySQLに触れる機会が生じた為、先日VirtualBoxに導入したAmazon Linux 2023にMySQLのコミュニティ版をインストールしてみた。
今回導入するMySQLのバージョンは、最新版ではなく業務環境でよく見られる「枯れたバージョン」を利用。yumやdnfコマンドで最新版のMySQLパッケージをインストールするのではなく、wgetコマンドでMySQLのrpmファイルをバージョン指定で作業用ディレクトリにダウンロードし、インストールを実施した。
そもそもMySQLとは何?
MySQLは世界で最も普及しているオープンソースなデータベース管理システムである。SQLとはデータの登録や取得や削除等で使用する為の言語を指し、SQLでデータベースを管理する。
1996年に初めて公開され、2008年のSun Microsystems社による買収や2010年のOracle社による買収を経て、2024年現在も精力的に開発が続けられているリレーショナルデータベース管理システム(RDBMS)である。
MySQLの特徴を簡潔に言うと、拡張性と柔軟性の高さ、高機能および高セキュリティ等が挙げられる。
・拡張性と柔軟性の高さ:小〜大規模なアプリ開発環境に対応出来る
・高機能:InnoDBやMemoryなど豊富なストレージエンジン
・高セキュリティ:DBへのアクセス制御、SSLやTLSなど暗号化通信
何故MySQLに手を出した?
自分はデータベース屋さんに転身した訳では無いが、業務で扱うツールのDBエンジンとしてMySQLが導入されており、DBそのものやMySQLのコマンドに興味を持ち始めた事からMySQLに片足を突っ込んだ。ただしデータベースの管理は本業ではない為、MySQLを深追いするつもりは無い(と思う...)。
当方の環境
ホスト機:macOS 14.5 / MacBook Pro 2020 / RAM: 16GB / CPU: Intel Core i5 2.0GHz
Virtualbox:7.0.18 r162988
ゲスト機:Amazon Linux 2023.5.20240708
尚、Amazon Linux 2023のデプロイおよび初期設定に関しては以下にて実施済み。
https://debslink.hatenadiary.jp/entry/20240719/1721397056 Amazon Linux 2023をVirtualBoxで動かす
MySQL Community版のインストール
1.rpmパッケージのダウンロード
MySQLのパッケージのダウンロードの前に、ホームディレクトリ内に作業用のディレクトリを作成する。
作成したtmpディレクトリ内に移動し、MySQLのrpmファイルを保存およびインストールを実施する。
[ec2-user@jpmtkvmsv99 ~]$ mkdir tmp [ec2-user@jpmtkvmsv99 ~]$ [ec2-user@jpmtkvmsv99 ~]$ cd tmp [ec2-user@jpmtkvmsv99 tmp]$
MySQLのコミュニティ版をインストールし動作させる為には、以下のパッケージのインストールが必要となる。
・mysql-community-client:MySQLのコマンドを含むクライアントツール
・mysql-community-client-plugins:MySQLサーバの拡張機能を実装する為のプラグイン
・mysql-community-common:MySQLクライアントとサーバ用の一般的なエラーメッセージおよび文字セット
・mysql-community-icu-data:MySQL正規表現に必要なICUデータファイル
・mysql-community-libs:MySQLの共有クライアントライブラリ群
・mysql-community-server:MySQLサーバのパッケージ
今回導入するMySQLのコミュニティ版について。
MySQLはオープンソースとして公開されており、コミュニティ版はライセンス料を支払うことなく無料で利用する事が出来る。
コミュニティ版は基本的な機能のみ実装されている為、より高度な機能を使用したい場合は有償版(エンタープライズ版)を利用する。
要件として簡単なデータベース機能で充分な場合はコミュニティ版のMySQLを選択しても問題無いが、セキュリティの強化やバックアップの自動化や高機能なストレージエンジン等の機能や、販社のサポートが必要な場合は有償版の導入を検討する。
MySQLのパッケージのURLを付けてwgetコマンドを実行する。AL2023ではデプロイ完了の段階で既にwgetコマンドの実行が可能な状態である為、wgetのインストールは不要である。
[ec2-user@jpmtkvmsv99 tmp]$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-server-8.0.38-1.el9.x86_64.rpm --2024-07-21 20:05:11-- https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-server-8.0.38-1.el9.x86_64.rpm Resolving dev.mysql.com (dev.mysql.com)... 2600:140b:a800:793::2e31, 2600:140b:a800:797::2e31, 23.36.106.252 Connecting to dev.mysql.com (dev.mysql.com)|2600:140b:a800:793::2e31|:443... connected. HTTP request sent, awaiting response... 302 Moved Temporarily Location: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-community-server-8.0.38-1.el9.x86_64.rpm [following] --2024-07-21 20:05:12-- https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-community-server-8.0.38-1.el9.x86_64.rpm Resolving cdn.mysql.com (cdn.mysql.com)... 2600:140b:a800:78c::1d68, 2600:140b:a800:78f::1d68, 23.34.106.69 Connecting to cdn.mysql.com (cdn.mysql.com)|2600:140b:a800:78c::1d68|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 51871386 (49M) [application/x-redhat-package-manager] Saving to: 'mysql-community-server-8.0.38-1.el9.x86_64.rpm' mysql-community-server-8 100%[==================================>] 49.47M 6.10MB/s in 8.1s 2024-07-21 20:05:20 (6.10 MB/s) - 'mysql-community-server-8.0.38-1.el9.x86_64.rpm' saved [51871386/51871386] [ec2-user@jpmtkvmsv99 tmp]$
上記のMySQLのサーバパッケージのダウンロードが正常に完了したら、続いてMySQLのライブラリやクライアントその他のツールも上記と同様にwgetコマンドでダウンロードする。
[ec2-user@jpmtkvmsv99 ~]$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-libs-8.0.38-1.el9.x86_64.rpm [ec2-user@jpmtkvmsv99 ~]$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-client-8.0.38-1.el9.x86_64.rpm [ec2-user@jpmtkvmsv99 ~]$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-client-plugins-8.0.38-1.el9.x86_64.rpm [ec2-user@jpmtkvmsv99 ~]$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-icu-data-files-8.0.38-1.el9.x86_64.rpm [ec2-user@jpmtkvmsv99 ~]$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-common-8.0.38-1.el9.x86_64.rpm
ダウンロードの完了後、以下の6つのrpmファイルが保存されている事を確認。
[ec2-user@jpmtkvmsv99 tmp]$ ls mysql-community-client-8.0.38-1.el9.x86_64.rpm mysql-community-client-plugins-8.0.38-1.el9.x86_64.rpm mysql-community-common-8.0.38-1.el9.x86_64.rpm mysql-community-icu-data-files-8.0.38-1.el9.x86_64.rpm mysql-community-libs-8.0.38-1.el9.x86_64.rpm mysql-community-server-8.0.38-1.el9.x86_64.rpm [ec2-user@jpmtkvmsv99 tmp]$
2.MySQLのインストール
rpmコマンドでMySQLのパッケージのインストールを実行。
以下のようにカッコ { } を使い全てのパッケージを指定すると、インストール順を考慮する事無く一発でインストールする事が出来る。
[ec2-user@jpmtkvmsv99 tmp]$ sudo rpm -Uvh mysql-community-{client,common,client-plugins,libs,icu-data-files,server}-8.0.38-1.el9.x86_64.rpm warning: mysql-community-client-8.0.38-1.el9.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID a8d3785c: NOKEY Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:mysql-community-client-plugins-8.################################# [100%] 2:mysql-community-common-8.0.38-1.e################################# [100%] 3:mysql-community-libs-8.0.38-1.el9################################# [100%] 4:mysql-community-client-8.0.38-1.e################################# [100%] 5:mysql-community-icu-data-files-8.################################# [100%] 6:mysql-community-server-8.0.38-1.e################################# [100%] [ec2-user@jpmtkvmsv99 tmp]$
3.設定ファイル/etc/my.cnfの編集
MySQLサーバやMySQLクライアントは起動時にmy.cnfファイルの記載内容を読み取る。
MySQLサーバの設定は[mysqld]セクション内の記載内容、MySQLクライアントの設定は[mysql]セクション内の記載内容が読み込まれる。
my.cnfファイルは/etcディレクトリの他にLinuxのユーザのホームディレクトリ内や/etc/mysqlディレクトリ等にも存在する事が有り、/etc/ディレクトリ以外にmy.cnfファイルが存在する場合はそれらの方が優先される。
https://qiita.com/yoheiW@github/items/bcbcd11e89bfc7d7f3ff 基礎MySQL ~その2~ my.cnf(設定ファイル)
以下は自分の環境にある/etc/my.cnfの内容。MySQLのインストール直後、MySQLが正常に起動しなかった際に「lower_case_table_namesは1ではなく0にしないさい」的なログが/var/log/sqld.logにあった為、lower_case_table_names=0を追記した。
[ec2-user@jpmtkvmsv99 ~]$ sudo vi /etc/my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove the leading "# " to disable binary logging # Binary logging captures changes between backups and is enabled by # default. It's default setting is log_bin=binlog # disable_log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M # # Remove leading # to revert to previous value for default_authentication_plugin, # this will increase compatibility with older clients. For background, see: # https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin # default-authentication-plugin=mysql_native_password datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid lower_case_table_names=0 [ec2-user@jpmtkvmsv99 ~]$
4.mysqldサービスを立ち上げる
設定ファイル/etc/my.confの編集後、systemctl start mysqldコマンドでMySQLサービスを立ち上げる。
その後はsystemctl status mysqldコマンドを叩きMySQLサービスの状態を確認し、Amazon Linuxの起動の際は常にMySQLサービスが立ち上がるようMySQLサービスの自動起動を有効にする。
以下ではsystemctl status mysqldを実行した結果、Activeの項目はactive (running)が出力されている。MySQLが正常に起動した事を示す。
[ec2-user@jpmtkvmsv99 tmp]$ sudo systemctl start mysqld [ec2-user@jpmtkvmsv99 tmp]$ [ec2-user@jpmtkvmsv99 tmp]$ sudo systemctl status mysqld ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: d> Active: active (running) since Sun 2024-07-21 22:18:14 UTC; 1min 0s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 24705 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, statu> Main PID: 24770 (mysqld) Status: "Server is operational" Tasks: 37 (limit: 2307) Memory: 447.3M CPU: 7.674s CGroup: /system.slice/mysqld.service └─24770 /usr/sbin/mysqld Jul 21 22:18:04 amazonlinux.onprem systemd[1]: Starting mysqld.service - MySQL > Jul 21 22:18:14 amazonlinux.onprem systemd[1]: Started mysqld.service - MySQL S> [ec2-user@jpmtkvmsv99 tmp]$ [ec2-user@jpmtkvmsv99 tmp]$ sudo systemctl enable mysqld
5.MySQLにログイン
MySQLにログインする前に、MySQLの初回ログインで使用するrootアカウントのパスワードを確認する必要が有る。
MySQLをインストールした後のMySQLの初回起動時に、MySQLはrootアカウントのパスワードを生成する。パスワードは/var/log/mysqld.logに出力される為、以下のコマンドを叩きパスワードの文字列を確認する。
[ec2-user@jpmtkvmsv99 tmp]$ sudo grep 'temporary password' /var/log/mysqld.log 2024-07-21T22:18:08.515139Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: vTsYXgTLV2?q [ec2-user@jpmtkvmsv99 tmp]$
MySQLにrootアカウントでログインする。
ログインパスワードは上記にて確認した文字列を入力する。
[ec2-user@jpmtkvmsv99 tmp]$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.38 Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
MySQLの初期設定と動作確認
1.rootアカウントのパスワード変更とユーザアカウントの作成
rootアカウントでMySQLにログイン出来たところで、ここからMySQLの簡単な初期設定を行う。
以下のコマンドを叩きrootアカウントのパスワードを修正する。
コマンドが正常に終了すると「Query OK,」の行が出力される。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'HogeHoge2024!'; Query OK, 0 rows affected (0.01 sec) mysql>
続いてユーザアカウントを作成する。
以下のコマンドを叩き、アカウント名hogehogeとパスワードを設定する。
上記のrootアカウントのパスワード変更と同様に、コマンドが正常に終了すると「Query OK,」の行が出力される。
mysql> CREATE USER 'hogehoge'@'local' IDENTIFIED BY 'OpenBSD58!'; Query OK, 0 rows affected (0.02 sec) mysql>
rootユーザのパスワード変更やユーザアカウントの作成を終えたところでstatusコマンドを叩き、接続しているMySQLサーバの基本的な情報を確認。
MySQLのバージョンや文字セットやMySQLの稼働時間やこれまでに実行されたクエリ等の情報を確認する事が出来る。
mysql> STATUS; -------------- mysql Ver 8.0.38 for Linux on x86_64 (MySQL Community Server - GPL) Connection id: 9 Current database: Current user: root@localhost SSL: Not in use Current pager: less Using outfile: '' Using delimiter: ; Server version: 8.0.38 MySQL Community Server - GPL Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: latin1 Conn. characterset: latin1 UNIX socket: /var/lib/mysql/mysql.sock Binary data as: Hexadecimal Uptime: 21 min 6 sec Threads: 2 Questions: 5 Slow queries: 0 Opens: 119 Flush tables: 3 Open tables: 38 Queries per second avg: 0.075 -------------- mysql>
2.データベースとテーブルの作成と削除
MySQLインストール直後の動作確認の為に簡単なデータベースを作成する。
以下のコマンドを叩きデータベースtestdb01を作成し、続いてSHOW DATABASESコマンドを叩いてデータベースtestdb01が作成された事を確認する。
mysql> CREATE DATABASE testdb01; Query OK, 1 row affected (0.00 sec) mysql> mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | testdb01 | +--------------------+ 5 rows in set (0.00 sec) mysql>
次はテーブルを作成する。
テーブルを作成する前に、テーブルを所属させたいデータベースを選択する。
今回は上記で作成したデータベース testdb01を選択する。
mysql> USE testdb01; Database changed mysql>
そしてテーブルtesttableを作成する。
以下のように所々で改行し設定内容を投入するが、CREATEから ); まで改行せず投入する事も可能である。
テーブルtesttableの作成後、SHOW TABLESコマンドを叩くとデータベースtestdb01内にテーブルtesttableが有る事を確認出来る。
mysql> CREATE TABLE testtable ( -> id INT AUTO_INCREMENT, -> name TEXT, -> PRIMARY KEY (id) -> ); Query OK, 0 rows affected (0.05 sec) mysql> mysql> SHOW TABLES; +--------------------+ | Tables_in_testdb01 | +--------------------+ | testtable | +--------------------+ 1 row in set (0.00 sec) mysql>
作成したテーブルはDROPコマンドを実行する事で削除する事が出来る。
テーブルtesttableの削除後、再度SHOW TABLESコマンドを叩くとテーブルが空っぽである事が確認出来る。
mysql> DROP TABLES testtable; Query OK, 0 rows affected (0.02 sec) mysql> mysql> SHOW TABLES; Empty set (0.01 sec) mysql>
更に、上記で作成したデータベースtestdb01を削除してみる。
データベースtestdb01の削除後、SHOW DATABSESコマンドを叩くとデータベースtestdb01が削除された事が分かる。
mysql> DROP DATABASE testdb01; Query OK, 0 rows affected (0.02 sec) mysql> mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql>
お疲れ様でした。
quitコマンドを叩き、MySQLのCUIから抜ける。
mysql> quit Bye [ec2-user@jpmtkvmsv99 tmp]$
今回はここまで。
VirtualBox上で動作しているAmazon Linux 2023にMySQLのコミュニティ版をバージョン指定でインストールし、MySQLのコマンドを叩いてデータベースとテーブルの作成および削除を実施した。
今のところMySQLに深入りするつもりは無いが参考書を1冊購入した(下記リンク先を参照)。
当ブログの記事として載せる予定は無いが、MySQL本家サイトのドキュメント眺めつつ、購入した参考書の内容に沿ってMySQLの学習を進めたい。
参照サイト
https://www.mysql.com/jp/ MySQL
https://www.mysql.com/jp/products/community/ MySQL Community Edition
https://dev.mysql.com/doc/refman/8.0/en/ MySQL Reference
https://aws.amazon.com/jp/mp/solutions/amazonlinux/ Amazon Linux
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/ec2-lamp-amazon-linux-2023.html チュートリアル: AL2023にLAMPサーバーをインストールする
https://qiita.com/kaburankattara/items/842e2e1758ea00d19553 Linux環境にMySQLサーバを構築する
https://www.amazon.co.jp/dp/4297141841/ MySQL運用・管理[実践]入門
AWS関連の記事
https://debslink.hatenadiary.jp/entry/20180714/1531577869 AWS EC2インスタンスにS3をマウントした際のメモ
https://debslink.hatenadiary.jp/entry/20180804/1533386651 AWS S3バケットの自動マウントのメモ
https://debslink.hatenadiary.jp/entry/20180805/1533400261 AWS EC2インスタンスの自動起動と自動停止
https://debslink.hatenadiary.jp/entry/20180806/1533482143 AWS S3のオブジェクトのライフサイクル設定のメモ
https://debslink.hatenadiary.jp/entry/20180813/1534165966 AWS EC2インスタンスのAMI取得時のメモ
https://debslink.hatenadiary.jp/entry/20240719/1721397056 Amazon Linux 2023をVirtualBoxで動かす