CentOS Stream运行MySQL数据库配置指南:从安装到优化的完整教程

引言:为什么选择CentOS Stream运行MySQL
MySQL是世界上最流行的开源关系型数据库管理系统之一,而CentOS Stream作为Red Hat Enterprise Linux (RHEL)的上游开发分支,提供了稳定且前沿的操作系统环境。在CentOS Stream上运行MySQL可以获得企业级的性能和可靠性,同时享受最新的内核特性和安全更新。
本教程将带你从零开始,在CentOS Stream上完成MySQL的安装、基本配置、安全加固、性能优化和日常维护的全过程。无论你是数据库管理员、开发人员还是系统管理员,都能通过本指南掌握MySQL在CentOS Stream上的最佳实践。
一、MySQL安装准备
1.1 系统环境检查
在开始安装之前,我们需要确认系统环境是否满足要求。MySQL 8.0需要至少2GB内存和10GB的可用磁盘空间(生产环境建议更多)。
# 检查系统版本
cat /etc/centos-release

# 检查内存信息
free -h

# 检查磁盘空间
df -h

# 检查CPU信息
lscpu
1.2 更新系统软件包
保持系统最新是确保安全性和稳定性的重要步骤。
# 更新所有软件包到最新版本
sudo dnf update -y

# 重启系统以应用内核更新(如果有)
sudo reboot
1.3 检查是否已安装MySQL
CentOS Stream可能预装了MySQL或其分支(如MariaDB),我们需要先检查并处理:
# 检查是否已安装MySQL相关软件
rpm -qa | grep -i mysql
rpm -qa | grep -i mariadb

# 如果存在旧版本,建议先卸载
sudo dnf remove -y mysql-server mysql-client mysql-common mysql-devel
sudo dnf remove -y mariadb-server mariadb
二、MySQL安装过程
2.1 添加MySQL官方Yum仓库
CentOS Stream默认仓库中可能没有最新版MySQL,我们需要添加官方仓库:
# 下载MySQL官方仓库配置包(适用于CentOS Stream 8/9)
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm

# 对于CentOS Stream 8,使用:
# sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm

# 验证仓库是否添加成功
sudo dnf repolist enabled | grep mysql
2.2 选择MySQL版本(可选)
MySQL仓库中包含多个版本,如果需要特定版本(如MySQL 5.7):
# 查看所有可用的MySQL版本
sudo dnf module list mysql

# 如果需要禁用默认的8.0版本,启用其他版本
sudo dnf module disable mysql
sudo dnf module enable mysql:8.0 # 或者 mysql:5.7
2.3 安装MySQL服务器
# 安装MySQL服务器和客户端
sudo dnf install -y mysql-community-server mysql-community-client

# 安装常用开发工具(如果需要编译或调试)
sudo dnf install -y mysql-community-devel gcc-c++ make
2.4 启动MySQL服务
# 启动MySQL服务
sudo systemctl start mysqld

# 设置开机自启
sudo systemctl enable mysqld

# 检查服务状态
sudo systemctl status mysqld
2.5 获取初始root密码
MySQL 8.0在首次启动时会生成临时root密码:
# 查看MySQL日志获取临时密码
sudo grep ‘temporary password’ /var/log/mysqld.log

# 输出示例:2023-10-15T14:23:45.678901Z 1 [Note] A temporary password is generated for root@localhost: abc123DEF$
三、MySQL初始配置
3.1 运行安全脚本
MySQL提供了安全脚本来帮助我们进行基本的安全配置:
# 运行mysql_secure_installation脚本
sudo mysql_secure_installation
脚本会依次提示:
输入临时密码
设置新密码(密码需要包含大小写字母、数字和特殊字符)
是否启用密码验证插件(建议启用)
是否移除匿名用户(强烈建议)
是否禁止root远程登录(生产环境建议禁止)
是否移除测试数据库(建议移除)
是否立即重新加载权限表(选择yes)
3.2 配置MySQL root用户
# 使用新密码登录MySQL
mysql -u root -p

# 在MySQL命令行中,我们可以进行一些初始配置
— 查看当前用户
SELECT user, host FROM mysql.user;

— 更新root用户密码(如果需要)
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘NewStrongPassword123!’;

— 允许root从任何主机连接(仅在开发环境使用,生产环境应限制IP)
CREATE USER ‘root’@’%’ IDENTIFIED BY ‘SameStrongPassword123!’;
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ WITH GRANT OPTION;

— 刷新权限
FLUSH PRIVILEGES;
四、MySQL基本配置优化
4.1 配置文件结构
MySQL的主要配置文件是
/etc/my.cnf
,它会包含
/etc/my.cnf.d/
目录下的配置文件:
# 主配置文件
/etc/my.cnf

# 包含目录
/etc/my.cnf.d/
4.2 核心参数配置
编辑
/etc/my.cnf
文件进行优化:
[mysqld]
# 基础配置
user = mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid

# 连接配置
max_connections = 1000
max_connect_errors = 100
connect_timeout = 10
wait_timeout = 28800

# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = ‘SET NAMES utf8mb4’

# InnoDB引擎配置(核心优化)
innodb_buffer_pool_size = 1G # 通常设置为系统内存的50-70%
innodb_log_file_size = 256M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2 # 1=完全ACID,2=性能更好
innodb_file_per_table = ON
innodb_flush_method = O_DIRECT

# 日志配置
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = ON

# 临时表和排序
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
join_buffer_size = 4M

# 二进制日志(用于复制和恢复)
log_bin = /var/log/mysql/mysql-bin.log
binlog_expire_logs_seconds = 604800 # 7天
binlog_format = ROW

# 查询缓存(MySQL 8.0已移除,但旧版本需要)
# query_cache_type = 1
# query_cache_size = 64M

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
4.3 创建专用配置文件
对于特定场景,可以创建单独的配置文件:
# 创建生产环境优化配置
sudo tee /etc/my.cnf.d/production.cnf << EOF [mysqld] # 生产环境专用优化 max_connections = 2000 innodb_buffer_pool_size = 4G innodb_io_capacity = 2000 innodb_io_capacity_max = 4000 innodb_lru_scan_depth = 2048 EOF 五、用户和权限管理 5.1 创建应用专用用户 永远不要使用root用户运行应用程序: # 登录MySQL mysql -u root -p -- 创建应用用户 CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppSecurePassword123!'; -- 授予特定数据库权限 GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'localhost'; -- 授予存储过程权限(如果需要) GRANT EXECUTE ON app_db.* TO 'app_user'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES; 5.2 创建只读用户 -- 创建只读用户 CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadonlyPassword123!'; -- 授予所有数据库的只读权限 GRANT SELECT ON *.* TO 'readonly'@'%'; -- 或者只授予特定数据库 GRANT SELECT ON app_db.* TO 'readonly'@'192.168.1.%'; -- 限制IP段 FLUSH PRIVILEGES; 5.3 查看和管理权限 -- 查看用户权限 SHOW GRANTS FOR 'app_user'@'localhost'; -- 查看所有用户 SELECT user, host, authentication_string FROM mysql.user; -- 删除用户 DROP USER 'old_user'@'localhost'; 六、数据库和表的创建 6.1 创建数据库 mysql -u root -p -- 创建数据库并指定字符集 CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 查看数据库 SHOW DATABASES; 6.2 创建表和索引 -- 使用创建的数据库 USE app_db; -- 创建用户表示例 CREATE TABLE users ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, status TINYINT DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_username (username), INDEX idx_email (email), INDEX idx_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 创建订单表 CREATE TABLE orders ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id BIGINT UNSIGNED NOT NULL, order_no VARCHAR(32) NOT NULL UNIQUE, amount DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_user_id (user_id), INDEX idx_order_no (order_no), INDEX idx_status (status), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 6.3 插入测试数据 -- 插入测试用户 INSERT INTO users (username, email, password_hash) VALUES ('testuser1', 'test1@example.com', MD5('password1')), ('testuser2', 'test2@example.com', MD5('password2')); -- 插入测试订单 INSERT INTO orders (user_id, order_no, amount) VALUES (1, 'ORD20231015001', 99.99), (2, 'ORD20231015002', 199.99); 七、备份和恢复 7.1 使用mysqldump进行逻辑备份 # 备份单个数据库 mysqldump -u root -p app_db > /backup/app_db_$(date +%Y%m%d).sql

# 备份所有数据库
mysqldump -u root -p –all-databases > /backup/all_databases_$(date +%Y%m%d).sql

# 备份特定表
mysqldump -u root -p app_db users orders > /backup/tables_$(date +%Y%m%d).sql

# 压缩备份
mysqldump -u root -p app_db | gzip > /backup/app_db_$(date +%Y%m%d).sql.gz

# 带事务和主键的备份(适合大型数据库)
mysqldump -u root -p –single-transaction –quick –lock-tables=false app_db > /backup/app_db_consistent.sql
7.2 自动化备份脚本
创建自动化备份脚本:
#!/bin/bash
# /usr/local/bin/mysql_backup.sh

BACKUP_DIR=”/backup/mysql”
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER=”root”
MYSQL_PASSWORD=”your_password”
RETENTION_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份所有数据库
mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD –single-transaction –quick –lock-tables=false –all-databases | gzip > $BACKUP_DIR/full_backup_$DATE.sql.gz

# 删除旧备份
find $BACKUP_DIR -name “*.sql.gz” -mtime +$RETENTION_DAYS -delete

# 记录日志
echo “$(date): Backup completed – full_backup_$DATE.sql.gz” >> /var/log/mysql_backup.log
设置脚本权限并添加到cron:
sudo chmod +x /usr/local/bin/mysql_backup.sh
sudo crontab -e

# 添加以下行(每天凌晨2点执行)
0 2 * * * /usr/local/bin/mysql_backup.sh
7.3 物理备份(Percona XtraBackup)
对于大型生产数据库,推荐使用物理备份工具:
# 安装Percona XtraBackup
sudo dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo dnf install -y percona-xtrabackup-80

# 创建完整备份
sudo xtrabackup –backup –user=root –password=your_password –target-dir=/backup/xtrabackup_full/

# 准备备份
sudo xtrabackup –prepare –target-dir=/backup/xtrabackup_full/

# 压缩备份
sudo tar -czf /backup/xtrabackup_full_$(date +%Y%m%d).tar.gz -C /backup/xtrabackup_full .
7.4 恢复数据库
7.4.1 从mysqldump恢复
# 恢复单个数据库
mysql -u root -p app_db < /backup/app_db_20231015.sql # 恢复所有数据库 mysql -u root -p < /backup/all_databases_20231015.sql # 从压缩文件恢复 gunzip < /backup/app_db_20231015.sql.gz | mysql -u root -p app_db 7.4.2 从物理备份恢复 # 停止MySQL服务 sudo systemctl stop mysqld # 备份当前数据目录(重要!) sudo mv /var/lib/mysql /var/lib/mysql_backup_$(date +%Y%m%d) # 创建新目录 sudo mkdir -p /var/lib/mysql sudo chown mysql:mysql /var/lib/mysql # 恢复备份 sudo xtrabackup --copy-back --target-dir=/backup/xtrabackup_full/ # 修复权限 sudo chown -R mysql:mysql /var/lib/mysql # 启动MySQL sudo systemctl start mysqld 八、性能监控和优化 8.1 MySQL性能监控命令 # 查看MySQL状态 mysqladmin -u root -p status # 实时监控MySQL进程 mysqladmin -u root -p -i 1 processlist # 查看InnoDB状态 mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G" 8.2 关键性能指标查询 mysql -u root -p -- 查看慢查询数量 SHOW GLOBAL STATUS LIKE 'Slow_queries'; -- 查看连接数 SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW GLOBAL STATUS LIKE 'Max_used_connections'; -- 查看InnoDB缓冲池命中率 SELECT (1 - (SUM(VARIABLE_VALUE) / @@innodb_buffer_pool_size)) * 100 AS buffer_pool_hit_rate FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads'; -- 查看表锁等待 SHOW ENGINE INNODB STATUS\G 8.3 使用Performance Schema监控 -- 启用特定的监控(默认已启用) UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%'; -- 查看最慢的查询 SELECT DIGEST_TEXT, COUNT_STAR, AVG_TIMER_WAIT/1000000000000 AS avg_time_sec, MAX_TIMER_WAIT/1000000000000 AS max_time_sec FROM performance_schema.events_statements_summary_by_digest ORDER BY AVG_TIMER_WAIT DESC LIMIT 10; 8.4 使用pt-query-digest分析慢查询日志 # 安装Percona Toolkit sudo dnf install -y percona-toolkit # 分析慢查询日志 sudo pt-query-digest /var/log/mysql/slow.log > /tmp/slow_query_report.txt

# 分析实时查询
sudo pt-query-digest –processlist h=localhost,u=root,p=your_password –interval 0.01
九、安全加固
9.1 操作系统级安全
# 设置MySQL目录权限
sudo chmod 750 /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql

# 限制配置文件权限
sudo chmod 600 /etc/my.cnf
sudo chmod 600 /etc/my.cnf.d/*.cnf

# 防火墙配置(如果需要远程访问)
sudo firewall-cmd –permanent –add-port=3306/tcp
sudo firewall-cmd –reload

# 或者限制特定IP访问
sudo firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.100″ port port=”3306″ protocol=”tcp” accept’
9.2 MySQL级安全
mysql -u root -p

— 禁用危险函数
SET GLOBAL local_infile = 0;
SET GLOBAL secure_file_priv = ‘/var/lib/mysql-files’;

— 重命名root用户(可选,增加安全性)
— 注意:这可能会影响某些管理工具
— RENAME USER ‘root’@’localhost’ TO ‘admin’@’localhost’;

— 删除匿名用户
DELETE FROM mysql.user WHERE User = ”;

— 禁用远程root登录(生产环境)
DELETE FROM mysql.user WHERE User = ‘root’ AND Host NOT IN (‘localhost’, ‘127.0.0.1’, ‘::1’);

— 删除测试数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db = ‘test’;

— 刷新权限
FLUSH PRIVILEGES;
9.3 启用SSL连接
# 检查MySQL是否支持SSL
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%ssl%’;”

— 在MySQL中强制SSL连接
ALTER USER ‘app_user’@’localhost’ REQUIRE SSL;

— 或者要求X509证书
ALTER USER ‘app_user’@’localhost’ REQUIRE X509;
十、高级配置和最佳实践
10.1 配置主从复制
10.1.1 主库配置
# 编辑主库配置 /etc/my.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
binlog_do_db = app_db # 只复制特定数据库

# 重启MySQL
sudo systemctl restart mysqld

# 创建复制用户
mysql -u root -p
CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘ReplSecurePassword123!’;
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
FLUSH PRIVILEGES;

— 锁定表并获取二进制日志位置
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
10.1.2 从库配置
# 编辑从库配置 /etc/my.cnf
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1

# 重启MySQL
sudo systemctl restart mysqld

# 配置复制
mysql -u root -p
CHANGE MASTER TO
MASTER_HOST=’master_ip’,
MASTER_USER=’repl’,
MASTER_PASSWORD=’ReplSecurePassword123!’,
MASTER_LOG_FILE=’mysql-bin.000001′,
MASTER_LOG_POS=1234; — 来自主库的SHOW MASTER STATUS结果

— 启动复制
START SLAVE;

— 检查复制状态
SHOW SLAVE STATUS\G
10.2 配置组复制(Group Replication)
MySQL 8.0支持组复制,提供高可用性:
# 在所有节点上配置
[mysqld]
server_id = 1 # 每个节点唯一
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_checksum = NONE
log_slave_updates = ON
relay_log_info_repository = TABLE
master_info_repository = TABLE
transaction_write_set_extraction = XXHASH64

# 组复制配置
plugin_load_add = group_replication.so
group_replication_group_name = “aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee”
group_replication_start_on_boot = off
group_replication_local_address = “node1:33061”
group_replication_group_seeds = “node1:33061,node2:33061,node3:33061”
group_replication_bootstrap_group = off
10.3 配置读写分离
使用ProxySQL实现读写分离:
# 安装ProxySQL
sudo dnf install -y proxysql

# 配置ProxySQL
mysql -u admin -padmin -h 127.0.0.1 -P 6032

— 添加MySQL服务器
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight) VALUES
(10, ‘master_ip’, 3306, 100), — 写组
(20, ‘slave1_ip’, 3306, 100), — 读组
(20, ‘slave2_ip’, 3306, 100);

— 配置查询规则
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES
(1, 1, ‘^SELECT.*FOR UPDATE’, 10, 1),
(2, 1, ‘^SELECT’, 20, 1);

— 加载配置
LOAD MYSQL VARIABLES TO RUNTIME;
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

— 保存配置
SAVE MYSQL VARIABLES TO DISK;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
十一、故障排除
11.1 常见问题及解决方案
11.1.1 MySQL无法启动
# 检查错误日志
sudo tail -f /var/log/mysqld.log

# 检查端口占用
sudo netstat -tlnp | grep 3306

# 检查权限
sudo ls -la /var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql

# 检查磁盘空间
df -h /var/lib/mysql

# 强制恢复(紧急情况)
sudo mysqld –skip-grant-tables –user=mysql &
mysql -u root
FLUSH PRIVILEGES;
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’;
11.1.2 连接数过多
# 查看当前连接
mysql -u root -p -e “SHOW PROCESSLIST;”

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

# 杀死空闲连接
mysql -u root -p -e “SELECT CONCAT(‘KILL ‘,id,’;’) FROM information_schema.processlist WHERE time > 3600 AND command = ‘Sleep’;”
11.1.3 表损坏修复
# 检查表
mysqlcheck -u root -p –check app_db

# 修复表
mysqlcheck -u root -p –repair app_db

# 或者在MySQL中
mysql -u root -p
REPAIR TABLE app_db.users;
11.2 日志分析
# 实时查看错误日志
sudo tail -f /var/log/mysqld.log

# 查看慢查询日志
sudo tail -f /var/log/mysql/slow.log

# 统计错误日志中的错误
sudo grep -i error /var/log/mysqld.log | wc -l

# 查看最近的连接尝试
sudo grep “Connect” /var/log/mysqld.log | tail -20
十二、性能调优高级技巧
12.1 InnoDB缓冲池优化
# 计算合适的缓冲池大小
# 通常设置为系统内存的50-70%
# 例如,16GB内存的服务器:
innodb_buffer_pool_size = 12G

# 多个缓冲池实例(提高并发性能)
innodb_buffer_pool_instances = 8

# 监控缓冲池使用情况
mysql -u root -p -e “SHOW ENGINE INNODB STATUS\G” | grep -A 10 “BUFFER POOL AND MEMORY”
12.2 查询优化技巧
# 使用EXPLAIN分析查询
mysql -u root -p
EXPLAIN SELECT * FROM users WHERE username = ‘testuser1’;

— 优化前
EXPLAIN SELECT orders.*, users.username
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.status = 1;

— 优化后(添加合适的索引)
CREATE INDEX idx_user_status ON users(status);
EXPLAIN SELECT orders.*, users.username
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.status = 1;
12.3 使用索引提示
— 强制使用特定索引
SELECT * FROM users USE INDEX (idx_username) WHERE username = ‘testuser1’;

— 忽略特定索引
SELECT * FROM users IGNORE INDEX (idx_email) WHERE email LIKE ‘%@example.com’;

— 强制使用主键
SELECT * FROM users FORCE PRIMARY KEY WHERE id = 1;
十三、总结
本教程详细介绍了在CentOS Stream上安装、配置、优化和维护MySQL数据库的完整过程。关键要点包括:
安装准备
:确保系统环境满足要求,添加官方仓库
安全配置
:运行安全脚本,设置强密码,创建专用用户
性能优化
:合理配置InnoDB缓冲池,优化连接参数
备份策略
:定期备份,测试恢复流程
安全加固
:操作系统和数据库双重安全措施
监控维护
:持续监控性能指标,及时发现和解决问题
记住,数据库配置是一个持续优化的过程。建议定期审查性能指标,根据实际负载调整配置,并保持MySQL和操作系统的更新。
推荐的维护时间表
每日
:检查错误日志,验证备份是否成功
每周
:分析慢查询日志,优化有问题的查询
每月
:审查用户权限,更新统计信息,检查磁盘空间
每季度
:全面性能评估,配置审查,安全审计
通过遵循本指南,你将能够在CentOS Stream上建立一个稳定、高效、安全的MySQL数据库环境。
# CentOS Stream运行MySQL数据库配置指南:从安装到优化的完整教程
引言:为什么选择CentOS Stream运行MySQL
MySQL是世界上最流行的开源关系型数据库管理系统之一,而CentOS Stream作为Red Hat Enterprise Linux (RHEL)的上游开发分支,提供了稳定且前沿的操作系统环境。在CentOS Stream上运行MySQL可以获得企业级的性能和可靠性,同时享受最新的内核特性和安全更新。
本教程将带你从零开始,在CentOS Stream上完成MySQL的安装、基本配置、安全加固、性能优化和日常维护的全过程。无论你是数据库管理员、开发人员还是系统管理员,都能通过本指南掌握MySQL在CentOS Stream上的最佳实践。
一、MySQL安装准备
1.1 系统环境检查
在开始安装之前,我们需要确认系统环境是否满足要求。MySQL 8.0需要至少2GB内存和10GB的可用磁盘空间(生产环境建议更多)。
# 检查系统版本
cat /etc/centos-release

# 检查内存信息
free -h

# 检查磁盘空间
df -h

# 检查CPU信息
lscpu
1.2 更新系统软件包
保持系统最新是确保安全性和稳定性的重要步骤。
# 更新所有软件包到最新版本
sudo dnf update -y

# 重启系统以应用内核更新(如果有)
sudo reboot
1.3 检查是否已安装MySQL
CentOS Stream可能预装了MySQL或其分支(如MariaDB),我们需要先检查并处理:
# 检查是否已安装MySQL相关软件
rpm -qa | grep -i mysql
rpm -qa | grep -i mariadb

# 如果存在旧版本,建议先卸载
sudo dnf remove -y mysql-server mysql-client mysql-common mysql-devel
sudo dnf remove -y mariadb-server mariadb
二、MySQL安装过程
2.1 添加MySQL官方Yum仓库
CentOS Stream默认仓库中可能没有最新版MySQL,我们需要添加官方仓库:
# 下载MySQL官方仓库配置包(适用于CentOS Stream 8/9)
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm

# 对于CentOS Stream 8,使用:
# sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm

# 验证仓库是否添加成功
sudo dnf repolist enabled | grep mysql
2.2 选择MySQL版本(可选)
MySQL仓库中包含多个版本,如果需要特定版本(如MySQL 5.7):
# 查看所有可用的MySQL版本
sudo dnf module list mysql

# 如果需要禁用默认的8.0版本,启用其他版本
sudo dnf module disable mysql
sudo dnf module enable mysql:8.0 # 或者 mysql:5.7
2.3 安装MySQL服务器
# 安装MySQL服务器和客户端
sudo dnf install -y mysql-community-server mysql-community-client

# 安装常用开发工具(如果需要编译或调试)
sudo dnf install -y mysql-community-devel gcc-c++ make
2.4 启动MySQL服务
# 启动MySQL服务
sudo systemctl start mysqld

# 设置开机自启
sudo systemctl enable mysqld

# 检查服务状态
sudo systemctl status mysqld
2.5 获取初始root密码
MySQL 8.0在首次启动时会生成临时root密码:
# 查看MySQL日志获取临时密码
sudo grep ‘temporary password’ /var/log/mysqld.log

# 输出示例:2023-10-15T14:23:45.678901Z 1 [Note] A temporary password is generated for root@localhost: abc123DEF$
三、MySQL初始配置
3.1 运行安全脚本
MySQL提供了安全脚本来帮助我们进行基本的安全配置:
# 运行mysql_secure_installation脚本
sudo mysql_secure_installation
脚本会依次提示:
输入临时密码
设置新密码(密码需要包含大小写字母、数字和特殊字符)
是否启用密码验证插件(建议启用)
是否移除匿名用户(强烈建议)
是否禁止root远程登录(生产环境建议禁止)
是否移除测试数据库(建议移除)
是否立即重新加载权限表(选择yes)
3.2 配置MySQL root用户
# 使用新密码登录MySQL
mysql -u root -p

# 在MySQL命令行中,我们可以进行一些初始配置
— 查看当前用户
SELECT user, host FROM mysql.user;

— 更新root用户密码(如果需要)
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘NewStrongPassword123!’;

— 允许root从任何主机连接(仅在开发环境使用,生产环境应限制IP)
CREATE USER ‘root’@’%’ IDENTIFIED BY ‘SameStrongPassword123!’;
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ WITH GRANT OPTION;

— 刷新权限
FLUSH PRIVILEGES;
四、MySQL基本配置优化
4.1 配置文件结构
MySQL的主要配置文件是
/etc/my.cnf
,它会包含
/etc/my.cnf.d/
目录下的配置文件:
# 主配置文件
/etc/my.cnf

# 包含目录
/etc/my.cnf.d/
4.2 核心参数配置
编辑
/etc/my.cnf
文件进行优化:
[mysqld]
# 基础配置
user = mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid

# 连接配置
max_connections = 1000
max_connect_errors = 100
connect_timeout = 10
wait_timeout = 28800

# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = ‘SET NAMES utf8mb4’

# InnoDB引擎配置(核心优化)
innodb_buffer_pool_size = 1G # 通常设置为系统内存的50-70%
innodb_log_file_size = 256M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2 # 1=完全ACID,2=性能更好
innodb_file_per_table = ON
innodb_flush_method = O_DIRECT

# 日志配置
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = ON

# 临时表和排序
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
join_buffer_size = 4M

# 二进制日志(用于复制和恢复)
log_bin = /var/log/mysql/mysql-bin.log
binlog_expire_logs_seconds = 604800 # 7天
binlog_format = ROW

# 查询缓存(MySQL 8.0已移除,但旧版本需要)
# query_cache_type = 1
# query_cache_size = 64M

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
4.3 创建专用配置文件
对于特定场景,可以创建单独的配置文件:
# 创建生产环境优化配置
sudo tee /etc/my.cnf.d/production.cnf << EOF [mysqld] # 生产环境专用优化 max_connections = 2000 innodb_buffer_pool_size = 4G innodb_io_capacity = 2000 innodb_io_capacity_max = 4000 innodb_lru_scan_depth = 2048 EOF 五、用户和权限管理 5.1 创建应用专用用户 永远不要使用root用户运行应用程序: # 登录MySQL mysql -u root -p -- 创建应用用户 CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppSecurePassword123!'; -- 授予特定数据库权限 GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'localhost'; -- 授予存储过程权限(如果需要) GRANT EXECUTE ON app_db.* TO 'app_user'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES; 5.2 创建只读用户 -- 创建只读用户 CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadonlyPassword123!'; -- 授予所有数据库的只读权限 GRANT SELECT ON *.* TO 'readonly'@'%'; -- 或者只授予特定数据库 GRANT SELECT ON app_db.* TO 'readonly'@'192.168.1.%'; -- 限制IP段 FLUSH PRIVILEGES; 5.3 查看和管理权限 -- 查看用户权限 SHOW GRANTS FOR 'app_user'@'localhost'; -- 查看所有用户 SELECT user, host, authentication_string FROM mysql.user; -- 删除用户 DROP USER 'old_user'@'localhost'; 六、数据库和表的创建 6.1 创建数据库 mysql -u root -p -- 创建数据库并指定字符集 CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 查看数据库 SHOW DATABASES; 6.2 创建表和索引 -- 使用创建的数据库 USE app_db; -- 创建用户表示例 CREATE TABLE users ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, status TINYINT DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_username (username), INDEX idx_email (email), INDEX idx_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 创建订单表 CREATE TABLE orders ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id BIGINT UNSIGNED NOT NULL, order_no VARCHAR(32) NOT NULL UNIQUE, amount DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_user_id (user_id), INDEX idx_order_no (order_no), INDEX idx_status (status), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 6.3 插入测试数据 -- 插入测试用户 INSERT INTO users (username, email, password_hash) VALUES ('testuser1', 'test1@example.com', MD5('password1')), ('testuser2', 'test2@example.com', MD5('password2')); -- 插入测试订单 INSERT INTO orders (user_id, order_no, amount) VALUES (1, 'ORD20231015001', 99.99), (2, 'ORD20231015002', 199.99); 七、备份和恢复 7.1 使用mysqldump进行逻辑备份 # 备份单个数据库 mysqldump -u root -p app_db > /backup/app_db_$(date +%Y%m%d).sql

# 备份所有数据库
mysqldump -u root -p –all-databases > /backup/all_databases_$(date +%Y%m%d).sql

# 备份特定表
mysqldump -u root -p app_db users orders > /backup/tables_$(date +%Y%m%d).sql

# 压缩备份
mysqldump -u root -p app_db | gzip > /backup/app_db_$(date +%Y%m%d).sql.gz

# 带事务和主键的备份(适合大型数据库)
mysqldump -u root -p –single-transaction –quick –lock-tables=false app_db > /backup/app_db_consistent.sql
7.2 自动化备份脚本
创建自动化备份脚本:
#!/bin/bash
# /usr/local/bin/mysql_backup.sh

BACKUP_DIR=”/backup/mysql”
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER=”root”
MYSQL_PASSWORD=”your_password”
RETENTION_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份所有数据库
mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD –single-transaction –quick –lock-tables=false –all-databases | gzip > $BACKUP_DIR/full_backup_$DATE.sql.gz

# 删除旧备份
find $BACKUP_DIR -name “*.sql.gz” -mtime +$RETENTION_DAYS -delete

# 记录日志
echo “$(date): Backup completed – full_backup_$DATE.sql.gz” >> /var/log/mysql_backup.log
设置脚本权限并添加到cron:
sudo chmod +x /usr/local/bin/mysql_backup.sh
sudo crontab -e

# 添加以下行(每天凌晨2点执行)
0 2 * * * /usr/local/bin/mysql_backup.sh
7.3 物理备份(Percona XtraBackup)
对于大型生产数据库,推荐使用物理备份工具:
# 安装Percona XtraBackup
sudo dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo dnf install -y percona-xtrabackup-80

# 创建完整备份
sudo xtrabackup –backup –user=root –password=your_password –target-dir=/backup/xtrabackup_full/

# 准备备份
sudo xtrabackup –prepare –target-dir=/backup/xtrabackup_full/

# 压缩备份
sudo tar -czf /backup/xtrabackup_full_$(date +%Y%m%d).tar.gz -C /backup/xtrabackup_full .
7.4 恢复数据库
7.4.1 从mysqldump恢复
# 恢复单个数据库
mysql -u root -p app_db < /backup/app_db_20231015.sql # 恢复所有数据库 mysql -u root -p < /backup/all_databases_20231015.sql # 从压缩文件恢复 gunzip < /backup/app_db_20231015.sql.gz | mysql -u root -p app_db 7.4.2 从物理备份恢复 # 停止MySQL服务 sudo systemctl stop mysqld # 备份当前数据目录(重要!) sudo mv /var/lib/mysql /var/lib/mysql_backup_$(date +%Y%m%d) # 创建新目录 sudo mkdir -p /var/lib/mysql sudo chown mysql:mysql /var/lib/mysql # 恢复备份 sudo xtrabackup --copy-back --target-dir=/backup/xtrabackup_full/ # 修复权限 sudo chown -R mysql:mysql /var/lib/mysql # 启动MySQL sudo systemctl start mysqld 八、性能监控和优化 8.1 MySQL性能监控命令 # 查看MySQL状态 mysqladmin -u root -p status # 实时监控MySQL进程 mysqladmin -u root -p -i 1 processlist # 查看InnoDB状态 mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G" 8.2 关键性能指标查询 mysql -u root -p -- 查看慢查询数量 SHOW GLOBAL STATUS LIKE 'Slow_queries'; -- 查看连接数 SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW GLOBAL STATUS LIKE 'Max_used_connections'; -- 查看InnoDB缓冲池命中率 SELECT (1 - (SUM(VARIABLE_VALUE) / @@innodb_buffer_pool_size)) * 100 AS buffer_pool_hit_rate FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads'; -- 查看表锁等待 SHOW ENGINE INNODB STATUS\G 8.3 使用Performance Schema监控 -- 启用特定的监控(默认已启用) UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%'; -- 查看最慢的查询 SELECT DIGEST_TEXT, COUNT_STAR, AVG_TIMER_WAIT/1000000000000 AS avg_time_sec, MAX_TIMER_WAIT/1000000000000 AS max_time_sec FROM performance_schema.events_statements_summary_by_digest ORDER BY AVG_TIMER_WAIT DESC LIMIT 10; 8.4 使用pt-query-digest分析慢查询日志 # 安装Percona Toolkit sudo dnf install -y percona-toolkit # 分析慢查询日志 sudo pt-query-digest /var/log/mysql/slow.log > /tmp/slow_query_report.txt

# 分析实时查询
sudo pt-query-digest –processlist h=localhost,u=root,p=your_password –interval 0.01
九、安全加固
9.1 操作系统级安全
# 设置MySQL目录权限
sudo chmod 750 /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql

# 限制配置文件权限
sudo chmod 600 /etc/my.cnf
sudo chmod 600 /etc/my.cnf.d/*.cnf

# 防火墙配置(如果需要远程访问)
sudo firewall-cmd –permanent –add-port=3306/tcp
sudo firewall-cmd –reload

# 或者限制特定IP访问
sudo firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.100″ port port=”3306″ protocol=”tcp” accept’
9.2 MySQL级安全
mysql -u root -p

— 禁用危险函数
SET GLOBAL local_infile = 0;
SET GLOBAL secure_file_priv = ‘/var/lib/mysql-files’;

— 重命名root用户(可选,增加安全性)
— 注意:这可能会影响某些管理工具
— RENAME USER ‘root’@’localhost’ TO ‘admin’@’localhost’;

— 删除匿名用户
DELETE FROM mysql.user WHERE User = ”;

— 禁用远程root登录(生产环境)
DELETE FROM mysql.user WHERE User = ‘root’ AND Host NOT IN (‘localhost’, ‘127.0.0.1’, ‘::1’);

— 删除测试数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db = ‘test’;

— 刷新权限
FLUSH PRIVILEGES;
9.3 启用SSL连接
# 检查MySQL是否支持SSL
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%ssl%’;”

— 在MySQL中强制SSL连接
ALTER USER ‘app_user’@’localhost’ REQUIRE SSL;

— 或者要求X509证书
ALTER USER ‘app_user’@’localhost’ REQUIRE X509;
十、高级配置和最佳实践
10.1 配置主从复制
10.1.1 主库配置
# 编辑主库配置 /etc/my.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
binlog_do_db = app_db # 只复制特定数据库

# 重启MySQL
sudo systemctl restart mysqld

# 创建复制用户
mysql -u root -p
CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘ReplSecurePassword123!’;
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
FLUSH PRIVILEGES;

— 锁定表并获取二进制日志位置
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
10.1.2 从库配置
# 编辑从库配置 /etc/my.cnf
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1

# 重启MySQL
sudo systemctl restart mysqld

# 配置复制
mysql -u root -p
CHANGE MASTER TO
MASTER_HOST=’master_ip’,
MASTER_USER=’repl’,
MASTER_PASSWORD=’ReplSecurePassword123!’,
MASTER_LOG_FILE=’mysql-bin.000001′,
MASTER_LOG_POS=1234; — 来自主库的SHOW MASTER STATUS结果

— 启动复制
START SLAVE;

— 检查复制状态
SHOW SLAVE STATUS\G
10.2 配置组复制(Group Replication)
MySQL 8.0支持组复制,提供高可用性:
# 在所有节点上配置
[mysqld]
server_id = 1 # 每个节点唯一
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_checksum = NONE
log_slave_updates = ON
relay_log_info_repository = TABLE
master_info_repository = TABLE
transaction_write_set_extraction = XXHASH64

# 组复制配置
plugin_load_add = group_replication.so
group_replication_group_name = “aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee”
group_replication_start_on_boot = off
group_replication_local_address = “node1:33061”
group_replication_group_seeds = “node1:33061,node2:33061,node3:33061”
group_replication_bootstrap_group = off
10.3 配置读写分离
使用ProxySQL实现读写分离:
# 安装ProxySQL
sudo dnf install -y proxysql

# 配置ProxySQL
mysql -u admin -padmin -h 127.0.0.1 -P 6032

— 添加MySQL服务器
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight) VALUES
(10, ‘master_ip’, 3306, 100), — 写组
(20, ‘slave1_ip’, 3306, 100), — 读组
(20, ‘slave2_ip’, 3306, 100);

— 配置查询规则
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES
(1, 1, ‘^SELECT.*FOR UPDATE’, 10, 1),
(2, 1, ‘^SELECT’, 20, 1);

— 加载配置
LOAD MYSQL VARIABLES TO RUNTIME;
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

— 保存配置
SAVE MYSQL VARIABLES TO DISK;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
十一、故障排除
11.1 常见问题及解决方案
11.1.1 MySQL无法启动
# 检查错误日志
sudo tail -f /var/log/mysqld.log

# 检查端口占用
sudo netstat -tlnp | grep 3306

# 检查权限
sudo ls -la /var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql

# 检查磁盘空间
df -h /var/lib/mysql

# 强制恢复(紧急情况)
sudo mysqld –skip-grant-tables –user=mysql &
mysql -u root
FLUSH PRIVILEGES;
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’;
11.1.2 连接数过多
# 查看当前连接
mysql -u root -p -e “SHOW PROCESSLIST;”

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

# 杀死空闲连接
mysql -u root -p -e “SELECT CONCAT(‘KILL ‘,id,’;’) FROM information_schema.processlist WHERE time > 3600 AND command = ‘Sleep’;”
11.1.3 表损坏修复
# 检查表
mysqlcheck -u root -p –check app_db

# 修复表
mysqlcheck -u root -p –repair app_db

# 或者在MySQL中
mysql -u root -p
REPAIR TABLE app_db.users;
11.2 日志分析
# 实时查看错误日志
sudo tail -f /var/log/mysqld.log

# 查看慢查询日志
sudo tail -f /var/log/mysql/slow.log

# 统计错误日志中的错误
sudo grep -i error /var/log/mysqld.log | wc -l

# 查看最近的连接尝试
sudo grep “Connect” /var/log/mysqld.log | tail -20
十二、性能调优高级技巧
12.1 InnoDB缓冲池优化
# 计算合适的缓冲池大小
# 通常设置为系统内存的50-70%
# 例如,16GB内存的服务器:
innodb_buffer_pool_size = 12G

# 多个缓冲池实例(提高并发性能)
innodb_buffer_pool_instances = 8

# 监控缓冲池使用情况
mysql -u root -p -e “SHOW ENGINE INNODB STATUS\G” | grep -A 10 “BUFFER POOL AND MEMORY”
12.2 查询优化技巧
# 使用EXPLAIN分析查询
mysql -u root -p
EXPLAIN SELECT * FROM users WHERE username = ‘testuser1’;

— 优化前
EXPLAIN SELECT orders.*, users.username
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.status = 1;

— 优化后(添加合适的索引)
CREATE INDEX idx_user_status ON users(status);
EXPLAIN SELECT orders.*, users.username
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.status = 1;
12.3 使用索引提示
— 强制使用特定索引
SELECT * FROM users USE INDEX (idx_username) WHERE username = ‘testuser1’;

— 忽略特定索引
SELECT * FROM users IGNORE INDEX (idx_email) WHERE email LIKE ‘%@example.com’;

— 强制使用主键
SELECT * FROM users FORCE PRIMARY KEY WHERE id = 1;
十三、总结
本教程详细介绍了在CentOS Stream上安装、配置、优化和维护MySQL数据库的完整过程。关键要点包括:
安装准备
:确保系统环境满足要求,添加官方仓库
安全配置
:运行安全脚本,设置强密码,创建专用用户
性能优化
:合理配置InnoDB缓冲池,优化连接参数
备份策略
:定期备份,测试恢复流程
安全加固
:操作系统和数据库双重安全措施
监控维护
:持续监控性能指标,及时发现和解决问题
记住,数据库配置是一个持续优化的过程。建议定期审查性能指标,根据实际负载调整配置,并保持MySQL和操作系统的更新。
推荐的维护时间表
每日
:检查错误日志,验证备份是否成功
每周
:分析慢查询日志,优化有问题的查询
每月
:审查用户权限,更新统计信息,检查磁盘空间
每季度
:全面性能评估,配置审查,安全审计
通过遵循本指南,你将能够在CentOS Stream上建立一个稳定、高效、安全的MySQL数据库环境。