MYSQL维护指南
1. 监控数据库性能
1.1. 主机监控
定期监控和分析数据库的性能指标,包括查询速度、连接数、CPU和内存使用情况等。这有助于识别性能瓶颈,并采取相应的优化措施。
常用命令:top 、 free -h 、 df -h 检查mysql主机的性能,可用资源应该冗余30%以上。
1.2. 状态监控
-- 这条命令用于查询当前有多少客户端线程连接到数据库。这个数字可以帮助你了解数据库的负载情况,如果连接数异常高,可能意味着你的数据库正面临过高的请求负载或者连接泄露问题
SHOW GLOBAL STATUS LIKE 'Threads_connected';
-- 这条命令用于显示自数据库启动以来执行的查询总数。这个指标可以帮助你评估数据库的工作量,了解数据库的使用频率
SHOW GLOBAL STATUS LIKE 'Queries';
-- 这条命令查询排序缓冲区的大小。排序缓冲区是MySQL用于排序操作的内存区域。调整这个值可以影响排序操作的性能,特别是在处理大量数据时
SHOW VARIABLES LIKE 'sort_buffer_size';
-- 这条命令用于查询InnoDB缓冲池的大小。InnoDB缓冲池是存储InnoDB表数据和索引的内存区域。这个值的大小直接影响到数据库的性能,特别是在处理大型数据库时
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
-- 这条命令显示当前MySQL服务器上所有运行的进程信息。这可以帮助你识别当前正在执行的查询,检查是否有长时间运行的查询或者锁竞争情况
SHOW FULL PROCESSLIST;
1.3. 利用MySQL的性能模式(Performance Schema)
-- 检查performance_schema这个系统变量的状态,如果performance_schema=ON,说明performance_schema已经启用
SHOW VARIABLES LIKE 'performance_schema';
-- 如果没有启用performance_schema,可以通过修改my.cnf文件来启用performance_schema,添加如下配置
-- [mysqld]
-- performance_schema=ON
-- 所有已执行SQL语句的性能摘要,返回了执行次数最多的前20个查询模板,这有助于识别出数据库中最频繁执行的查询,这些查询往往是性能优化的重点目标
SELECT
SCHEMA_NAME,
DIGEST_TEXT,
COUNT_STAR as `执行次数`,
SUM_TIMER_WAIT / COUNT_STAR/1e12 AS `平均执行时间(秒)`,
MAX_TIMER_WAIT/1e12 as `最大执行时间(秒)`,
SUM_LOCK_TIME / COUNT_STAR/1e12 AS `平均锁定时间(秒)`,
SUM_ROWS_SENT / COUNT_STAR AS `平均返回的行数`,
SUM_ROWS_EXAMINED / COUNT_STAR AS `平均扫描的行数`,
SUM_ROWS_AFFECTED / COUNT_STAR AS `平均影响的行数`,
SUM_CREATED_TMP_DISK_TABLES / COUNT_STAR AS `平均创建的临时磁盘表`,
SUM_SORT_MERGE_PASSES / COUNT_STAR AS `序操作的效率`,
SUM_NO_INDEX_USED / COUNT_STAR AS `没有使用索引的次数`,
SUM_NO_GOOD_INDEX_USED / COUNT_STAR AS `没有更好的使用索引的次数`
FROM
events_statements_summary_by_digest
WHERE
SCHEMA_NAME NOT IN (
'mysql',
'performance_schema',
'information_schema'
)
ORDER BY
`平均执行时间(秒)` DESC
LIMIT
20;
1.4. 分析日志
分析查询日志和慢查询日志,找出执行时间长、效率低下的查询语句,并进行优化。
--
在cnf开启慢日志
--# 开启慢查询日志
-- slow_query_log = slow_query_log=1
--# 慢查询日志文件路径
# slow_query_log_file=/var/log/mysql/mysql-slow.log
# 如果未设置慢日志的阈值,可以使用 --SHOW long_query_timeVARIABLES =LIKE 5'slow_query_log_file'查看
--# 开启慢日志记录查询执行时间超过30秒的查询
long_query_time=30
-- 查询是否开启慢日志
SHOW VARIABLES LIKE 'slow_query_log';
-- 临时开启慢日志,重启后失效
SET GLOBAL slow_query_log = 'ON';
-- 查看慢查询阈值
SHOW VARIABLES LIKE 'long_query_time';
-- 设置超过阈值的查询时间为慢查询
SET GLOBAL long_query_time = 5;30;
-- 查看慢查询日志
SELECT
*
FROM
mysql.slow_log
ORDER BY
start_time DESC
LIMIT
20;
2. 备份数据库
根据数据库的重要性和数据变动频率,制定合理的备份策略。通常建议每天或每周进行一次全备份,并结合增量备份以减少存储空间和时间消耗。
2.1. 备份方式
可以选择逻辑备份(如使用mysqldump工具)或物理备份(如直接复制数据文件)。逻辑备份生成SQL脚本文件,便于在不同版本的MySQL之间迁移;物理备份则速度更快,恢复时更接近原始状态。
-- 备份mysql数据库
mysqldump - u root - p --all-databases > all_databases.sql
-- 恢复mysql数据库
mysql - u root - p < all_databases.sql
2.2. 验证备份
定期验证备份数据的完整性和可恢复性,确保在需要时能够成功恢复数据。
3. 优化查询语句和表结构
3.1. 优化查询语句
使用合适的索引、避免全表扫描、减少不必要的JOIN操作等,以提高查询效率。
3.2. 优化表结构
定期检查并优化表结构,删除不必要的字段和表,合并相似的表以减少冗余数据。对于大型表,可以使用OPTIMIZE TABLE命令进行优化,以减少磁盘空间使用和提高查询性能。
3.3. 归档历史数据
将超过一定历史时限的数据库进行归档,并从实时数据库进行删除,以降低数据量提高数据库性能。
4. 更新和维护
4.1. 更新数据库软件:
定期更新MySQL服务器和相关组件的软件版本,以修复已知的漏洞、提高性能和增加新功能。
4.2. 安装安全补丁:
及时安装MySQL的安全补丁,以防止黑客攻击和数据泄露。
5. 安全管理
5.1. 设置强密码与密码密码过期策略
为用户和数据库设置复杂且不易猜测的密码,并定期更换密码。设置密码过期策略
-- 全局的密码生命周期
SET GLOBAL default_password_lifetime = 180;
-- 设置密码过期时间
ALTER USER 'your_username' @'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;
5.2. 最小权限原则:
-
遵循最小权限原则:为用户和应用程序分配必要的最小权限集合,以减少安全风险。
-
定期审计:定期审计数据库的访问日志和权限分配情况,及时发现并处理潜在的安全问题。
-
不允许使用ROOT直接:不允许使用ROOT用户直连数据库,应该为每个应用程序单独设置连接用户。
6. 其他维护任务
6.1. 检查磁盘空间
确保数据库服务器有足够的磁盘空间来存储数据和日志文件。
6.2. 清理无用数据
定期清理无用的数据、临时表和日志文件等,以释放磁盘空间和提高性能。
6.3. 配置和优化MySQL参数
根据监控结果和实际需求,调整MySQL的配置参数,如缓冲区大小、连接数等,以优化数据库性能。