工具/原料
已经安装了mysql数据库的windows
操作系统
方法/步骤
首先,需要关闭mysql
server服务.在"运行"窗口,输入"services.msc",进入"服务"窗口.
这样,mysql
server服务就停止了.
当然,也可以在命令行窗口使用"net
stop
接着,需要使用到mysql的安装位置.如果忘记了,可以在"开始"按钮(windows键)找到安装"mysql"文件夹,打开并选择"mysql
server
commond
打开的快捷方式.选择其中的一个查看其属性,就可以找到mysql的安装位置.
可以看到我们的mysql位置在"d:\program
files\mysql"
其实,我们之所以想知道mysql的安装位置,是为了获取其下的.ini文件的位置.该文件记录了mysql的配置信息.如果我们想跳过登录权限,就必须获取该文件的位置.
需要注意的是,不同版本的.ini文件的名称不同,在mysql
接着,打开命令行窗口,输入如下的命令:
c:\users\wangmysqld
--defaults-file="d:\program
files\mysql\mysql
--console
--skip-grant-tables
需要说明的是,此时该窗口不可再写入.这也是检验命令是否正确执行的一个标准.
另外打开一个命令行窗口,输入命令:mysql
-u
root
-p,回车即可进入mysql命令行界面.
此时此刻呢,只需要修改系统数据库,将密码进行更新即可.
需要使用到的命令是:
mysql-show
database;
mysql-use
mysql
mysql-update
user
set
where
user='root';
第一段:背景
第二段:问题复现
按照测试同学的测试步骤,首先创建一个用户:
然后关闭mysqld;这里需要介绍一下,我们集群的关闭方式是如下方式:
然后重启mysqld,操作如下:
此时问题复现了,mysqld启动失败,我们查看了下error日志,信息如下:
对于该参数的官方文档的解释如下:
设置MyISAM存储引擎恢复模式.选项值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意组合.如果指定多个值,请用逗号分隔.指定不带参数的选项与指定DEFAULT相同,指定显式值" "将禁用恢复(与OFF值相同).如果启用了恢复,则mysqld每次打开MyISAM表时,都会检查该表是否标记为已崩溃或未正确关闭.(只有在禁用外部锁定的情况下运行,最后一个选项才起作用.)在这种情况下,mysqld在表上运行检查.如果表已损坏,mysqld将尝试对其进行修复.
服务器自动修复表之前,它将有关修复的注释写到错误日志中.如果您希望能够在无需用户干预的情况下从大多数问题中恢复,则应使用选项BACKUP,FORCE.即使某些行将被删除,这也会强制修复表,但是它将旧的数据文件保留为备份,以便您以后可以检查发生了什么.
全局变量,只读变量,默认为OFF.
第三段:问题修复
这类MySQL用户表损耗的问题解决方式也是有多种,我这里列举其中一种:
(1)my.cnf中的[mysqld]标签下添加skip_grant_tables,启动时跳过加载系统字典.
此时mysqld是可以正常启动的,无异常.
第四段:深入排查
在产品化中,以上修复方式很不优雅,只是作为临时的解决方案;并且也存在一些令人疑惑的点:
带着这些疑问,我们继续排查出现该现象的原因;此时Google也没有找到一些有效的信息,那么只能通过MySQL源代码来寻找一些答案.
在源代码中搜索一下关键词,用于打断点的位置,然后进行调试:
根据该函数的注释发现:该函数是初始化负责用户/数据库级特权检查的结构,并从mysql schema中的表中为其加载特权信息;且return值为1代表的是初始化权限失败.
调试信息如下:
可以看到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函数相关信息 下面概述.
此时第一反应就是去检查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开源数据库,喜好开源技术.
原文链接:
第一段:无法访问系统资源
MySQL 不能访问启动需要的资源是造成而 MySQL 无法启动的一个常见原因,如:文件,端口等.由于 linux 中用于启动 mysqld 进程的 mysql 用户通常是不能登陆的,可以使用类似下面的命令检查文件的访问权限.
sudo -u mysql touch /var/lib/mysql/b
找出问题后,修改对应文件或目录的权限或属主后通常可以解决问题.但有时 mysql 用户有访问文件和目录的权限,但仍然会被拒绝访问,例如下面这个例子:
mysql system sudo -u mysql touch /home/mysql/data/a
mysql create table t1 (
id int primary key,n varchar(10
) data directory
测试说明 mysql 用户有这个目录的访问权限,但创建文件还是失败,这种情况让很多人困惑,这个时候通常是 mysqld 进程的访问被 linux 的 selinux 或 apparmor 给阻止了,大家可以看到创建的表不是在 mysql 的默认目录下面,所以呢 selinux 或 apparmor 的 policy 里面没有包含这个目录的访问权限,此时只要对应的修改 policy 就行了,当然把 selinux 或 apparmor 停了也行.
有时虽然对系统资源有访问的权限,但系统资源已经被占用:
mysqld --no-defaults --console --user mysql
这个故障产生的原因是另外一个 mysqld 进程已经启动并占用了对应的文件.
第二段:参数设置错误
参数设置错误造成 MySQL 无法启动的原因也非常常见,此时先要检查 MySQL 启动时会调用的参数,下面的命令可以查询 MySQL 启动时调用参数文件的顺序:
$ mysqld --verbose --help | grep "Default options " -A 1
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
知道了 MySQL 参数文件的调用顺序,我们就可以检查对应的参数文件,找出其中的错误,如果觉得参数文件的可读性不强,可以使用下面的命令显示 mysqld 程序将要调用的参数:
$ mysqld --print-defaults
/usr/sbin/mysqld would have been started with the following arguments:
......
注意这个命令显示完参数后就退出,不会真正运行 mysqld.这个命令和 my_print_defaults mysqld 完全是等价的,只不过后者的显示方式是一行一个参数.
然后开始对可疑的参数进行调试,我个人喜欢加的参数和顺序如下:
① 在 mysqld 后加上第一个参数 --no-defaults ,这个参数的作用是通知 mysqld 在启动的时候不要读任何参数文件;
第一段:mysqld 进程没有正常运行遇到这种情况首先到服务器上看看 mysqld 进程是否活着,采用的命令:
第一种情况
第二种情况
第三段:账户密码的问题最后一种情况是账户密码的问题,应付这种情况我们有个有力的工具就是查看 MySQL 的 error log, error log 记载信息的详细程度上由参数 --log-error-verbosity 进行控制的
mysql 服务无法启动的原因有很多:可能端口被占用;可能my.cnf配置了错误的参数;也有可能没有初始数据库,还有可能是其他原因.大多数原因都可以通过先注销掉原有的服务、重新装载服务、之后再重新启动的方法解决.也可以尝试下以下方法:
①.、将目录中配置文件my.default.ini改名为my.ini移至bin目录下.
扩展资料
数据库就相当于现实中的仓库.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.
使用关系型数据库管理系统(RDBMS)来存储和管理大数据量.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据.MySQL 就是一种关系型数据库.
参考资料:百度百科-MySQL
土嘎嘎的粉丝们大家好,
①.、在计算机管理中,找到本地用户和组,然后选择用户,找到mysql的超级账户,然后设置密码,