如何以编程方式重置MySQL中的root密码,特别是在Ubuntu / Debian上?
似乎有a lot这样的问题,但很少,如果有任何解决方案有效,并且都假设您手动运行这些示例。
我正在尝试为应用程序编写安装脚本,我发现几乎不可能自动设置MySQL密码。我的目标操作系统是Ubuntu 16,它带有MySQL 5.7.17。 official docs列出了两种更改root密码的方法,不幸的是,它们都没有工作。
提出的第一种方法是将密码重置SQL放在临时文件中,停止mysql,然后运行:
mysqld_safe --init-file=/home/me/mysql-init &
不幸的是,MySQL 5.7.17不再列出--init-file
选项,虽然该命令不会引发错误,但它对root密码没有影响。
提出的第二种方法是停止mysql,并以允许任何本地用户登录并执行任何操作的模式启动它,但运行:
sudo mkdir -p /var/run/mysqld
sudo chown mysql /var/run/mysqld; mysqld_safe --skip-grant-tables &
sudo mysqld_safe --skip-grant-tables &
sleep 10
mysql --execute="FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysupersecretpassword'; FLUSH PRIVILEGES;"
然而,10次中有9次失败并出现错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
我无法确定是什么导致了这一点。起初,我认为这是因为我没有给mysqld_safe
足够的时间来启动,但即使我提高睡眠值,我仍然经常得到错误。每次我手动运行相同的命令时,它总是成功,但是当我运行我的脚本时,它们会失败,而error.log什么都不显示。
我之前使用的方法是预先播种dpkg,如:
sudo dpkg --configure -a
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password mysupersecretpassword'
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password mysupersecretpassword'
因此在最初安装mysql-server
包时会自动填写密码。但是,首次安装时,Ubuntu 16软件包似乎不再提示输入root密码。
我该如何解决这个问题?这有一种更可靠的方式来以编程方式重置MySQL的root密码吗?