🚀

【データベーススペシャリスト試験対策】MySQL+PHPMyAdmin環境をMacbookで手軽に構築する手順

に公開

MySQL+PHPMyAdmin環境をMacbookでで手軽に構築する手順

データベーススペシャリスト試験対策に
MacBook(Apple Silicon)でMySQLとphpMyAdminのコンテナ環境を構築するためのコードを準備してみました。
Docker Composeを使った構成で、ARM64アーキテクチャに対応しています。

PHPMyAdminとmysqlを脳死で使えるようになるので個人的には便利かも?

石田 先生の
データベーススペシャリスト 完全攻略の教科書+過去問題
のUdemy講座のsampleデータのインポートにも対応できそうな雰囲気です(一応、動作確認済)

GitHubのRepository

詳しくはRepositoryのREADMEに記載済ですが以下の手順で環境をセットアップできます:

クイックスタート手順:

  1. ディレクトリ作成
mkdir mysql-phpmyadmin
cd mysql-phpmyadmin
mkdir mysql_config
  1. ファイル配置

    • docker-compose.yml(1つ目のコード)
    • mysql_config/my.cnf(2つ目のコード)
  2. 環境起動

docker-compose up -d
  1. アクセス

特徴:

  • Apple Silicon対応: ARM64アーキテクチャ指定済み
  • 学習用最適化: データベーススペシャリスト試験に適したサンプルSQL付き
  • 永続化対応: データはボリュームに保存され、コンテナ再起動後も保持
  • 設定カスタマイズ: MySQL設定ファイルで詳細調整可能

提供したサンプルSQLには、試験でよく出題される結合、集約関数、サブクエリ、ウィンドウ関数の練習問題も含まれています。

何かご質問があれば、お気軽にお聞かせください!

前提条件

  • Docker Desktop for Mac がインストール済み
  • Apple Silicon MacBook対応

ディレクトリ構成

mysql-phpmyadmin/
├── docker-compose.yml
├── mysql_config/
│   └── my.cnf
└── README.md

セットアップ手順

1. ディレクトリとファイルの作成

mkdir mysql-phpmyadmin
cd mysql-phpmyadmin

# mysql_configディレクトリを作成
mkdir mysql_config

# docker-compose.ymlとmy.cnfファイルを作成
# (上記のコードをそれぞれのファイルにコピー)

docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    platform: linux/arm64/v8  # M2 Pro対応
    container_name: mysql_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: testdb
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql_config:/etc/mysql/conf.d
    networks:
      - db_network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    platform: linux/arm64/v8  # M2 Pro対応
    container_name: phpmyadmin
    restart: always
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_USER: root
      PMA_PASSWORD: rootpassword
      MYSQL_ROOT_PASSWORD: rootpassword
    ports:
      - "8080:80"
    depends_on:
      - mysql
    networks:
      - db_network

volumes:
  mysql_data:
    driver: local

networks:
  db_network:
    driver: bridge

my.cnf

[mysqld]
# 基本設定
default-storage-engine = InnoDB
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 接続設定
bind-address = 0.0.0.0
port = 3306
max_connections = 100

# パフォーマンス設定
innodb_buffer_pool_size = 128M
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 1

# ログ設定
general_log = 1
general_log_file = /var/lib/mysql/general.log
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2

# セキュリティ設定
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

2. コンテナの起動

# バックグラウンドで起動
docker-compose up -d

# ログを確認
docker-compose logs -f

3. 接続確認

phpMyAdmin(ブラウザ):

MySQL(コマンドライン):

# コンテナ内のMySQLに接続
docker exec -it mysql_db mysql -u root -p

# または外部から接続
mysql -h 127.0.0.1 -P 3306 -u root -p

IPAデータベーススペシャリスト試験用サンプルSQL

データベース作成

-- 試験用データベース作成
CREATE DATABASE IF NOT EXISTS db_specialist_practice
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE db_specialist_practice;

-- 部門テーブル
CREATE TABLE departments (
    dept_id INT PRIMARY KEY AUTO_INCREMENT,
    dept_name VARCHAR(50) NOT NULL,
    location VARCHAR(50)
);

-- 従業員テーブル
CREATE TABLE employees (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(50) NOT NULL,
    dept_id INT,
    salary DECIMAL(10,2),
    hire_date DATE,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

-- プロジェクトテーブル
CREATE TABLE projects (
    project_id INT PRIMARY KEY AUTO_INCREMENT,
    project_name VARCHAR(100) NOT NULL,
    start_date DATE,
    end_date DATE,
    budget DECIMAL(12,2)
);

-- プロジェクト参加テーブル
CREATE TABLE project_assignments (
    assignment_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_id INT,
    project_id INT,
    role VARCHAR(50),
    assigned_date DATE,
    FOREIGN KEY (emp_id) REFERENCES employees(emp_id),
    FOREIGN KEY (project_id) REFERENCES projects(project_id)
);

サンプルデータ投入

-- 部門データ
INSERT INTO departments (dept_name, location) VALUES
('開発部', '東京'),
('営業部', '大阪'),
('人事部', '東京'),
('経理部', '名古屋');

-- 従業員データ
INSERT INTO employees (emp_name, dept_id, salary, hire_date) VALUES
('田中太郎', 1, 500000, '2020-04-01'),
('佐藤花子', 1, 450000, '2021-06-15'),
('鈴木一郎', 2, 400000, '2019-03-10'),
('高橋美咲', 3, 380000, '2022-01-20'),
('山田次郎', 1, 520000, '2018-09-05');

-- プロジェクトデータ
INSERT INTO projects (project_name, start_date, end_date, budget) VALUES
('新システム開発', '2024-01-01', '2024-12-31', 10000000),
('顧客管理システム', '2024-03-01', '2024-09-30', 5000000),
('社内ポータル', '2024-06-01', '2024-11-30', 3000000);

-- プロジェクト参加データ
INSERT INTO project_assignments (emp_id, project_id, role, assigned_date) VALUES
(1, 1, 'プロジェクトマネージャー', '2024-01-01'),
(2, 1, '開発者', '2024-01-15'),
(5, 1, 'アーキテクト', '2024-01-01'),
(1, 2, '開発者', '2024-03-01'),
(2, 3, 'プロジェクトマネージャー', '2024-06-01');

練習用SQL例

-- 集約関数の練習
SELECT dept_name, COUNT(*) as emp_count, AVG(salary) as avg_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY dept_name
HAVING COUNT(*) >= 2;

-- サブクエリの練習
SELECT emp_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- 結合の練習
SELECT e.emp_name, d.dept_name, p.project_name, pa.role
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
JOIN project_assignments pa ON e.emp_id = pa.emp_id
JOIN projects p ON pa.project_id = p.project_id;

-- ウィンドウ関数の練習
SELECT emp_name, salary,
       RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) as salary_rank
FROM employees;

管理コマンド

コンテナの管理

# コンテナの停止
docker-compose stop

# コンテナの再起動
docker-compose restart

# コンテナの完全削除(データも削除)
docker-compose down -v

# ログの確認
docker-compose logs mysql
docker-compose logs phpmyadmin

バックアップとリストア

# データベースのバックアップ
docker exec mysql_db mysqldump -u root -prootpassword --all-databases > backup.sql

# データベースのリストア
docker exec -i mysql_db mysql -u root -prootpassword < backup.sql

設定情報

  • MySQL接続情報:

    • ホスト: localhost (または 127.0.0.1)
    • ポート: 3306
    • ユーザー名: root
    • パスワード: rootpassword
  • phpMyAdmin:

  • テスト用データベース:

    • データベース名: testdb
    • ユーザー名: testuser
    • パスワード: testpass

Discussion