当前位置 : 首页 » 文章分类 :  开发  »  MySQL-安装配置

MySQL-安装配置

MySQL 安装配置笔记
我照着自己这篇笔记安装了好多次mysql,虚拟机上,AWS EC2上,阿里云ECS上,AWS Lightsail上,各种VPS上,但每次都有各种意外。

Getting Started with MySQL - Installing and Starting MySQL
https://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-installing

A Quick Guide to Using the MySQL Yum Repository
https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/


Docker安装MySQL

1、拉取 mysql:5.7.34 镜像:

docker pull mysql:5.7.34

2、启动mysql镜像

docker run -d --rm \
--name mysql \
-p 8306:3306 \
-e MYSQL_ROOT_PASSWORD=xxxxxx \
mysql:5.7.34

MAC brew安装MySQL

搜索 mysql 安装包

$ brew search mysql
==> Formulae
automysqlbackup          mysql++                  mysql-client@5.7         mysql-connector-c++@1.1  mysql-search-replace     mysql@5.7
mysql                    mysql-client             mysql-connector-c++      mysql-sandbox            mysql@5.6                mysqltuner
==> Casks
homebrew/cask/mysql-connector-python              homebrew/cask/mysql-utilities                     homebrew/cask/sqlpro-for-mysql
homebrew/cask/mysql-shell                         homebrew/cask/navicat-for-mysql

可以看到有多个版本的 mysql,不指定版本的话会安装最新版

安装 mysql 5.7

brew install mysql@5.7

We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

mysql@5.7 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have mysql@5.7 first in your PATH, run:
  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc

For compilers to find mysql@5.7 you may need to set:
  export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
  export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"


To have launchd start mysql@5.7 now and restart at login:
  brew services start mysql@5.7
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/mysql@5.7/bin/mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql@5.7/5.7.34: 319 files, 232.8MB

安装目录
/usr/local/Cellar/mysql@5.7/5.7.34
安装后有一个无密码的 root 用户

设置环境变量

使全局可用 mysql 命令

vi ~/.zshrc
export PATH=${PATH}:/usr/local/Cellar/mysql@5.7/5.7.34/bin
source ~/.zshrc

启动mysql服务

启动 brew service 并添加开机启动:brew services start mysql@5.7

或者直接启动mysql,但这样没有开机启动:mysql.server start

注意:最好使用 brew services 启动,这样能自动添加开机启动,不用每次开机都再起一次MySQL了

初始化mysql配置

执行脚本 /usr/local/Cellar/mysql@5.7/5.7.29/bin/mysql_secure_installation
这个脚本会以交互的形式帮助用户进行一些 mysql 初始化配置,比如设置 root 账号密码等等。

$ ./mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: i # 不安装密码强度插件
Please set the password for root here.  # 设置 root 密码

New password:

Re-enter new password:
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y # 删除匿名用户
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y # 只允许 local 登录
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : o # 是否删除 test 库

 ... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y # 刷新权限
Success.

All done!

Windows安装MySQL

下载

打开MySQL下载页面 https://www.mysql.com/downloads/
选择 MySQL Community Edition (GPL) ,打开社区版下载页面 https://dev.mysql.com/downloads/
选择 MySQL Community Server (GPL),打开 MySQL Community Server 下载页面 https://dev.mysql.com/downloads/mysql/
点页面右侧的 Looking for the latest GA version? 选择稳定的5.6版本(5.6.40),分为安装版和免安装版,选择 Windows (x86, 64-bit), ZIP Archive 免安装版,进入下载页面,不需要注册,点No thanks, just start my download. 开始下载 mysql-5.6.40-winx64.zip 压缩包。

安装

ZIP Archive版是免安装的,只要解压就行了。将解压出的文件夹mysql-5.6.40-winx64拷贝到想安装的目录即可,我这里是 D:\ProgramFiles\mysql-5.6.40-winx64

2.3.5 Installing MySQL on Microsoft Windows Using a noinstall ZIP Archive
https://dev.mysql.com/doc/refman/5.6/en/windows-install-archive.html

my.ini初始配置

进入mysql-5.6.40-winx64文件夹,看到有个默认配置文件my-default.ini,我们需要新建一个自己的配置文件my.ini。
.ini文件是window里面的配置文件,保存初始化信息,安装版的是在安装的时候让你自己选然后系统给你保存进来,zip archive是自己写,都一样。

my.ini的配置分为不同的section,例如[client]、[mysql]、[mysqld],其中[client]和[mysql]都是客户端配置,[mysqld]是服务端配置。

我的my.ini配置:

# ---------------------------客户端配置---------------------------
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306

# 客户端默认的字符集,如果你希望它支持中文,可以设置成gbk或者utf8。
default-character-set=utf8

# ---------------------------服务端配置---------------------------
[mysqld]
# mysql服务端默认监听(listen on)的TCP/IP端口
port=3306

# 基准路径,其他路径都相对于这个路径;即MySQL的安装路径
basedir=D:\ProgramFiles\mysql-5.6.40-winx64

# mysql数据库文件所在目录
datadir=D:\ProgramFiles\mysql-5.6.40-winx64\data

# 服务端使用的字符集默认为8比特编码的utf-8字符集
character-set-server=utf8

MySQL——配置文件(my.ini)
https://blog.csdn.net/spring_model/article/details/54089678

添加环境变量

为了避免每次都要进入 D:\ProgramFiles\mysql-5.6.40-winx64\bin 目录启动mysql,直接将bin目录加入到系统环境变量。
右键单击我的电脑->属性->高级系统设置(高级)->环境变量
编辑PATH变量,在原有内容后加分号”;”,再加上D:\ProgramFiles\mysql-5.6.40-winx64\bin

Windows 如何让环境变量设置后 立即生效
https://www.aliyun.com/jiaocheng/872042.html

安装MySQL服务

从控制台进入到MySQL解压目录下的 bin 目录下,执行服务安装命令
mysqld install MySQL --defaults-file="D:\ProgramFiles\mysql-5.6.40-winx64\my.ini"
提示Service successfully installed.表示安装成功。

D:\ProgramFiles\mysql-5.6.40-winx64\bin>mysqld install MySQL --defaults-file="D:\ProgramFiles\mysql-5.6.40-winx64\my.ini"
Service successfully installed.

移除服务命令为:mysqld remove

安装成功后打开控制面板,服务,可以看奥有个MySQL服务:

2.3.5.7 Starting MySQL as a Windows Service
https://dev.mysql.com/doc/refman/5.6/en/windows-start-service.html

启动和停止MySQL服务

启动MySQL服务
方法一:启动服务命令为:net start mysql
方法二:打开管理工具 服务,找到MySQL服务。通过右键选择启动或者直接点击左边的启动来启动服务。

停止MySQL服务
方法一:在cmd中运行命令:net stop mysql
方法二:打开管理工具 服务,找到MySQL服务。右键停止服务。


RHEL/CentOS 安装 MySQL5.6(联网)

添加MySQL Yum Repository

默认yum只能安装最新版mysql,我们可以自己配置通过yum安装5.6或者其他版本。

查看系统里面有没有mysql的repo

查看系统里面有没有mysql的repo
yum repolist all | grep mysql
如果没有的话,添加mysql yum repo

添加mysql yum repo

打开mysql yum repo下载页面 https://dev.mysql.com/downloads/repo/yum/
注意一定要根据 RHEL/CentOS 版本选择对应的repo源
RHEL/CentOS 7.x 上选择 Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package
RHEL/CentOS 6.x 上选择 Red Hat Enterprise Linux 6 / Oracle Linux 6 (Architecture Independent), RPM Package
选错源会导致后续yum安装的mysql和系统版本不对应而报错,比如在 RHEL/CentOS 6.x 上安装了 7.x 的源,后续安装yum时会提示找不到 systemd

1、在aws ec2 Amazon Linux 2 和 阿里云 ecs centos 7.6 上安装时,选择 7.x 版本
2、在aws Lightsail上使用 7.x的mysql源安装时出了问题,找不到 systemd,才知道对应的是centos6.x版本,只能使用6.x的源。

RHEL/CentOS 7.x源

选择 Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package
下载后得到一个 mysql80-community-release-el7-1.noarch.rpm 文件
使用scp命令把这个.rpm文件上传到服务器

将rpm添加到yum repo
sudo rpm -Uvh mysql80-community-release-el7-1.noarch.rpm

[root@ecs-t5 ~]# rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
警告:mysql80-community-release-el7-3.noarch.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql80-community-release-el7-3  ################################# [100%]

或者直接通过网络添加:
下面这个下载地址可以在点开文件的下载页面后看到
sudo rpm -Uvh http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

RHEL/CentOS 6.x源

选择 Red Hat Enterprise Linux 6 / Oracle Linux 6 (Architecture Independent), RPM Package
或者直接通过网络添加:
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el6-3.noarch.rpm

repo源安装完成后再次查看yum repo:

[ec2-user@ip ~]$ yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64   MySQL Cluster 7.5 Community  disabled
mysql-cluster-7.5-community-source   MySQL Cluster 7.5 Community  disabled
mysql-cluster-7.6-community/x86_64   MySQL Cluster 7.6 Community  disabled
mysql-cluster-7.6-community-source   MySQL Cluster 7.6 Community  disabled
mysql-connectors-community/x86_64    MySQL Connectors Community   enabled: 51+14
mysql-connectors-community-source    MySQL Connectors Community - disabled
mysql-tools-community/x86_64         MySQL Tools Community        enabled:    69
mysql-tools-community-source         MySQL Tools Community - Sour disabled
mysql-tools-preview/x86_64           MySQL Tools Preview          disabled
mysql-tools-preview-source           MySQL Tools Preview - Source disabled
mysql55-community/x86_64             MySQL 5.5 Community Server   disabled
mysql55-community-source             MySQL 5.5 Community Server - disabled
mysql56-community/x86_64             MySQL 5.6 Community Server   disabled
mysql56-community-source             MySQL 5.6 Community Server - disabled
mysql57-community/x86_64             MySQL 5.7 Community Server   disabled
mysql57-community-source             MySQL 5.7 Community Server - disabled
mysql80-community/x86_64             MySQL 8.0 Community Server   enabled:    33
mysql80-community-source             MySQL 8.0 Community Server - disabled

禁用yum repo中不想用的mysql版本

mysql yum repo 中,默认除了最新版,其他mysql版本是disable禁用的,编辑
/etc/yum.repos.d/mysql-community.repo
文件把自己想安装的版本设为enable,将其上的版本设为disable
默认 mysql-community.repo 文件如下:

# Enable to use MySQL 5.5
[mysql55-community]
name=MySQL 5.5 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

# Enable to use MySQL 5.7
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-tools-community]
name=MySQL Tools Community
baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-tools-preview]
name=MySQL Tools Preview
baseurl=http://repo.mysql.com/yum/mysql-tools-preview/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-cluster-7.5-community]
name=MySQL Cluster 7.5 Community
baseurl=http://repo.mysql.com/yum/mysql-cluster-7.5-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-cluster-7.6-community]
name=MySQL Cluster 7.6 Community
baseurl=http://repo.mysql.com/yum/mysql-cluster-7.6-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

比如我想安装 5.6,则把 mysql56-community 的 enabled 设为1,把 mysql80-community 的enable 设为0

查看yum repo中enabled的mysql版本

查看 yum repo 中 enabled 的 mysql 版本,确认刚才的修改:

[ec2-user@ip yum.repos.d]$ yum repolist enabled |grep mysql
mysql-connectors-community/x86_64     MySQL Connectors Community          51+14
mysql-tools-community/x86_64          MySQL Tools Community                  69
mysql56-community/x86_64              MySQL 5.6 Community Server            412

yum安装mysql-community-server

yum 安装 mysql-community-server
sudo yum install mysql-community-server

6.x系统使用7.x的源安装mysql出错提示需要 systemd

在 aws Lightsail 上 yum 安装 mysql5.6 时遇到下面的问题,需要 systemd

---> 软件包 mysql-community-server.x86_64.0.5.6.44-2.el7 将被 安装
--> 正在处理依赖关系 systemd,它被软件包 mysql-community-server-5.6.44-2.el7.x86_64 需要
--> 正在处理依赖关系 systemd,它被软件包 mysql-community-server-5.6.44-2.el7.x86_64 需要
---> 软件包 perl-Compress-Raw-Bzip2.x86_64.0.2.061-3.11.amzn1 将被 安装
---> 软件包 perl-Compress-Raw-Zlib.x86_64.1.2.061-4.1.amzn1 将被 安装
--> 解决依赖关系完成
错误:软件包:mysql-community-server-5.6.44-2.el7.x86_64 (mysql56-community)
          需要:systemd

原因:6.x 系统,没有 systemctl 命令,但安装了 7.x yum源
解决:删除 7.x 的mysql源后,重新安装 6.x 的mysql源

$ rpm -qa|grep mysql
mysql80-community-release-el7-1.noarch
$ sudo rpm -e mysql80-community-release-el7-1.noarch
警告:/etc/yum.repos.d/mysql-community.repo 已另存为 /etc/yum.repos.d/mysql-community.repo.rpmsave

删除yum repo缓存
一开始我删除7.x的repo后马上安装6.x的repo,结果安装的mysql版本还是7.x的,原来是yum repo有缓存,需要手动删除repo缓存,否则还会读取缓存中的7.x repo

$ cd /var/cache/yum/x86_64/latest/
$ ls
amzn-main  amzn-updates  mysql56-community  mysql-connectors-community  mysql-tools-community  nodesource  timedhosts
$ sudo rm -rf mysql*

再次安装就好了。


启动mysqld.service

RHEL/CentOS 6.x 系统上:
sudo service mysqld start 启动mysql服务
sudo service mysqld stop 停止mysql服务
sudo service mysqld restart 重启mysql服务
sudo service mysqld status 检查httpd服务状态

RHEL/CentOS 7.x 系统上:
sudo systemctl start mysqld.service
有的 /usr/lib/systemd/system/mysqld.service 中定义了别名 Alias=mysql.service, 此时 sudo systemctl start mysql.service 也可以启动,但有的版本中并没有定义,需注意。

停止 mysql
sudo systemctl stop mysqld.service

在aws ec2上启动时必须加sudo,否则无法启动:

[ec2-user@ip init.d]$ service mysqld start
Redirecting to /bin/systemctl start mysqld.service
Failed to start mysqld.service: The name org.freedesktop.PolicyKit1 was not provided by any .service files

内存不足导致InnoDB引擎初始化失败导致mysql启动失败

安装完成后启动 mysqld 服务失败:

$ sudo service mysqld start
MySQL Daemon failed to start.
Starting mysqld:                                           [FAILED]

查看mysql日志 /var/log/mysqld.log
发现是初始化 InnoDB 引擎时要分配128M内存失败,我机器只有500兆内存

2019-07-15 05:12:17 8636 [Note] InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
2019-07-15 05:12:17 8636 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2019-07-15 05:12:17 8636 [ERROR] Plugin 'InnoDB' init function returned error.
2019-07-15 05:12:17 8636 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-07-15 05:12:17 8636 [ERROR] Unknown/unsupported storage engine: InnoDB
2019-07-15 05:12:17 8636 [ERROR] Aborting

Innodb 存储引擎的缓存机制和 MyISAM 的最大区别就在于 Innodb 不仅仅缓存索引,同时还会缓存实际的数据。所以,完全相同的数据库,使用 Innodb 存储引擎可以使用更多的内存来缓存数据库相关的信息,当然前提是要有足够的物理内存。
innodb_buffer_pool_size 参数用来设置 Innodb 最主要的 Buffer(Innodb_Buffer_Pool)的大小,也 就是缓存用户表及索引数据的最主要缓存空间,对 Innodb 整体性能影响也最大。这个参数设置成内存的50%-80%,当然具体要结合实际情况而定,考虑别的存储引擎占用的内存,考虑服务器是不是还提供其他服务等等。

修改 /etc/my.cnf 配置文件,将 innodb_buffer_pool_size 改小为 32M后来又改为16M,重启mysql,还是报同样的错误。同时我free -m看了下可用内存,还有300多M,不知为啥就是无法启动。
后来考虑了下,应该是500M内存怎么都不够,即使改小 innodb缓存还有其他地方需要的内存总量大于500M,只能给linux加个swap空间,即添加虚拟内存。

Mysql cannot allocate memory for the buffer pool 解决方法
https://blog.csdn.net/Mr_OOO/article/details/78653523

给linux添加swap交换文件(即虚拟内存)

我在 500M 内存的机器上安装mysql时遇到无法启动才需要设置虚拟内存,在1G内存机器上安装不需要此步骤。
可以先 freeswapon -s 查看系统是否有虚拟内存,没有的话按如下步骤增加。

1、创建大小为 1G 的交换文件:

sudo dd if=/dev/zero of=/swapfile1 bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,14.7397 秒,72.8 MB/秒

2、修改文件的权限,避免其他用户对这个文件进行误操作:
sudo chmod 600 /swapfile1

3、使用mkswap命令来设置交换文件:

sudo mkswap /swapfile1
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=b30e9371-0e0b-40b4-bd85-624aeb173aa1

4、启用交换文件:
sudo swapon /swapfile1

5、写入/etc/fstab,以便在系统启动时自动加载交换文件:
/swapfile1 none swap defaults 0 0

$ cat /etc/fstab
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
/swapfile1 none swap defaults 0 0

新添了交换分区并启用它之后,请查看 cat /proc/swapsfreeswapon -s 命令的输出来确保交换分区已被启用了。

$ free -m
             total       used       free     shared    buffers     cached
Mem:           481        469         12          0         44        353
-/+ buffers/cache:         71        410
Swap:         1023          0       1023
$ swapon -s
文件名                类型        大小    已用    权限
/swapfile1  file    1048572    0    -2

Changed limits: max_open_files: 50000 (requested 100000)

启动日志中有警告:

2021-07-23T07:54:47.570141Z 0 [Warning] Changed limits: max_open_files: 5000 (requested 100000)
2021-07-23T07:54:47.570454Z 0 [Warning] Changed limits: max_connections: 4190 (requested 20000)
2021-07-23T07:54:47.570462Z 0 [Warning] Changed limits: table_open_cache: 400 (requested 2000)

原因:
/usr/lib/systemd/system/mysqld.service 中设置了 LimitNOFILE 限制

解决:
vi /usr/lib/systemd/system/mysqld.service
修改
LimitNOFILE=100000
然后执行 systemctl daemon-reload 后重启 MySQL


设置mysql开机启动

一、RHEL/CentOS 6.x 系统上:
查看mysql是否自启动,chkconfig 是在linux中设置开启自启动的命令

# chkconfig --list | grep mysqld
mysqld          0:off   1:off   2:off   3:on    4:on    5:on    6:off

设置开机启动

# chkconfig mysqld on
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

二、在 RHEL7 或 centos7 系统上使用 systemctl 代替 chkconfig 来管理服务
chkconfig mysqld on 会自动转为 systemctrl 命令,或者直接使用 systemctrl 来 设置 mysql 开机启动
sudo systemctl enable mysqld.service

在centos7上chkconfig --list命令无法看到全部系统服务, 会提示:

[ec2-user@ip bin]$ chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off

使用 systemctl 命令来查看开机启动设置
systemctl list-unit-files

[root@ecs-t5 ~]# systemctl list-unit-files |grep mysql
mysql.service                                 enabled
mysqld.service                                enabled

enabled 表示已设为开机启动


yum卸载mysql-community-server

1、rpm -qa|grep mysql-community-server 查找具体的安装版本

# rpm -qa mysql-community-server
mysql-community-server-5.7.34-1.el7.x86_64

2、yum remove mysql-community-server-5.7.34-1.el7.x86_64 卸载


RHEL/CentOS7 安装 MySQL5.7(离线)

# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

下载MySQL离线安装包

打开官方下载页面
https://downloads.mysql.com/archives/community/
Product Version 选择 5.7.34
Operating System 选择 Red Hat Enterprise Linux / Oracle Linux
OS Version 选择 Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit)

下载 bundle 合集包 mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar 并上传到服务器。

yum install安装离线rpm包

mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar 解压后得到所有需要的 rpm 包,其中必须安装的是下面 5 个:

26M    mysql-community-client-5.7.34-1.el7.x86_64.rpm
312K    mysql-community-common-5.7.34-1.el7.x86_64.rpm
2.4M    mysql-community-libs-5.7.34-1.el7.x86_64.rpm
1.3M    mysql-community-libs-compat-5.7.34-1.el7.x86_64.rpm
174M    mysql-community-server-5.7.34-1.el7.x86_64.rpm

执行 yum install mysql-community-{server,client,common,libs}-* 安装这几个 rpm 包。
过程中会自动创建 mysql 用户,不需要手动操作。


MySQL启动方式

mysqld启动

mysqld 是mysql的一个核心程序,用于管理mysql的数据库文件及用户的请求操作。
mysqld可以读取配置文件中的 [mysqld] 的部分。
mysqld启动命令: bin/mysqld --defaults-file=/etc/my.cnf &
关闭命令: mysqladmin -uroot -p123456 shutdown

mysqld_safe启动

mysqld_safe 是一个启动脚本,用它启动实质是启动mysqld守护进程,如果mysqld 不存在了,自动把mysqld拉起来。
1、可以读取的配置部分 [mysqld],[server],[myslqd_safe], 为了兼容 mysql_safe 也会读取 [safe_mysqld] 中的配置
2、调用的mysqld是可以在 [mysqld_safe] 中用-mysqld, –mysqld-version指定

mysqld_safe启动命令:mysqld_safe --defaluts-file=/etc/my.cnf &
关闭命令: mysqladmin -uroot -p123456 shutdown

mysqld_multi启动

mysqld_multi 是用于管理多实例启动的一个脚本。
读取配置文件中的[mysqld_multi],[mysqldN] N需要一个整数,建议用端口号表示,该部分配置会覆盖[mysqld]部分中的配置
mysqld_multi 启动命令:mysqld_multi start 3306

service启动

需要先安装为 linux 系统服务
RHEL/CentOS 6.x 系统上是在 /etc/ini.d/ 目录下
sudo service mysqld start 启动mysql服务

RHEL/CentOS 7.x 系统上是在 /usr/lib/systemd/system/ 目录下
sudo systemctl start mysqld.service

sudo systemctl start mysql.service

查看mysql服务脚本内容可以发现,mysqld服务启动实质还是要调用mysqld_safe;


MySQL配置

默认位于 /etc/my.cnf 目录下

my.cnf的默认查找顺序

mysqld --verbose --help 命令可以看到 mysql 会从哪几个目录寻找 my.cnf

# ./mysqld --verbose --help|grep -A 1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

依次是
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
~/.my.cnf


MySQL 5.6的默认my.cnf

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

我的my.cnf配置

改动:
1、指定了三个字符集
2、改小了 innodb 缓存大小,默认是128,改成64M了,否则在500M内存的机器上起不来。

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 64M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

character-set-server = utf8mb4

[client]
default-character-set = utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]客户端配置

port=3306

设置mysql客户端连接服务端时默认使用的端口

default-character-set=utf8

客户端默认的字符集,如果你希望它支持中文,可以设置成gbk或者utf8。

password=1234

这里设置了password参数的值就可以在登陆时不用输入密码直接进入


[mysqld]服务端配置

port=3306

mysql服务端默认监听(listen on)的TCP/IP端口

basedir

basedir=D:\ProgramFiles\mysql-5.6.40-winx64
基准路径,其他路径都相对于这个路径;即MySQL的安装路径

datadir=/var/lib/mysql

datadir=/var/lib/mysql
mysql数据库文件所在目录

log-error

general-log-file

pid-file

character-set-server=utf8

服务端使用的字符集默认为8比特编码的utf-8字符集

default-storage-engine=INNODB

创建新表时将使用的默认存储引擎

max_connections=100

mysql服务器支持的最大并发连接数(用户数)。
即使连接数目达到最大限制,也总会预留其中的一个连接给管理员使用超级权限登录。
如果设置得过小而用户比较多,会经常出现“Too many connections”错误。

sql-mode

sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
SQL模式为strict模式

query_cache_size=0

查询缓存大小,用于缓存SELECT查询结果。如果有许多返回相同查询结果的SELECT查询,并且很少改变表,
可以设置query_cache_size大于0,可以极大改善查询效率。而如果表数据频繁变化,就不要使用这个,会适得其反

tmp_table_size=20M

内存中的每个临时表允许的最大大小。如果临时表大小超过该值,临时表将自动转为基于磁盘的表(Disk Based Table)。

thread_cache_size=9

缓存的最大线程数。当客户端连接断开时,如果客户端总连接数小于该值,则处理客户端任务的线程放回缓存。
在高并发情况下,如果该值设置得太小,就会有很多线程频繁创建,
线程创建的开销会变大,查询效率也会下降。一般来说如果在应用端有良好的多线程处理,这个参数对性能不会有太大的提高。

innodb_additional_mem_pool_size=2M

InnoDB用于存储元数据信息的内存池大小,一般不需修改

innodb_flush_log_at_trx_commit=1

事务相关参数,如果值为1,则InnoDB在每次commit都会将事务日志写入磁盘(磁盘IO消耗较大),
这样保证了完全的ACID特性。而如果设置为0,则表示事务日志写入内存log和内存log写入磁盘的频率都为1次/秒。
如果设为2则表示事务日志在每次commit都写入内存log,但内存log写入磁盘的频率为1次/秒。

innodb_log_buffer_size=1M

InnoDB日志数据缓冲大小,如果缓冲满了,就会将缓冲中的日志数据写入磁盘(flush)。
由于一般至少都1秒钟会写一次磁盘,所以没必要设置过大,即使是长事务。

innodb_buffer_pool_size=97M

InnoDB使用缓冲池来缓存索引和行数据。该值设置的越大,则磁盘IO越少。一般将该值设为物理内存的80%。

innodb_log_file_size=48M

每一个InnoDB事务日志的大小。一般设为innodb_buffer_pool_size的25%到100%

innodb_thread_concurrency=9

InnoDB内核最大并发线程数


[mysqld_safe]

my.cnf 中的 [mysqld_safe] 配置块在使用 mysqld_safe 方式启动 MySQL 时会起作用。


设置字符集为utf8mb4

修改 /etc/my.cnf , 增加字符集配置, 修改后要重启mysql

[mysqld]
character-set-server = utf8mb4

[client]
default-character-set = utf8mb4

[mysql]
default-character-set=utf8mb4

重启后查看字符集

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

配置mysql绑定ip

查看 mysql server 绑定ip
show variables like 'bind_address';
默认是*,表示接收所有的IPv4 或 IPv6 连接请求,如没有更改过就不用配置。


MySQL日志

5.4 MySQL Server Logs
https://dev.mysql.com/doc/refman/5.7/en/server-logs.html

默认情况下,MySQL 中的所有日志都是关闭的(除了Windows上的错误日志)。

错误日志(error log)

记录启动、运行、停止 mysqld 时的错误。
默认情况下,错误日志是开启的,且无法被禁止。默认情况下,错误日志是存储在数据库的数据文件目录中,名称为hostname.err,其中,hostname为服务器主机名。

log-error配置错误日志

为了方便管理,用户可以根据自己的需求在 my.cnf 中配置错误日志存储位置和日志级别,配置参数如下:

log-error=/var/log/mysqld_log.err

show variables like “log_error”

mysql> show variables like "log_error";
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| log_error     | /var/log/mysqld.log |
+---------------+---------------------+

日常query日志(General query log)

记录 mysql 的日常日志,包括查询、修改、更新等的每条sql。
Mysql打开general log日志后,所有的查询语句都可以在general log文件中输出,如果打开会导致IO非常大,影响MySQL性能,因此如果不是在调试环境下,是不建议开启查询日志功能的。

general-log-file配置查询日志

查询日志的输出文件可以在 my.cnf 中添加

general-log-file = [filename]

show global variables like “%general_log%”

查看mysql是否启用了查询日志

mysql> show global variables like "%general_log%";
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | OFF                          |
| general_log_file | /var/lib/mysql/lightsail.log |
+------------------+------------------------------+

二进制日志(binlog)

二进制日志,包含一些事件,这些事件描述了数据库的改动,如建库删库、建表删表、数据增删改等,主要用于备份、恢复、审计等操作。
注意binlog不记录SELECT、SHOW等那些不修改数据的SQL语句。
binlog默认是关闭的

log_bin配置二进制日志

my.cnf 中配置二进制文件

log_bin = /var/log/mysql-bin.log

如果只添加了 log_bin 配置项,没有指定文件,则默认二进制日志文件名为主机名,并以自增的数字作为后缀,例如 mysql-bin.000001,所在目录为数据库所在目录(datadir)

show variables like “%log_bin%”

mysql> show variables like "%log_bin%";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+

binlog index文件

为了管理所有的binlog文件,MySQL额外创建了一个base-name.index文件,它按顺序记录了MySQL使用的所有binlog文件。如果你想自定义index文件的名称,可以设置 log_bin_index=file 参数。千万不要在mysqld运行的时候手动修改index文件的内容,这样会使mysqld产生混乱。

何时会创建新的binlog文件?

对于二进制文件,当满足下面任意情况时会创建新的文件,文件后缀会自增。
文件大小达到 max_binlog_size 参数设置值时。
执行 flush logs 命令。
重启 mysqld 进程。

3种binlog格式

binlog相关配置

log_bin

log_bin 设置此参数表示启用binlog功能,并指定路径名称

log_bin_index

log_bin_index 设置此参数是指定二进制索引文件的路径与名称

binlog_do_db

binlog_do_db 此参数表示只记录指定数据库的二进制日志

binlog_ignore_db

binlog_ignore_db 此参数表示不记录指定的数据库的二进制日志

max_binlog_cache_size

max_binlog_cache_size 此参数表示binlog使用的内存最大的尺寸

binlog_cache_size:此参数表示binlog使用的内存大小,可以通过状态变量binlog_cache_use和binlog_cache_disk_use来帮助测试。binlog_cache_use:使用二进制日志缓存的事务数量

binlog_cache_disk_use:使用二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量

max_binlog_size

max_binlog_size Binlog最大值,最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束

sync_binlog

sync_binlog 这个参数直接影响mysql的性能和完整性

sync_binlog=0:
当事务提交后,Mysql仅仅是将binlog_cache中的数据写入Binlog文件,但不执行fsync之类的磁盘 同步指令通知文件系统将缓存刷新到磁盘,而让Filesystem自行决定什么时候来做同步,这个是性能最好的。

sync_binlog=n,在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,同志文件系统将Binlog文件缓存刷新到磁盘。
Mysql中默认的设置是sync_binlog=0,即不作任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。一旦系统绷Crash,在文件系统缓存中的所有Binlog信息都会丢失

中继日志(relay log)

relay log 是复制过程中产生的日志,很多方面都跟binary log差不多,区别是: relay log 是从库服务器I/O线程将主库服务器的二进制日志读取过来记录到从库服务器本地文件,然后从库的SQL线程会读取relay-log日志的内容并应用到从库服务器上。

慢查询日志(Slow query log)

默认情况下,慢查询日志是不开启的,只有手动开启了,慢查询才会被记录到慢查询日志中。

show variables like “%slow%”

mysql> show variables like "%slow%";
+---------------------------+-----------------------------------+
| Variable_name             | Value                             |
+---------------------------+-----------------------------------+
| log_slow_admin_statements | OFF                               |
| log_slow_slave_statements | OFF                               |
| slow_launch_time          | 2                                 |
| slow_query_log            | OFF                               |
| slow_query_log_file       | /var/lib/mysql/lightsail-slow.log |
+---------------------------+-----------------------------------+

开启慢查询日志

set global slow_query_log = on; 开启慢查询日志,重启后失效。
或者在 my.cnf 中配置来永久生效

slow_query_log=1
slow-query-log-file = /tmp/mysql-slow.log
long_query_time = 1 #设置满请求时间, 设置查多少秒的查询算是慢查询

long_query_time

long_query_time: 慢查询指定时间设置,表示”多长时间的查询”被认定为”慢查询”,单位是秒(s),默认是10s,即超过10s的查询都被认定为慢查询。

mysql> show variables like "%long_query_time%";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------

设置root用户密码

MySQL安装完成后会自动提供一个不带密码的root用户,为了安全起见给root设置密码123456。

修改root密码的三种办法
首先命令行登录MySQL。

用SET PASSWORD命令

方法1: 用SET PASSWORD命令
首先使用无密码的root账号登陆mysql
格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例子:mysql> set password for root@localhost = password('123456');

mysql> set password for root@localhost = password('123456');
Query OK, 0 rows affected (0.00 sec)

13.7.1.7 SET PASSWORD Syntax
https://dev.mysql.com/doc/refman/5.6/en/set-password.html

用mysqladmin命令

方法2:用mysqladmin命令
注意 mysqladmin 命令是在mysql外使用的
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:
如果root还没设置过密码:mysqladmin -u root password 123456
如果root已设置过密码:mysqladmin -u root -p 123456 password 123

直接update user表

方法3:用UPDATE直接编辑user表

mysql> use mysql;
mysql> update user set password=password('123456') where user='root' and host='localhost';
mysql> flush privileges;

设置密码后登入时需要输入密码:

mysql -u root -p (-u 后跟登入的用户名,-p 提示要密码登入)
Enter password:(输入密码)

Access denied for user ‘root‘@’localhost’ (using password: NO)

现象:
yum 安装的 MySQL 5.7, 登录时提示:
Access denied for user ‘root‘@’localhost’ (using password: NO)
使用 mysqladmin -u root password 123456 修改 root 密码也不行,同样提示这个错误。

排查:
试过 yum remove 删除 MySQL 后重新安装,重装后还是同样的问题。

解决:
1、systemctl stop mysqld.service 停止 mysql

2、编辑 /etc/my.cnf 最后增加

skip-grant-tables

这个选项允许任何用户无密码连接到 MySQL 并拥有全部权限,是非常不安全的,只用于重置密码。
或者也可以给 MySQL 启动命令增加 mysqld_safe --user=mysql --skip-grant-tables --skip-networking & 选项,效果一样。
之后 systemctl start mysqld.service 启动 MySQL

3、直接 mysql 登录本地 MySQL, use mysql; 切换为 mysql 数据库,然后执行下面语句重设 root 的密码:

update user set authentication_string=PASSWORD("123456") where user='root';
FLUSH PRIVILEGES;

注意 MySQL 5.6 及以下版本用 UPDATE user SET Password=PASSWORD('123456') where USER='root';
MySQL 5.7 user 表中没有 Password 字段,改为 authentication_string 字段了。

4、退出 MySQL, systemctl stop mysqld.service 停止 mysql
编辑 /etc/my.cnf, 去掉最后的 skip-grant-tables
之后 systemctl start mysqld.service 启动 MySQL

5、然后 mysql -uroot -p123456 可成功登录。
但此时执行任何语句都会提示

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

需要 ALTER USER 再次修改密码 alter user 'root'@'localhost' identified by '123456';
而且密码简单了还不行

mysql> alter user 'root'@'localhost' identified by '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

密码规则可以查 validate_password 相关变量,当然重置密码前这个 show 变量的命令也执行不了。

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+

B.3.3.2 How to Reset the Root Password
https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html


数据库操作

show databases查看库列表

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

Mysql刚安装完有三个数据库:mysql, information_schema, performance_schema
mysql库非常重要,它里面有MySQL的系统信息,我们改密码和新增用户,实际上就是用这个库中的相关表进行操作。

13.7.5.15 SHOW DATABASES Syntax
https://dev.mysql.com/doc/refman/5.6/en/show-databases.html

use db切换数据库

mysql> use mysql;
Database changed

对哪个数据库进行操作就要先打开哪个库,打开后会显示Database changed

13.8.4 USE Syntax
https://dev.mysql.com/doc/refman/5.6/en/use.html

show tables查看表列表

首先打开相应数据库,然后

mysql> show tables;
+------------------------+
| Tables_in_mysql |
+------------------------+
| columns_priv  |
| db        |
| func        |
| host        |
| tables_priv      |
| user        |
+------------------------+
6 rows in set (0.01 sec)

13.7.5.38 SHOW TABLES Syntax
https://dev.mysql.com/doc/refman/5.6/en/show-tables.html

create database创建数据库

例如:创建一个名字位SMS_RTMP的库

mysql> create database SMS_RTMP;

13.1.10 CREATE DATABASE Syntax
https://dev.mysql.com/doc/refman/5.6/en/create-database.html

修改数据库名

Mysql没有直接更改数据库名称的命令。

注:RENAME DATABASE这条命令在MySQL 5.1.7中被加入,但很快就发现这条命令所带来的危险,于是在MySQL 5.1.23中这条命令被移除。

假如现在我们想把数据库名由 Hwei 更改为 hwei。

我们可以在数据库外执行以下命令:

mysqladmin -u root -p create hwei
mysqldump Hwei | mysql -u root -p hwei
当你确定原数据库中的数据都被复制到了新数据库中,就可以把原数据库删掉了。
drop database Hwei


创建用户

create user命令创建用户

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
如果没有@host参数,默认是%,即所有主机,例如:
create user usrname identified by 'password';

13.7.1.2 CREATE USER Syntax
https://dev.mysql.com/doc/refman/5.6/en/create-user.html

直接插入mysql.user表

以root用户登入,在mysql中有一张mysql.user表是存储MySQL中所有用户的信息表,所以可以直接增加删除这个表的记录就可增加和删除用户;
直接对mysql.user添加一条记录

insert into mysql.user(Host,User,Password) values("localhost","username",password("123"));
flush privileges;

这样就创建了一个名为:username 密码为:123 (密码是经过加密的 ) 的用户,不过这样没有权限因为只添加了三个字段,也可通过grant添加权限:

mysql创建普通用户后无法登陆(删除匿名用户)

新建了一个root用户外的普通用户,但始终无法登陆,总是提示密码错误,如下:

[ec2-user@ip- ~]$ mysql -u masikkk -p
Enter password:
ERROR 1045 (28000): Access denied for user 'masikkk'@'localhost' (using password: YES)

解决方法:
增加普通用户后,执行:

mysql> use mysql
mysql> delete from user where user='';
mysql> flush privileges;

意思是删除匿名用户。
注意:删除之后必须刷新系统权限表使生效

删除前:

mysql> select User,Host,Password from user;
+---------+--------------------------------------------+-------------------------------------------+
| User    | Host                                       | Password                                  |
+---------+--------------------------------------------+-------------------------------------------+
| root    | localhost                                  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root    | ip-172-31-31-59.us-west-2.compute.internal |                                           |
| root    | 127.0.0.1                                  |                                           |
| root    | ::1                                        |                                           |
|         | localhost                                  |                                           |
|         | ip-172-31-31-59.us-west-2.compute.internal |                                           |
| masikkk | %                                          | *A4B81B2C357B4AE327A5217C543A151B7522CF98 |
+---------+--------------------------------------------+-------------------------------------------+
7 rows in set (0.00 sec)

删除后:

mysql> select User,Host,Password from user;
+---------+--------------------------------------------+-------------------------------------------+
| User    | Host                                       | Password                                  |
+---------+--------------------------------------------+-------------------------------------------+
| root    | localhost                                  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root    | ip-172-31-31-59.us-west-2.compute.internal |                                           |
| root    | 127.0.0.1                                  |                                           |
| root    | ::1                                        |                                           |
| masikkk | %                                          | *A4B81B2C357B4AE327A5217C543A151B7522CF98 |
+---------+--------------------------------------------+-------------------------------------------+
5 rows in set (0.00 sec)

然后使用新建的用户登录成功。
之前真没注意有匿名用户,后来想了想,直接在linux命令行输入mysql命令也能登录,原来这种没指定用户名的情况下用的就是匿名用户,登录后只能看到一个information_schema库
删除匿名用户后,直接输入mysql命令就是用linux的用户名登陆了,如果没在mysql中创建这个用户,就会登录失败。

删除用户

DROP USER user [, user]

13.7.1.3 DROP USER Syntax
https://dev.mysql.com/doc/refman/5.6/en/drop-user.html

grant给新建用户授权

新创建的用户还没有任何表的读写权限,可以通过grant语句给用户赋权。
grant 权限 on 数据库.表 to 用户名@登录主机 identified by "密码"

使用root账号登录(注意只有root账号登录才行),执行:

grant all on *.* to username@localhost;
flush privileges;

all表示所有权限(包括增 删 改 查等权限), *.* 表示所有数据库的所有表,username为添加的用户名,
localhost为匹配的主机,如果没有@host参数,默认是%,即所有主机,例如:

grant all on *.* to username;
flush privileges;

如果直接给一个不存在的用户名赋权,也就直接创建了这个用户,比如:

grant all on *.* to username identified by "password";
flush privileges;

执行完会在mysql.user表插入一条记录。

注意:授权之后必须刷新系统权限表使赋权生效

13.7.1.4 GRANT Syntax
https://dev.mysql.com/doc/refman/5.6/en/grant.html

远程访问

现在新版的 mysql 一般默认都不允许远程连接的。需要建立远程连接账号才可以。
查看 user 表中默认的账号和 host:

mysql> select Host , User, Password from user;
+--------------------------------------------+------+-------------------------------------------+
| Host                                       | User | Password                                  |
+--------------------------------------------+------+-------------------------------------------+
| localhost                                  | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| ip-xxxxx.us-west-2.compute.internal        | root |                                           |
| 127.0.0.1                                  | root |                                           |
| ::1                                        | root |                                           |
| localhost                                  |      |                                           |
| ip-xxxxx.us-west-2.compute.internal        |      |                                           |
+--------------------------------------------+------+-------------------------------------------+
6 rows in set (0.00 sec)

可以看到,root 账号只允许本地连接。
为了方便远程操作数据库,我们可以给新创建的账号开启远程连接,这样就可以远程连接mysql:
mysql -h mysql.myhost.com -u username -pxxxx
或者使用 Navicat 或 datagrip 连接,也可以在应用服务器上使用此账号连接。
为了安全,推荐专门开一个可远程连接的账号,root 账号不开远程连接

如果让某个指定的 ip 可以远程使用 root 账号登录,可以 update user 表:
UPDATE userSETHost='192.192.192.192' WHERE User='root' and Host='localhost';
这样 192.192.192.192 这台服务器就可以远程连接到这个数据库服务器了。
假如你想让任何远程机器都可以连接这个数据库,就将 192.192.192.192 换为 %

使账号可以远程访问

UPDATE `user` SET `Host`='%' WHERE `User`='username';
flush privileges;

表示使 username 账号可被所有ip访问。

或者新创建一个账号,Host为%,即允许所有主机连接,并给账号授权。

防火墙导致无法远程连接

mysql安装并配置可远程连接的账号后还是会连接失败,报错:

$ mysql -u username -h xx.xx.xx.xx -ppassword;
ERROR 2002 (HY000): Can't connect to MySQL server on 'xx.xx.xx.xx' (36)

可能的一个原因是,服务器的防火墙阻断了 mysql 的 3306 端口
比如我使用过的 aws ec2, aws Lightsail 以及 阿里云 ecs,默认都只开放了 ssh 的22端口,最多也只再开放了http的80端口,所以如果不手动打开 3306 端口是无法远程访问的。

修改用户密码

使用root账号登录,切换到mysql数据库

set password for 'username'@'%' = password('password');

Access denied for user username@ip

指定的 username 已开启远程登录和授权

grant all on *.* to 'username'@'%';

在远端通过终端登录 mysql -h mysql.myhost.com -u username -pxxxx 一切都ok,能查询能修改,但在 datagrip 或 idea 客户端中始终无法登录,提示:
The specified user/password combination is rejected: [28000][1045] Access denied for user ‘username‘@’ip’ (using password: YES)

在网上查解决方法,都说的是没把host设为%导致无法远程登录,或者没有赋权,但我都弄了的。

还有的说 mysql 5.7 会有密码自动过期策略,但我看了下我用的5.6啊,而且 user表中最后一列的 password_expired 字段值为 N,密码没过期啊。再说如果密码过期了我在命令行中可定也无法登录的。

最后试了下改密码,修改密码后竟然可以在客户端登录了,好奇怪。但是只是第一次可以,后来我在 datagrip 中删除连接,再重连,又不行了。

上一篇 VMware虚拟机

下一篇 SVN

阅读
评论
11k
阅读预计50分钟
创建日期 2015-04-01
修改日期 2021-07-23
类别
目录
  1. Docker安装MySQL
  2. MAC brew安装MySQL
    1. 搜索 mysql 安装包
    2. 安装 mysql 5.7
    3. 设置环境变量
    4. 启动mysql服务
    5. 初始化mysql配置
  3. Windows安装MySQL
    1. 下载
    2. 安装
    3. my.ini初始配置
    4. 添加环境变量
    5. 安装MySQL服务
    6. 启动和停止MySQL服务
  4. RHEL/CentOS 安装 MySQL5.6(联网)
    1. 添加MySQL Yum Repository
      1. 查看系统里面有没有mysql的repo
      2. 添加mysql yum repo
      3. RHEL/CentOS 7.x源
      4. RHEL/CentOS 6.x源
      5. 禁用yum repo中不想用的mysql版本
      6. 查看yum repo中enabled的mysql版本
    2. yum安装mysql-community-server
      1. 6.x系统使用7.x的源安装mysql出错提示需要 systemd
    3. 启动mysqld.service
      1. 内存不足导致InnoDB引擎初始化失败导致mysql启动失败
      2. 给linux添加swap交换文件(即虚拟内存)
      3. Changed limits: max_open_files: 50000 (requested 100000)
    4. 设置mysql开机启动
    5. yum卸载mysql-community-server
  5. RHEL/CentOS7 安装 MySQL5.7(离线)
    1. 下载MySQL离线安装包
    2. yum install安装离线rpm包
  6. MySQL启动方式
    1. mysqld启动
    2. mysqld_safe启动
    3. mysqld_multi启动
    4. service启动
  7. MySQL配置
    1. my.cnf的默认查找顺序
    2. MySQL 5.6的默认my.cnf
    3. 我的my.cnf配置
    4. [client]客户端配置
      1. port=3306
      2. default-character-set=utf8
      3. password=1234
    5. [mysqld]服务端配置
      1. port=3306
      2. basedir
      3. datadir=/var/lib/mysql
      4. log-error
      5. general-log-file
      6. pid-file
      7. character-set-server=utf8
      8. default-storage-engine=INNODB
      9. max_connections=100
      10. sql-mode
      11. query_cache_size=0
      12. tmp_table_size=20M
      13. thread_cache_size=9
      14. innodb_additional_mem_pool_size=2M
      15. innodb_flush_log_at_trx_commit=1
      16. innodb_log_buffer_size=1M
      17. innodb_buffer_pool_size=97M
      18. innodb_log_file_size=48M
      19. innodb_thread_concurrency=9
    6. [mysqld_safe]
    7. 设置字符集为utf8mb4
    8. 配置mysql绑定ip
  8. MySQL日志
    1. 错误日志(error log)
      1. log-error配置错误日志
      2. show variables like “log_error”
    2. 日常query日志(General query log)
      1. general-log-file配置查询日志
      2. show global variables like “%general_log%”
    3. 二进制日志(binlog)
      1. log_bin配置二进制日志
      2. show variables like “%log_bin%”
      3. binlog index文件
      4. 何时会创建新的binlog文件?
      5. 3种binlog格式
      6. binlog相关配置
        1. log_bin
        2. log_bin_index
        3. binlog_do_db
        4. binlog_ignore_db
        5. max_binlog_cache_size
        6. max_binlog_size
        7. sync_binlog
    4. 中继日志(relay log)
    5. 慢查询日志(Slow query log)
      1. show variables like “%slow%”
      2. 开启慢查询日志
      3. long_query_time
  9. 设置root用户密码
    1. 用SET PASSWORD命令
    2. 用mysqladmin命令
    3. 直接update user表
    4. Access denied for user ‘root‘@’localhost’ (using password: NO)
  10. 数据库操作
    1. show databases查看库列表
    2. use db切换数据库
    3. show tables查看表列表
    4. create database创建数据库
    5. 修改数据库名
  11. 创建用户
    1. create user命令创建用户
    2. 直接插入mysql.user表
    3. mysql创建普通用户后无法登陆(删除匿名用户)
    4. 删除用户
    5. grant给新建用户授权
  12. 远程访问
    1. 使账号可以远程访问
    2. 防火墙导致无法远程连接
  13. 修改用户密码
  14. Access denied for user username@ip

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论