最近在学Redis过程中Redis给入侵服务器给装了病毒,于是决定重装机子。但在安装Mysql中遇到了各种坑,在这篇文章里汇总一下我收集到的解决方案。
1.误删mysql的root用户,mysql忘记密码:
网上给出的解决方案一般如下:
1.先关闭mysql sudo systemctl stop mysql
2.用sudo mysqld_safe --skip-grant-tables
命令在跳过密码的情况下启动mysql
3.进入mysql后,先输入use mysql
命令,再执行ALERT user 'root'@'localhost' IDENTIFIED BY '你的新密码
命令设置新密码,之后重启服务器即可。
我贴一下我在上述步骤中出现的问题。
1.在执行第二步的过程中,出现了mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists.该问题。进一步排查发现,这个文件夹在mysql正常运行的时候是存在的,但是当我们执行关闭mysql命令的时候,这个文件夹也被自动删除了。
解决问题的方法是在mysql运行时备份一个,然后再运行。
sudo systemctl start mysql
cd /var/run
sudo cp -rp ./mysqld ./mysqld.bak
sudo systemctl stop mysql
sudo mv ./mysqld.back ./mysqld
sudo mysqld_safe --skip-grant-tables
之后我们就可以无密码的直接用mysql命令登入服务器。同时,登入mysql后要先执行 FLUSH PRIVILEGES;
命令,否则无法进行update操作或插入操作。
2.如果是误删root用户,那么我们在这里需要新插入一个root用户,这里直接摘抄https://developer.aliyun.com/article/527540的方法
mysql> insert into user set user=‘root’,ssl_cipher=‘’,x509_issuer=‘’,x509_subject=‘’;
(增加root用户的表)
Query OK, 1 row affected, 3 warnings (0.00 sec)
(这时可能会提示某字段如ssl_cipher无默认值, 只要加上,ssl_cipher=‘’; 其字段如有提示依次添加就OK了)
update user set Host=‘localhost’,select_priv=‘y’, insert_priv=‘y’,update_priv=‘y’, Alter_priv=‘y’,delete_priv=‘y’,create_priv=‘y’,drop_priv=‘y’,reload_priv=‘y’,shutdown_priv=‘y’,Process_priv=‘y’,file_priv=‘y’,grant_priv=‘y’,References_priv=‘y’,index_priv=‘y’,create_user_priv=‘y’,show_db_priv=‘y’,super_priv=‘y’,create_tmp_table_priv=‘y’,Lock_tables_priv=‘y’,execute_priv=‘y’,repl_slave_priv=‘y’,repl_client_priv=‘y’,create_view_priv=‘y’,show_view_priv=‘y’,create_routine_priv=‘y’,alter_routine_priv=‘y’,create_user_priv=‘y’ where user=‘root’;
(这里面是修改root用户的权限)
之后修改密码参考忘记密码部分即可。
3.在执行ALERT user ‘root’@‘localhost’ IDENTIFIED BY '你的新密码`时出错。
原因不明,但是在update或者select user表之后再执行似乎没有问题。
2、Navicat远程连接的问题
1.我首先遇到的问题是2003 - Can’t connect to MySQL server on ‘x.x.x.x’ (10038) mysql数据库连接不上问题。网上对此的回答一般是检查服务端和客户端两端的防火墙是否开启。我先随便换了个IP地址连接,报密码错误,说明客户端防火墙没有问题,之后再检查服务端防火墙,也没有问题。
网上对这种情况几乎没有第二种解释,我在排查问题的过程中发现原来是Mysql并没有在3306端口监听。对于该问题我们去找/etc/mysql/mysql.conf.d/mysqld.cnf
该文件。
这里要注意,网上很多文章在这里针对的是老版mysql,在新版mysql里skip-networking已经被取代了。相关部分如下:
#Instead of skip-networking the default is now to listen only on
#localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1 #这里默认监听本地localhost
把bind-address这行前加个#号注释掉即可。之后重启,发现3306端口已经被监听。
2.Navicat在连接上以后的报错问题相对简单。无论是1130问题还是1251问题网上都有成熟的解决方案。这里切记1251问题不能简单地把root的plugin直接用update命令换掉,一定要按照教程走。
1251:
https://blog.youkuaiyun.com/2301_76857349/article/details/129583492
1130:
https://blog.youkuaiyun.com/dabao87/article/details/80571877