当前位置: 首页 > news >正文

第二篇:MySQL初始化配置与性能优化

MySQL初始化配置与性能优化

一、初始化安全配置

1.1 运行安全配置脚本

安装完MySQL后,第一件事就是进行安全配置。MySQL提供了一个很方便的安全配置脚本:

# 运行安全配置脚本
sudo mysql_secure_installation

这个脚本会引导你完成几个重要的安全设置。每个步骤详细解释:

1.1.1 密码策略设置
Securing the MySQL server deployment.Connecting to MySQL using a blank password.VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to only set those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?Press y|Y for Yes, any other key for No:

建议:选择 Y 启用密码验证组件。然后选择密码强度:

  • 0 = LOW(低强度,只检查长度)
  • 1 = MEDIUM(中等强度,推荐)
  • 2 = STRONG(高强度,包含特殊字符检查)

选择 1(中等强度)就好,既安全又不会太严格。

1.1.2 设置root密码
Please set the password for root here.New password:
Re-enter new password:

设置强密码的技巧

  • 至少8个字符
  • 包含大小写字母、数字和特殊字符
  • 不要使用常见词汇或个人信息
  • 例如:MySql@2024#Secure
1.1.3 移除匿名用户
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.Remove anonymous users? (Press y|Y for Yes, any other key for No):

建议:选择 Y 移除匿名用户。匿名用户是安全隐患,生产环境必须移除。

1.1.4 禁止root远程登录
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.Disallow root login remotely? (Press y|Y for Yes, any other key for No):

建议:选择 Y 禁止root远程登录。这是重要的安全措施,root用户只能在本地登录。

1.1.5 移除测试数据库
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.Remove test database and access to it? (Press y|Y for Yes, any other key for No):

建议:选择 Y 移除测试数据库。测试数据库没有实际用途,移除它更安全。

1.1.6 重新加载权限表
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.Reload privilege tables now? (Press y|Y for Yes, any other key for No):

建议:选择 Y 重新加载权限表,让所有设置立即生效。

1.2 手动安全配置(补充)

除了安全配置脚本,建议你再手动检查一些安全设置:

1.2.1 检查用户权限
# 登录MySQL
mysql -u root -p# 查看所有用户
SELECT user, host, authentication_string FROM mysql.user;# 查看用户权限
SHOW GRANTS FOR 'root'@'localhost';
1.2.2 删除不必要的用户
-- 删除空密码用户
DELETE FROM mysql.user WHERE authentication_string = '';-- 删除匿名用户(如果安全脚本没删除)
DELETE FROM mysql.user WHERE user = '';-- 删除测试数据库相关权限
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE db = 'test' OR db = 'test\\_%';-- 刷新权限
FLUSH PRIVILEGES;

1.3 配置远程访问(可选)

如果你需要远程连接MySQL,需要进行以下配置:

1.3.1 创建远程用户
-- 创建远程用户(不要用root)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword123!';-- 授予特定数据库权限(不要授予所有权限)
GRANT ALL PRIVILEGES ON app_database.* TO 'app_user'@'%';-- 或者授予只读权限
GRANT SELECT ON app_database.* TO 'app_user'@'%';-- 刷新权限
FLUSH PRIVILEGES;
1.3.2 配置MySQL监听所有IP
# 编辑MySQL配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf    # Ubuntu
sudo vim /etc/my.cnf                           # CentOS

找到 bind-address 行,修改为:

bind-address = 0.0.0.0
1.3.3 重启MySQL服务
sudo systemctl restart mysql
1.3.4 配置防火墙
# Ubuntu系统
sudo ufw allow 3306/tcp# CentOS系统
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

二、基础性能配置

2.1 找到配置文件

MySQL的配置文件位置因安装方式而异:

# 包管理器安装的常见位置
/etc/mysql/my.cnf                    # Ubuntu
/etc/my.cnf                          # CentOS
/etc/mysql/mysql.conf.d/mysqld.cnf   # Ubuntu# 手动编译安装的常见位置
/usr/local/mysql/etc/my.cnf

建议:使用以下命令查找你的配置文件位置:

# 查找MySQL配置文件
sudo find / -name "my.cnf" 2>/dev/null# 或者查看MySQL加载的配置文件
mysql --help | grep "Default options"

2.2 基础配置参数

让我为你介绍一些最重要的基础配置参数。创建或编辑配置文件:

[mysqld]
# 基础配置
port = 3306
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid# 字符集配置(支持中文和emoji)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci# 存储引擎配置
default-storage-engine = InnoDB# 日志配置
log-error = /var/log/mysql/error.log
slow-query-log = 1
slow-query-log-file = /var/log/mysql/slow.log
long_query_time = 2# 连接配置
max_connections = 200
max_connect_errors = 1000
wait_timeout = 28800
interactive_timeout = 28800# 缓冲配置(最关键的性能参数)
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M# 其他配置
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

2.3 关键参数详解

让我详细解释这些重要参数的含义和设置建议:

2.3.1 内存相关参数

innodb_buffer_pool_size(最重要的参数!)

innodb_buffer_pool_size = 1G

这是什么:InnoDB缓冲池大小,是MySQL最重要的内存参数。

设置建议

  • 开发环境:512M - 1G
  • 生产环境:系统内存的50-70%
  • 例如:8GB内存的服务器可以设置为4-6G

为什么重要:这个参数决定了MySQL能缓存多少数据和索引,直接影响查询性能。

innodb_log_file_size

innodb_log_file_size = 256M

这是什么:InnoDB日志文件大小,用于事务恢复。

设置建议

  • 一般设置为缓冲池大小的25%
  • 例如:缓冲池1G,日志文件可以设置为256M

max_connections

max_connections = 200

这是什么:最大连接数,决定了同时能有多少客户端连接MySQL。

设置建议

  • 小型应用:100-200
  • 中型应用:200-500
  • 大型应用:500-1000
2.3.2 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

为什么用utf8mb4

  • 支持完整的Unicode字符,包括emoji表情
  • 比utf8更完整,是现代应用的标准选择
  • 向后兼容utf8
2.3.3 SQL模式
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

SQL模式的作用

  • STRICT_TRANS_TABLES:严格模式,拒绝无效数据
  • NO_ZERO_IN_DATE:不允许日期中的月或日为0
  • NO_ZERO_DATE:不允许’0000-00-00’这样的日期
  • ERROR_FOR_DIVISION_BY_ZERO:除零错误时返回错误而非警告

2.4 应用配置更改

修改配置文件后,需要重启MySQL服务才能生效:

# 重启MySQL服务
sudo systemctl restart mysql# 或者使用reload(部分配置可以热加载)
sudo systemctl reload mysql# 验证配置是否生效
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"

三、高级性能优化

3.1 InnoDB引擎优化

InnoDB是MySQL的默认存储引擎,针对它进行优化能显著提升性能。

3.1.1 InnoDB缓冲池优化
[mysqld]
# InnoDB缓冲池设置
innodb_buffer_pool_size = 2G                    # 根据内存大小调整
innodb_buffer_pool_instances = 4               # 缓冲池实例数,建议每个实例1-2G
innodb_buffer_pool_chunk_size = 128M            # 缓冲池块大小# InnoDB I/O优化
innodb_io_capacity = 2000                       # SSD硬盘设置为2000,HDD设置为200
innodb_io_capacity_max = 4000                   # 最大I/O容量
innodb_read_io_threads = 8                       # 读线程数
innodb_write_io_threads = 4                     # 写线程数
innodb_thread_concurrency = 0                   # 线程并发数(0表示不限制)
3.1.2 InnoDB日志优化
[mysqld]
# InnoDB日志设置
innodb_log_file_size = 512M                      # 日志文件大小
innodb_log_buffer_size = 32M                     # 日志缓冲区大小
innodb_flush_log_at_trx_commit = 1               # 事务提交时刷新日志(1=安全,2=性能)
innodb_flush_method = O_DIRECT                   # 刷新方法(Linux推荐O_DIRECT)
innodb_doublewrite = 1                          # 双写缓冲(安全与性能的平衡)
3.1.3 InnoDB其他优化
[mysqld]
# InnoDB其他优化
innodb_file_per_table = 1                       # 每个表一个文件空间
innodb_stats_on_metadata = 0                     # 不更新统计信息元数据
innodb_old_blocks_time = 1000                   # 旧块在LRU列表中的时间
innodb_open_files = 2000                        # 打开的文件数限制

3.2 查询缓存优化(MySQL 5.7及以下)

注意:MySQL 8.0已移除查询缓存功能。

[mysqld]
# 查询缓存设置(MySQL 5.7及以下)
query_cache_type = 1                             # 启用查询缓存
query_cache_size = 64M                          # 查询缓存大小
query_cache_limit = 2M                          # 单个查询缓存大小限制

3.3 连接和线程优化

[mysqld]
# 连接优化
max_connections = 500                            # 最大连接数
max_connect_errors = 10000                      # 最大连接错误数
connect_timeout = 10                             # 连接超时时间
wait_timeout = 28800                            # 等待超时时间(8小时)
interactive_timeout = 28800                     # 交互式超时时间# 线程缓存
thread_cache_size = 16                          # 线程缓存大小
thread_stack = 256K                             # 线程堆栈大小# 表缓存
table_open_cache = 2000                         # 表缓存大小
table_definition_cache = 2000                  # 表定义缓存大小

3.4 慢查询日志配置

[mysqld]
# 慢查询日志
slow_query_log = 1                              # 启用慢查询日志
slow_query_log_file = /var/log/mysql/slow.log   # 慢查询日志文件
long_query_time = 2                             # 慢查询阈值(秒)
log_queries_not_using_indexes = 1                # 记录未使用索引的查询

3.5 根据服务器类型优化配置

3.5.1 开发环境配置(4GB内存)
[mysqld]
# 开发环境优化配置
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 100
thread_cache_size = 8
table_open_cache = 200
query_cache_size = 32M    # MySQL 5.7及以下
3.5.2 生产环境配置(8GB内存)
[mysqld]
# 生产环境优化配置
innodb_buffer_pool_size = 4G
innodb_log_file_size = 1G
max_connections = 500
thread_cache_size = 16
table_open_cache = 2000
innodb_io_capacity = 2000
innodb_read_io_threads = 8
innodb_write_io_threads = 4
3.5.3 高性能环境配置(16GB+内存)
[mysqld]
# 高性能环境优化配置
innodb_buffer_pool_size = 10G
innodb_log_file_size = 2G
max_connections = 1000
thread_cache_size = 32
table_open_cache = 4000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_read_io_threads = 16
innodb_write_io_threads = 8

四、配置验证与监控

4.1 验证配置是否生效

修改配置后,我们需要验证配置是否正确生效:

# 重启MySQL服务
sudo systemctl restart mysql# 检查MySQL状态
sudo systemctl status mysql# 查看错误日志
tail -f /var/log/mysql/error.log# 登录MySQL验证配置
mysql -u root -p

在MySQL中执行以下命令验证关键配置:

-- 查看缓冲池大小
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';-- 查看字符集
SHOW VARIABLES LIKE 'character_set_server';-- 查看日志文件大小
SHOW VARIABLES LIKE 'innodb_log_file_size';-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query%';

4.2 性能监控命令

4.2.1 基础状态查看
-- 查看MySQL运行状态
SHOW STATUS;-- 查看特定状态变量
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
SHOW STATUS LIKE 'Questions';
SHOW STATUS LIKE 'Slow_queries';-- 查看InnoDB状态
SHOW ENGINE INNODB STATUS;
4.2.2 性能指标计算
-- 计算QPS(每秒查询数)
SHOW GLOBAL STATUS LIKE 'Questions';
SET @qps = (SELECT variable_value FROM global_status WHERE variable_name = 'Questions');
SELECT @qps AS total_queries;-- 计算TPS(每秒事务数)
SHOW GLOBAL STATUS LIKE 'Com_commit';
SHOW GLOBAL STATUS LIKE 'Com_rollback';
SET @commits = (SELECT variable_value FROM global_status WHERE variable_name = 'Com_commit');
SET @rollbacks = (SELECT variable_value FROM global_status WHERE variable_name = 'Com_rollback');
SELECT (@commits + @rollbacks) AS total_transactions;-- 查看缓冲池命中率
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
SET @read_requests = (SELECT variable_value FROM global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests');
SET @read_misses = (SELECT variable_value FROM global_status WHERE variable_name = 'Innodb_buffer_pool_reads');
SELECT @read_requests, @read_misses, ROUND((@read_requests - @read_misses) * 100 / @read_requests, 2) AS hit_rate_percent;

4.3 使用Performance Schema监控

MySQL 5.7+提供了Performance Schema,可以更详细地监控性能:

-- 启用Performance Schema监控
UPDATE performance_schema.setup_instruments SET enabled = 'YES', timed = 'YES';-- 查看最耗时的SQL
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;-- 查看索引使用情况
SELECT * FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE OBJECT_SCHEMA NOT IN ('mysql', 'performance_schema')
ORDER BY COUNT_STAR DESC;

五、常见配置问题解决

5.1 内存配置问题

5.1.1 内存不足错误

问题InnoDB: Cannot allocate memory for the buffer pool

解决

[mysqld]
# 减少内存配置
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
max_connections = 50
5.1.2 缓冲池过大

问题:服务器启动缓慢或频繁交换内存

解决

# 查看内存使用情况
free -h# 检查MySQL内存使用
ps aux | grep mysqld# 调整配置
innodb_buffer_pool_size = 系统内存的50%或更少

5.2 连接配置问题

5.2.1 连接数过多

问题ERROR 1040: Too many connections

解决

[mysqld]
# 增加最大连接数
max_connections = 500# 增加线程缓存
thread_cache_size = 32# 减少连接超时时间
wait_timeout = 600
interactive_timeout = 600
5.2.2 连接超时

问题MySQL server has gone away

解决

[mysqld]
# 增加超时时间
wait_timeout = 28800
interactive_timeout = 28800# 检查网络配置
connect_timeout = 10

5.3 日志配置问题

5.3.1 日志文件权限问题

问题:MySQL无法写入日志文件

解决

# 检查日志文件权限
ls -la /var/log/mysql/# 设置正确的权限
sudo chown -R mysql:mysql /var/log/mysql/
sudo chmod 755 /var/log/mysql/
5.3.2 磁盘空间不足

问题:日志文件占满磁盘空间

解决

# 检查磁盘空间
df -h# 清理旧日志
sudo logrotate -f /etc/logrotate.d/mysql-server# 限制日志大小
[mysqld]
max_binlog_size = 100M
binlog_expire_logs_seconds = 604800  # 7天后过期

5.4 字符集问题

5.4.1 中文乱码

问题:中文字符显示为问号

解决

[mysqld]
# 确保字符集配置正确
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci[client]
default-character-set = utf8mb4[mysql]
default-character-set = utf8mb4
5.4.2 连接字符集问题

问题:应用程序连接时字符集不匹配

解决

-- 在连接时指定字符集
SET NAMES utf8mb4;-- 或者在连接字符串中指定
mysql -u root -p --default-character-set=utf8mb4

六、配置优化建议

6.1 根据应用类型优化

6.1.1 读密集型应用
[mysqld]
# 读密集型优化
innodb_buffer_pool_size = 系统内存的70%
innodb_read_io_threads = 16
query_cache_size = 256M    # MySQL 5.7及以下
table_open_cache = 4000
6.1.2 写密集型应用
[mysqld]
# 写密集型优化
innodb_buffer_pool_size = 系统内存的50%
innodb_write_io_threads = 16
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2  # 牺牲一定安全性换取性能
innodb_doublewrite = 0              # 如果数据安全有保障可以关闭
6.1.3 混合型应用
[mysqld]
# 混合型优化
innodb_buffer_pool_size = 系统内存的60%
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_log_file_size = 1G
table_open_cache = 2000

6.2 监控和调优建议

6.2.1 定期监控指标
# 创建监控脚本
cat > mysql_monitor.sh << 'EOF'
#!/bin/bash
MYSQL_USER="monitor"
MYSQL_PASS="monitor_pass"# 获取关键指标
echo "=== MySQL Performance Metrics ==="
echo "Timestamp: $(date)"mysql -u$MYSQL_USER -p$MYSQL_PASS -e "
SELECT 'Threads_connected' as metric,variable_value as value
FROM global_status 
WHERE variable_name = 'Threads_connected'UNION ALLSELECT 'Max_used_connections' as metric,variable_value as value
FROM global_status 
WHERE variable_name = 'Max_used_connections'UNION ALLSELECT 'Slow_queries' as metric,variable_value as value
FROM global_status 
WHERE variable_name = 'Slow_queries';SELECT 'Buffer_pool_hit_rate' as metric,ROUND((SUM(CASE WHEN variable_name = 'Innodb_buffer_pool_read_requests' THEN variable_value ELSE 0 END) - SUM(CASE WHEN variable_name = 'Innodb_buffer_pool_reads' THEN variable_value ELSE 0 END)) * 100 /SUM(CASE WHEN variable_name = 'Innodb_buffer_pool_read_requests' THEN variable_value ELSE 1 END), 2) as value
FROM global_status 
WHERE variable_name IN ('Innodb_buffer_pool_read_requests', 'Innodb_buffer_pool_reads');
"
EOFchmod +x mysql_monitor.sh
./mysql_monitor.sh
6.2.2 配置调优流程
  1. 建立基准:记录优化前的性能指标
  2. 逐步调整:一次只调整一个参数
  3. 监控效果:观察调整后的性能变化
  4. 记录结果:记录每次调整的效果
  5. 持续优化:根据监控结果持续调整

6.3 安全配置建议

[mysqld]
# 安全配置
skip-name-resolve                           # 跳过域名解析,提高连接速度
local_infile = 0                            # 禁用LOCAL INFILE,防止文件读取攻击
symbolic-links = 0                           # 禁用符号链接,提高安全性# 用户权限控制
grant-privileges = 0                        # 禁止授权权限
skip-show-database = 1                       # 不显示数据库列表
http://www.dtcms.com/a/351911.html

相关文章:

  • 汽车零部件软件迭代开发指南
  • Spring Boot -Mybatis的使用和基础
  • 数字孪生:工厂优化的下一个前沿领域
  • GIS开源库汇总
  • Linux笔记10——shell编程基础-4
  • Web安全开发指导规范文档V1.0
  • 基于SpringBoot的美剧观影网站【2026最新】
  • WebSocket 技术详解:协议原理、握手到生产落地的一站式实践
  • AI——提示词工程认识
  • 探索高效随机地址生成器 AddressGen.top
  • STM32——Uinx时间戳+BKP+RTC实时时钟
  • Ubuntu 操作系统
  • 高速CANFD通讯接口芯片ASM1042性能分析与5Mbps多节点测验
  • 进程管理详解
  • 【ElasticSearch】客户端选择
  • Sigma规则集网络安全应用(Elasticsearch、es日志安全检查、SOC、自定义规则)
  • Linux修改服务器时区
  • S2B2B系统哪个好,商淘云、数商云、金蝶云苍穹供应链批发哪个比较靠谱
  • 模型微调训练中超长文本训练存在的问题
  • 机器视觉学习-day02-灰度化实验
  • 更新依赖失败,报错
  • 赋能增长:商城分销平台的五大核心模式与适用场景
  • 京东招java开发
  • 解决Ubuntu拉取Docker镜像失败问题。
  • 云计算学习笔记——Linux硬盘、硬盘划分、交换空间、自动挂载篇
  • 淤地坝安全在线监测系统
  • 如何用企业微信AI解决金融运维难题,让故障响应快、客服专业度高
  • Android 中使用开源库 ZXing 生成二维码图片
  • 实训日志day28
  • 人工智能-python-深度学习-参数初始化与损失函数