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

最近,笔者正在做的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用户的密码问题

你可能感兴趣的:(配置环境)