MySQL 8 のインストール,テーブル定義,レコード挿入(Ubuntu 上)

MySQL は,オープンソースのリレーショナルデータベース管理システムである. このページでは,Ubuntu 上での MySQL のインストール,初期セキュリティ設定,テーブル定義とレコード挿入の手順を説明する.

目次

  1. 事前に決めておく事項
  2. 前準備
  3. MySQL のインストール(Ubuntu 24.04, Ubuntu 26.04 上)
  4. MySQL のバージョンの確認
  5. MySQL サーバの起動と終了
  6. MySQL root ユーザのパスワードの設定と変更
  7. テーブル定義とレコード挿入

事前に決めておく事項

前準備

Ubuntu のシステム更新

Ubuntu で OS のシステム更新を行うときは, 端末で,次のコマンドを実行する.これは,パッケージ情報を最新の状態に保ち,インストール済みのパッケージをセキュリティアップデートやバグ修正を含めて更新するためである.

Ubuntu のインストールはこちらの別ページで説明する.
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# カーネル更新等で実際に再起動が必要な場合のみ実行
# sudo shutdown -r now

MySQL のインストール(Ubuntu 24.04, Ubuntu 26.04 上)

Ubuntu の公式リポジトリが提供する MySQL のバージョンは,Ubuntu のリリースにより異なる. Ubuntu 24.04 LTS では MySQL 8.0,Ubuntu 26.04 LTS では MySQL 8.4 である. どちらも,このページで説明する手順と SQL がそのまま使用できる.
  1. 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-mysqldb
    
    Python から MySQL を扱う別の選択肢として,Oracle 公式のドライバである python3-mysql.connector パッケージがある.
  2. 確認のため,MySQL サーバを再起動する.

    エラーメッセージが出ず,active (running) と表示されれば正常である.

    sudo systemctl restart mysql
    systemctl status mysql
    
  3. MySQL のサービスアカウントの確認

    MySQL サーバのプロセスは,Linux 上の mysql アカウントの権限で動作する. 次のコマンドで確認する.

    sudo cat /etc/passwd | grep mysql
    
    第 2 フィールドの「x」は,パスワードが /etc/shadow に格納されていることを示す.

    サービスアカウントは Linux が管理するアカウントである.MySQL が管理するアカウントとは別のものである.

  4. データベースディレクトリの確認

    データベースの実体は /var/lib/mysql に置かれる.

    sudo ls -la /var/lib/mysql
    
  5. セキュリティ設定
    1. 「sudo mysql_secure_installation」の実行
      sudo mysql_secure_installation
      
    2. パスワード検証コンポーネント(validate_password)をインストールする.

      y」, Enter キー

    3. パスワード検証ポリシーを,0(LOW: 8 文字以上),1(MEDIUM: 8 文字以上,数字・大小文字・記号を含む),2(STRONG: MEDIUM に加え辞書ファイルによる検査)から選ぶ.
    4. MySQL root ユーザのパスワードを設定する.
      選んだポリシーを満たすパスワードを設定する.パスワードは,必ず独自に設定すること.
    5. パスワードの強度が表示されるので確認する.

      y」, Enter キー

    6. 匿名の MySQL ユーザを削除する.

      y」, Enter キー

    7. MySQL root ユーザでの,リモートからのログインを禁止する.

      y」, Enter キー

    8. テストデータベースを削除する.

      y」, Enter キー

    9. 権限テーブルを再読み込みし,設定を直ちに反映させる.

      y」, Enter キー

    10. 終了の確認
  6. 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 ユーザのパスワードの設定と変更

パスワードには,英文字,数字,記号を使う.日本語は使わない

  1. MySQL が稼働した状態にする.
  2. 端末で,次のコマンドを実行し,MySQL に接続する.
    sudo mysql
    
  3. パスワードを設定または変更するときは,MySQL のプロンプトで次の SQL を実行する. ALTER USER により,認証プラグインをパスワード認証(caching_sha2_password)に変更し,同時にパスワードを設定している.
    alter user 'root'@'localhost' identified with caching_sha2_password by '(新しいパスワード)';
    flush privileges;
    exit
    
  4. 設定したパスワードでの接続を確認する.「-p」を付けると,パスワードの入力が求められる.
    mysql -u root -p
    
    auth_socket による認証に戻すときは,「sudo mysql」で接続し,次の SQL を実行する.
    alter user 'root'@'localhost' identified with auth_socket;
    flush privileges;
    

テーブル定義とレコード挿入

  1. 「sudo mysql -D mysql」により MySQL に接続する.

    -D mysql」は,使用するデータベースを mysql に設定するオプションである.

    sudo mysql -D mysql
    
  2. 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 ) );
    
  3. 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;
    
  4. 確認表示
    select * from order_records;
    
  5. 更新し確認表示

    updated_at の値が更新時刻に変わることを確認する.

    start transaction;
    update order_records set unit_price = 11.2 where id = 1;
    commit;
    select * from order_records;
    
  6. テーブル一覧の表示
    show tables;
    
  7. 「exit」で終了する.
    exit