linux安装mysql8配置使用,并解决常见问题

        以下主要讲解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

端口开放设置

  1. 默认监听3306端口,并且只允许localhost访问
  2. 只允许root用户在localhost上登录

// 保障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秒后没有连接自动断开

    1. 需要mysql设置等待时间
    2. java设置断开后自动链接

解决方式,更改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

  • 获取binlog文件列表:

mysql> show binary logs;

  • 查看当前使用的binlog文件(这里日志可能占用过多内存,需要清理和设置保存限制):

mysql> show master status;

  • 只查看第一个binlog文件的内容:

mysql> show binlog events;

  • 查看指定binlog文件的内容:

mysql> show binlog events in 'binlog.000002';

方法二:使用mysqlbinlog工具查看

  • 查看mysql-bin.000002:

mysqlbinlog binlog.000002

  • 基于开始/结束时间:

mysqlbinlog --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlog.000002

  • 基于pos值:

mysqlbinlog --start-position=205 --stop-position=2205 binlog.000002

  • 指定数据库:

mysqlbinlog --no-defaults -d databasename binlog.000002

  • 使用mysqlbinlog工具

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

你可能感兴趣的:(mysql,操作系统,数据库,linux,mysql,运维,开放mysql端口,mysql常见错误)