记一次MySQL运维踩坑

事情的起因是Docker部署的MySQL总提示Too Many Connections,意为连接过多。

第二个是后端碰到了ONLY_FULL_GROUP_BY的问题,如果都通过Navicat设置那万一哪一次重启数据库忘记这茬了,就GG了。所以决定给MySQL加上配置文件。

注意:坑来了!

首先,MySQL不允许读取具有777权限的配置文件,它认为任何人都可以读写配置文件是不安全的,所以直接忽略,看都不带看的。

所以需要给文件赋予0444的权限:

chmod 0444 my.cnf
MySQL挂载的数据路径是需要读写权限的!

到这一步,如果配置文件没有问题,一般是可以启动成功的。如果还是报一些奇奇怪怪的错误,可以优先考虑my.cnf的配置。

另外,MySQL 8.x 的sql_mode跟5.7的有变化,所以如果要在配置文件里配置sql_mode的话,最好先查询一下。

select @@GLOBAL.sql_mode;

附件

docker-compose.yml

version: '3.1'
services:
  mysql:
    image: mysql:latest
    restart: always
    container_name: docker-mysql
    volumes:
      - /data/mysql/data:/var/lib/mysql:rw
      - /data/mysql/conf:/etc/mysql/conf.d:rw
    ports:
      - 3306:3306
    environment:
      TZ: "Asia/Shanghai"
      LANG: en_US.UTF-8
      MYSQL_ROOT_PASSWORD: root用户的密码
    stdin_open: true
    tty: true

my.cnf

[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'max_connections = 1500
# MySQL的最大连接数,默认是100,测试开过1万个连接数,并将他们持久化,内存增加了一个多G,由此算出一个连接大概为100+K。
# 如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。
# 比较理想的设置应该是max_used_connections / max_connections * 100% ≈ 80%,当发现这一比例在10%以下的话,说明最大连接数设置的过高了
# 查看最大的连接数:SHOW VARIABLES LIKE "max_connections";
# 查看已使用的最大连接:SHOW GLOBAL STATUS LIKE 'max_used_connections';
# 显示连接相关的设置:SHOW STATUS LIKE '%connect%';
# 显示当前正在执行的mysql连接:SHOW PROCESSLIST
max_connect_errors = 300
# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST。防止黑客
max_allowed_packet = 10M
# 接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。
# 该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。
slow_query_log = 1
long_query_time = 1
#慢查询时间 超过1秒则为慢查询
slow_query_log_file = /var/lib/mysql/mysql-slow.log
#慢查询日志存储位置
interactive_timeout = 300
# 服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。默认值:28800秒(8小时)
wait_timeout = 300
# 服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,
# 取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。参数默认值:28800秒(8小时)
# MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,
# 应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,
# 最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。
# 在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,
# 可以进行适当的调整小些。要同时设置interactive_timeout和wait_timeout才会生效。

打完收工!

你可能感兴趣的:(数据库,mysql,运维)