MySQL 8 のインストール,テーブル定義,レコード挿入(Ubuntu 上)
【目次】
事前に決めておく事項
- MySQL root ユーザパスワード
MySQL のデータベース管理者は,データベースへのあらゆる操作を許されたユーザである. そのユーザ名は root である. パスワードには,英文字,数字,記号を使う.日本語は使わない.
前準備
Ubuntu のシステム更新
Ubuntu で OS のシステム更新を行うときは, 端末で,次のコマンドを実行する.これは,パッケージ情報を最新の状態に保ち,インストール済みのパッケージをセキュリティアップデートやバグ修正を含めて更新するためである.
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# カーネル更新等で実際に再起動が必要な場合のみ実行
# sudo shutdown -r now
MySQL のインストール(Ubuntu 24.04, Ubuntu 26.04 上)
- MySQL および関連ソフトウェア類のインストール
インストールするには,端末で,次のコマンドを実行する. python3-mysqldb は,Ubuntu の標準の Python(Ubuntu 24.04 では Python 3.12,Ubuntu 26.04 では Python 3.14)から MySQL を操作するためのパッケージである.
# パッケージリストの情報を更新 sudo apt update sudo apt -y install mysql-client mysql-server python3-mysqldbPython から MySQL を扱う別の選択肢として,Oracle 公式のドライバである python3-mysql.connector パッケージがある. - 確認のため,MySQL サーバを再起動する.
エラーメッセージが出ず,active (running) と表示されれば正常である.
sudo systemctl restart mysql systemctl status mysql
- MySQL のサービスアカウントの確認
MySQL サーバのプロセスは,Linux 上の mysql アカウントの権限で動作する. 次のコマンドで確認する.
sudo cat /etc/passwd | grep mysql
第 2 フィールドの「x」は,パスワードが /etc/shadow に格納されていることを示す.サービスアカウントは Linux が管理するアカウントである.MySQL が管理するアカウントとは別のものである.
- データベースディレクトリの確認
データベースの実体は /var/lib/mysql に置かれる.
sudo ls -la /var/lib/mysql
- セキュリティ設定
- 「sudo mysql_secure_installation」の実行
sudo mysql_secure_installation
- パスワード検証コンポーネント(validate_password)をインストールする.
「y」, Enter キー
- パスワード検証ポリシーを,0(LOW: 8 文字以上),1(MEDIUM: 8 文字以上,数字・大小文字・記号を含む),2(STRONG: MEDIUM に加え辞書ファイルによる検査)から選ぶ.
- MySQL root ユーザのパスワードを設定する.
選んだポリシーを満たすパスワードを設定する.パスワードは,必ず独自に設定すること.
- パスワードの強度が表示されるので確認する.
「y」, Enter キー
- 匿名の MySQL ユーザを削除する.
「y」, Enter キー
- MySQL root ユーザでの,リモートからのログインを禁止する.
「y」, Enter キー
- テストデータベースを削除する.
「y」, Enter キー
- 権限テーブルを再読み込みし,設定を直ちに反映させる.
「y」, Enter キー
- 終了の確認
- 「sudo mysql_secure_installation」の実行
- MySQL の動作確認
端末で「sudo mysql」を実行する. 「status」により,MySQL root ユーザで接続していること,そして 使用中のデータベースが無いことを確認する.
sudo mysql status show databases; exit
Ubuntu の MySQL では,root@localhost の認証に auth_socket プラグインが使用される. これは,Linux 側のユーザ名が root であることをもって認証する方式である. そのため「sudo mysql」ではパスワードの入力を求められない.これは正常な動作である.
MySQL のバージョンの確認
端末で,次のコマンドを実行する.
mysql --version
sudo mysqladmin version
MySQL サーバの起動と終了
MySQL サーバの再起動
sudo systemctl restart mysql
systemctl status mysql
MySQL サーバの終了
sudo systemctl stop mysql
systemctl status mysql
MySQL root ユーザのパスワードの設定と変更
パスワードには,英文字,数字,記号を使う.日本語は使わない.
- MySQL が稼働した状態にする.
- 端末で,次のコマンドを実行し,MySQL に接続する.
sudo mysql - パスワードを設定または変更するときは,MySQL のプロンプトで次の SQL を実行する.
ALTER USER により,認証プラグインをパスワード認証(caching_sha2_password)に変更し,同時にパスワードを設定している.
alter user 'root'@'localhost' identified with caching_sha2_password by '(新しいパスワード)'; flush privileges; exit - 設定したパスワードでの接続を確認する.「-p」を付けると,パスワードの入力が求められる.
mysql -u root -pauth_socket による認証に戻すときは,「sudo mysql」で接続し,次の SQL を実行する.alter user 'root'@'localhost' identified with auth_socket; flush privileges;
テーブル定義とレコード挿入
- 「sudo mysql -D mysql」により MySQL に接続する.
「-D mysql」は,使用するデータベースを mysql に設定するオプションである.
sudo mysql -D mysql
- SQL を用いたテーブル定義
MySQL では,バージョン 8.0.16 以降で CHECK 制約が実際に検査される.
create table order_records ( id integer primary key not null, year integer not null CHECK ( year > 2008 ), month integer not null CHECK ( month >= 1 AND month <= 12 ), day integer not null CHECK ( day >= 1 AND day <= 31 ), customer_name text not null, product_name text not null, unit_price real not null check ( unit_price > 0 ), qty integer not null default 1 check ( qty > 0 ), created_at timestamp not null default current_timestamp, updated_at timestamp not null default current_timestamp on update current_timestamp, check ( ( unit_price * qty ) < 200000 ) );
- SQL を用いたレコード挿入
start transaction から commit までが 1 つのトランザクションとなる.
start transaction; insert into order_records (id, year, month, day, customer_name, product_name, unit_price, qty) values( 1, 2023, 7, 26, 'kaneko', 'orange A', 1.2, 10 ); insert into order_records (id, year, month, day, customer_name, product_name, unit_price, qty) values( 2, 2023, 7, 26, 'miyamoto', 'Apple M', 2.5, 2 ); insert into order_records (id, year, month, day, customer_name, product_name, unit_price, qty) values( 3, 2023, 7, 27, 'kaneko', 'orange B', 1.2, 8 ); insert into order_records (id, year, month, day, customer_name, product_name, unit_price) values( 4, 2023, 7, 28, 'miyamoto', 'Apple L', 3 ); commit;
- 確認表示
select * from order_records;
- 更新し確認表示
updated_at の値が更新時刻に変わることを確認する.
start transaction; update order_records set unit_price = 11.2 where id = 1; commit; select * from order_records;
- テーブル一覧の表示
show tables;
- 「exit」で終了する.
exit