【踩坑记录】初使用mysql8记录

  • 一、设置密码时会遇到“坑”
  • 前言
  • 二、被远程连接时出现的“坑”
  • 前言
  • 三、navicat 连接失败的“坑”
  • 前言
  • 四、关于mysql的性能参数调整(此次是降低mysql的性能,目的是降低mysql的内存占用率,毕竟才1G的内存)
  • 前言
  • 正文开始
  • 运维
  • 优化mysql的内存占用
  • 本文结束...


一、设置密码时会遇到“坑”

前言

mysql8 默认密码长度是8,并且安全等级比较高,需要vim 使用免登陆模式,将这里参数改一下 **↓ ↓**
# 先登录mysql:
		mysql -uroot -p 

1、mysql> SHOW VARIABLES LIKE 'validate_password%';
        +--------------------------------------+--------+
        | Variable_name                        | Value  |
        +--------------------------------------+--------+
        | validate_password.check_user_name    | ON     |
        | validate_password.dictionary_file    |        |
        | validate_password.length             | 8      |  -- 默认长度:8
        | validate_password.mixed_case_count   | 1      |  -- 修改密码至少要包含的小写字母个数和大写字母个数
        | validate_password.number_count       | 1      |  -- 修改密码至少要包含的数字个数
        | validate_password.policy             | MEDIUM |  -- 等级较高
        | validate_password.special_char_count | 1      |  -- 修改密码至少要包含的特殊字符的个数
        +--------------------------------------+--------+

     可以看到mysql8安装后,默认密码长度8,至少包含大小写字母各一个,数字至少1个,所以我们不妨先将密码设置为:Aa1234..   

     2、修改:
        set global validate_password.length=4;
        set global validate_password.policy=0;
        set global validate_password.mixed_case_count=0;
        set global validate_password.special_char_count=0;
        set global validate_password.number_count=0;
        
     3、修改后再查看
         mysql> SHOW VARIABLES LIKE 'validate_password%';
        +--------------------------------------+-------+
        | Variable_name                        | Value |
        +--------------------------------------+-------+
        | validate_password.check_user_name    | ON    |
        | validate_password.dictionary_file    |       |
        | validate_password.length             | 4     |
        | validate_password.mixed_case_count   | 0     |
        | validate_password.number_count       | 0     |
        | validate_password.policy             | LOW   |
        | validate_password.special_char_count | 0     |
        +--------------------------------------+-------+
        7 rows in set (0.09 sec) 
        
>>>> 处理结束...

二、被远程连接时出现的“坑”

前言

解决java.sql.SQLException: null, message from server: "Host 'XXX' is not allowed to connect异常
不能被访问,原因mysql有默认的IP白名单限制
① [root@localhost ~]# mysql -u root -p
        Enter password: 
        Welcome to the MySQL monitor.  Commands end with ; or \g.
        Your MySQL connection id is 33
        Server version: 8.0.22 MySQL Community Server - GPL

        Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

        Oracle is a registered trademark of Oracle Corporation and/or its
        affiliates. Other names may be trademarks of their respective
        owners.

        Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

        ② mysql> use mysql;
        Reading table information for completion of table and column names
        You can turn off this feature to get a quicker startup with -A

        Database changed
        ③ mysql> select user,host from user;
        +------------------+-----------+
        | user             | host      |
        +------------------+-----------+
        | mysql.infoschema | localhost |
        | mysql.session    | localhost |
        | mysql.sys        | localhost |
        | root             | localhost |   -- 可以看到这里  限制了只能本地连接,更改一下。
        +------------------+-----------+
        4 rows in set (0.03 sec)

        ④ mysql> update user set host = '%' where user = 'root';
        Query OK, 1 row affected (0.11 sec)
        Rows matched: 1  Changed: 1  Warnings: 0

        ⑤ mysql> select user,host  from user;
        +------------------+-----------+
        | user             | host      |
        +------------------+-----------+
        | root             | %         |  -- 已被修改了。
        | mysql.infoschema | localhost |
        | mysql.session    | localhost |
        | mysql.sys        | localhost |
        +------------------+-----------+
        4 rows in set (0.05 sec)

        ⑥ mysql> quit
        Bye
        
        ⑦ [root@localhost ~]# service mysqld restart
        Redirecting to /bin/systemctl restart mysqld.service
>>>>> 处理结束   ...

三、navicat 连接失败的“坑”

前言

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
① [root@localhost ~]# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 13
    Server version: 8.0.22 MySQL Community Server - GPL

    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    ② mysql> use mysql;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed
    ③ mysql> select host,user,plugin,authentication_string from user;
    +-----------+------------------+-----------------------+------------------------------------------------------------------------+
    | host      | user             | plugin                | authentication_string                                                  |
    +-----------+------------------+-----------------------+------------------------------------------------------------------------+
    | %         | root             | caching_sha2_password | $A$005$f/E fH%_Ka@ Bwcma3RGy7.gvCGtAnJk3C4sXoIeq6hl4uauBxYLY7vI5       |  
    | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    | localhost | mysql.session    | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    | localhost | mysql.sys        | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    +-----------+------------------+-----------------------+------------------------------------------------------------------------+
    4 rows in set (0.07 sec)

-- 可以看到root的 plugin的值为:caching_sha2_password,这是因为密码不合格导致的,改成符合要求的。

    ④ mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements -- 说明改的密码不符合要求,这里又回到了第一处踩坑,
    
    ⑤ mysql> SHOW VARIABLES LIKE 'validate_password%';
    +--------------------------------------+--------+
    | Variable_name                        | Value  |
    +--------------------------------------+--------+
    | validate_password.check_user_name    | ON     |
    | 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.09 sec)

    ⑥ mysql> set global validate_password.length=4;
    Query OK, 0 rows affected (0.08 sec)

    mysql>         set global validate_password.policy=0;
    Query OK, 0 rows affected (0.00 sec)

    mysql>         set global validate_password.mixed_case_count=0;
    Query OK, 0 rows affected (0.00 sec)

    mysql>         set global validate_password.special_char_count=0;
    Query OK, 0 rows affected (0.00 sec)

    mysql>         set global validate_password.number_count=0;
    Query OK, 0 rows affected (0.00 sec)

    ⑦ mysql> SHOW VARIABLES LIKE 'validate_password%';
    +--------------------------------------+-------+
    | Variable_name                        | Value |
    +--------------------------------------+-------+
    | validate_password.check_user_name    | ON    |
    | validate_password.dictionary_file    |       |
    | validate_password.length             | 4     |
    | validate_password.mixed_case_count   | 0     |
    | validate_password.number_count       | 0     |
    | validate_password.policy             | LOW   |
    | validate_password.special_char_count | 0     |
    +--------------------------------------+-------+
    7 rows in set (0.07 sec)

    ⑧ mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    Query OK, 0 rows affected (0.12 sec)

    ⑨ mysql> select host,user,plugin,authentication_string from user;
    +-----------+------------------+-----------------------+------------------------------------------------------------------------+
    | host      | user             | plugin                | authentication_string                                                  |
    +-----------+------------------+-----------------------+------------------------------------------------------------------------+
    | %         | root             | mysql_native_password | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9                              |
    | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    | localhost | mysql.session    | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    | localhost | mysql.sys        | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    +-----------+------------------+-----------------------+------------------------------------------------------------------------+
    4 rows in set (0.04 sec)
    -- 可以看到root 的 plugin的值变为:mysql_native_password 这里就大功告成了!
 
 -- 处理结束

四、关于mysql的性能参数调整(此次是降低mysql的性能,目的是降低mysql的内存占用率,毕竟才1G的内存)

前言

该优化是针对小内存的服务器,降低mysql的内存占用而设置的,并不是提升mysql的使用性能的。
若想提升mysql的性能,可以把下面提到的参数往相反的方向调整。

正文开始

运维

# 查看内存溢出被linux杀掉的程序
	grep "Out of memory" /var/log/messages

# 进程活跃情况
    top

# 看内存占用
    free -m

# 硬盘占用率
    df -h

优化mysql的内存占用

mysql> SHOW VARIABLES LIKE '%table_open_cache%';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | table_open_cache           | 4000  |
    | table_open_cache_instances | 16    |
    +----------------------------+-------+
    2 rows in set (0.03 sec)

mysql> show global status like 'Open%tables';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Open_tables   | 151   |
    | Opened_tables | 230   |
    +---------------+-------+
    2 rows in set (0.01 sec)


-- 建议优化比:
Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95

-- 按照公式转换一下
    151/0.85 = 178 
    Opened_tables    不得大于 178
    151/0.95 = 158
    table_open_cache 不得超过 158

所以,退出mysql 
        quit
    
    # 执行    
    	vim /etc/my.conf
    # 若配置文件有table_open_cache,就将值改为经过计算得到的值,若没有则添加
        table_open_cache=512
      即可。   

-- mysql buffer_pool 参数优化
    innodb_buffer_pool_size:缓存区域的大小。
    innodb_buffer_pool_chunk_size:当增加或减少innodb_buffer_pool_size时,操作以块(chunk)形式执行。块大小由innodb_buffer_pool_chunk_size配置选项定义,默认值128M。可以自行设定,且增加和减少都要以M为单位,并只能在启动前修改,修改后的值
    innodb_buffer_pool_instances:当buffer pool比较大的时候(超过1G),innodb会把buffer pool划分成几个instances,这样可以提高读写操作的并发,减少竞争。读写page都使用hash函数分配给一个instances。把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。innodb_buffer_pool_instances 参数显著的影响测试结果,特别是非常高的 I/O 负载时。

-- 配合的优化SQL:
    vim /etc/my.conf
   
# 增加一行(针对内存1G的服务器,降低mysql的缓存池,来降低mysql的内存使用率),相反的设置提高该值,也会是mysql的内存使用占比升高,并且mysql的性能也会相应提高
    innodb_buffer_pool_size=64m 

所以:
    # 先查询默认的参数情况
        show global status like 'Innodb_buffer_pool_pages_data';
        show global status like 'Innodb_buffer_pool_pages_total';
        show global status like 'Innodb_page_size';
    ↓ ↓    
    mysql> show global status like 'Innodb_buffer_pool_pages_data';
    +-------------------------------+-------+
    | Variable_name                 | Value |
    +-------------------------------+-------+
    | Innodb_buffer_pool_pages_data | 1394  |
    +-------------------------------+-------+
    1 row in set (0.11 sec)

    mysql> show global status like 'Innodb_buffer_pool_pages_total';
    +--------------------------------+-------+
    | Variable_name                  | Value |
    +--------------------------------+-------+
    | Innodb_buffer_pool_pages_total | 8192  |
    +--------------------------------+-------+
    1 row in set (0.00 sec)

    mysql> show global status like 'Innodb_page_size';
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | Innodb_page_size | 16384 |
    +------------------+-------+
    1 row in set (0.01 sec)
>>>> 处理结束...