# MYSQL维护指南

#### 1. **监控数据库性能**

##### 1.1. **主机监控**

定期监控和分析数据库的性能指标，包括查询速度、连接数、CPU和内存使用情况等。这有助于识别性能瓶颈，并采取相应的优化措施。

常用命令：**top** 、 **free -h** 、 **df -h** 检查mysql主机的性能，可用资源应该冗余30%以上。



##### 1.2. **状态监控**

```mysql

-- 这条命令用于查询当前有多少客户端线程连接到数据库。
-- 这个数字可以帮助你了解数据库的负载情况，如果连接数异常高，可能意味着你的数据库正面临过高的请求负载或者连接泄露问题
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）**

```mysql

-- 检查performance_schema这个系统变量的状态，如果performance_schema=ON，说明performance_schema已经启用
SHOW VARIABLES LIKE 'performance_schema';

-- 如果没有启用performance_schema，可以通过修改my.cnf文件来启用performance_schema，添加如下配置
-- [mysqld]  
-- performance_schema=ON
-- 所有已执行SQL语句的性能摘要,返回了执行次数最多的前20个查询模板，这有助于识别出数据库中最频繁执行的查询，这些查询往往是性能优化的重点目标
use performance_schema;

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. **分析慢日志**

分析查询日志和慢查询日志，找出执行时间长、效率低下的查询语句，并进行优化。
```conf

# 开启慢查询日志
slow_query_log=1

# 慢查询日志文件路径
# slow_query_log_file=/var/log/mysql/mysql-slow.log
# 如果未设置，可以使用 SHOW VARIABLES LIKE 'slow_query_log_file'查看

# 记录查询执行时间超过30秒的查询
long_query_time=10

```

```mysql

-- 查询是否开启慢日志
SHOW VARIABLES LIKE 'slow_query_log';

-- 临时开启慢日志，重启后失效
SET  GLOBAL slow_query_log = 'ON';

-- 查看慢查询阈值
SHOW VARIABLES LIKE 'long_query_time';

-- 设置超过阈值的查询时间为慢查询
SET  GLOBAL long_query_time = 10;

-- 慢日志存储路径
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 查看慢查询日志
SELECT
  *
FROM
  mysql.slow_log
ORDER BY
  start_time DESC
LIMIT
  20;

```
---
#### 2. **备份数据库**

根据数据库的重要性和数据变动频率，制定合理的备份策略。通常建议每天或每周进行一次全备份，并结合增量备份以减少存储空间和时间消耗。



##### 2.1. **备份方式**

可以选择逻辑备份（如使用mysqldump工具）或物理备份（如直接复制数据文件）。逻辑备份生成SQL脚本文件，便于在不同版本的MySQL之间迁移；物理备份则速度更快，恢复时更接近原始状态。

```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. 设置强密码与密码密码过期策略

为用户和数据库设置复杂且不易猜测的密码，并定期更换密码。设置密码过期策略

```mysql
-- 全局的密码生命周期
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的配置参数，如缓冲区大小、连接数等，以优化数据库性能。