当前位置 博文首页 > 阿俊之家●●●https://ximenjianxue.blog.csdn.net:MySQL 启动

    阿俊之家●●●https://ximenjianxue.blog.csdn.net:MySQL 启动

    作者:[db:作者] 时间:2021-09-08 13:34

    一、问题描述

    某次接手一个新业务系统,业务主机重启后,发现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

    cs