189 8069 5689

mysql服务禁用怎么办 mysql服务无效

面试官:MySQL权限表损坏导致无法启动怎么办?

一、背景

创新互联建站是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,微信小程序开发,十余年建站对成都柴油发电机等多个行业,拥有丰富的网站设计经验。

近期,公司RDS云产品的MySQL Server版本进行升级,由目前使用的5.7.26版本升级到最新版本5.7.31;升级后测试同学发现:在MySQL创建用户后,5.7.31版本重新启动集群会出现启动失败的现象;而5.7.26版本在相同测试场景下是正常启动的。这到底是为什么呢?

二、问题复现

2.1 实验环境

2.2 操作步骤

按照测试同学的测试步骤,首先创建一个用户:

然后关闭mysqld;这里需要介绍一下,我们集群的关闭方式是如下方式:

这种方式的内部实现类似于kill -9模式。所以我在线下环境使用kill -9的方式来复现,操作如下:

然后重启mysqld,操作如下:

此时问题复现了,mysqld启动失败,我们查看了下error日志,信息如下:

根据报错信息可以看出:MySQL的权限系统表发生了损坏,导致了mysqld启动失败;由于在MySQL 5.7及其之前版本该表是MyISAM引擎,且该引擎不支持事务,所以在mysqld异常崩溃会导致该类型引擎表的损坏;但在mysqld启动时是有参数控制MyISAM引擎的恢复模式,且该参数在我们产品中也配置到了my.cnf中,如下所示:

2.3 参数解析

对于该参数的官方文档的解释如下:

设置MyISAM存储引擎恢复模式。选项值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意组合。如果指定多个值,请用逗号分隔。指定不带参数的选项与指定DEFAULT相同,指定显式值" "将禁用恢复(与OFF值相同)。如果启用了恢复,则mysqld每次打开MyISAM表时,都会检查该表是否标记为已崩溃或未正确关闭。(只有在禁用外部锁定的情况下运行,最后一个选项才起作用。)在这种情况下,mysqld在表上运行检查。如果表已损坏,mysqld将尝试对其进行修复。

服务器自动修复表之前,它将有关修复的注释写到错误日志中。如果您希望能够在无需用户干预的情况下从大多数问题中恢复,则应使用选项BACKUP,FORCE。即使某些行将被删除,这也会强制修复表,但是它将旧的数据文件保留为备份,以便您以后可以检查发生了什么。

全局变量,只读变量,默认为OFF。

三、问题修复

这类MySQL用户表损耗的问题解决方式也是有多种,我这里列举其中一种:

(1)my.cnf中的[mysqld]标签下添加skip_grant_tables,启动时跳过加载系统字典。

(2)重启mysqld,然后修复mysql schema下的所有表。

(3)在[mysqld]标签下注释或删除掉skip_grant_tables,然后重启mysqld。

此时mysqld是可以正常启动的,无异常。

四、深入排查

在产品化中,以上修复方式很不优雅,只是作为临时的解决方案;并且也存在一些令人疑惑的点:

带着这些疑问,我们继续排查出现该现象的原因;此时Google也没有找到一些有效的信息,那么只能通过MySQL源代码来寻找一些答案。

首先需要下载mysql 5.7.31版本的源代码,并搭建mysql debug环境;具体步骤可以自动Google搜索一下,本文就不再赘述了。

在源代码中搜索一下关键词,用于打断点的位置,然后进行调试:

定位到相关代码,大概是sql/mysqld.cc的4958行,且存在if条件判断,此时我们开始调试:

通过以上调试信息,可以判断出acl_init函数返回的值为真;此时我们查看该函数的代码 (sql/auth/sql_auth_cache.cc:1365):

根据该函数的注释发现:该函数是初始化负责用户/数据库级特权检查的结构,并从mysql schema中的表中为其加载特权信息;且return值为1代表的是初始化权限失败。

此后开始逐步调试,观察return相关信息,当调试到lock_table_names函数时,我们发现在Phase 3时return值为true,且根据代码注释发现true代表是Failure;具体代码如下(sql/sql_base.cc:5549):

调试信息如下:

可以看到flags的值为0,而MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK为宏定义值0x1000,与flags的值 做按位与操作,结果自然也是0,当然MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY也是如此;need_global_read_lock_protection是bool类型值,代表是否需要全局读锁的保护,这个值是在table- mdl_request.type不为MDL_SHARED_READ_ONLY发生改变;check_readonly函数相关信息 下面概述。

此时也查看了下MySQL 5.7.26版本代码作为对比,发现lock_table_names函数下的Phase 3后的部分代 码是在5.7.29版本后新增的。如果是git clone的MySQL代码可以用git blame命令查询文件变化的信息:

上述展示的信息中,最左侧的列值为commit id为05824063和0405ebee,有兴趣的同学可以详细看下。

此功能解决的问题是 BUG#28438114: SET READ_ONLY=1 SOMETIMES DOESN'T BLOCK CONCURRENT DDL.;当然这个代码的变更功能也在5.7 Release Notes中有所体现,如下所示( m/doc/relnotes/mysql/5.7/en/news-5-7-29.html ):

最后我们再查看下check_readonly函数,该函数是基于read_only和super_read_only状态执行标准化检查,是禁止(TRUE)还是允许(FALSE)操作。代码如下(sql/auth/sql_authorization.cc:489):

此时第一反应就是去检查my.cnf中是否包含read_only相关参数,检查之后发现确实是使用了该参数, 如下:

此时注释掉该参数,然后再次启动mysqld,发现MyISAM表可以自动修复,且正常启动;error log信息如下:

由于docker一些限制,我们在mysqld启动会涉及两次;所以解决该问题的方式为:第一次mysqld的启动时先关闭read_only参数,第二次启动时开启read_only参数。之所以选择默认开启read_only参数, 是为了避免在mysqld启动后,选主逻辑未完成时的保护措施;当然选主完成后,会自动对master执行 set global read_only=0 操作。

五、总结

六、附录

调试的栈帧信息如下,有兴趣的小伙伴可以研究下:

熟悉MySQL体系结构和innodb存储引擎工作原理;以及MySQL备份恢复、复制、数据迁移等技术;专注于MySQL、MariaDB开源数据库,喜好开源技术。

原文链接:

Windows下MySQL服务无法停止和删除的解决办法

我在

Windows

操作系统上,使用解压压缩包的方式安装

MySQL。这是安装的具体方法:点击这里。在执行如下命令:

mysqld

--install

MySQL

--defaults-file=[ini配置文件绝对路径]

在执行上面那个命令的时候,输入了错误的配置文件路径。虽然系统可能会返回

success

。并且命令

mysqld

--initialize

也可以执行并生成数据文件。但是当我执行

net

start

mysql

的时候,系统会一直提示服务正在启动。原因是我的配置文件路径错误,导致服务启动的时候出现异常情况。此时MySQL服务无法启动,也无法通过命令行和控制面板停止。MySQL

服务也无法删除。

解决方法:

控制面板

右上查看方式选择大图标

管理工具

服务

选中MySQL。

这个时候你可以看到,根本没有停止、重启和暂停的选项。这时需要这么干:

右键MySQL服务

属性

常规选项卡

“启动类型”选择禁用

重启电脑

以管理员身份打开命令行

cd命令进入MySQL安装路径下的bin文件夹。

因为MySQL服务被设置禁止开机启动,并重启了电脑,这个时候MySQL服务是停止状态的。

命令行输入命令:

mysqld

remove

MySQL

命令可以正常执行,命令执行完后就能把那个错误配置的MySQL服务删除了。然后把MySQL的数据文件夹下面的文件全部删除,重新从头开始一步一步安装MySQL即可。

以上所述是小编给大家介绍的Windows下MySQL服务无法停止和删除的解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

windows 服务禁用怎么开启

右键桌面”电脑“图标,选择”管理“,进入”计算机管理“窗口。

注:也可以在”开始“-"运行"里输入services.msc命令,进入服务窗口。

选择计算机管理窗口中”服务和应用程序“下面的”服务“,窗口右边就会展示windows所有的服务。

找到你要打开或禁用的服务,比如我要启用”MySQL“服务。

找到”MySQL“服务,右键菜单,选择”启用“,即可。

禁用的操作一样,右键菜单选择”停止“等相应操作即可。

如果要修改启动模式,”自动“、”手动“、”禁用“等,右键菜单选择”属性“,进入服务属性设置窗口。

选择相应的启动类型后确定即可。

mysql被禁用了,大神求救!

mysql配置文件不对,所以服务启动不了,应该是你改动过了,你查看下mysql下错误日志看提示具体什么原因,针对性的修改

mysql的my.ini被禁用了

datadir="F:/Program Files/MySQL/MySQL Server 4.1/Data/"

basedir="F:/Program Files/MySQL/MySQL Server 4.1/"

这两个路径 搞正确 就差不多了

可以看看下这个资料

实在不行给我留言

在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了,

你可以删除系统目录下的my.ini文件,

把下面的内容重新写入my.ini文件试试,

要适当地改写一下文件路径

我的my.ini 2007年12月31日

[WinMySQLAdmin]

Server=C:/MYSQL/mysql/bin/mysqld-opt.exe

user=root

[mysqld]

basedir=C:/MYSQL/mysql

datadir=C:/MYSQL/mysql/data

#bind-address=192.168.0.2

#language=D:/MYSQL/share/chinese

===========================================

[WinMySQLAdmin]

Server=D:/MYSQL/bin/mysqld-opt.exe

user=root

[mysqld]

basedir=D:/MYSQL

datadir=D:/MYSQL/data

#bind-address=192.168.0.2

#language=D:/MYSQL/share/chinese

============================================

查找Windows目录下的my.ini文件,编辑内容(如果没有该文件,则新建一个),至少包含basedir,datadir这两个基本的配置。

[mysqld]

# set basedir to installation path, e.g., c:/mysql

# 设置为MYSQL的安装目录

basedir=D:/www/WebServer/MySQL

# set datadir to location of data directory,

# e.g., c:/mysql/data

# 设置为MYSQL的数据目录

datadir=D:/www/WebServer/MySQL/data

另外,要注意:

[WinMySQLadmin]

Server=D:/www/WebServer/MySQL/bin/mysqld-nt.exe

user=root

password=xxxxxxxx

#以上是设置WinMySQLadmin的配置

[Client]

user=root

password=xxxxxxxx

将Mysql添加到Windows系统服务中:

1.、 安装服务。

在Windows2000下,安装完成后,并没有把MySQL安装成服务,我们必须执行下面的语句把MySQL注册为服务:installdir\mysql\bin\mysqld-nt –-install。

Windows98下没有服务的概念,所以不用安装服务。

2.、 启动服务

在Windows2000下,安装服务后可以启动MySQL服务:net start mysql。

在Windows98下,可以用下面的命令启动服务:c:\mysql\bin\mysqld,服务启动后在后台运行,并没有界面。

3.、 停止服务

在Windows2000下,可以通过下面的命令停止MySQL服务:net stop mysql。

在Windows98下,可以通过下面命令停止服务:C:\ C:\mysql\bin\mysqladmin -u root shutdown


名称栏目:mysql服务禁用怎么办 mysql服务无效
文章链接:http://cdxtjz.com/article/hpioic.html

其他资讯