在Linux系统上安装MySQL数据库之前,有几个关键准备工作需要完成。这些步骤看似简单,但往往决定了后续安装过程的顺利程度。
首先需要确认你的Linux发行版和版本信息。不同发行版的包管理器和依赖项可能有所不同。可以通过以下命令查看:
bash复制cat /etc/os-release
对于大多数现代Linux发行版(如Ubuntu 20.04+、CentOS 7+等),系统自带的软件仓库通常已经包含了MySQL或MariaDB的安装包。但如果你需要特定版本的MySQL,或者希望获得最新版本,手动安装二进制包是更好的选择。
MySQL运行需要一些基础系统库的支持。在开始安装前,建议先安装这些依赖:
bash复制# 对于基于Debian的系统(如Ubuntu)
sudo apt-get update
sudo apt-get install libaio1 libnuma1 libtinfo5
# 对于基于RPM的系统(如CentOS)
sudo yum install libaio numactl-libs ncurses-compat-libs
这些库提供了MySQL运行所需的基础功能支持,缺少它们可能导致安装失败或运行时异常。
MySQL官方提供了多个版本的二进制包下载。选择适合你系统的版本非常重要:
注意:生产环境建议使用GA(General Availability)版本,而不是开发版或RC版,以确保稳定性。
下载完成后,将MySQL包解压到合适的目录。通常建议放在/usr/local/下:
bash复制sudo tar -xvf mysql-8.0.33-linux-glibc2.28-x86_64.tar.xz -C /usr/local/
cd /usr/local
sudo ln -s mysql-8.0.33-linux-glibc2.28-x86_64 mysql
这样创建符号链接的好处是,当未来升级MySQL版本时,只需更改链接指向而不用修改所有配置文件中的路径。
为MySQL创建专用系统用户是安全最佳实践:
bash复制sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
使用-r参数创建系统用户,-s /bin/false确保该用户不能直接登录系统,增强了安全性。
创建数据目录并设置正确的权限:
bash复制sudo mkdir -p /var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql
这里使用/var/lib/mysql作为数据目录是Linux系统的惯例。确保该目录有足够的磁盘空间(生产环境建议至少10GB)。
MySQL的配置文件通常位于/etc/my.cnf或/etc/mysql/my.cnf。一个生产环境可用的配置示例如下:
ini复制[mysqld]
# 基础路径设置
basedir = /usr/local/mysql
datadir = /var/lib/mysql
socket = /tmp/mysql.sock
# 用户和权限
user = mysql
port = 3306
bind-address = 0.0.0.0
# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 日志设置
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
# 内存设置
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
[client]
socket = /tmp/mysql.sock
default-character-set = utf8mb4
innodb_buffer_pool_size:这是InnoDB最重要的参数,通常设置为系统内存的50-70%character-set-server:设置为utf8mb4以支持完整的Unicode字符,包括emojibind-address:0.0.0.0表示允许远程连接,生产环境应结合防火墙规则使用mysqld --verbose --help查看所有可用参数使用以下命令初始化MySQL数据目录:
bash复制cd /usr/local/mysql
sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql
初始化过程会:
重要:记录下输出的临时密码,首次登录需要使用它。
MySQL提供了多种启动方式。推荐使用systemd管理:
bash复制sudo cp support-files/mysql.server /etc/init.d/mysqld
sudo systemctl daemon-reload
sudo systemctl start mysqld
sudo systemctl enable mysqld
检查MySQL状态:
bash复制sudo systemctl status mysqld
如果服务器启用了防火墙,需要开放MySQL端口:
bash复制# 对于firewalld
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
# 对于ufw
sudo ufw allow 3306/tcp
首次登录后立即修改root密码:
bash复制mysql -u root -p
输入临时密码后执行:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;
安全提示:密码应包含大小写字母、数字和特殊字符,长度至少12位。
MySQL提供了安全配置脚本:
bash复制sudo bin/mysql_secure_installation
这个脚本会引导你完成:
生产环境不应使用root用户连接应用:
sql复制CREATE USER 'appuser'@'%' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
ANALYZE TABLE更新统计信息如果MySQL启动失败,按以下步骤排查:
sudo tail -n 50 /var/log/mysql/error.logsudo netstat -tulnp | grep 3306df -h连接MySQL时常见问题:
无法连接到MySQL服务器
访问被拒绝
SHOW GRANTS FOR 'user'@'host'MySQL提供了多种性能诊断工具:
EXPLAIN:查看SQL执行计划SHOW PROCESSLIST:查看当前连接和查询performance_schema数据库bash复制mysqldump -u root -p --all-databases > full_backup.sql
bash复制sudo systemctl stop mysqld
sudo rsync -av /var/lib/mysql /backup/mysql
sudo systemctl start mysqld
设置cron定时任务实现自动备份:
bash复制0 2 * * * /usr/bin/mysqldump -u backupuser -p'password' --all-databases | gzip > /backup/mysql/$(date +\%Y\%m\%d).sql.gz
定期测试备份文件的可恢复性:
bash复制mysql -u root -p < full_backup.sql
或者对于单个数据库:
bash复制mysql -u root -p dbname < db_backup.sql
配置主从复制提高可用性:
ini复制[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
ini复制[mysqld]
server-id = 2
relay_log = mysql-relay-bin
read_only = 1
对于高并发应用,建议使用连接池:
sql复制SET GLOBAL max_connections = 200;
properties复制maximumPoolSize=20
minimumIdle=5
connectionTimeout=30000
对于MySQL的小版本升级(如8.0.32到8.0.33):
对于大版本升级(如5.7到8.0):
迁移到云数据库(如AWS RDS、阿里云RDS)的步骤:
持续监控和优化:
在实际运维中,我发现MySQL的性能往往受到磁盘I/O的限制。使用SSD存储可以显著提升性能,特别是在高并发写入场景下。另外,合理配置InnoDB的刷盘策略(innodb_flush_method)也能带来明显的性能改善。