作为 IDC 运维人员,数据库运维是重中之重。MySQL 作为最流行的开源关系型数据库,每天都要面对备份、优化、故障恢复等任务。

一、数据库备份策略

1. mysqldump 逻辑备份

# 备份单个数据库
mysqldump -u root -p database_name > backup.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_backup.sql

# 压缩备份(推荐)
mysqldump -u root -p database_name | gzip > backup_$(date +%Y%m%d).sql.gz

2. XtraBackup 物理备份(适合大库)

# 全量备份
xtrabackup --backup --target-dir=/backup/base/

# 增量备份
xtrabackup --backup --target-dir=/backup/inc1/ \
  --incremental-basedir=/backup/base/

3. 自动备份脚本

#!/bin/bash
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)

mysqldump -u$DB_USER -p$DB_PASS \
  --all-databases --single-transaction \
  --routines --triggers --events | gzip \
  > $BACKUP_DIR/full_$DATE.sql.gz

# 删除 7 天前的旧备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

配合 crontab:0 3 * /usr/local/bin/mysql_backup.sh

二、性能优化

1. 慢查询日志

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

# 分析慢查询
mysqldumpslow /var/log/mysql/slow.log

2. my.cnf 优化(4GB 内存服务器参考)

[mysqld]
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
max_connections = 500
tmp_table_size = 64M

三、常见故障处理

1. Too many connections

# 紧急处理
mysql -u root -p -e "SHOW FULL PROCESSLIST\G" | grep Sleep

# 临时增加连接数
mysql -u root -p -e "SET GLOBAL max_connections = 1000;"

# 看看到底有多少连接
netstat -anp | grep 3306 | wc -l

2. 磁盘空间满(binlog 是杀手)

# 查看 binlog 占用
ls -lh /var/lib/mysql/mysql-bin.*

# 清理 7 天前的 binlog
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

# my.cnf 限制
expire_logs_days = 7
max_binlog_size = 100M

3. 表损坏修复

CHECK TABLE table_name;
REPAIR TABLE table_name;

# 命令行批量修复
mysqlcheck -u root -p --auto-repair --all-databases

四、总结

数据库运维核心三件事:备份要自动化、查询要监控、空间要预警。做好这三样,99% 的数据库问题都能在酿成大祸之前被发现并解决。