我一直是自己租用VPS服务器,然后搭建各种服务,比如博客就是Apache2+MySQL数据库。一般来说就是默认参数,没有去管,不过最近发现MySQL的性能参数都很保守,不能发挥整个服务器的性能。
然后我就网上搜索了一下,根据参数配置建议,用ChatGPT写了以下Python和BASH脚本。只需要在需要优化的服务器上,跑一下该脚本,然后就会显示参数配置,然后直接把参数添加到MySQL数据库配置参数文件上: /etc/mysql/mysql.conf.d/mysqld.cnf
然后运行: service mysql restart 重启MySQL服务器。
运行了几周,发现效果很好,博客反应速度也快了很多,这很大原因是根据了内存增加了MySQL缓存大小。
Python脚本优化MySQL数据库参数
把下面的Python脚本存成 mysql_config.py 然后运行 python3 mysql_config.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | def get_total_ram(): with open('/proc/meminfo', 'r') as f: for line in f: if line.startswith("MemTotal:"): total_ram_kb = int(line.split()[1]) return total_ram_kb * 1024 # 转换为字节(bytes) return 0 # 如果未找到 MemTotal,则返回 0 def calculate_mysql_settings(): # 获取总内存(以字节为单位) total_ram = get_total_ram() # 根据总内存(以字节为单位)计算 MySQL 配置 innodb_buffer_pool_size = int(total_ram * 0.3) # 使用内存的 30% key_buffer_size = min(total_ram * 20 // 100, 512 * 1024 * 1024) # 使用内存的 20%,最大限制为 512MB sort_buffer_size = min(total_ram * 25 // 1000, 4 * 1024 * 1024) # 使用内存的 0.25%,最大限制为 4MB read_rnd_buffer_size = min(total_ram * 625 // 100000, 512 * 1024) # 使用内存的 0.0625%,最大限制为 512KB tmp_table_size = max_heap_table_size = min(total_ram * 5 // 100, 64 * 1024 * 1024) # 使用内存的 5%,最大限制为 64MB join_buffer_size = min(total_ram * 2 // 1000, 4 * 1024 * 1024) # 使用内存的 0.2%,最大限制为 4MB table_open_cache = min(400 + (total_ram // 64), 2000) # 根据内存动态计算,最大限制为 2000 thread_cache_size = min(total_ram * 15 // 1000, 100) # 使用内存的 1.5%,最大限制为 100 innodb_log_buffer_size = min(total_ram * 5 // 100, 16 * 1024 * 1024) # 使用内存的 5%,最大限制为 16MB # 以字节为单位打印配置 print(f"MySQL 配置(基于总内存 {total_ram / (1024 * 1024):.2f} MB):") print("将以下内容添加到 /etc/mysql/mysql.conf.d/mysqld.cnf 的末尾\n") print(f"innodb_buffer_pool_size = {innodb_buffer_pool_size}") print(f"key_buffer_size = {key_buffer_size}") print(f"sort_buffer_size = {sort_buffer_size}") print(f"read_rnd_buffer_size = {read_rnd_buffer_size}") print(f"tmp_table_size = {tmp_table_size}") print(f"max_heap_table_size = {max_heap_table_size}") print(f"join_buffer_size = {join_buffer_size}") print(f"table_open_cache = {table_open_cache}") print(f"thread_cache_size = {thread_cache_size}") print(f"innodb_log_buffer_size = {innodb_log_buffer_size}") # 打印自定义设置 print("expire_logs_days = 3") print("max_binlog_size = 100M") if __name__ == "__main__": calculate_mysql_settings() |
def get_total_ram(): with open('/proc/meminfo', 'r') as f: for line in f: if line.startswith("MemTotal:"): total_ram_kb = int(line.split()[1]) return total_ram_kb * 1024 # 转换为字节(bytes) return 0 # 如果未找到 MemTotal,则返回 0 def calculate_mysql_settings(): # 获取总内存(以字节为单位) total_ram = get_total_ram() # 根据总内存(以字节为单位)计算 MySQL 配置 innodb_buffer_pool_size = int(total_ram * 0.3) # 使用内存的 30% key_buffer_size = min(total_ram * 20 // 100, 512 * 1024 * 1024) # 使用内存的 20%,最大限制为 512MB sort_buffer_size = min(total_ram * 25 // 1000, 4 * 1024 * 1024) # 使用内存的 0.25%,最大限制为 4MB read_rnd_buffer_size = min(total_ram * 625 // 100000, 512 * 1024) # 使用内存的 0.0625%,最大限制为 512KB tmp_table_size = max_heap_table_size = min(total_ram * 5 // 100, 64 * 1024 * 1024) # 使用内存的 5%,最大限制为 64MB join_buffer_size = min(total_ram * 2 // 1000, 4 * 1024 * 1024) # 使用内存的 0.2%,最大限制为 4MB table_open_cache = min(400 + (total_ram // 64), 2000) # 根据内存动态计算,最大限制为 2000 thread_cache_size = min(total_ram * 15 // 1000, 100) # 使用内存的 1.5%,最大限制为 100 innodb_log_buffer_size = min(total_ram * 5 // 100, 16 * 1024 * 1024) # 使用内存的 5%,最大限制为 16MB # 以字节为单位打印配置 print(f"MySQL 配置(基于总内存 {total_ram / (1024 * 1024):.2f} MB):") print("将以下内容添加到 /etc/mysql/mysql.conf.d/mysqld.cnf 的末尾\n") print(f"innodb_buffer_pool_size = {innodb_buffer_pool_size}") print(f"key_buffer_size = {key_buffer_size}") print(f"sort_buffer_size = {sort_buffer_size}") print(f"read_rnd_buffer_size = {read_rnd_buffer_size}") print(f"tmp_table_size = {tmp_table_size}") print(f"max_heap_table_size = {max_heap_table_size}") print(f"join_buffer_size = {join_buffer_size}") print(f"table_open_cache = {table_open_cache}") print(f"thread_cache_size = {thread_cache_size}") print(f"innodb_log_buffer_size = {innodb_log_buffer_size}") # 打印自定义设置 print("expire_logs_days = 3") print("max_binlog_size = 100M") if __name__ == "__main__": calculate_mysql_settings()
会打印出类似以下的配置:
innodb_buffer_pool_size = 626468044 key_buffer_size = 417645363 sort_buffer_size = 4194304 read_rnd_buffer_size = 524288 tmp_table_size = 67108864 max_heap_table_size = 67108864 join_buffer_size = 4176453 table_open_cache = 2000 thread_cache_size = 100 innodb_log_buffer_size = 16777216 expire_logs_days = 3 max_binlog_size = 100M
添加到MySQL的配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf 然后重启数据库即可:service mysql restart
BASH脚本优化MySQL数据库参数
以下是完成同样功能的BASH脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #!/bin/bash # 获取总内存大小(以字节为单位) get_total_ram() { # 从 /proc/meminfo 中提取总内存(以 kB 为单位) total_ram_kb=$(awk '/^MemTotal:/ {print $2}' /proc/meminfo) if [[ -z "$total_ram_kb" ]]; then echo 0 # 如果未找到 MemTotal,则返回 0 else echo $((total_ram_kb * 1024)) # 将 kB 转换为字节 fi } # 根据总内存大小计算 MySQL 配置 calculate_mysql_settings() { # 获取总内存(以字节为单位) total_ram=$(get_total_ram) # 计算 MySQL 配置参数 innodb_buffer_pool_size=$((total_ram * 30 / 100)) # 使用内存的 30% key_buffer_size=$(($((total_ram * 20 / 100)) < $((512 * 1024 * 1024)) ? $((total_ram * 20 / 100)) : $((512 * 1024 * 1024)))) # 使用内存的 20%,最大限制为 512MB sort_buffer_size=$(($((total_ram * 25 / 1000)) < $((4 * 1024 * 1024)) ? $((total_ram * 25 / 1000)) : $((4 * 1024 * 1024)))) # 使用内存的 0.25%,最大限制为 4MB read_rnd_buffer_size=$(($((total_ram * 625 / 100000)) < $((512 * 1024)) ? $((total_ram * 625 / 100000)) : $((512 * 1024)))) # 使用内存的 0.0625%,最大限制为 512KB tmp_table_size=$((total_ram * 5 / 100 < 64 * 1024 * 1024 ? total_ram * 5 / 100 : 64 * 1024 * 1024)) # 使用内存的 5%,最大限制为 64MB max_heap_table_size=$tmp_table_size # 临时表大小等于最大堆表大小 join_buffer_size=$(($((total_ram * 2 / 1000)) < $((4 * 1024 * 1024)) ? $((total_ram * 2 / 1000)) : $((4 * 1024 * 1024)))) # 使用内存的 0.2%,最大限制为 4MB table_open_cache=$(($((400 + total_ram / 64)) < 2000 ? $((400 + total_ram / 64)) : 2000)) # 根据内存动态计算,最大限制为 2000 thread_cache_size=$(($((total_ram * 15 / 1000)) < 100 ? $((total_ram * 15 / 1000)) : 100)) # 使用内存的 1.5%,最大限制为 100 innodb_log_buffer_size=$(($((total_ram * 5 / 100)) < $((16 * 1024 * 1024)) ? $((total_ram * 5 / 100)) : $((16 * 1024 * 1024)))) # 使用内存的 5%,最大限制为 16MB # 打印配置(以字节为单位) echo "MySQL 配置(基于总内存 $((total_ram / (1024 * 1024))) MB):" echo "将以下内容添加到 /etc/mysql/mysql.conf.d/mysqld.cnf 的末尾" echo echo "innodb_buffer_pool_size = $innodb_buffer_pool_size" echo "key_buffer_size = $key_buffer_size" echo "sort_buffer_size = $sort_buffer_size" echo "read_rnd_buffer_size = $read_rnd_buffer_size" echo "tmp_table_size = $tmp_table_size" echo "max_heap_table_size = $max_heap_table_size" echo "join_buffer_size = $join_buffer_size" echo "table_open_cache = $table_open_cache" echo "thread_cache_size = $thread_cache_size" echo "innodb_log_buffer_size = $innodb_log_buffer_size" echo echo "expire_logs_days = 3" # 日志过期天数设置为 3 天 echo "max_binlog_size = 100M" # 最大二进制日志大小设置为 100M } # 主函数调用 calculate_mysql_settings |
#!/bin/bash # 获取总内存大小(以字节为单位) get_total_ram() { # 从 /proc/meminfo 中提取总内存(以 kB 为单位) total_ram_kb=$(awk '/^MemTotal:/ {print $2}' /proc/meminfo) if [[ -z "$total_ram_kb" ]]; then echo 0 # 如果未找到 MemTotal,则返回 0 else echo $((total_ram_kb * 1024)) # 将 kB 转换为字节 fi } # 根据总内存大小计算 MySQL 配置 calculate_mysql_settings() { # 获取总内存(以字节为单位) total_ram=$(get_total_ram) # 计算 MySQL 配置参数 innodb_buffer_pool_size=$((total_ram * 30 / 100)) # 使用内存的 30% key_buffer_size=$(($((total_ram * 20 / 100)) < $((512 * 1024 * 1024)) ? $((total_ram * 20 / 100)) : $((512 * 1024 * 1024)))) # 使用内存的 20%,最大限制为 512MB sort_buffer_size=$(($((total_ram * 25 / 1000)) < $((4 * 1024 * 1024)) ? $((total_ram * 25 / 1000)) : $((4 * 1024 * 1024)))) # 使用内存的 0.25%,最大限制为 4MB read_rnd_buffer_size=$(($((total_ram * 625 / 100000)) < $((512 * 1024)) ? $((total_ram * 625 / 100000)) : $((512 * 1024)))) # 使用内存的 0.0625%,最大限制为 512KB tmp_table_size=$((total_ram * 5 / 100 < 64 * 1024 * 1024 ? total_ram * 5 / 100 : 64 * 1024 * 1024)) # 使用内存的 5%,最大限制为 64MB max_heap_table_size=$tmp_table_size # 临时表大小等于最大堆表大小 join_buffer_size=$(($((total_ram * 2 / 1000)) < $((4 * 1024 * 1024)) ? $((total_ram * 2 / 1000)) : $((4 * 1024 * 1024)))) # 使用内存的 0.2%,最大限制为 4MB table_open_cache=$(($((400 + total_ram / 64)) < 2000 ? $((400 + total_ram / 64)) : 2000)) # 根据内存动态计算,最大限制为 2000 thread_cache_size=$(($((total_ram * 15 / 1000)) < 100 ? $((total_ram * 15 / 1000)) : 100)) # 使用内存的 1.5%,最大限制为 100 innodb_log_buffer_size=$(($((total_ram * 5 / 100)) < $((16 * 1024 * 1024)) ? $((total_ram * 5 / 100)) : $((16 * 1024 * 1024)))) # 使用内存的 5%,最大限制为 16MB # 打印配置(以字节为单位) echo "MySQL 配置(基于总内存 $((total_ram / (1024 * 1024))) MB):" echo "将以下内容添加到 /etc/mysql/mysql.conf.d/mysqld.cnf 的末尾" echo echo "innodb_buffer_pool_size = $innodb_buffer_pool_size" echo "key_buffer_size = $key_buffer_size" echo "sort_buffer_size = $sort_buffer_size" echo "read_rnd_buffer_size = $read_rnd_buffer_size" echo "tmp_table_size = $tmp_table_size" echo "max_heap_table_size = $max_heap_table_size" echo "join_buffer_size = $join_buffer_size" echo "table_open_cache = $table_open_cache" echo "thread_cache_size = $thread_cache_size" echo "innodb_log_buffer_size = $innodb_log_buffer_size" echo echo "expire_logs_days = 3" # 日志过期天数设置为 3 天 echo "max_binlog_size = 100M" # 最大二进制日志大小设置为 100M } # 主函数调用 calculate_mysql_settings
需要注意的是,我在脚本后面加入了一些我自定义的配置,根据需求自行修改即可。在配置文件里,后面定义的会覆盖前面的,这就是为什么要添加到文件尾的原因。
其中最关键的配置 innodb_buffer_pool_size 我设置为使用当前内存的30%,如果服务器只有数据库/博客这个功能,可以适当的提高比例,比如60%-80%。
英文:Python/Bash Script to Print the Optimized Parameters for MySQL Servers
运维/DevOps
- MySQL参数一键配置脚本: 有效提升数据库性能
- 把 MySQL 中的 MyISAM 表格转换成 InnoDB 的PHP小工具
- 通过 MySQLTuner 来检查数据库配置
- 升级到 PHP 5.5 之后内置 OpCache 加速缓存
- VPS低配置服务器优化的一些方法
- 如何在 Linux 下 列出最耗资源的进程 (BASH 脚本)
- 在LINUX下循环备份的方法
- 更改Wordpress博客全站的评论名称
- 几条Wordpress 博客 有用的 SQL 语句
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK