在现代化的运维工作中,数据库的高效部署与管理是保障业务稳定运行的关键,MySQL作为全球最受欢迎的开源关系型数据库之一,其自动化安装部署能够显著提升部署效率、减少人为错误,并实现标准化配置,本文将详细介绍几种主流的MySQL自动化安装部署方法,包括基于Shell脚本、Ansible以及Docker的实践方案,并附上关键配置与注意事项,帮助读者快速构建可靠的MySQL自动化部署体系。

基于Shell脚本的自动化安装部署
Shell脚本是实现MySQL自动化安装部署最直接的方式,尤其适用于Linux环境下的批量部署,其核心思路是通过预定义的脚本文件,自动完成依赖安装、用户创建、配置文件生成、服务启动等步骤。
环境准备与依赖安装
在编写脚本前,需确保系统满足MySQL的运行环境要求,如操作系统版本(推荐CentOS 7+/Ubuntu 18.04+)、内核参数调整等,以CentOS为例,首先更新系统并安装必要的依赖包:
#!/bin/bash # 更新系统 yum update -y # 安装依赖包 yum install -y wget gcc-c++ make ncurses-devel openssl-devel cmake bison
下载与编译安装MySQL
通过脚本自动下载MySQL源码包(或二进制包),并完成编译与安装,以MySQL 8.0为例:
# 创建MySQL用户与用户组 groupadd mysql && useradd -r -g mysql mysql # 下载MySQL源码包 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.26.tar.gz tar -xzf mysql-8.0.26.tar.gz cd mysql-8.0.26 # 编译安装 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci make && make install
配置文件与服务初始化
自动生成MySQL配置文件(如/etc/my.cnf),并初始化数据目录:
# 复制配置文件模板 cp support-files/my-default.cnf /etc/my.cnf # 初始化数据目录 chown -R mysql:mysql /usr/local/mysql /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # 生成启动脚本 cp support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld
启动服务与安全配置
通过脚本启动MySQL服务并执行安全配置脚本(如mysql_secure_installation的自动化版本):
service mysqld start
# 自动获取临时密码并设置root用户
temp_password=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
mysql -uroot -p"$temp_password" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword!';"
# 执行安全配置(删除匿名用户、禁止root远程登录等)
mysql -uroot -p'YourNewPassword!' -e "DELETE FROM mysql.user WHERE User='';" && mysql -uroot -p'YourNewPassword!' -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');" && mysql -uroot -p'YourNewPassword!' -e "FLUSH PRIVILEGES;"
注意事项:Shell脚本需根据操作系统版本(如CentOS与Ubuntu的包管理器差异)进行调整,并确保脚本具备错误处理机制(如检查命令执行状态、日志记录等)。
基于Ansible的自动化部署
Ansible作为一款自动化运维工具,通过YAML格式的Playbook实现MySQL的批量部署与配置管理,尤其适合多服务器环境。

环境准备与Inventory配置
在控制节点安装Ansible,并定义Inventory文件(如/etc/ansible/hosts),指定目标MySQL服务器:
[mysql_servers] 192.168.1.10 192.168.1.11
编写Playbook
创建Playbook文件(如deploy_mysql.yml),定义安装、配置、启动等任务:
---
- name: Deploy MySQL on Remote Hosts
hosts: mysql_servers
become: yes
tasks:
- name: Install MySQL dependencies
yum:
name: ["wget", "gcc-c++", "make", "ncurses-devel", "openssl-devel", "cmake"]
state: present
- name: Create mysql user and group
user:
name: mysql
group: mysql
system: yes
- name: Download MySQL binary package
get_url:
url: https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
dest: /tmp/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
- name: Extract MySQL package
unarchive:
src: /tmp/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
dest: /usr/local
remote_src: yes
owner: mysql
group: mysql
- name: Create symbolic link
file:
src: /usr/local/mysql-8.0.26-linux-glibc2.12-x86_64
dest: /usr/local/mysql
state: link
- name: Configure my.cnf
template:
src: my.cnf.j2
dest: /etc/my.cnf
notify: Restart MySQL
- name: Initialize MySQL data directory
command: /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
args:
creates: /usr/local/mysql/data/mysql
- name: Start MySQL service
service:
name: mysqld
state: started
enabled: yes
handlers:
- name: Restart MySQL
service:
name: mysqld
state: restarted
配置文件模板
使用Jinja2模板生成my.cnf配置文件(如my.cnf.j2),支持动态参数(如服务器IP、端口等):
[mysqld]
port = {{ mysql_port }}
bind-address = {{ mysql_bind_address }}
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
执行Playbook
通过命令执行Playbook,实现多台MySQL服务器的自动化部署:
ansible-playbook -i /etc/ansible/hosts deploy_mysql.yml --extra-vars "mysql_port=3306 mysql_bind_address=0.0.0.0"
优势:Ansible支持幂等性(重复执行不会产生副作用)、配置文件版本控制,并通过Handler实现服务重启等操作,适合企业级批量部署场景。
基于Docker的容器化部署
Docker通过容器技术实现MySQL的快速部署与隔离,具有环境一致性、资源占用低、弹性伸缩等优势。
使用官方MySQL镜像
Docker Hub提供了官方MySQL镜像,可直接通过docker run命令启动容器:

docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=YourPassword! -e MYSQL_DATABASE=mydb -e MYSQL_USER=myuser -e MYSQL_PASSWORD=myuserpass -d -p 3306:3306 -v /mysql/data:/var/lib/mysql mysql:8.0
参数说明:
-e:设置环境变量(root密码、数据库、用户等);-d:后台运行容器;-p:映射端口(宿主机3306映射至容器3306);-v:挂载数据卷(实现数据持久化)。
使用Docker Compose编排服务
对于复杂场景(如MySQL主从复制),可通过Docker Compose定义多容器服务:
version: '3.8'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_REPLICATION_USER: repluser
MYSQL_REPLICATION_PASSWORD: replpass
ports:
- "3307:3306"
volumes:
- ./master-data:/var/lib/mysql
- ./master.cnf:/etc/mysql/conf.d/master.cnf
command: --server-id=1 --log-bin=mysql-bin
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_REPLICATION_USER: repluser
MYSQL_REPLICATION_PASSWORD: replpass
ports:
- "3308:3306"
volumes:
- ./slave-data:/var/lib/mysql
- ./slave.cnf:/etc/mysql/conf.d/slave.cnf
command: --server-id=2 --relay-log=mysql-relay-bin
depends_on:
- mysql-master
配置文件示例
在master.cnf和slave.cnf中定义主从复制参数:
# master.cnf [mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW # slave.cnf [mysqld] server-id=2 relay-log=mysql-relay-bin read-only=1
启动与验证
通过docker-compose up -d启动服务,并进入容器配置主从复制:
docker exec -it mysql-master mysql -uroot -prootpassword -e "CREATE USER 'repluser'@'%' IDENTIFIED BY 'replpass'; GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%';" docker exec -it mysql-slave mysql -uroot -prootpassword -e "CHANGE REPLICATION SOURCE TO SOURCE_HOST='mysql-master', SOURCE_USER='repluser', SOURCE_PASSWORD='replpass'; START REPLICA;"
优势:Docker部署无需关心底层系统环境,通过镜像实现“一次构建,处处运行”,适合开发测试、微服务架构等场景。
自动化部署的注意事项
- 安全性:避免在脚本或配置中明文存储密码,建议使用Ansible Vault或Docker Secrets等工具加密敏感信息;
- 版本兼容性:不同版本的MySQL在配置参数、初始化方式上存在差异,需提前测试验证;
- 日志监控:自动化部署过程中需记录详细日志,便于排查问题(如MySQL的错误日志
/var/log/mysqld.log); - 备份与恢复:部署完成后需制定备份策略,并通过自动化脚本实现定期备份与灾难恢复演练。
通过Shell脚本、Ansible、Docker三种方式的结合,可根据实际需求选择合适的MySQL自动化部署方案,Shell脚本适合简单场景,Ansible适合批量管理,Docker适合环境隔离与快速迭代,合理运用自动化工具,不仅能提升运维效率,更能为数据库的高可用与稳定性提供坚实保障。


















