MySQL 启动异常处理

一、问题描述
某次接手一个新业务系统,业务主机重启后,发现MySQL启动后,无法登录,命令行本地登录报错:
ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: Yes)

二、原因分析处理
1、上述报错是因为登录用户密码不正确所致;可重置登录密码来解决;

操作:

1)编辑MySQL配置文件/etc/my.cnf,在mysqld配置段里添加skip-grant-tables;这会允许你下次无密码登录;

2)重启mysqld服务,发现服务无法启动,执行systemctl status mysqld 报错:status=203/EXEC(对于status=1/FAILURE,这是因环境变量设置异常)


3)查看服务,执行:systemctl cat mysqld,检查命令执行路径是否存在(检查路径配置失效),查看启动脚本中是否有#!/bin/bash;


修改/etc/systemd/system/mysqld.service,更正路径后systemctl daemon-reload,启动mysql:systemctl start mysqld 正常。


4)无密码登录MySQL后,mysql -u root -p直接enter不管密码即可进入。

5)重置root密码,执行:

mysql> use mysql; Enter
mysql> update mysql.user set authtntication_string=password(‘你的密码’) where user=‘root’;
mysql> flush privileges;
mysql> quit;

6)完成后注销或删除my.cnf里的skip选项,重启mysqld服务;本地命令行登录,这是应该输入密码就可正常登录

7)远程navicat连接MySQL发现依然报错error 1405,提示权限不足,查看本地root远程登录权限,执行:

selelct user,host,accout_locked from user; //查看对应账户的host里有%没有

如果没有,授权一下,执行:
mysql>grant all privileges on . to ‘用户名’@’%’ identified by ‘登录密码’ with grant option;
mysql>flush privileges;

8)再次Navicat连接MySQL数据库,这时应该已经恢复正常连接。

三、附录
1、二进制包安装mysql后配置systemd管理

当使用通用二进制包安装mysql之后,我们需要手动systemd进行管理。手动增加一个systemd单元配置文件,该文件详细描述了MySQL服务。文件名为mysqld.service,文件位于 /usr/lib/systemd/system 。执行:

cd /usr/lib/systemd/system
touch mysqld.service
chmod 644 mysqld.service //然后文件中写入以下内容

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

# Have mysqld write its state to the systemd notify socket
Type=forking

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS 

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false

systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld.service

2、使用本地化的systemd配置文件
创建 /etc/systemd/system/mysqld.service.d 目录或直接创建创建 /etc/systemd/system/mysqld.service文件,添加service区段,已使systemd管理更多mysql配置项:

[Service]
LimitNOFILE=max_open_files  ##打开文件限制,show variables like 'open_files_limit';可查询
PIDFile=/path/to/pid/file
Nice=nice_level
LimitCore=core_file_limit
Environment="LD_PRELOAD=/path/to/malloc/library"
Environment="TZ=time_zone_setting"

可执行systemctl edit mysqld //会打开override.conf文件,将上述内容写入,保存后执行:
systemctl daemon-reload
systemctl restart mysqld

注:override.conf 配置方法必须配置明确的参数,而不是在MySQL配置文件中的[mysqld]或 [mysqld_safe]组中进行设置;可以在override.conf中设置以下参数 :

1>从MySQL 5.7.10开始:使用 override.conf,更改 PIDFile和 ExecStart来命名PID文件路径名。MySQL选项文件中进程ID文件的任何设置都将被忽略。要修改 ExecStart,必须先将其清除。例如:

[Service]
PIDFile=/var/run/mysqld/mysqld-custom.pid
ExecStart=
ExecStart=/usr/sbin/mysqld --pid-file=/var/run/mysqld/mysqld-custom.pid  $MYSQLD_OPTS

2>设置提供给MySQL服务器的文件描述符,使用override.conf中的LimitNOFILE,而不是mysqld的系统变量open_files_limit或mysqld_safe的选项 --open-files-limit。
3>要设置最大核心文件大小,请使用override.conf中的 LimitCore,而不是mysqld_safe的 --core-file-size 选项。
4>要设置MySQL服务器的调度优先级,请使用override.conf中的 Nice,而不是mysqld_safe的 --nice选项。

3、MySQL多实例配置参考,my.cnf

[mysqld@replica01]
datadir=/var/lib/mysql-replica01
socket=/var/lib/mysql-replica01/mysql.sock
port=3307
log-error=/var/log/mysqld-replica01.log

[mysqld@replica02]
datadir=/var/lib/mysql-replica02
socket=/var/lib/mysql-replica02/mysql.sock
port=3308
log-error=/var/log/mysqld-replica02.log

然后就可:
systemctl start mysqld@replica01 //副本名称@用作分隔符,这是systemd支持的唯一分隔符
systemctl start mysqld@replica02
————————————————
版权声明:本文为CSDN博主「羌俊恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ximenjianxue/article/details/119116416

你可能感兴趣的:(MySQL 启动异常处理)