https://blog.csdn.net/qq_43228581/article/details/115174122
下载
链接:https://pan.baidu.com/s/1nCkiD7LsAct_vHqXyFq7lQ
提取码:98j3
把安装包mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 拷贝到 离线生产环境/usr/local目录下
安装
2.1 创建用户
为了方便数据库管理,对于安装的MySQL数据库,生产上我们都会建立一个mysql用户和mysql用户组:
# 添加mysql用户组
groupadd mysql
# 添加mysql用户
useradd -g mysql mysql -d /home/mysql
# 修改mysql用户的登陆密码
passwd mysql
yfz@2020
卸载:
rpm -qa | grep mariadb
rpm -e mariadb-libs-5.5.41-2.el7_0.x86_64 --nodeps
2.2 解压缩
cd /usr/local/
tar -xzvf mysql-5.7.13-linux-glibc2.5-x86_64.tar.gz
# 改名为mysql
mv mysql-5.7.13-linux-glibc2.5-x86_64 mysql
并赋予用户读写权限(此处也可以换位你的用户)
chown -R mysql:mysql mysql/
2.3 创建配置文件
vim /etc/my.cnf
复制以下内容:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#不区分大小写
lower_case_table_names = 1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=5000
default-time_zone = '+8:00'
2.4 初始化文件
初始化log文件,防止没有权限。
#手动编辑一下日志文件,什么也不用写,直接保存退出
cd /var/log/
vim mysqld.log
:wq 或 touch mysqld.log
chmod 777 mysqld.log
chown mysql:mysql mysqld.log
初始化pid文件,防止没有权限。
#手动编辑一下日志文件,什么也不用写,直接保存退出
cd /var/run/mysqld
touch mysqld.pid
# 给权限
chmod 777 mysqld.pid
chown -R mysql:mysql mysqld.pid
初始化数据库
# 初始化数据库,并指定启动mysql的用户,否则就会在启动MySQL时出现权限不足的问题
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --lc_messages_dir=/usr/local/mysql/share --lc_messages=en_US
初始化完成后,在my.cnf中配置的datadir目录(/var/log/mysqld.log)下生成一个error.log文件,里面记录了root用户的随机密码。
cat /var/log/mysqld.log
执行后记录最后一行:root@localhost: xxxxx 。 这里的xxxxx就是初始密码。后面登入数据库要用到
2.5 启动数据库
启动数据库
#源目录启动:
/usr/local/mysql/support-files/mysql.server start
-----------------------------------------------------------
首先描述下遇到的问题
重启linux系统之后 mysql 需要手动启动,
执行命令: service mysqld start
执行后就报错了:Starting MySQL. ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).
解决方案:
在/var/run/mysqld/目录下 创建mysqld.pid 文件
1.cd /var/run/mysqld/
2.touch mysqld.pid
3.chmod -R 777 /var/run/mysqld/ (给mysqld文件夹以及下面的子文件或者文件夹赋予 读写可执行权限)
4.service mysqld start
执行后成功
Starting MySQL. SUCCESS!
-------------------------------------------------------------
并设置开机自启动服务:
# 复制启动脚本到资源目录
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
# 增加mysqld服务控制脚本执行权限
chmod +x /etc/rc.d/init.d/mysqld
# 将mysqld服务加入到系统服务
chkconfig --add mysqld
# 检查mysqld服务是否已经生效
chkconfig --list mysqld
# 切换至mysql用户,启动mysql,或者稍后下一步再启动。
service mysqld start
从此就可以使用service mysqld命令启动/停止服务:
su mysql
service mysqld start
service mysqld stop
service mysqld restart
2.6 登陆,修改密码
必须修改初始的随机密码:
# 系统默认会查找/usr/bin下的命令;建立一个链接文件。
ln -s /usr/local/mysql/bin/mysql /usr/bin
# 登陆mysql的root用户
mysql -uroot -p
# 输入上面的默认初始密码(root@localhost: xxxxx)
# 修改root用户密码为XXXXXX
set password for root@localhost=password("XXXXXX");
3 使用mysql
3.1 用户建立,远程连接
use mysql;
update user set host = '%' where user = 'root';
select host, user from user;
flush privileges;
以下命令只需要改动 用户名 和密码:
grant all privileges on *.* to '新用户名'@'%' identified by '新密码';
flush privileges;
其中通配符%表示让该用户可以从任意远程主机登陆。
如果远程访问失败:
查看防火墙状态:
systemctl status firewalld.service
绿的running表示防火墙开启
执行关闭命令:
systemctl stop firewalld.service
再次执行查看防火墙命令:
systemctl status firewalld.service
执行开机禁用防火墙自启命令 :
systemctl disable firewalld.service
--资料参考备注信息:
https://blog.csdn.net/qq_45060236/article/details/105357666?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
资料参考:
【
在my.cnf添加如下配置
[mysqld]
sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'
】
配置文件加入相应参数[以下会讲到],重启的时候,依然差强人意,甚至给出教程的人并没有亲力亲为的去测试,就张贴了出来,还会带来新的mysql的报错,或者是完全启动报错,今天我就来详细与大家一一说明这些参数,及解决办法。
sql_mode这个变量,很容易被忽视,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。
sql_mode常用值如下:
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.0中这么设置下依然会报错,原因如下:
ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'
8.0以上已经取消了NO_AUTO_CREATE_USER这个关键字,删掉sql语句中的这个关键字即可
最终,/etc/my.cnf 配置文件中 修改 :sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
重启mysql服务,大功告成!~