2021年 · MySQL

mysql连接超时设置

mysql数据库有一个wait_timeout的配置,默认值为28800(即8小时mysql server将主动断开这条连接,后续在该连接上进行的查询操作都将失败)

interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。
通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
interactive_timeout:交互式连接超时时间(mysql工具、mysqldump等)
wait_timeout:非交互式连接超时时间,默认的连接mysql api程序,jdbc连接数据库等

方法一:(无需重启服务,但重启后会失效)
查看mysql server超时时间:
MySQL [(none)]> show global variables like ‘wait_timeout’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| wait_timeout | 28800 |
+—————+——-+
1 row in set (0.01 sec)

设置mysql server超时时间(以秒为单位):
针对非交互式查看链接超时时间:
MySQL [(none)]> show global variables like ‘wait_timeout’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| wait_timeout | 28800 |
+—————+——-+
1 row in set (0.01 sec)
针对非交互式链接临时设置超时时间(数据库重启后会恢复默认值)
MySQL [(none)]> set global wait_timeout=288000;
Query OK, 0 rows affected (0.00 sec)
针对非交互式链接,设置后查看所设置的值是否成功:
MySQL [(none)]> show global variables like ‘wait_timeout’;
+—————+——–+
| Variable_name | Value |
+—————+——–+
| wait_timeout | 288000 |
+—————+——–+
1 row in set (0.00 sec)
针对交互式连接查看链接超时时间:
MySQL [(none)]> show global variables like ‘interactive_timeout’;
+———————+——-+
| Variable_name | Value |
+———————+——-+
| interactive_timeout | 28800 |
+———————+——-+
1 row in set (0.00 sec)
针对交互式连接临时设置超时时间(数据库重启后会恢复默认值)
MySQL [(none)]> set global interactive_timeout=288000;
Query OK, 0 rows affected (0.00 sec)
针对交互式连接,设置后查看所设置的值是否成功:
MySQL [(none)]> show global variables like ‘interactive_timeout’;
+———————+——–+
| Variable_name | Value |
+———————+——–+
| interactive_timeout | 288000 |
+———————+——–+
1 row in set (0.00 sec)

方法二:(mysql服务需要重启才能生效)
在配置文件/etc/my.cnf中添加如下:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000

2021年 · MySQL

MySQL5.7密码过期

#在配置文件my.cnf中设置密码过期时间参数default_password_lifetime(需要重启mysql服务)
[mysqld]
default_password_lifetime=180

注意:
— default_password_lifetime的值为密码的有效天数。密码设置超过有效天数,密码过期失效。
— default_password_lifetime的值为0时,表示用户设置的密码永不过期。

#查看密码过期时间
MySQL [(none)]> show variables like ‘default_password_lifetime’;
+—————————+——-+
| Variable_name | Value |
+—————————+——-+
| default_password_lifetime | 0 |
+—————————+——-+
1 row in set (0.00 sec)

#设置密码过期时间为180天(无需重启mysql服务)
MySQL [(none)]> SET GLOBAL default_password_lifetime = 180;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show variables like ‘default_password_lifetime’;
+—————————+——-+
| Variable_name | Value |
+—————————+——-+
| default_password_lifetime | 180 |
+—————————+——-+
1 row in set (0.00 sec)

#直接让用户密码过期
ALTER USER ‘testuser’@’192.168.%’ PASSWORD EXPIRE;

#指定用户过期天数为30天
ALTER USER ‘testuser’@’192.168.%’ PASSWORD EXPIRE INTERVAL 30 DAY;

#设置用户密码永不过期
ALTER USER ‘testuser’@’192.168.%’ PASSWORD EXPIRE NEVER;

2021年 · MySQL

MySQL 配置密码复杂度

一、mysql 5.7.35 版本信息
[root@localhost mysql]# mysql -V
mysql Ver 14.14 Distrib 5.7.35, for Linux (x86_64) using EditLine wrapper

二、配置或安装插件名”validate_password”
方法一:在/etc/my.cnf加上配置,并重启mysql,重启会导致业务中断
[mysqld]
plugin-load=validate_password.so
validate_password_policy=1
validate-password=FORCE_PLUS_PERMANENT

方法二:管理员登录数据库执行如下命令,此操作无需重启服务,可在线处理业务问题
MySQL [(none)]> INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;
Query OK, 0 rows affected (0.00 sec)

注意:
1、validate_password_policy(命令设置:set global validate_password_policy=1;)
代表的密码策略,可配置的值有以下:默认是MEDIUM
— 0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)
— 1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
— 2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中

2、validate_password_dictionary_file
# 用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。

3、validate_password_length(命令设置:set global validate_password_length=8;)
# 用来设置密码的最小长度,默认值是8最小是0

4、validate_password_mixed_case_count
# 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。

5、validate_password_number_count
# 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0

6、validate_password_special_char_count
# 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0

三、登陆数据库查看

MySQL [(none)]> show variables like ‘validate%’;
+————————————–+——-+
| Variable_name | Value |
+————————————–+——-+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+————————————–+——-+
7 rows in set (0.01 sec)

MySQL [(none)]> grant all on oa_bak.* to ‘testuser’@’192.168.%’ identified by ‘123’;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
MySQL [(none)]> grant all on oa_bak.* to ‘testuser’@’192.168.%’ identified by ‘123456789’;
Query OK, 0 rows affected, 1 warning (0.01 sec)
=================以下为修改数据库密码长度为8位(默认)同时还需满足至少有1个数字,小写字母,大写字母和特殊字符=========
MySQL [(none)]> show variables like ‘validate%’;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 2
Current database: *** NONE ***

+————————————–+——–+
| Variable_name | Value |
+————————————–+——–+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+————————————–+——–+
7 rows in set (0.01 sec)
#测试密码长度大于8位,但全部为数字,授权用户报错
MySQL [(none)]> grant all on oa_bak.* to ‘testuser’@’192.168.%’ identified by ‘123456789’;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
#测试密码长度大于8位,密码包括大小写字母、数字、特殊符号,授权用户成功
MySQL [(none)]> grant all on oa_bak.* to ‘testuser’@’192.168.%’ identified by ‘123us_UEj232’;
Query OK, 0 rows affected, 1 warning (0.00 sec)
#测试密码长度大于8位,密码包括大小写字母、数字、无特殊符号,授权用户报错
MySQL [(none)]> grant all on oa_bak.* to ‘testuser’@’192.168.%’ identified by ‘123usUEj232’;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

2021年 · MySQL

MySQL 插件之连接控制插件(Connection-Control)

MySQL 5.7.17 以后提供了Connection-Control插件用来控制客户端在登录操作连续失败一定次数后的响应的延迟。该插件可有效的防止客户端暴力登录的风险(攻击)。该插件包含以下2个组件

CONNECTION_CONTROL:用来控制登录失败的次数及延迟响应时间
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:该表将登录失败的操作记录至IS库中

配置文件增加以下配置(需要重启服务)
[mysqld]
plugin-load-add = connection_control.so
connection-control = FORCE
connection-control-failed-login-attempts = FORCE
connection_control_min_connection_delay = 1000
connection_control_max_connection_delay = 86400
connection_control_failed_connections_threshold = 3

#插件动态安装启用(无需重启)
MySQL [(none)]> INSTALL PLUGIN CONNECTION_CONTROL SONAME ‘connection_control.so’;
Query OK, 0 rows affected (0.10 sec)

MySQL [(none)]> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME ‘connection_control.so’;
Query OK, 0 rows affected (0.00 sec)

#验证是否正常安装
MySQL [(none)]> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE ‘connection%’;
+——————————————+—————+
| PLUGIN_NAME | PLUGIN_STATUS |
+——————————————+—————+
| CONNECTION_CONTROL | ACTIVE |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE |
+——————————————+—————+
2 rows in set (0.00 sec)

MySQL [(none)]> SHOW PLUGINS;
+——————————————+———-+——————–+———————–+———+
| Name | Status | Type | Library | License |
+——————————————+———-+——————–+———————–+———+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | GPL |
| CONNECTION_CONTROL | ACTIVE | AUDIT | connection_control.so | GPL |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE | INFORMATION SCHEMA | connection_control.so | GPL |
+——————————————+———-+——————–+———————–+———+
47 rows in set (0.00 sec)

#查看默认相关变量
MySQL [(none)]> show variables like ‘connection_control%’;
+————————————————-+————+
| Variable_name | Value |
+————————————————-+————+
| connection_control_failed_connections_threshold | 3 |
| connection_control_max_connection_delay | 2147483647 |
| connection_control_min_connection_delay | 1000 |
+————————————————-+————+
3 rows in set (0.00 sec)

MySQL [(none)]> SET GLOBAL connection_control_failed_connections_threshold = 3;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SET GLOBAL connection_control_min_connection_delay = 1000;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SET GLOBAL connection_control_max_connection_delay = 86400;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show variables like ‘connection_control%’;
+————————————————-+——-+
| Variable_name | Value |
+————————————————-+——-+
| connection_control_failed_connections_threshold | 3 |
| connection_control_max_connection_delay | 86400 |
| connection_control_min_connection_delay | 1000 |
+————————————————-+——-+
3 rows in set (0.00 sec)

connection_control_failed_connections_threshold 失败尝试的次数,默认为3,表示当连接失败3次后启用连接控制,0表示不开启
connection_control_max_connection_delay 响应延迟的最大时间,默认约25天
connection_control_min_connection_delay 响应延迟的最小时间,默认1000微秒,1秒

— 该表记录登录失败的用户及失败次数,当用户登录成功后,登录失败的记录则会被删除。
— 重新配置connection_control_failed_connections_threshold变量,该表记录会被删除(重置)
— 如果使用不存在的用户登录,则该表记录用户名为空,但会记录具体登录的IP
use information_schema;
select * from connection_control_failed_login_attempts;

— 连接控制的使用次数(可用户判断是否存在暴力登录尝试)
— 重新配置connection_control_failed_connections_threshold变量,该表记录会被删除(重置)
mysql> show global status like ‘Connection_control_delay_generated’;
+————————————+——-+
| Variable_name | Value |
+————————————+——-+
| Connection_control_delay_generated | 5 |
+————————————+——-+