萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

RHEL 6 / Oracle Linux 6 安裝 MySQL 5.6/5.7/8.0 完整實戰手冊:RPM 部署、系統優化與安全加固

從 RPM 包到生產就緒的標準化交付流程

RHEL 6 及兼容發行版 (Oracle Linux 6, CentOS 6) 雖已進入維護支持階段 (ELS),但大量存量系統仍在運行。本文提供 MySQL 官方 RPM 部署全流程,含依賴解決、系統內核調優、安全基線、多實例架構、升級遷移路徑。

前置條件與依賴解決

# 1. 卸載系統自帶 mariadb/mysql (避免衝突)
rpm -qa | grep -i mariadb | xargs rpm -e --nodeps
rpm -qa | grep -i mysql | xargs rpm -e --nodeps

# 2. 安裝依賴 (官方 RPM 依賴 libaio, numactl, libnsl)
yum install -y libaio numactl libnsl libncurses5* compat-openssl10

# 3. 關閉 SELinux (或設置 permissive) — 生產建議 Enforcing + 定製策略
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# 4. 關閉防火牆或放行 3306 (生產請用 firewalld 精細控制)
systemctl stop iptables 2>/dev/null; systemctl stop firewalld 2>/dev/null

官方 RPM Bundle 下載與安裝

# 1. 下載 (以 MySQL 5.7 為例,8.0 需 glibc 2.17+,RHEL 6 glibc 2.12 不支持 8.0)
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/MySQL-5.7.44-1.el6.x86_64.rpm-bundle.tar

# 2. 解壓
tar -xf MySQL-5.7.44-1.el6.x86_64.rpm-bundle.tar

# 3. 安裝順序關鍵:common → libs → client → server
rpm -ivh mysql-community-common-5.7.44-1.el6.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.44-1.el6.x86_64.rpm
rpm -ivh mysql-community-client-5.7.44-1.el6.x86_64.rpm
rpm -ivh mysql-community-server-5.7.44-1.el6.x86_64.rpm

# 4. 驗證安裝
rpm -qa | grep mysql-community
mysqld --version

系統級性能調優 (必做)

# 1. 內核參數 /etc/sysctl.conf
vm.swappiness = 1                    # 避免 swap,MySQL 管理內存
vm.dirty_ratio = 80
vm.dirty_background_ratio = 10
fs.file-max = 1000000
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
kernel.sem = 250 32000 100 128

sysctl -p

# 2. 文件句柄限制 /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535

# 3. 透明大頁 (THP) 關閉 — 關鍵!避免內存抖動導致延遲尖峰
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 加入 /etc/rc.local 永久生效

# 4. NUMA 綁定 (多插槽服務器)
numactl --interleave=all mysqld_safe ...  # 或 my.cnf: innodb_numa_interleave=ON

MySQL 基線配置 /etc/my.cnf (生產模板)

[mysqld]
# 基礎
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
server_id=101
log_error=/var/log/mysqld.log
pid_file=/var/run/mysqld/mysqld.pid
user=mysql
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
skip_name_resolve=1
explicit_defaults_for_timestamp=1

# 連接與線程
max_connections=2000
thread_cache_size=100
back_log=500
max_connect_errors=1000000

# InnoDB 核心 (假設 32GB 內存,預留 8GB OS)
innodb_buffer_pool_size=20G
innodb_buffer_pool_instances=16
innodb_log_file_size=2G
innodb_log_files_in_group=3
innodb_log_buffer_size=256M
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
innodb_file_per_table=1
innodb_io_capacity=2000
innodb_io_capacity_max=4000
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_purge_threads=4
innodb_adaptive_hash_index=1
innodb_adaptive_flushing=1
innodb_flush_neighbors=0

# 安全與審計
local_infile=0
secure_file_priv=/tmp
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# 慢查詢與二進制日志
slow_query_log=1
slow_query_log_file=/var/log/mysql_slow.log
long_query_time=1
log_queries_not_using_indexes=1
log_bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
sync_binlog=1
gtid_mode=ON
enforce_gtid_consistency=1
master_info_repository=TABLE
relay_log_info_repository=TABLE

# 客戶端
[client]
default_character_set=utf8mb4
port=3306
socket=/var/lib/mysql/mysql.sock

初始化、啟動與安全加固

# 1. 初始化數據目錄 (5.7+ 自動初始化,8.0 需 --initialize-insecure)
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql

# 2. 啟動服務
systemctl start mysqld
systemctl enable mysqld

# 3. 獲取臨時 root 密碼 (5.7+)
grep 'temporary password' /var/log/mysqld.log

# 4. 安全加固腳本 (交互式)
mysql_secure_installation
# - 設置 root 強密碼
# - 移除匿名用戶
# - 禁止 root 遠程登錄
# - 移除 test 數據庫
# - 重新加載權限表

# 5. 驗證
mysql -uroot -p -e "SELECT VERSION(); SHOW GLOBAL VARIABLES LIKE 'validate_password%';"

多實例部署架構 (單機多 Port 隔離業務)

# 實例 1: 3306 (核心交易)
# 實例 2: 3307 (數倉/報表)
# 實例 3: 3308 (測試/開發)

# 每實例獨立:datadir、socket、port、pid_file、log_error、my.cnf (include 共享基線)
# systemd 多實例: systemctl start mysqld@3306 mysqld@3307
# /etc/systemd/system/mysqld@.service 包含 EnvironmentFile=-/etc/my%d.cnf

升級遷移路徑 (RHEL 6 → RHEL 8/9 + MySQL 8.0)

  1. 建立 RHEL 8/9 新環境,安裝 MySQL 8.0 (glibc 2.28+ 支持)。
  2. 使用 mysqldump --single-transaction --set-gtid-purged=OFF --routines --triggers --events --all-databases 導出邏輯備份。
  3. 新實例導入,運行 mysql_upgrade (8.0 自動執行)。
  4. 應用端兼容性測試:caching_sha2_password 驅動升級、SQL_MODE 變更、保留字衝突。
  5. 灰度切流:只讀流量先切、驗證無誤後切寫入、保留回滾窗口 48h。

標準化部署、基線配置、自動化巡檢、版本生命週期管理 —— 這才是企業級 MySQL 運維的正確姿勢。

copyright © 萬盛學電腦網 all rights reserved