MySQL 教程 1.2
作者:mmseoamin日期:2023-12-11

上期教程网友笔记整理

MySQL 重置密码

如果你忘记 MySQL 密码,可以通过修改 my.cnf 文件添加 skip-grant-tables 来重置密码,步骤如下:

1、打开 my.cnf 配置文件,找到 [mysqld] ,然后在该行下面添加以下参数:

skip-grant-tables

MySQL 教程 1.2,第1张

重启 MySQL 服务:

service mysql restart

登录 MySQL,此时不需要密码,直接回车:

# mysql -u root -p

更改 root 密码 为 123456:

mysql> use mysql;
mysql>  update user set authentication_string=password("123456") where user='root';
mysql> flush privileges;  # 刷新权限

注意密码字段名 5.7 版本的是 authentication_string,之前的为 password。

修改完后,记得注释掉 my.cnf 中的 skip-grant-tables 参数,重启 MySQL 服务,就可以用你设置的密码登录了。

关闭 MySQL 服务器:

service mysql stop

进入目录,以安全模式启动 MySQL

cd /usr/local/mysql/bin  
./mysqld_safe --skip-grant-tables & 

注意:

可能你的系统没有 safe_mysqld 程序(Windows 或 Ubuntu操作系统) ,可以使用 mysqld:

mysqld --skip-grant-tables &

启动后, root 用户以空密码登录 mysql:

# mysql -u root
mysql> update mysql.user set password=PASSWORD('123456') where User='root';   # 修改密码
mysql> flush privileges;  # 刷新权限
mysql> quit 

启动 MySQL:

service mysql start

这是就可以使用新密码 123456 登录了。

如果你知道密码,可以使用以下命令

# mysqladmin -u root -p password 新密码

假如楼上的方式改密码没有成功(我就没有), 记得在 update 的时候顺便把 plugin 改成 mysql_native_password:

update user set authentication_string=password("123456"),plugin='mysql_native_password' where user='root';

 

首先安装后,执行任何指令都会提示:

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

可以用以下指令修改你密码为 123456。

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;

之后使用以下指令刷新权限:

flush privileges;

注意指令末尾的分号。

退出后重新登陆。

Windows 64 位 mysql 8.0.12 版本包解压中没有 data 目录和 my-default.ini 文件以及服务无法启动的解决办法以及修改初始密码的方法。

1、没有 my-default.ini 文件,你可以在根目录下自己创建一个 my.ini 文件,具体内容如下:

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
 
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\web\mysql-8.0.11
#允许最大连接数
max_connections=200
#服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

2、如果设置 mysql 数据库的数据的存放目录:

datadir=C:\web\sqldata

这样会导致服务无法启动,不要添加这一句,也不要自己新建 data 文件夹,由 mysql 自动生成 data 就好。

以管理员的方式打开 cmd 命令窗口(直接打开 cmd 运行,可能会报错),并且进入到 mysql 安装目录的 bin 目录下。然后输入以下命令:

mysqld install
mysqld --initialize
net start mysql 

最后就会生成 data 目录。

我用 Windows10 安装 mysql 出现的问题。

1.编码错误

mysql Found option without preceding group in config file D:\System\mysql\my.ini at line 1

解决:请将 my.ini 文件格式转为 ANSI 编码。

2.时区错误

The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

需要在配置文件 [mysqld] 中加入:

default-time-zone = '+8:00'

 

在键入任何命令都会报这个错的时候:

You must reset your password using ALTER USER statement before executing this statement.

意思是需要重设密码,重设密码的命令如下:

alter user user() identified by "密码";

例如:

alter user user() identified by "123456";

MySQL 修改 root 密码的 4种方法(以windows为例)

方法 1: 用 SET PASSWORD 命令

首先登录MySQL。

格式:

mysql> set password for 用户名@localhost = password('新密码');

例子:

mysql> set password for root@localhost = password('123');

方法 2:用 mysqladmin

格式:

mysqladmin -u用户名 -p旧密码 password 新密码 

例子:

mysqladmin -uroot -p123456 password 123

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

首先登录MySQL。

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

方法 4:在忘记 root 密码的时候,可以这样,以 windows 为例:

  •  1. 关闭正在运行的 MySQL 服务。
  •  2. 打开 DOS 窗口,转到 mysql\bin 目录。
  •  3. 输入 mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
  •  4. 再开一个 DOS 窗口(因为刚才那个 DOS 窗口已经不能动了),转到 mysql\bin 目录。
  •  5. 输入 mysql 回车,如果成功,将出现MySQL提示符 >。
  •  6. 连接权限数据库: use mysql; 。
  •  6. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
  •  7. 刷新权限(必须步骤):flush privileges; 。
  •  8. 退出 quit。
  •  9. 注销系统,再进入,使用用户名 root 和刚才设置的新密码 123 登录。

     

    Navicat 连接 Mysql8.0.11 出现 2059 错误

    在使用 8+ 以上 MySQL 时,navicat premium 连接 mysql 数据库时,会报2059错误;

    MySQL 教程 1.2,第2张

    原因: 8+ 版本使用的密码加密规则为 caching_sha2_password。

    而 navicate 驱动目前不支持新加密规则,解决问题方法有两种,一种是升级 navicat 驱动,一种是把 mysql 用户登录密码加密规则还原成 mysql_native_password,这里我们将 mysql 规则修改回之前的 mysql_native_password,

    ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码' PASSWORD EXPIRE NEVER; # 修改加密规则 
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; # 更新一下用户的密码 
    FLUSH PRIVILEGES; #刷新权限

    8.0 以上版本修改密码使用:

    ALTER user 'root'@'localhost' IDENTIFIED BY '你的密码';

    如:

    mysql> ALTER user 'root'@'localhost' IDENTIFIED BY '123456';
    mysql> FLUSH PRIVILEGES;

    用以前的方法会报这个错:

    ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

    注意一定要有分号。

    在 8.0 以上的某些版本中,使用 mysqld --skip-grant-tables 命令跳过权限表认证的的命令可能会失效且不提供任何报错。

    此时可使用:

    mysqld --console --skip-grant-tables --shared-memory

     

    MySQL 管理


    启动及关闭 MySQL 服务器

    Windows 系统下

    在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录。

    启动:

    cd c:/mysql/bin
    mysqld --console

    关闭:

    cd c:/mysql/bin
    mysqladmin -uroot shutdown

    Linux 系统下

    首先,我们需要通过以下命令来检查MySQL服务器是否启动:

    ps -ef | grep mysqld

    如果MySql已经启动,以上命令将输出mysql进程列表, 如果mysql未启动,你可以使用以下命令来启动mysql服务器:

    root@host# cd /usr/bin
    ./mysqld_safe &

    如果你想关闭目前运行的 MySQL 服务器, 你可以执行以下命令:

    root@host# cd /usr/bin
    ./mysqladmin -u root -p shutdown
    Enter password: ******

    MySQL 用户设置

    如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。

    以下为添加用户的实例,用户名为guest,密码为guest123,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:

    root@host# mysql -u root -p
    Enter password:*******
    mysql> use mysql;
    Database changed
    mysql> INSERT INTO user 
              (host, user, password, 
               select_priv, insert_priv, update_priv) 
               VALUES ('localhost', 'guest', 
               PASSWORD('guest123'), 'Y', 'Y', 'Y');
    Query OK, 1 row affected (0.20 sec)
    mysql> FLUSH PRIVILEGES;
    Query OK, 1 row affected (0.01 sec)
    mysql> SELECT host, user, password FROM user WHERE user = 'guest';
    +-----------+---------+------------------+
    | host      | user    | password         |
    +-----------+---------+------------------+
    | localhost | guest | 6f8c114b58f2ce9e |
    +-----------+---------+------------------+
    1 row in set (0.00 sec)

    在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。 你可以在以上实例看到用户密码加密后为: 6f8c114b58f2ce9e.

    注意:在 MySQL5.7 中 user 表的 password 已换成了authentication_string。

    注意:password() 加密函数已经在 8.0.11 中移除了,可以使用 MD5() 函数代替。

    注意:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。

    如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。

    你可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下:

    • Select_priv
    • Insert_priv
    • Update_priv
    • Delete_priv
    • Create_priv
    • Drop_priv
    • Reload_priv
    • Shutdown_priv
    • Process_priv
    • File_priv
    • Grant_priv
    • References_priv
    • Index_priv
    • Alter_priv

      另外一种添加用户的方法为通过SQL的 GRANT 命令,以下命令会给指定数据库TUTORIALS添加用户 zara ,密码为 zara123 。

      root@host# mysql -u root -p
      Enter password:*******
      mysql> use mysql;
      Database changed
      mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
          -> ON TUTORIALS.*
          -> TO 'zara'@'localhost'
          -> IDENTIFIED BY 'zara123';

      以上命令会在mysql数据库中的user表创建一条用户信息记录。

      注意: MySQL 的SQL语句以分号 (;) 作为结束标识。


      /etc/my.cnf 文件配置

      一般情况下,你不需要修改该配置文件,该文件默认配置如下:

      [mysqld]
      datadir=/var/lib/mysql
      socket=/var/lib/mysql/mysql.sock
      [mysql.server]
      user=mysql
      basedir=/var/lib
      [safe_mysqld]
      err-log=/var/log/mysqld.log
      pid-file=/var/run/mysqld/mysqld.pid

      在配置文件中,你可以指定不同的错误日志文件存放的目录,一般你不需要改动这些配置。


      管理MySQL的命令

      以下列出了使用Mysql数据库过程中常用的命令:

      • USE 数据库名 :

        选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

        mysql> use RUNOOB;
        Database changed
      • SHOW DATABASES:

        列出 MySQL 数据库管理系统的数据库列表。

        mysql> SHOW DATABASES;
        +--------------------+
        | Database           |
        +--------------------+
        | information_schema |
        | RUNOOB             |
        | cdcol              |
        | mysql              |
        | onethink           |
        | performance_schema |
        | phpmyadmin         |
        | test               |
        | wecenter           |
        | wordpress          |
        +--------------------+
        10 rows in set (0.02 sec)
      • SHOW TABLES:

        显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。

        mysql> use RUNOOB;
        Database changed
        mysql> SHOW TABLES;
        +------------------+
        | Tables_in_runoob |
        +------------------+
        | employee_tbl     |
        | runoob_tbl       |
        | tcount_tbl       |
        +------------------+
        3 rows in set (0.00 sec)
      • SHOW COLUMNS FROM 数据表:

        显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。

        mysql> SHOW COLUMNS FROM runoob_tbl;
        +-----------------+--------------+------+-----+---------+-------+
        | Field           | Type         | Null | Key | Default | Extra |
        +-----------------+--------------+------+-----+---------+-------+
        | runoob_id       | int(11)      | NO   | PRI | NULL    |       |
        | runoob_title    | varchar(255) | YES  |     | NULL    |       |
        | runoob_author   | varchar(255) | YES  |     | NULL    |       |
        | submission_date | date         | YES  |     | NULL    |       |
        +-----------------+--------------+------+-----+---------+-------+
        4 rows in set (0.01 sec)
      • SHOW INDEX FROM 数据表:

        显示数据表的详细索引信息,包括PRIMARY KEY(主键)。

        mysql> SHOW INDEX FROM runoob_tbl;
        +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
        | Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
        +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
        | runoob_tbl |          0 | PRIMARY  |            1 | runoob_id   | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
        +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
        1 row in set (0.00 sec)
      • SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] \G:

        该命令将输出Mysql数据库管理系统的性能及统计信息。

        mysql> SHOW TABLE STATUS  FROM RUNOOB;   # 显示数据库 RUNOOB 中所有表的信息
        mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%';     # 表名以runoob开头的表的信息
        mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G;   # 加上 \G,查询结果按列打印

        Gif 图演示:

        MySQL 教程 1.2,第3张