欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux下Mysql添加用户操作踩到的坑

程序员文章站 2022-07-14 20:12:43
...

最近,笔者正在做的project想要对数据库做比较多的调试,同时也为了方便开发与版本部署以及之后数据库的整体迁移,于是想在数据库添加用户操作以及开放数据库的远程访问,折腾了一个多小时,学到了以下一些内容。

环境与目标

操作系统: centos7.2

数据库: MariaDB,MariaDB与mysql给用户的体验差别不大,基本都是兼容的,常用命令也基本相同。

目标: 原有登录数据库用root账户,无密码访问直接登录,希望设置账户名以及对应权限。

	# 原有的登录数据库方法
	mysql -u root -p

原理

Mysql或者说MariaDB管理用户权限等内容,是database里面的mysql中的user表,这个user表的结构包括了:host(允许访问的主机名)、user(登录的用户名)、password(登录密码或者口令)以及允许访问的权限(包括了可以访问的数据库、增删改查等)。
因此,最容易理解的一种方式就是用mysql常用的insert、delete、update等语句即可。

操作

例如想要新增用户:

	use mysql;
	insert into user (Host, User, Password) values ('xxx', 'xxx', PASSWORD('xxx'));
	# 刷新操作,必须做
	FLUSH PRIVILEGES;
	# 为其赋予权限
	grant all on *.* to 'username'@'hostname' identified by 'password' with grant option;
	exit;
	# 重启数据库服务,这里笔者用的是mariadb,如果直接是Mysql,就用重启Mysql的指令
	systemctl restart mariadb.service

想要修改root用户密码:

	use mysql;
	# 根据实际需求更新
	update user set password=password('password') where user='root'; 
	# 刷新操作,必须做
	FLUSH PRIVILEGES;
	# 为其赋予权限
	grant all on *.* to 'root'@'hostname' identified by 'password' with grant option;
	exit;
	# 重启数据库服务,这里笔者用的是mariadb,如果直接是Mysql,就用重启Mysql的指令
	systemctl restart mariadb.service

遇到过的问题以及解决方法

1. 无法进入数据库或者进入数据库无权限访问Mysql表:

可能因为忘记密码或者其他原因无法访问mysql表,则:

  • 停止数据库服务:

      systemctl stop mariadb.service
    
  • 跳过密码验证:修改/etc/my.cnf文件,在[mysqld]下面添加上一行:skip-grant-tables

      [mysqld]
      skip-grant-tables
    
  • 重启数据库服务:

      systemctl start mariadb.service
    
  • 免密登录数据库:

      mysql -uroot -p
    
  • 执行前文增加修改等操作

  • 完成之后,记得把/etc/my.cnf加的那一行删去或者注释,否则难以保证安全性,之后重启数据库服务。

2.执行1中的赋予权限操作时报错:

如果在赋予权限的时候报错:
The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
则:

  • 关掉新主库的只读属性

      set global read_only=0;
      flush privileges;
    
  • 继续1中的步骤再次重新赋予权限后,开启只读属性

      set global read_only=1;
      flush privileges;
    
  • 继续1中的步骤,直至完成

3.修改之后尝试登录,用户名为空:

修改了之后尝试命令登录:

mysql -uroot -p

但是发现access denied,根据提示显示登录的是’’@‘localhost’,很明显,并没有按照我们希望的root或者其他用户名登录,使用了一个空的用户名(匿名用户)。

笔者提供一个简单粗暴的方法:直接用数据库的delete操作,删除了Mysql的user表里所有用户名(User)为空的记录。

参考资料

1.完美解决Mysql的Access denied for user ‘root’@’%'问题

2.mysql中root用户的密码问题