# MySQL部署

### 环境

1. Ubuntu 18.04
2. MySQL 8.0.16

### 安装MySQL

1. 从官网下载mysql-apt-config.deb安装配置包

   https://dev.mysql.com/downloads/repo/apt/

   如： mysql-apt-config_0.8.13-1_all.deb

2. 开始安装

   ```shell
   dpkg -i mysql-apt-config_0.8.13-1_all.deb
   ```

   选择MySQL8，OK

   ```
   apt update
   apt install mysql-server
   ```

   输入root密码，加密方式选择Legacy Authentication Method

3. 验证安装是否成功

   ```shell
   service mysql status
   mysql -u root -p
   ```

4. 查看mysql字符集

   ```shell
   mysql> show variables like '%char%';
   ```

5. 设置 mysql  数据库表大小写不敏感

   mysql 在Windows下不区分大小写，但是在Linux下默认是区分大小写的

   查看当前配置（区分大小写）

   ```shell
   mysql> show variables like '%case%';
   ```


| Variable_name          | Value | 说明                                                         |
| ---------------------- | ----- | ------------------------------------------------------------ |
| lower_case_file_system | OFF   | 表示当前系统文件是否大小写敏感，只读参数，无法修改           |
| lower_case_table_names | 0     | 表示表名是否大小写敏感，可以修改。lower_case_table_names = 0时，mysql会根据表名直接操作，大小写敏感。lower_case_table_names = 1时，mysql会先把表名转为小写，再执行操作。 |

   mysql8 如果数据库已经初始化则已经不能通过修改配置文件使大小写不敏感了，只能清空数据库文件，然后修改配置文件，再初始化数据库，才能生效

   1. 清空数据库文件

      ```shell
      rm -r /var/lib/mysql
      ```

   2. 修改配置文件

      ```shell
      vi /etc/mysql/mysql.conf.d/mysqld.cnf
      ```

      末尾添加 lower_case_table_names=1

   3. 初始化数据库

      ```shell
      mysqld --initialize
      # 然后授权数据库数据给mysql用户
      chown -R mysql:mysql /var/lib/mysql
      ```

   4. 登陆数据库，修改root密码，临时密码在日志文件里面找 /var/log/mysql/error.log

      ```shell
      mysql -u root -p
      mysql>ALTER USER "root"@"localhost" IDENTIFIED  BY "XCH666xch!";
      # 生产数据库
      mysql>ALTER USER "root"@"%" IDENTIFIED  BY "XCH666xch_prod!";
      ```

5. mysql数据库最大连接数修改

   1. 查看当前连接数

      ```shell
      mysql -uroot -pXCH666xch! -e 'show status' | grep -i  Threads
      ```

      Threads_running	2 表示当前连接数为2

   2. 查看最大连接数

      ```shell
      mysql -uroot -pXCH666xch! -e 'show variables' | grep max_connections
      ```

   3. 临时修改最大连接数，服务重启会失效

      ```shell
      mysql> set GLOBAL max_connections=300
      ```

   4. 永久修改

      ```shell
      vi /etc/mysql/mysql.conf.d/mysqld.cnf
      # 末尾添加 max_connections=500
      # 重启mysql服务
      ```

6. mysql远程访问

   ```shell
   mysql> use mysql;
   mysql> select user,host from user;
   ```

   看到root用户只允许localhost（即本地）访问，修改为 % ，%表示所有机器（临时处理）

   ```shell
   mysql> update user set host='%' where user='root';
   ```

   重启mysql服务

   ```shell
   service mysql restart
   ```

7. 排序配置

   ```
   select @@sql_mode;
   # 原来的值
   ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
   # 更改为
   ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
   # 修改配置文件
   /etc/mysql/conf.d/mysql.cnf
   /etc/mysql/mysql.conf.d/mysqld.cnf
   分别在[mysqld]、[mysql]下加入
   sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
   # 发现好像只能在[mysqld]下加入
   ```

   **ONLY_FULL_GROUP_BY**： 对于GROUP BY聚合操作，如果在SELECT中的列，没有在GROUP
   BY中出现，那么这个SQL是不合法的，因为列不在GROUP BY从句中

   **NO_AUTO_VALUE_ON_ZERO**： 该值影响自增长列的插入。默认设置下，插入0或NULL代表生成下一个自增长值。如果用户
   希望插入的值为0，而该列又是自增长的，那么这个选项就有用了。

   **STRICT_TRANS_TABLES**： 在该模式下，如果一个值不能插入到一个事务表中，则中断当前的操作，对非事务表不做限制
   **NO_ZERO_IN_DATE**： 在严格模式下，不允许日期和月份为零

   **NO_ZERO_DATE**： 设置该值，mysql数据库不允许插入零日期，插入零日期会抛出错误而不是警告。

   **ERROR_FOR_DIVISION_BY_ZERO**： 在INSERT或UPDATE过程中，如果数据被零除，则产生错误而非警告。如
   果未给出该模式，那么数据被零除时MySQL返回NULL

   **NO_AUTO_CREATE_USER**： 禁止GRANT创建密码为空的用户

   **NO_ENGINE_SUBSTITUTION**：
   如果需要的存储引擎被禁用或未编译，那么抛出错误。不设置此值时，用默认的存储引擎替代，并抛出一个异常

   **PIPES_AS_CONCAT**：
   将”||”视为字符串的连接操作符而非或运算符，这和Oracle数据库是一样的，也和字符串的拼接函数Concat相类似

   ​       **ANSI_QUOTES**： 启用ANSI_QUOTES后，不能用双引号来引用字符串，因为它被解释为识别符

   8. mysql错误处理

         1. msyql 1129 错误 Host is blocked because of many connection errors; unblock with 'mysqladmin flush-host

            原因：同一个IP连接失败次数超过了最大的max_connection_errors=10;就会阻止连接

            处理：

               1. 修改/etc/mysql/mysql.conf.d/mysqld.cnf 文件，添加以下内容

                  ```properties
                  max_connect_errors=300
                  ```

               2. 刷新flush-hosts，在数据库服务器执行以下命令

                  ```shell
                  /usr/bin/mysqladmin flush-hosts -h127.0.0.1 -uroot -p
                  ```

                  