暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 有关用户密码

晟数学苑 2021-08-25
240

点击蓝字 · 关注我们

MySQL 介绍

   MySQL 是由Oracle Corporation 开发和发行的最流行的数据库管理系统。MySQL 网站地址为: www.mysql.com,提供最新的MySQL软件包及相关工具的下载。MySQL 是一个数据库管理系统,数据库是由数据的集合构成。MySQL 是关系型数据库,关系型数据库存储数据在单独的一系列表中,而不是将数据存储在一个大的存储空间中。数据库的结构是被组织在快速的优化后的物理文件中。逻辑模型和对象如数据库、表、视图、行和列,提供了灵活的编程环境。MySQL 的 SQL 部分是标准的 "Structured Query Language"。SQL 是用来访问数据库的最标准的语言。当然,取决于你的编程环境。

安装

  MySQL 使用 rpm 或者 yum 方式安装将会自动创建一个 mysql 普通操作系统用户。在当前 redhat 家族操作系统中,已经不再提供 mysql 安装包了,如果使用 yum 方式安装,需要自己手动创建一个 mysql 仓库。yum 安装的好处在于自动解决依赖。以下是使用 yum 安装的过程:

    #创建归档包路径 opt/software 和解包后存放文件路径 mnt/mysql
    [root@node01 ~]# mkdir -p opt/software mnt/mysql


    #上传已下载的 MySQL 包到 opt/software 目录下
    [root@node01 ~]# cd opt/software/
    [root@node01 software]# ls
    mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar


    #解包到 mnt目录下的 mysql 目录
    [root@node01 ~]# tar -xf opt/software/mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar -C mnt/mysql/


    #删除安装包归档文件 mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar
    [root@node01 ~]# ls mnt/mysql/
    mysql-community-client-5.7.34-1.el7.x86_64.rpm
    mysql-community-common-5.7.34-1.el7.x86_64.rpm
    mysql-community-devel-5.7.34-1.el7.x86_64.rpm
    mysql-community-embedded-5.7.34-1.el7.x86_64.rpm
    mysql-community-embedded-compat-5.7.34-1.el7.x86_64.rpm
    mysql-community-embedded-devel-5.7.34-1.el7.x86_64.rpm
    mysql-community-libs-5.7.34-1.el7.x86_64.rpm
    mysql-community-libs-compat-5.7.34-1.el7.x86_64.rpm
    mysql-community-server-5.7.34-1.el7.x86_64.rpm
    mysql-community-test-5.7.34-1.el7.x86_64.rpm


    #安装 createrepo
    #该命令是用来生成 rpm 包元数据仓库的命令工具
    [root@node01 ~]# yum install -y createrepo


    #使用 createrepo 生成元数据仓库信息
    [root@node01 ~]# createrepo mnt/mysql/ #创建的快慢取决于你的CPU核心数


    #配置 mysql yum 仓库
    [root@node01 ~]# cat >/etc/yum.repos.d/mysql.repo<<EOF
    [mysql]
    name=mysql
    baseurl=file:///mnt/mysql
    enabled=1
    gpgcheck=0
    EOF
    [root@node01 ~]# cat etc/yum.repos.d/mysql.repo
    [mysql]
    name=mysql
    baseurl=file:///mnt/mysql
    enabled=1
    gpgcheck=0


    #查看已经配置好的 mysql 仓库
    [root@node01 ~]# yum repolist enabled | grep mysql
    mysql mysql 10


    #安装 mysql-community-server
    [root@node01 ~]# yum install -y mysql-community-server


    #验证
    [root@node01 ~]# rpm -ql mysql-community-server | wc -l
    150


    #修改配置文件内容如下
    [root@node01 ~]# cat etc/my.cnf
    [mysqld]
    datadir=/data1/mysqldata
    socket=/data1/mysql/mysql.sock
    symbolic-links=0
    log-error=/data1/log/mysqld.log
    pid-file=/data1/mysqld/mysqld.pid


    #创建配置文件中需要的目录并授权
    [root@node01 ~]# mkdir -p data1/{mysql/log,mysqldata,log,mysqld}
    [root@node01 mysql]# ll data1/
    total 0
    drwxr-xr-x. 2 root root 6 Aug 13 15:49 log
    drwxr-xr-x. 3 root root 17 Aug 13 15:49 mysql
    drwxr-xr-x. 2 root root 6 Aug 13 15:49 mysqld
    drwxr-xr-x. 2 root root 6 Aug 13 15:49 mysqldata




    [root@node01 ~]# chown mysql.mysql -R data1/


    #服务启动配置文件
    [root@node01 ~]# egrep -v "^$|^#" usr/lib/systemd/system/mysqld.service
    [Unit]
    Description=MySQL Server
    Documentation=man:mysqld(8)
    Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
    After=network.target
    After=syslog.target
    [Install]
    WantedBy=multi-user.target
    [Service]
    User=mysql
    Group=mysql
    Type=forking
    PIDFile=/data1/mysqld/mysqld.pid
    TimeoutSec=0
    PermissionsStartOnly=true
    ExecStartPre=/usr/bin/mysqld_pre_systemd
    ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/data1/mysqld/mysqld.pid $MYSQLD_OPTS
    EnvironmentFile=-/etc/sysconfig/mysql
    LimitNOFILE = 5000
    Restart=on-failure
    RestartPreventExitStatus=1
    PrivateTmp=false


    #加载配置文件
    [root@node01 ~]# systemctl daemon-reload


    #启动 mysql 服务(该过程将会自动初始化数据库集群并生成临时用户登录密码)
    [root@node01 ~]# systemctl status mysqld
    ● mysqld.service - MySQL Server
    Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
    Active: active (running) since Fri 2021-08-13 15:56:33 CST; 4s ago
    Docs: man:mysqld(8)
    http://dev.mysql.com/doc/refman/en/using-systemd.html
    Process: 4237 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/data1/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
    Process: 4188 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
    Main PID: 4240 (mysqld)
    CGroup: system.slice/mysqld.service
    └─4240 usr/sbin/mysqld --daemonize --pid-file=/data1/mysqld/mysqld.pid


    Aug 13 15:56:29 node01 systemd[1]: Starting MySQL Server...
    Aug 13 15:56:33 node01 systemd[1]: Started MySQL Server.
    复制

    首次登录

      首次登录需要使用密码,当然也可以通过 skip-grant-tables 选项来跳过密码登录。在首次启动 MySQL 数据库后,将会生成一个临时密码。临时密码位于日志文件中,默认的日志文件是 var/log/mysqld.log ,这里在配置文件 /etc/my.cnf 中指定的是 data1/log/mysqld.log

      [root@node01 ~]# cat data1/log/mysqld.log  | grep password | awk  '{print $NF}' 
      _rDRCIajo3D.


      #使用上面输出的密码来登录(由于 socket 路径已变更,因此需要特殊指定 socket 文件的路径)
      [root@node01 ~]# mysql -uroot -p -S data1/mysql/mysql.sock
      Enter password:
      Welcome to the MySQL monitor. Commands end with ; or \g.
      Your MySQL connection id is 2
      Server version: 5.7.34


      Copyright (c) 2000, 2021, Oracle and/or its affiliates.


      Oracle is a registered trademark of Oracle Corporation and/or its
      affiliates. Other names may be trademarks of their respective
      owners.


      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


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


      #可以看到由于第一次登录,需要修改密码才能使用数据库
      mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySQL@123';
      Query OK, 0 rows affected (0.00 sec)


      mysql> flush privileges;
      Query OK, 0 rows affected (0.00 sec)
      mysql> show databases;
      +--------------------+
      | Database |
      +--------------------+
      | information_schema |
      | mysql |
      | performance_schema |
      | sys |
      +--------------------+
      4 rows in set (0.00 sec)
      复制

      用户密码

        在 MySQL 中,密码采用 hash 方式加密。密码表为 mysql 数据库下的 user,也叫授权表。每个用户都对应一个密码, user 表不以明文的方式存储密码,存储的是明文进行hash运算后的哈希值,表中存储密码的字段为 authentication_string。如下:

        --生成的密码 hash
        mysql>SELECT
        PASSWORD('MySQL@123')
        ;
        +-------------------------------------------+
        | password('MySQL@123') |
        +-------------------------------------------+
        | *42D97F0078E96A9A0589554CCEB3E1E095B7DF69 |
        +-------------------------------------------+
        1 row in set, 1 warning (0.00 sec)


        --user 表中存储的 hash
        mysql>SELECT
        AUTHENTICATION_STRING
        FROM
        MYSQL.USER
        WHERE
        USER = 'root'
        AND HOST = 'localhost'
        ;
        +-------------------------------------------+
        | authentication_string |
        +-------------------------------------------+
        | *42D97F0078E96A9A0589554CCEB3E1E095B7DF69 |
        +-------------------------------------------+
        1 row in set (0.00 sec)
        复制

        忘记密码后的解决方法

        跳过授权表

          在实际使用过程中,有可能会出现忘记密码的问题,如果在 MySQL 中忘记了密码,该如何处理呢?
          通过跳过密码授权表的方式可以免密登录到数据库中,但是需要重新启动数据库。可以在 mysqld.service 服务启动配置文件中添加参数 --skip-grant-tables ,也可以通过在 my.cnf 模块 [mysqld] 中添加 skip-grant-tables 的方式跳过密码表,我们以后一种方式进行配置。如下:

          #停止数据库
          [root@node01 ~]# systemctl stop mysqld


          #在 /etc/my.cnf 中添加 skip-grant-tables
          [root@node01 ~]# cat /etc/my.cnf
          [mysqld]
          skip-grant-tables
          datadir=/data1/mysqldata
          socket=/data1/mysql/mysql.sock
          symbolic-links=0
          log-error=/data1/log/mysqld.log
          pid-file=/data1/mysqld/mysqld.pid


          #重新启动数据库
          [root@node01 ~]# systemctl start mysqld
          [root@node01 ~]# systemctl status mysqld | grep running
          Active: active (running) since Fri 2021-08-13 16:33:40 CST; 13s ago




          #登录数据库
          [root@node01 ~]# mysql -uroot -p -S /data1/mysql/mysql.sock
          Enter password: (此处只需要再按一次回车键即可,而不需要输入密码)
          Welcome to the MySQL monitor. Commands end with ; or \g.
          Your MySQL connection id is 2
          Server version: 5.7.34 MySQL Community Server (GPL)


          Copyright (c) 2000, 2021, Oracle and/or its affiliates.


          Oracle is a registered trademark of Oracle Corporation and/or its
          affiliates. Other names may be trademarks of their respective
          owners.


          Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


          mysql>
          复制

            但是通过 skip-grant-tables 跳过授权表,需要注意一些问题,只要通过该方式登录到数据库,并执行了 flush privileges 或者使用 **mysqladmin flush-privileges **命令后,退出后,再次登录必须要使用密码才能登录,如果想再次通过以跳过密码的方式登录,必须重新启动数据库。

            通过该方式登录到数据库,是无法通过 ALTER USER 的方式修改密码的,如下:

            mysql> ALTER USER 'root'@'localhsot' IDENTIFIED BY 'MySQL@123';
            ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
            复制

            更新密码表

              既然无法通过 ALTER USER 命令行的方式修改密码,那么只能采用更新密码授权表 user 中的 authentication_string 字段来更新密码,如下:

              mysql> UPDATE
              MYSQL.USER
              SET
              AUTHENTICATION_STRING =PASSWORD('NewPass@123')
              WHERE
              USER = 'root'
              AND HOST = 'localhost'
              ;
              Query OK, 1 row affected, 1 warning (0.00 sec)
              Rows matched: 1 Changed: 1 Warnings: 1


              mysql> show warnings;
              +---------+------+-------------------------------------------------------------------+
              | Level | Code | Message |
              +---------+------+-------------------------------------------------------------------+
              | Warning | 1681 | 'PASSWORD' is deprecated and will be removed in a future release. |
              +---------+------+-------------------------------------------------------------------+
              1 row in set (0.00 sec)


              #查看新密码
              mysql>SELECT
              AUTHENTICATION_STRING
              FROM
              USER
              WHERE
              USER = 'root'
              AND HOST = 'localhost'
              ;
              +-------------------------------------------+
              | authentication_string |
              +-------------------------------------------+
              | *303EC79A0669B1C7233BB0E885A363B18A69900B |
              +-------------------------------------------+
              1 row in set (0.00 sec)
              复制

               修改 user 表完成后,那么再次将 /etc /my.cnf 中的 skip-grant-tables 删除,然后重启服务器就可以使用新密码登录到数据了

                [root@node01 ~]# mysql -uroot -pNewPass@123 -S /data1/mysql/mysql.sock
                mysql: [Warning] Using a password on the command line interface can be insecure.
                Welcome to the MySQL monitor. Commands end with ; or \g.
                Your MySQL connection id is 2
                Server version: 5.7.34 MySQL Community Server (GPL)


                Copyright (c) 2000, 2021, Oracle and/or its affiliates.


                Oracle is a registered trademark of Oracle Corporation and/or its
                affiliates. Other names may be trademarks of their respective
                owners.


                Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


                mysql> 
                复制

                避免输入密码和用户名登录数据库

                  有时候为了方便维护程序运行,不需要输入密码和用户名要登录到数据库中,那么可以配置免用户名和密码来登录到数据库中。该免密登录的方式是通过 mysql_ config _editor 命令生成一个 .mylogin.cnf 的隐藏文件,该文件加密存储。mysql 在执行登录时访问该隐藏文件既可实现免密登录,如下:

                  #生成隐藏文件 .mylogin.cnf
                  [root@node01 ~]# mysql_config_editor set --user=root --port=3306 --host=localhost --password
                  Enter password: (输入密码)
                  .mylogin.cnf .mysql_history
                  [root@node01 ~]# ls .mylogin.cnf
                  .mylogin.cnf


                  #直接使用 mysql 登录
                  [root@node01 ~]# mysql -S /data1/mysql/mysql.sock
                  Welcome to the MySQL monitor. Commands end with ; or \g.
                  Your MySQL connection id is 3
                  Server version: 5.7.34 MySQL Community Server (GPL)


                  Copyright (c) 2000, 2021, Oracle and/or its affiliates.


                  Oracle is a registered trademark of Oracle Corporation and/or its
                  affiliates. Other names may be trademarks of their respective
                  owners.


                  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


                  mysql>
                  复制

                  如验证 MySQL 服务器是否连接成功

                    [root@node01 ~]# cat testconn.sh 
                    #!/bin/bash
                    SOCKET=/data1/mysql/mysql.sock
                    myconn=`mysql mysql -S ${SOCKET} -s -e "SELECT 1" | tail -1`
                    if [ "${myconn}" == "1" ];then
                    echo "Connection successfully"
                    else
                    echo "Connection Failure"
                    fi


                    [root@node01 ~]# sh testconn.sh
                    Connection successfully
                    复制

                     以上就是 MySQL 数据库有关密码的内容,如果有更其他方式,可以投稿指出。

                    往期回顾

                    ·logstash抽取oracle慢sql和alert日志

                    · 记一次oracle HAIP引发的数据库问题

                    · mysql show profiles 性能跟踪诊断工具

                    · Postgresql pglogical订阅端触发器如何控制

                    我知道你“在看”哟~

                    文章转载自晟数学苑,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论