雖然 apt install mysql-server 最便捷,但特定版本需求、客製化編譯參數、學習內部機制時,原始碼編譯安裝不可或缺。本文記錄 Ubuntu 20.04/22.04 編譯安裝 MySQL 8.0 完整流程。
# 更新套件索引 sudo apt update # 安裝編譯工具鏈與依賴 sudo apt install -y \ build-essential cmake \ libncurses5-dev libssl-dev \ libreadline-dev libaio-dev \ libmecab-dev liblz4-dev \ libzstd-dev libprotobuf-dev \ protobuf-compiler \ bison flex \ pkg-config \ git
# 系統使用者 (無登入殼層)
sudo groupadd -r mysql
sudo useradd -r -g mysql -s /bin/false -M mysql
# 目錄規劃
sudo mkdir -p /usr/local/mysql/{data,log,tmp,run}
sudo chown -R mysql:mysql /usr/local/mysql
# 下載 (官網或 GitHub) cd /usr/local/src wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36.tar.gz tar xzf mysql-8.0.36.tar.gz cd mysql-8.0.36 # 建構目錄 (out-of-source build) mkdir build && cd build # CMake 配置 (關鍵參數) cmake .. \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/etc \ -DWITH_INNODB=ON \ -DWITH_PARTITION_STORAGE_ENGINE=ON \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LZ4=system \ -DWITH_ZSTD=system \ -DWITH_PROTOBUF=system \ -DENABLED_LOCAL_INFILE=ON \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ -DWITH_DEBUG=OFF \ -DCMAKE_BUILD_TYPE=Release # 編譯 (依 CPU 核心數調整 -j) make -j$(nproc) # 安裝 sudo make install
cd /usr/local/mysql # 初始化 (產生臨時 root 密碼) sudo bin/mysqld --initialize --user=mysql \ --datadir=/usr/local/mysql/data \ --basedir=/usr/local/mysql # 記下輸出的臨時密碼:[Note] A temporary password is generated for root@localhost: xxxx # 配置檔 sudo tee /etc/my.cnf <<'EOF' [mysqld] basedir = /usr/local/mysql datadir = /usr/local/mysql/data socket = /usr/local/mysql/run/mysql.sock pid-file = /usr/local/mysql/run/mysqld.pid log-error = /usr/local/mysql/log/error.log slow_query_log_file = /usr/local/mysql/log/slow.log tmpdir = /usr/local/mysql/tmp port = 3306 bind-address = 0.0.0.0 default-storage-engine = InnoDB character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci innodb_buffer_pool_size = 1G innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 innodb_file_per_table = ON max_connections = 500 table_open_cache = 4000 [client] socket = /usr/local/mysql/run/mysql.sock default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 EOF
# 建立 systemd 服務單元 sudo tee /etc/systemd/system/mysql.service <<'EOF' [Unit] Description=MySQL Community Server After=network.target [Service] Type=forking User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf ExecStop=/usr/local/mysql/bin/mysqladmin shutdown --defaults-file=/etc/my.cnf PIDFile=/usr/local/mysql/run/mysqld.pid TimeoutSec=300 Restart=on-failure LimitNOFILE=65535 [Install] WantedBy=multi-user.target EOF # 重載 systemd、啟用開機自動啟動、啟動服務 sudo systemctl daemon-reload sudo systemctl enable mysql sudo systemctl start mysql # 驗證 systemctl status mysql /usr/local/mysql/bin/mysql -u root -p # 輸入臨時密碼,首次登入需修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!'; -- 或執行安全精靈 /usr/local/mysql/bin/mysql_secure_installation
| 錯誤 | 解決 |
|---|---|
| CMake 找不到 OpenSSL | apt install libssl-dev、確認 pkg-config --libs openssl |
| mecab 缺失 | apt install libmecab-dev 或 -DWITH_MECAB=OFF |
| Boost 版本不符 | MySQL 8.0 內建 Boost,無需外部安裝 |
| 權限錯誤 | 確認 datadir/log/tmp/run 擁有者為 mysql:mysql |
| socket 連線失敗 | client/my.cnf 指定正確 socket 路徑 |
原始碼編譯安裝耗時較長但彈性最高。生產環境建議使用官方預編譯二進位包或套件管理器,僅在特殊需求時編譯。