/usr/local/mysql-{version} + 軟鏈接 /usr/local/mysql,數據目錄 /data/mysql/{port}wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.5.50-linux2.6-x86_64.tar.gz tar zxf mysql-5.5.50-linux2.6-x86_64.tar.gz mv mysql-5.5.50-linux2.6-x86_64 /usr/local/mysql-5.5.50 ln -s /usr/local/mysql-5.5.50 /usr/local/mysql
# CentOS/RHEL yum install -y libaio numactl-libs # Ubuntu/Debian apt-get install -y libaio1 libnuma1
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
mkdir -p /data/mysql/3306/{data,logs,tmp}
chown -R mysql:mysql /data/mysql/3306
# 5.6/5.7 通用腳本 /usr/local/mysql/scripts/mysql_install_db \ --basedir=/usr/local/mysql \ --datadir=/data/mysql/3306/data \ --user=mysql
成功標誌:data/ 下生成 mysql、performance_schema、test 目錄及 ibdata1、ib_logfile*。
[client] port = 3306 socket = /data/mysql/3306/tmp/mysql.sock [mysqld] port = 3306 socket = /data/mysql/3306/tmp/mysql.sock pid-file = /data/mysql/3306/logs/mysql.pid basedir = /usr/local/mysql datadir = /data/mysql/3306/data tmpdir = /data/mysql/3306/tmp log-error = /data/mysql/3306/logs/mysql.err slow_query_log = 1 slow_query_log_file = /data/mysql/3306/logs/slow.log long_query_time = 1 log-bin = /data/mysql/3306/logs/mysql-bin binlog_format = ROW server-id = 1 gtid_mode = ON enforce_gtid_consistency = ON character-set-server = utf8mb4 collation-server = utf8mb4_general_ci skip-name-resolve sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION innodb_buffer_pool_size = 4G innodb_log_file_size = 512M innodb_flush_log_at_trx_commit = 2 sync_binlog = 500 max_connections = 2000 open_files_limit = 65535
# 方式一:mysqld_safe 直接啟動 (測試用) /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/3306/my.cnf & # 方式二:systemd 服務單元 (生產標準) cat > /etc/systemd/system/mysqld@.service <<'EOF' [Unit] Description=MySQL Server (%i) After=network.target [Service] Type=forking User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/%i/my.cnf ExecStop=/usr/local/mysql/bin/mysqladmin --defaults-file=/data/mysql/%i/my.cnf shutdown PIDFile=/data/mysql/%i/logs/mysql.pid TimeoutSec=300 Restart=on-failure RestartSec=10 LimitNOFILE=65535 LimitNPROC=65535 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable mysqld@3306 systemctl start mysqld@3306
# 登入 (臨時密碼在 error log 中,5.7+ --initialize 生成)
mysql -uroot -p -S /data/mysql/3306/tmp/mysql.sock
# 刪除匿名、遠程 root、test 庫
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE Host NOT IN ('localhost','127.0.0.1','::1');
DROP DATABASE test;
# 創建管理員
CREATE USER 'dba'@'10.0.0.%' IDENTIFIED BY 'StrongPass!23';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.0.0.%' WITH GRANT OPTION;
# 修改 root 密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'AnotherStrongPass!23';
FLUSH PRIVILEGES;
datadir) 不動basedir 指向新版本mysqld_safe 拉起實例mysql_upgrade 更新系統表# 1. 停止舊實例 systemctl stop mysqld@3306 # 2. 部署新版本二進制包 (如 5.6.32) tar zxf mysql-5.6.32-linux-glibc2.12-x86_64.tar.gz mv mysql-5.6.32 /usr/local/mysql-5.6.32 ln -snf /usr/local/mysql-5.6.32 /usr/local/mysql # 原子切換軟鏈接 # 3. 更新 my.cnf basedir (若未用軟鏈接則需改配置) # 基於軟鏈接部署則無需改動 my.cnf # 4. 以新版本啟動 systemctl start mysqld@3306 # 5. 驗證版本 mysql -uroot -p -S /data/mysql/3306/tmp/mysql.sock -e "SELECT VERSION();" # 應顯示 5.6.32-log # 6. 執行 mysql_upgrade (關鍵!更新 mysql 系統表、performance_schema、sys) /usr/local/mysql/bin/mysql_upgrade -uroot -p -S /data/mysql/3306/tmp/mysql.sock # 輸出所有表 OK,最後顯示 "OK" 表示成功 # 7. 二次驗證 /usr/local/mysql/bin/mysql_upgrade -uroot -p -S /data/mysql/3306/tmp/mysql.sock # 提示 "This installation of MySQL is already upgraded to 5.6.32"
mysql_upgrade 會鎖表,建議低峰期執行,大庫預留時間sql_mode 默認變化 (5.7 嚴格模式默認開啟,應用可能報錯)mysql.proc 表等,需提前適配/data/mysql/ ├── 3306/ # 核心交易實例 │ ├── data/, logs/, tmp/, my.cnf ├── 3307/ # 報表/只讀實例 │ ├── data/, logs/, tmp/, my.cnf ├── 3308/ # 歸檔/備份實例 │ ├── data/, logs/, tmp/, my.cnf
[mysqld] port = 3307 socket = /data/mysql/3307/tmp/mysql.sock pid-file = /data/mysql/3307/logs/mysql.pid datadir = /data/mysql/3307/data tmpdir = /data/mysql/3307/tmp log-error = /data/mysql/3307/logs/mysql.err log-bin = /data/mysql/3307/logs/mysql-bin server-id = 2 innodb_buffer_pool_size = 8G # 視機器內存分配 # 其他參數同 3306 模板
mysql -uroot -p -S /data/mysql/3307/tmp/mysql.sock # 同單實例:刪匿名、禁遠程 root、改密碼、建業務用戶、授最小權限
# 為 3306 實例限制 CPU 80%、內存 32G cgcreate -g cpu,memory:mysql_3306 echo 80000 > /sys/fs/cgroup/cpu/mysql_3306/cpu.cfs_quota_us echo 100000 > /sys/fs/cgroup/cpu/mysql_3306/cpu.cfs_period_us echo 34359738368 > /sys/fs/cgroup/memory/mysql_3306/memory.limit_in_bytes # 啟動服務加入 cgroup (systemd 服務單元添加) # ControlGroup=cpu,memory:mysql_3306
| 類別 | 檢查項 | 驗證命令/標準 |
|---|---|---|
| 二進制包 | 版本一致性、軟鏈接指向正確 | ls -l /usr/local/mysql、mysql -V |
| 目錄權限 | datadir/logs/tmp 屬主 mysql:mysql | ls -ld /data/mysql/3306/data |
| 配置文件 | my.cnf 權限 600、關鍵參數生效 | stat /data/mysql/3306/my.cnf、mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';" |
| 服務管理 | systemd 單元啟用、開機自啟 | systemctl is-enabled mysqld@3306 |
| 安全 | 無匿名用戶、root 僅本地、強密碼、最小權限 | mysql -e "SELECT User,Host FROM mysql.user;" |
| 字符集 | 庫/表/連接均為 utf8mb4 | SHOW VARIABLES LIKE 'character_set%'; |
| 複制 | GTID 模式、server-id 唯一、Binlog ROW 格式 | SHOW VARIABLES LIKE 'gtid_mode'; |
| 監控 | 慢查詢開啟、長查詢閾值 1s、錯誤日志輪轉 | ls -lh /data/mysql/3306/logs/ |
| 備份 | 每日全量 + 定期增量、異地存儲、恢復演練 | 備份腳本、恢復演練記錄 |
| 多實例 | 端口/目錄/Server-ID 隔離、資源限制生效 | netstat -lntup | grep 330 |
掌握這套體系,從單節點到百實例集群,部署運維都能做到有章可循、有據可查、有備無患。