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 数据库有关密码的内容,如果有更其他方式,可以投稿指出。
Speak Your Mind