首页 » MySQL » 正文

MySQL密码忘记之后的重置密码

ubuntu下使用debian-sys-maint用户重置密码,debian-sys-maint用户是debian或者Ubuntu下面才有的用户,用于重启和运行MySQL服务,可用于重置MySQL密码

root@huawei:~# cat /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = oksoAKskO4khltvV
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = oksoAKskO4khltvV
socket   = /var/run/mysqld/mysqld.sock

#该文件默认所有者为root,默认权限为600。
#Ubuntu下使用跳过授权的方式运行MySQL会失败,过一会儿就会自动退出。只有通过该用户来进行密码重置

CentOS、RHEL下的MySQL使用跳过授权的方式重置MySQL密码

systemctl stop mysqld
mysqld --skip-grant-tables --user=mysql &

#然后使用空密码登陆,之后直接修改密码即可。
#MySQL 8.0需要先刷新权限再修改
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${Mysql_Root_Password}';
FLUSH PRIVILEGES;
#MySQL 5.7直接修改之后再刷新权限即可
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${Mysql_Root_Password}';

附MySQL密码重置脚本,支持CentOS下的,经过测试,percona也支持该脚本修改,只是修改之后会启动失败,再次重新启动即可,脚本会自动检测运行状况尝试重启。

#!/bin/bash
#system:Centos7 Minimal install
#by:波仔
#url:www.yisca.cn
#Date:2019年11月25日
#忘记mysql密码时重置密码时使用

function Countdown (){
echo -n 倒计时:
tput sc
count=$1
while true;
do
  if [ ${count} -le $1 ] && [ ${count} -gt 0 ]
    then
      let count--;
      sleep 1;
      tput rc
      tput ed
      echo -n ${count};
    else
    echo -e "\n"
    break
  fi
done
}

function reset_mysql_password () {
while :;do
  Mysql_Root_Password=""
  read -p "请输入$DB_Name的root密码(密码需包含大小写字母、数字、特殊符号): " Mysql_Root_Password
if [ "${Mysql_Root_Password}" = "" ]
  then
    echo "错误: 密码不能为空!!"
  else
    break
fi
done
echo -e "\n"
echo -e "\033[37;31;5m关闭 ${DB_Name} ${DB_Ver} 中...\033[39;49;0m"
systemctl stop mysqld
Countdown 10
echo -e "\033[37;31;5m开始以跳过授权表的方式运行${DB_Name}\033[39;49;0m"
${MYSQLD} --skip-grant-tables --user=mysql &
echo -e "\n"
Countdown 10

echo -e "\n"
echo -e "\033[37;31;5m更新 ${DB_Name} root 密码中...\033[39;49;0m"
if echo "${DB_Ver}" | grep -Eqi '^8.0.'; then
${MYSQL} -u root << EOF
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${Mysql_Root_Password}';
FLUSH PRIVILEGES;
EOF
elif echo "${DB_Ver}" | grep -Eqi '^5.7.'; then
${MYSQL} -u root << EOF
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${Mysql_Root_Password}';
EOF
fi

if [ $? -eq 0 ]
  then
    echo -e "MySQL ${DB_Ver} 密码重置成功"
    echo -e "\033[37;31;5m正在重启 ${DB_Name} ${DB_Ver} 服务\033[39;49;0m"
    echo "MySQL PID IS : `pgrep mysqld`"
    echo "正在关闭mysqld进程"
    pkill mysqld
    echo -e "\n"
    Countdown 10
    echo -e "\n"
    systemctl start mysqld
    case $? in
      0)
      echo -e "${DB_Name} ${DB_Ver} 密码已经重置成功,新密码为${Mysql_Root_Password} "
      ;;
      *)
      sleep 5
      systemctl start mysqld
      if [ $? -eq 0 ]
      then
        echo -e "${DB_Name} ${DB_Ver} 密码已经重置成功,新密码为${Mysql_Root_Password} "
      else
        echo -e "${DB_Name} ${DB_Ver} 启动失败,请检查是否重置成功,新密码为${Mysql_Root_Password}"
      fi
    esac
    sleep 5
    echo -e "\n"
    [ -n "`systemctl status mysqld|grep running`" ] && echo -e "\e[1;31mMySQL数据库已经启动\e[0m"
    echo -e "\n"
  else
    echo -e "${DB_Name} ${DB_Ver} 密码重置失败!!"
    echo -e "\n"
    sleep 2
fi
}

function change_mysql_password () {
if [ -s /usr/local/mysql/bin/mysql ]
  then
    DB_Name="MySQL"
    DB_Ver=`/usr/local/mysql/bin/mysql_config --version`
    mysql_install=source
  elif [ -s /usr/bin/mysql ]
    then
    DB_Name="MySQL"
    DB_Ver=`/usr/bin/mysql_config --version`
    mysql_install=yum
  else
    echo -e "没找到mysql执行文件,请检查是否成功安装"
fi
case ${mysql_install} in
  source)
    MYSQLD=/usr/local/mysql/bin/mysqld
    MYSQL=/usr/local/mysql/bin/mysql
    reset_mysql_password
    ;;
  yum)
    [ -s /usr/bin/mysqld ] && MYSQLD=/usr/bin/mysqld
    [ -s /usr/sbin/mysqld ] && MYSQLD=/usr/sbin/mysqld
    [ -s /usr/bin/mysql ] && MYSQL=/usr/bin/mysql
    [ -s /usr/sbin/mysql ] && MYSQL=/usr/bin/mysql
    reset_mysql_password
esac
}

[ -s /usr/local/mysql/bin/mysql ] && mysql_log=/usr/local/mysql/log
[ -s /usr/bin/mysql ] && mysql_log=/var/log
change_mysql_password

发表评论