以下主要讲解linux安装mysql8,并解决常见问题。mysql安装后常用命令、设置用户名密码、设置可以外部访问使用数据库、解决只能执行部分数据库命令、查看日志
对linux命令不熟悉,可以先看下我发过的:Linux常用命令
mysql在C#中使用可以参考我发的:C#基础知识体系框架图,及起对应我发过的博客
我发过的相关博客:mybatis-plus使用generator快速生成代码,并手动添加数据库命令_花开莫与流年错_的博客-CSDN博客_mybatisplus自动生成数据库
MySQL常用命令(DQL)_花开莫与流年错_的博客-CSDN博客_mysql数据库中dql有什么命令
mysql安装包官网下载地址:MySQL :: Download MySQL Community Server
当前开发中使用新的mysql8,开完完成后部署到linux服务器中,我的服务器为ubuntu系统,对系统版本有要求,mysql8只支持ubuntu18及以后版本,我之前在ubuntu16版本上装提示各种依赖错误,很难部署。
安装配置如下
// 默认安装的mysql5.x版本,安装最新的版本则不要执行这个命令
apt install mysql
// 安装mysql8可能需要的依赖,可以先不执行这个命令,如果有报错则根据报错下载还需要安装的依赖,资源可以在这个网站搜索复制下载路径,然后wget下载:https://pkgs.org/
sudo apt-get install mysql-server mysql-community-server mysql-client mysql-community-server-core mysql-community-client libc6 libgcc-s1 libssl3 libstdc++6 libtirpc3
// 下载mysql-connector-java
wget https://repo.mysql.com/apt/ubuntu/pool/mysql-tools/m/mysql-connector-java/mysql-connector-java_8.0.30-1ubuntu20.04_all.deb
// 安装
sudo dpkg -i mysql-connector-java_8.0.30-1ubuntu20.04_all.deb
sudo apt update
# 如果update失败,提示key的问题,需要拷贝提示的可以到以下命令中执行,在update后安装
#Err:1 http://repo.mysql.com/apt/ubuntu bionic InRelease
# The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 467B942D3A79BD29
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 467B942D3A79BD29
sudo apt update
sudo apt-get install mysql-server
// 查看是否正常安装,下面搜索后会包含
mysql-connector-java
dpkg --get-selections | grep mysql
// dpkg查看安装信息
dpkg -s mysql-connector-java
// 查看当前装了哪些mysql相关的
dpkg -l | grep mysql
// 删除软件:-P删除文件及配置文件;-r只移除文件
dpkg -P
-r|--remove ... | -a|--pending
-P|--purge ... | -a|--pending
安装报错提示缺少依赖
sudo apt-get install -f
安装好后配置mysql及常用命令
// 拷贝命令到服务器后执行脚本命令,先进入mysql
mysql
# 如果mysql设置密码后,登录如下,-u后为用户名,-p密码
mysql -u root -p
// 创建用户名和密码
create user 'root' identified by 'password';
// 创建数据表
create database if not exists db1;
// 给这个用户分配权限
grant all privileges on db1.* to 'root';
// windows上配置生成的sql数据库命令,拷贝到linux服务器上执行
use db1;
source /root/web/db0914.sql
quit
# 更改密码,输入user名和新密码,会出提示框输入旧密码回车
mysqladmin -u root -p password "password"
// 查看当前配置信息
show variables like '%timeout%';
// 设置等待时间
set wait_timeout=100000;
// 全局设置;我在服务器上设置时,如果没设置全局的下次打开查询会是默认值,全局的话查询会更改有效
set global wait_timeout=100000;
show global variables like 'wait_timeout';
quit
mysql启动、停止、查看进程
// 启动
service mysql start
// 重启mysql
sudo service mysql restart
// 停止服务
sudo service mysql stop
// 查看状态
sudo service mysql status
// 查看是否运行
netstat -tlnp | grep 3306
// 或
ps -A | grep mysql
端口开放设置
// 保障3306端口是开放的
sudo ufw allow 3306 # 打开3306号端口
sudo ufw status # 查看端口状态,allow就是开放的。
sudo ufw disable # 关闭防火墙
sudo ufw enable # 开启防火墙
// 允许其他IP访问
进入到 /etc/mysql/mysql.conf.d 目录 # 一般mysql默认会安装在这个目录下。如果不是,可以使用sudo find / -name "mysql.cnf"来查找文件。
修改mysqld.cnf文件
把bind-address从127.0.0.0改为0.0.0.0
// 允许root用户在其他IP上登录
# 使用root用户登录mysql数据库,进入到mysql数据库
mysql -u root -p
# 切换到mysql数据库
use mysql;
# 查看user表的host和user数据:会发现root用户允许的host是localhost
select host, user from user;
# 修改数据:把user为root的host改为%,表示允许root用户在所有IP上登录
update user set host='%' where user='root';
# 刷新
flush privileges;
# 重启mysql:
/etc/init.d/mysql restart
# mysql开启后无法远程登录,设置访问权限
nano /etc/mysql/mysql.conf.d/mysqld.cnf
# 更改可访问的地址
bind-address = 0.0.0.0
# 访问容易出错,不中断
sql_mode=
本地登录远程数据库报错:Host is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’
mysql -u root -p
① 进入Mysql数据库查看max_connection_errors: show variables like "max_connection_errors";
② 修改max_connection_errors的数量为1000: set global max_connect_errors = 1000;
③ 修改 max_connections 的数量为1000 :set global max_connections = 1000;
// 也可以
flush hosts;
部署后数据库请求失败
报错内容如下:
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
解决:超过0秒后没有连接自动断开
解决方式,更改yml中配置
// 配置autoReconnect=true超时自动连接
url: jdbc:mysql://服务器id:3306/db?characterEncoding=utf-8&useSSL=false&autoReconnect=true
配置后可以正常访问数据库进行登录,但是无法动态查询数据显示(部分数据可以正常操作)
问题参考:MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案_格子衫111的博客-CSDN博客_with sql_mode=only_full_group_by
原因分析:
一、原理层面
这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题:
mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
二、sql层面
在sql执行时,出现该原因,简单来说就是:
由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,
并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,会报错误…
这部分一般当前代码会出错,需要检查配置
mysql -u root -p
SELECT VERSION(); // 查看数据库版本
select @@GLOBAL.sql_mode; // 查看sql_mode配置模式
// 设置参数解决,重启mysql后还是会恢复(需要重设或者用改my.cnf才会一直有效)
// 去掉ONLY_FULL_GROUP_BY,重新设置值,如下设置时全局的,对新增的数据库有效,已存在的无效
SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
// 对已存在的需要如下操作
SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
// 修改my.cnf解决上面问题
nano /etc/mysql/my.cnf
// 有sql_mode的话删除ONLY_FULL_GROUP_BY,没有的话,将上面select @@GLOBAL.sql_mode;得到的内容中删除ONLY_FULL_GROUP_BY后添加到sql_mode配置
// 重启mysql生效
service mysql restart
查看mysql日志
方法一:登录到mysql查看binlog
mysql> show binary logs;
mysql> show master status;
mysql> show binlog events;
mysql> show binlog events in 'binlog.000002';
方法二:使用mysqlbinlog工具查看
mysqlbinlog binlog.000002
mysqlbinlog --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlog.000002
mysqlbinlog --start-position=205 --stop-position=2205 binlog.000002
mysqlbinlog --no-defaults -d databasename binlog.000002
mysqlbinlog是一个查看mysql二进制日志的工具,可以把mysql上面的所有操作记录从日志里导出,这个工具默认的安装路径为:/usr/local/mysql/bin/mysqlbinlog
可以通过find / -name "mysqlbinlog"命令查找mysqlbinlog的工具路径。
基于开始/结束时间:
/usr/local/mysql/bin/mysqlbinlog --start-datetime="2013-03-01 00:00:00" --stop-datetime="2014-03-21 23:59:59" /usr/local/mysql/var/binlog.000007 -r test2.sql