当前位置:首页>Linux>【Linux 运维体系 · 第 11 篇】数据库部署与管理 — MySQL 从部署到故障排查

【Linux 运维体系 · 第 11 篇】数据库部署与管理 — MySQL 从部署到故障排查

  • 2026-10-11 07:41:27
【Linux 运维体系 · 第 11 篇】数据库部署与管理 — MySQL 从部署到故障排查

本篇目标

  • • 部署 MySQL
  • • 创建数据库与用户
  • • 管理数据库服务
  • • 做备份与恢复
  • • 排查数据库故障

一、为什么运维必须懂数据库?

很多人认为:

数据库是开发的事情

实际上生产环境大量故障:

  • • 网站打不开
  • • 接口超时
  • • CPU 飙升
  • • 磁盘爆满
  • • 数据丢失

最后发现:

根因在数据库

一个典型请求路径:

用户请求
↓
业务程序
↓
数据库
↓
返回结果

所以:

不会数据库排障,很难做好运维。


二、安装 MySQL

Ubuntu:

apt update

apt install mysql-server -y

CentOS:

yum install mysql-server -y

启动并设置开机自启:

systemctl start mysqld

systemctl enable mysqld

查看状态:

systemctl status mysqld

查看监听:

ss -lntp | grep 3306

如果看到:

LISTEN *:3306

说明:

数据库已经启动


三、登录数据库

进入数据库:

mysql -uroot -p

查看数据库:

show databases;

创建数据库:

create database demo;

切换数据库:

use demo;

查看当前库:

select database();

这里建议建立一个习惯:

不要所有业务都放一个库

否则:

备份困难

迁移困难

权限混乱

四、创建业务用户

很多新人喜欢直接使用root用户,这是非常危险的。

创建用户:

create user 'app' identified by 'password';

授权:

grant all privileges on demo.* to 'app'@'%';

刷新权限:

flush privileges;

验证:

show grants for 'app'@'%';

推荐思路:

一个业务
↓
一个数据库
↓
一个用户

这样更容易维护。


五、为什么远程连不上数据库?

很多人:

数据库启动成功
↓
3306打开
↓
远程还是连不上

通常应该先检查监听地址。

查看配置:

grep bind-address /etc/mysql/mysql.conf.d/mysqld.cnf

如果:

bind-address=127.0.0.1

意味着:

仅允许本机访问

修改:

bind-address=0.0.0.0

重启:

systemctl restart mysql

再次确认:

ss -lntp | grep 3306

再次远程访问端口,此时应该就可以访问到了。
如果还是报错,则需要检查防火墙,云安全组策略等。


六、备份为什么重要?

运维有一句经典的话:

没备份 = 没上线

最简单备份:

mysqldump -uroot -p demo > demo.sql

恢复:

mysql demo < demo.sql

七、配置自动备份

生产环境不要这样:

mysqldump demo > backup.sql

因为:

  • • 会覆盖旧备份
  • • 无法回滚历史
  • • 容易把备份盘写满
  • • 不方便自动化

更推荐:

定时备份
↓
按日期命名
↓
自动清理旧文件
↓
记录日志
↓
远程同步数据

创建备份目录:

mkdir -p /backup/mysql

创建脚本:

vim /usr/local/bin/mysql_backup.sh

写入:

#!/bin/bash

BACKUP_DIR="/backup/mysql"

DATE=$(date +%F_%H-%M-%S)

DB_NAME="demo"

DB_USER="root"

DB_PASS="your_password"

mkdir
 -p ${BACKUP_DIR}

mysqldump \
-u${DB_USER} \
-p${DB_PASS} \
--single-transaction \
--routines \
--events \
${DB_NAME}
 \
| gzip \
> ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz

find ${BACKUP_DIR} \
-type f \
-name "*.sql.gz" \
-mtime +7 \
-delete

脚本说明:

  • • --single-transaction

保证 InnoDB 热备

  • • gzip

压缩,减少磁盘占用

  • • mtime +7

自动删除 7 天前备份

赋予权限:

chmod +x /usr/local/bin/mysql_backup.sh

测试运行:

/usr/local/bin/mysql_backup.sh

查看结果:

ls -lh /backup/mysql

如果看到:

demo_2026-05-29_02-00-01.sql.gz

说明备份成功。


配置定时任务:

编辑:

crontab -e

每天凌晨 2 点执行:

0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

含义:

每天凌晨2点
↓
执行脚本
↓
记录正常&错误日志

查看是否执行成功:

tail -f /var/log/mysql_backup.log

恢复备份:

gunzip < demo.sql.gz | mysql demo

记住:

没验证恢复的备份,不算备份。


八、数据库启动失败怎么排查?

第一步:

systemctl status mysql

第二步:

journalctl -u mysql -n 100

第三步:

检查磁盘:

df -h

检查权限:

ls -ld /var/lib/mysql

检查端口:

ss -lntp

常见原因:

  • • 磁盘满
  • • 配置错误
  • • 权限异常
  • • 数据损坏
  • • 端口冲突

排查思路:

服务状态
↓
日志
↓
磁盘
↓
权限
↓
配置

一般情况下日志中会显示详细的错误内容,顺藤摸瓜即可解决问题。


九、实战:应用连接数据库失败

开发反馈:

Connection refused

先不要改代码。

检查:

数据库是否运行:

systemctl status mysql

端口:

ss -lntp | grep 3306

测试连接:

telnet 数据库IP 3306

查看用户权限:

select host,user

from
 mysql.user;

大量问题最终都是:

  • • 监听错误
  • • 防火墙问题
  • • 用户权限问题

而不是数据库坏了


十、数据库性能快速检查

查看连接:

show processlist;

查看运行状态:

show status;

查看资源:

top
free -h
iostat

十一、本篇总结

数据库运维最重要的不是优化,而是保证数据不会丢。

最新文章

随机文章