一、安裝方式選型
| 方式 | 優點 | 缺點 | 適用場景 |
| 官方 RPM/YUM (dnf) | 版本新、依賴自動解決、systemd 集成、易升級 | 需配置官方源 | 生產環境首選 |
| 系統默認源 (mariadb) | 零配置安裝 | 版本舊、非 Oracle MySQL、功能差異 | 測試/非關鍵業務 |
| 二進制通用包 | 無依賴、可多版本共存、可自定義安裝路徑 | 需手動配置 systemd、初始化、權限、啟動腳本 | 離線環境/多實例/舊版本相容 |
| 源碼編譯 | 極致優化、自定義特性 | 耗時、依賴複雜、升級困難 | 極少數特殊需求 |
| Docker / Podman | 隔離、遷移快、版本鎖定、CI/CD 友好 | 持久化/網絡/性能調優需容器化經驗 | 雲原生/微服務/開發測試 |
二、官方 YUM 源安裝 MySQL 8.0 實戰 (CentOS 7/8, Rocky, Alma)
1. 配置官方源
# 下載並安裝源配置包
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm # el7 適用 CentOS 7/Rocky 8
# 或 el8 包
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
# 驗證源啟用
yum repolist enabled | grep mysql
2. 安裝服務端與客戶端
dnf install -y mysql-community-server mysql-community-client
# 或 yum install -y ...
3. 初始化與啟動
systemctl enable --now mysqld
# 首次啟動會自動執行 --initialize-insecure (生成隨機 root 密碼在錯誤日誌)
# 查看臨時密碼
grep 'temporary password' /var/log/mysqld.log
4. 安全初始化 (務必執行)
mysql_secure_installation
# 按提示:設置 root 強密碼、移除匿名用戶、禁止遠程 root、移除 test 庫、重載權限
三、關鍵目錄結構速查
| 用途 | 默認路徑 | 說明 |
| 數據目錄 | /var/lib/mysql | 核心資產,備份重點保護 |
| 主配置文件 | /etc/my.cnf | 或 /etc/mysql/my.cnf,包含 [mysqld] 等段 |
| 補充配置目錄 | /etc/my.cnf.d/ | 模塊化配置,推薦業務配置放這裡 |
| 啟動腳本/服務 | /usr/lib/systemd/system/mysqld.service | systemd 管理單元 |
| 二進制文件 | /usr/bin/ (mysql, mysqldump, mysqladmin...) | 客戶端工具 |
| 錯誤日誌 | /var/log/mysqld.log | 由 log-error 參數控制 |
| Socket 文件 | /var/lib/mysql/mysql.sock | 本地連接用 |
| PID 文件 | /var/run/mysqld/mysqld.pid | 進程 ID |
四、核心配置模板 (/etc/my.cnf.d/custom.cnf)
[mysqld]
# 基礎
port = 3306
bind_address = 0.0.0.0
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
pid_file = /var/run/mysqld/mysqld.pid
# 字符集 (全鏈路 utf8mb4)
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci
skip_character_set_client_handshake = ON
# InnoDB 核心 (按機器內存調整,假設 16G 內存)
innodb_buffer_pool_size = 10G # 物理內存 60-70%
innodb_log_file_size = 1G # 總 redo log 容量,大減少 checkpoint 壓力
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1 # 生產庫堅持 1,從庫可 2
innodb_flush_method = O_DIRECT # 避免雙緩衝
innodb_file_per_table = ON
innodb_io_capacity = 2000 # SSD 建議 2000-5000,NVMe 更高
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 連接與線程
max_connections = 2000
thread_cache_size = 64
back_log = 1024
# 日誌
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL
expire_logs_days = 7
max_binlog_size = 1G
sync_binlog = 1 # 生產庫堅持 1
log_error = /var/log/mysqld.log
slow_query_log = 1
slow_query_log_file = /var/log/slow.log
long_query_time = 1
log_queries_not_using_indexes = 0
log_slow_admin_statements = 0
log_throttle_queries_not_using_indexes = 60
# 其他
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
explicit_defaults_for_timestamp = ON
skip_name_resolve = ON # 禁用 DNS 反解,加速連接
五、基礎運維操作速查表
| 操作 | 命令 |
| 啟動/停止/重啟/狀態 | systemctl start|stop|restart|status mysqld |
| 開機自啟 | systemctl enable mysqld |
| 登錄 | mysql -u root -p (本地 Socket) / mysql -h 127.0.0.1 -P 3306 -u root -p (TCP) |
| 修改密碼 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!'; FLUSH PRIVILEGES; |
| 建庫建表 | CREATE DATABASE db CHARSET utf8mb4; CREATE TABLE t (id INT PRIMARY KEY) ENGINE=InnoDB; |
| 備份 (邏輯) | mysqldump -uroot -p --single-transaction --master-data=2 --routines --triggers --events --all-databases > /backup/full_$(date +%F).sql |
| 恢復 | mysql -uroot -p < /backup/full_2023-10-01.sql |
| 查看進程 | SHOW PROCESSLIST; / SHOW FULL PROCESSLIST; |
| 查看主從狀態 | SHOW SLAVE STATUS\G / SHOW REPLICA STATUS\G (8.0.22+) |
| 查看配置生效值 | SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; |
六、常見避坑指南
- SELinux:
setsebool -P mysql_connect_any 1,數據目錄非默認路徑需 semanage fcontext -a -t mysqld_db_t "/new_datadir(/.*)?" + restorecon -R /new_datadir。
- 防火牆:
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload。
- 大頁內存:內存 > 64G 且高併發可開啟
large_pages=ON,需 OS 配置 HugePages。
- 時區:
default_time_zone = '+08:00' 或系統 timedatectl set-timezone Asia/Shanghai。
- 定期 ANALYZE TABLE:維護統計信息,防止執行計劃劣化。