# 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' ``` **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后,不能用双引号来引用字符串,因为它被解释为识别符