手動編譯安裝 MySQL 在百台級集群不可行。本文提供「自建 RPM + 模板化配置 + 數據目錄預備 + Shell 自動化」四位一體的標準化交付方案,實現從裸機到就緒可用的全自動部署。
wget https://downloads.mysql.com/archives/get/file/mysql-5.6.16.tar.gzmysql.spec 關鍵段:Name: mysql
Version: 5.6.16
Release: guahao
License: GPL
Group: Applications/Databases
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: cmake
Packager: dba@company.com
Prefix: /opt/mysql
Summary: MySQL 5.6.16 Enterprise Build
%description
Custom MySQL build with InnoDB, Partition, Performance Schema, SSL, UTF8MB4.
%define MYSQL_USER mysql
%define MYSQL_GROUP mysql
%define __os_install_post %{nil}
%build
cd $OLDPWD/..
export CFLAGS="-O3 -g -fno-exceptions -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing"
export CXX=g++
export CXXFLAGS="-O3 -g -fno-exceptions -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing"
cmake . \
-DSYSCONFDIR:PATH=%{prefix} \
-DCMAKE_INSTALL_PREFIX:PATH=%{prefix} \
-DCMAKE_BUILD_TYPE:STRING=Release \
-DENABLE_PROFILING:BOOL=ON \
-DWITH_DEBUG:BOOL=OFF \
-DWITH_VALGRIND:BOOL=OFF \
-DENABLE_DEBUG_SYNC:BOOL=OFF \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_SSL:STRING=bundled \
-DWITH_UNIT_TESTS:BOOL=OFF \
-DWITH_ZLIB:STRING=bundled \
-DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON \
-DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON \
-DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON \
-DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON \
-DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE:BOOL=ON \
-DWITH_EMBEDDED_SERVER=0 \
-DINSTALL_LAYOUT:STRING=STANDALONE \
-DCOMMUNITY_BUILD:BOOL=ON \
-DMYSQL_SERVER_SUFFIX='-ent'
make -j$(grep -c processor /proc/cpuinfo)
%install
cd $OLDPWD/..
make DESTDIR=$RPM_BUILD_ROOT install
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})
%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) %{prefix}/*
%post
ln -sf %{prefix}/lib %{prefix}/lib64
%changelog
rpmbuild -bb ./mysql.spec → 產出 mysql-5.6.16-guahao.x86_64.rpm。my.cnf(關鍵參數佔位符)[mysqld_safe] pid-file=/opt/mysql/run/mysqld.pid [mysql] prompt=\\u@\\d \\r:\\m:\\s> default-character-set=gbk no-auto-rehash [client] socket=/opt/mysql/run/mysql.sock [mysqld] basedir=/opt/mysql datadir=/data/mysql/data tmpdir=/data/mysql/tmp log-error=/data/mysql/log/alert.log slow_query_log_file=/data/mysql/log/slow.log general_log_file=/data/mysql/log/general.log socket=/opt/mysql/run/mysql.sock # InnoDB 核心參數(按實例內存 60-70% 設定 buffer_pool) innodb_buffer_pool_size=10G innodb_buffer_pool_instances=4 innodb_log_file_size=1G innodb_log_files_in_group=4 innodb_flush_log_at_trx_commit=1 innodb_file_per_table=1 innodb_flush_method=O_DIRECT transaction-isolation=READ-COMMITTED # Replication log-bin=/data/mysql/log/mysql-bin server_id=__SERVER_ID__ # 部署腳本動態替換 binlog_format=ROW sync_binlog=1000 expire_logs_days=7 gtid_mode=ON enforce_gtid_consistency=ON # 安全與連接 skip-name-resolve max_connections=4500 max_allowed_packet=128M open_files_limit=65536 # 其他參數略...
關鍵點:server_id=__SERVER_ID__ 留作佔位符,部署時用時間戳/IP 尾數生成全局唯一 ID。
mysql_secure_installation、創建監控帳號、安裝審計插件。tar -czf /tmp/mysql_datadir_template.tar.gz -C /data/mysql data log tmpmysql_install_db。mysql_install.sh#!/bin/bash set -euo pipefail # 1. 系統依賴 yum install -y cmake gcc gcc-c++ bison ncurses-devel zlib-devel openssl-devel # 2. 用戶 id mysql &>/dev/null || groupadd mysql id mysql &>/dev/null || useradd -g mysql -s /sbin/nologin -d /opt/mysql mysql # 3. 從內部 FTP 拉取製品 ftp -n </opt/mysql/my.cnf chown -R mysql:mysql /opt/mysql # 6. 部署數據目錄 tar -xzf mysql_datadir_template.tar.gz -C /data chown -R mysql:mysql /data/mysql # 7. 註冊服務並啟動 cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld chkconfig mysqld on service mysqld start # 8. 驗證 sleep 5 /opt/mysql/bin/mysql -uroot -p'initpass' -e "SELECT VERSION(); SHOW VARIABLES LIKE 'server_id';" echo "MySQL deployed successfully on $(hostname) with server_id=${UNIQUE_ID}"
server_id 通過 inventory 變量下發。innodb_buffer_pool_size 等參數。pt-query-digest --test、mysqlslap 煙測,納入交付驗收標準。標準化交付鏈路:源碼 → RPM → 模板 → 腳本 → 平台,讓 MySQL 部署從「手工藝」進化為「工業化產品」。