MySQL安装与配置

[复制链接]
发表于 2025-6-16 11:50:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
第2章:MySQL安装与配置(续)

2.4 MySQL基本配置

MySQL的配置对于数据库性能安全性和可靠性至关重要。本节将具体介绍MySQL的配置文件、常用配置参数、字符集设置以及安全配置等内容。
2.4.1 配置文件概述

MySQL使用配置文件来存储服务器和客户端的设置。相识配置文件的位置和结构是管理MySQL的基础。
配置文件位置

MySQL会按照特定的次序查找并加载配置文件。配置文件的位置取决于操作体系:
Windows体系


  • C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
  • C:\Program Files\MySQL\MySQL Server 8.0\my.ini
  • C:\my.ini
  • C:\Windows\my.ini
Linux/Unix体系


  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • /usr/local/mysql/etc/my.cnf
  • ~/.my.cnf(用户特定配置)
可以使用以下命令检察MySQL当前使用的配置文件:
  1. mysql --help | grep "Default options" -A 1
复制代码
配置文件结构

MySQL配置文件使用INI格式,由多个部分构成,每个部分以方括号中的标签开始。常见的配置部分包罗:


  • [mysqld]:MySQL服务器配置
  • [mysql]:MySQL命令行客户端配置
  • [client]:全部MySQL客户端步伐的通用配置
  • [mysqldump]:mysqldump工具的配置
  • [mysqladmin]:mysqladmin工具的配置
示例配置文件结构:
  1. [mysqld]
  2. # 服务器配置
  3. port=3306
  4. datadir=/var/lib/mysql
  5. socket=/var/lib/mysql/mysql.sock
  6. [mysql]
  7. # 命令行客户端配置
  8. prompt=\u@\h [\d]>\_
  9. [client]
  10. # 所有客户端的通用配置
  11. port=3306
  12. socket=/var/lib/mysql/mysql.sock
复制代码
配置优先级

MySQL按照以下优先级加载配置(从低到高):

  • 全局配置文件(如/etc/my.cnf)
  • MySQL安装目次中的配置文件
  • 用户特定的配置文件(~/.my.cnf)
  • 命令行参数
这意味着命令行参数会覆盖配置文件中的设置,而用户特定的配置会覆盖全局配置。
2.4.2 常用配置参数

MySQL有数百个配置参数,但只有少数参数必要常常调解。以下是一些最常用的配置参数及其说明:
基本设置

  1. [mysqld]
  2. # 服务器标识,在复制环境中必须唯一
  3. server-id=1
  4. # 监听地址和端口
  5. bind-address=0.0.0.0  # 监听所有网络接口
  6. port=3306
  7. # 数据目录
  8. datadir=/var/lib/mysql
  9. # 套接字文件位置
  10. socket=/var/run/mysqld/mysqld.sock
  11. # 临时目录
  12. tmpdir=/tmp
  13. # 最大连接数
  14. max_connections=200
  15. # 连接超时(秒)
  16. wait_timeout=28800
  17. interactive_timeout=28800
  18. # 最大允许的数据包大小
  19. max_allowed_packet=64M
复制代码
内存相关设置

  1. [mysqld]
  2. # InnoDB缓冲池大小(通常设置为系统内存的50-80%)
  3. innodb_buffer_pool_size=1G
  4. # InnoDB缓冲池实例数(通常设置为缓冲池大小/1GB)
  5. innodb_buffer_pool_instances=1
  6. # 查询缓存大小(MySQL 8.0已移除查询缓存)
  7. # query_cache_size=32M
  8. # query_cache_type=1
  9. # 排序缓冲区大小
  10. sort_buffer_size=2M
  11. # 连接缓冲区大小
  12. join_buffer_size=2M
  13. # 表定义缓存
  14. table_definition_cache=1400
  15. # 表打开缓存
  16. table_open_cache=2000
复制代码
日志日志设置

  1. [mysqld]
  2. # 错误日志日志
  3. log_error=/var/log/mysql/error.log
  4. # 一般查询日志日志(通常在生产环境中禁用)
  5. general_log=0
  6. general_log_file=/var/log/mysql/mysql.log
  7. # 慢查询日志
  8. slow_query_log=1
  9. slow_query_log_file=/var/log/mysql/mysql-slow.log
  10. long_query_time=2  # 记录执行时间超过2秒的查询
  11. # 二进制日志(用于复制和时间点恢复)
  12. log_bin=/var/log/mysql/mysql-bin.log
  13. expire_logs_days=14  # 自动删除14天前的日志
  14. max_binlog_size=100M
复制代码
InnoDB存储引擎设置

  1. [mysqld]
  2. # 默认存储引擎
  3. default_storage_engine=InnoDB
  4. # InnoDB日志文件大小
  5. innodb_log_file_size=256M
  6. # InnoDB日志缓冲区大小
  7. innodb_log_buffer_size=16M
  8. # InnoDB刷新方法
  9. innodb_flush_method=O_DIRECT
  10. # InnoDB刷新日志的频率
  11. # 1=最安全但最慢,0=最快但最不安全,2=折中
  12. innodb_flush_log_at_trx_commit=1
  13. # InnoDB文件每表一个(MySQL 5.6+)
  14. innodb_file_per_table=1
  15. # InnoDB缓冲池转储和加载
  16. innodb_buffer_pool_dump_at_shutdown=1
  17. innodb_buffer_pool_load_at_startup=1
复制代码
复制设置

  1. [mysqld]
  2. # 启用二进制日志(用于复制)
  3. log_bin=mysql-bin
  4. # 服务器ID(在复制环境中必须唯一)
  5. server_id=1
  6. # 二进制日志格式(ROW, STATEMENT, MIXED)
  7. binlog_format=ROW
  8. # 从服务器设置
  9. # read_only=1  # 使从服务器只读
  10. # relay_log=relay-bin
  11. # relay_log_index=relay-bin.index
复制代码
2.4.3 字符集和排序规则设置

字符集和排序规则对于准确存储和比较多语言数据至关重要。MySQL 8.0默认使用utf8mb4字符集和utf8mb4_0900_ai_ci排序规则,这是一个很好的选择,由于它支持全部Unicode字符(包罗心情符号)。
设置全局字符集和排序规则

在配置文件中设置全局字符集和排序规则:
  1. [mysqld]
  2. # 服务器字符集和排序规则
  3. character-set-server=utf8mb4
  4. collation-server=utf8mb4_unicode_ci
  5. [mysql]
  6. # 客户端字符集
  7. default-character-set=utf8mb4
  8. [client]
  9. # 连接字符集
  10. default-character-set=utf8mb4
复制代码
检察当前字符集设置

连接到MySQL后,可以使用以下命令检察当前的字符集和排序规则设置:
  1. -- 查看服务器字符集变量
  2. SHOW VARIABLES LIKE 'character_set%';
  3. -- 查看排序规则变量
  4. SHOW VARIABLES LIKE 'collation%';
复制代码
修改现有数据库和表的字符集

对于已经创建的数据库和表,可以使用以下命令修改其字符集和排序规则:
  1. -- 修改数据库字符集
  2. ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  3. -- 修改表字符集
  4. ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. -- 修改列字符集
  6. ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
复制代码
字符集最佳实践


  • 使用utf8mb4:始终使用utf8mb4而不是utf8,由于utf8mb4支持全部Unicode字符,包罗心情符号和一些稀有的中笔墨符。
  • 保持一致性:在服务器、数据库、表和连接级别使用雷同的字符集,以避免转换问题。
  • 选择适当的排序规则

    • utf8mb4_unicode_ci:正确但较慢
    • utf8mb4_general_ci:速度较快但不太正确
    • utf8mb4_0900_ai_ci:MySQL 8.0的默认值,结合了正确性和性能

  • 注意连接设置:确保应用步伐连接字符串中指定了准确的字符集。
2.4.4 安全配置

MySQL的安全配置对于保护数据库和数据至关重要。以下是一些基本的安全配置建议:
网络安全

  1. [mysqld]
  2. # 限制MySQL只监听特定IP地址(如本地连接)
  3. bind-address=127.0.0.1
  4. # 禁用远程root登录
  5. # 注意:这需要在MySQL中使用SQL命令设置
  6. # 使用安全连接
  7. require_secure_transport=ON  # 要求使用SSL/TLS连接(MySQL 5.7+)
复制代码
认证和访问控制

  1. [mysqld]
  2. # 使用强密码加密(MySQL 8.0默认)
  3. default_authentication_plugin=caching_sha2_password
  4. # 启用密码验证组件(MySQL 8.0+)
  5. plugin-load-add=validate_password.so
  6. validate_password.policy=MEDIUM
  7. validate_password.length=8
复制代码
文件体系安全

  1. [mysqld]
  2. # 限制文件系统访问
  3. secure-file-priv=/var/lib/mysql-files
  4. # 设置适当的文件权限(这是系统级设置,不在配置文件中)
  5. # sudo chown -R mysql:mysql /var/lib/mysql
  6. # sudo chmod 750 /var/lib/mysql
复制代码
用户账户安全

MySQL 8.0引入了角色,这使得权限管理更加机动和安全。以下是一些用户账户安全的最佳实践(通过SQL命令实现):
  1. -- 创建具有最小权限的用户
  2. CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';
  3. GRANT SELECT, INSERT, UPDATE, DELETE ON app_database.* TO 'app_user'@'localhost';
  4. -- 创建角色(MySQL 8.0+)
  5. CREATE ROLE 'app_read_role', 'app_write_role';
  6. GRANT SELECT ON app_database.* TO 'app_read_role';
  7. GRANT INSERT, UPDATE, DELETE ON app_database.* TO 'app_write_role';
  8. -- 将角色分配给用户
  9. GRANT 'app_read_role' TO 'read_user'@'localhost';
  10. GRANT 'app_write_role' TO 'write_user'@'localhost';
  11. -- 激活角色
  12. SET DEFAULT ROLE ALL TO 'read_user'@'localhost', 'write_user'@'localhost';
复制代码
审计和日志

  1. [mysqld]
  2. # 启用审计日志(企业版功能,社区版可以使用MariaDB审计插件)
  3. # audit_log=FORCE_PLUS_PERMANENT
  4. # audit_log_file=/var/log/mysql/audit.log
  5. # 启用一般查询日志(仅用于调试,生产环境通常禁用)
  6. general_log=0
  7. general_log_file=/var/log/mysql/mysql.log
  8. # 记录所有失败的登录尝试
  9. log_error_verbosity=3
复制代码
2.4.5 性能优化配置

MySQL的性能很大程度上取决于其配置。以下是一些基本的性能优化配置:
缓冲池和内存设置

  1. [mysqld]
  2. # InnoDB缓冲池大小(根据可用内存调整)
  3. # 对于专用服务器,可以设置为系统内存的50-80%
  4. innodb_buffer_pool_size=4G
  5. # InnoDB缓冲池实例数(每GB内存一个实例)
  6. innodb_buffer_pool_instances=4
  7. # InnoDB读写I/O线程数
  8. innodb_read_io_threads=4
  9. innodb_write_io_threads=4
  10. # 表定义缓存
  11. table_definition_cache=2000
  12. # 表打开缓存
  13. table_open_cache=4000
  14. table_open_cache_instances=16
复制代码
并发设置

  1. [mysqld]
  2. # 最大连接数
  3. max_connections=500
  4. # 线程缓存大小
  5. thread_cache_size=32
  6. # 临时表大小
  7. tmp_table_size=64M
  8. max_heap_table_size=64M
  9. # 后台线程并发
  10. innodb_parallel_read_threads=4  # MySQL 8.0.14+
复制代码
日志和事件设置

  1. [mysqld]
  2. # InnoDB日志文件大小(通常设置为缓冲池大小的25%)
  3. innodb_log_file_size=1G
  4. # InnoDB日志缓冲区大小
  5. innodb_log_buffer_size=32M
  6. # InnoDB刷新设置
  7. # 1=最安全但最慢,0=最快但最不安全,2=折中
  8. innodb_flush_log_at_trx_commit=1
  9. # 二进制日志同步
  10. sync_binlog=1  # 最安全设置,每次事务都同步
复制代码
查询优化

  1. [mysqld]
  2. # 排序缓冲区大小
  3. sort_buffer_size=4M
  4. # 连接缓冲区大小
  5. join_buffer_size=4M
  6. # 读取缓冲区大小
  7. read_buffer_size=2M
  8. read_rnd_buffer_size=2M
  9. # 优化器设置
  10. optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'
复制代码
2.4.6 监控监控和调优配置

为了有用地监控监控和调优MySQL,可以启用一些特定的配置选项:
性能模式(Performance Schema)

Performance Schema是MySQL的一个功能,用于监控监控MySQL服务器的执行情况:
  1. [mysqld]
  2. # 启用性能模式
  3. performance_schema=ON
  4. # 设置性能模式内存限制(根据可用内存调整)
  5. performance_schema_max_table_instances=500
  6. performance_schema_max_table_handles=500
  7. performance_schema_max_mutex_instances=5000
  8. performance_schema_max_rwlock_instances=2000
复制代码
信息模式(Information Schema)

Information Schema提供了对数据库元数据的访问:
  1. [mysqld]
  2. # 启用额外的统计信息
  3. innodb_stats_on_metadata=ON
复制代码
慢查询日志

慢查询日志对于识别性能问题非常有用:
  1. [mysqld]
  2. # 启用慢查询日志
  3. slow_query_log=1
  4. slow_query_log_file=/var/log/mysql/mysql-slow.log
  5. # 记录执行时间超过1秒的查询
  6. long_query_time=1
  7. # 记录未使用索引的查询
  8. log_queries_not_using_indexes=1
  9. # 限制每分钟记录的未使用索引的查询数
  10. log_throttle_queries_not_using_indexes=10
  11. # 记录管理语句(如ALTER TABLE)
  12. log_slow_admin_statements=1
复制代码
2.4.7 配置文件示例

以下是一个综合的MySQL配置文件示例,适用于中等规模的应用:
  1. [mysqld]
  2. # 基本设置
  3. user=mysql
  4. pid-file=/var/run/mysqld/mysqld.pid
  5. socket=/var/run/mysqld/mysqld.sock
  6. port=3306
  7. basedir=/usr
  8. datadir=/var/lib/mysql
  9. tmpdir=/tmp
  10. bind-address=0.0.0.0
  11. # 字符集设置
  12. character-set-server=utf8mb4
  13. collation-server=utf8mb4_unicode_ci
  14. # InnoDB设置
  15. default_storage_engine=InnoDB
  16. innodb_buffer_pool_size=2G
  17. innodb_buffer_pool_instances=2
  18. innodb_log_file_size=512M
  19. innodb_log_buffer_size=16M
  20. innodb_flush_log_at_trx_commit=1
  21. innodb_file_per_table=1
  22. innodb_flush_method=O_DIRECT
  23. innodb_read_io_threads=4
  24. innodb_write_io_threads=4
  25. # 连接设置
  26. max_connections=300
  27. thread_cache_size=32
  28. wait_timeout=3600
  29. interactive_timeout=3600
  30. max_allowed_packet=64M
  31. # 表缓存设置
  32. table_open_cache=2000
  33. table_definition_cache=1400
  34. table_open_cache_instances=16
  35. # 临时表设置
  36. tmp_table_size=32M
  37. max_heap_table_size=32M
  38. # 查询缓冲设置
  39. sort_buffer_size=2M
  40. join_buffer_size=2M
  41. read_buffer_size=1M
  42. read_rnd_buffer_size=1M
  43. # 日志设置
  44. log_error=/var/log/mysql/error.log
  45. slow_query_log=1
  46. slow_query_log_file=/var/log/mysql/mysql-slow.log
  47. long_query_time=2
  48. log_queries_not_using_indexes=0
  49. log_slow_admin_statements=1
  50. # 二进制日志设置
  51. log_bin=/var/log/mysql/mysql-bin.log
  52. expire_logs_days=14
  53. max_binlog_size=100M
  54. binlog_format=ROW
  55. sync_binlog=1
  56. # 复制设置
  57. server_id=1
  58. # 如果是从服务器,取消下面的注释
  59. # read_only=1
  60. # relay_log=relay-bin
  61. # relay_log_index=relay-bin.index
  62. # 安全设置
  63. secure-file-priv=/var/lib/mysql-files
  64. default_authentication_plugin=caching_sha2_password
  65. # 性能模式
  66. performance_schema=ON
  67. [mysql]
  68. default-character-set=utf8mb4
  69. [client]
  70. default-character-set=utf8mb4
复制代码
2.4.8 动态配置参数

MySQL的很多配置参数可以在运行时动态修改,无需重启服务器。这对于调试和优化非常有用。
检察可动态修改的参数

  1. -- 查看所有系统变量
  2. SHOW VARIABLES;
  3. -- 查看特定变量
  4. SHOW VARIABLES LIKE 'max_connections';
  5. -- 查看变量是否可动态修改
  6. SELECT @@max_connections;
复制代码
动态修改参数

  1. -- 修改全局变量(影响新连接)
  2. SET GLOBAL max_connections = 500;
  3. -- 修改会话变量(仅影响当前连接)
  4. SET SESSION sort_buffer_size = 4*1024*1024;
复制代码
长期化动态参数(MySQL 8.0+)

MySQL 8.0引入了SET PERSIST命令,可以动态修改参数并将其保存到配置文件中,使其在重启后仍旧有用:
  1. -- 修改参数并持久化
  2. SET PERSIST max_connections = 500;
  3. -- 仅持久化参数,不立即修改
  4. SET PERSIST_ONLY max_connections = 500;
  5. -- 查看持久化的配置
  6. SELECT * FROM performance_schema.persisted_variables;
  7. -- 删除持久化的配置
  8. RESET PERSIST max_connections;
  9. RESET PERSIST IF EXISTS max_connections;
  10. RESET PERSIST; -- 删除所有持久化配置
复制代码
2.4.9 配置最佳实践

以下是一些MySQL配置的最佳实践:

  • 基于实际需求配置:根据应用步伐的实际需求和服务器的硬件资源调解配置。
  • 监控和调解:定期监控MySQL的性能,并根据监控结果调解配置。
  • 增量调解:一次只调解一个或少数几个参数,然后观察效果,避免大规模更改导致问题难以诊断。
  • 记录更改:记录全部配置更改及其效果,以便将来参考。
  • 使用默认值作为出发点:MySQL的默认配置在大多数情况下是合理的,可以作为调解的出发点。
  • 考虑工作负载类型:不同类型的工作负载(如OLTP、OLAP)必要不同的配置优化。
  • 定期审查安全设置:定期检查和更新安全配置,确保数据库的安全性。
  • 备份配置文件:在修改配置文件之前,始终创建备份,以便在出现问题时可以规复。
  • 测试环境验证:在生产环境应用配置更改之前,先在测试环境中验证。
  • 使用配置管理工具:对于多服务器环境,考虑使用配置管理工具(如Ansible、Puppet或Chef)来管理MySQL配置。
通过合理配置MySQL,可以显著进步数据库的性能、安全性和可靠性,为应用步伐提供稳固高效的数据存储和检索服务。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表