mysql集群怎么重启 mysql集群三种方式

服务器重启MYSQL启动不了怎么办一、无法访问系统资源
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
ERROR 1030 (HY000): Got error 168 from storage engine
测试说明 mysql 用户有这个目录的访问权限,但创建文件还是失败,这种情况让很多人困惑,这个时候通常是 mysqld 进程的访问被 linux 的 selinux 或 apparmor 给阻止了 , 大家可以看到创建的表不是在 mysql 的默认目录下面,因此 selinux 或 apparmor 的 policy 里面没有包含这个目录的访问权限 , 此时只要对应的修改 policy 就行了,当然把selinux 或 apparmor 停了也行 。
有时虽然对系统资源有访问的权限,但系统资源已经被占用:
mysqld --no-defaults --console --user mysql
2020-11-03T03:36:07.519419Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 21171
2020-11-03T03:36:07.740347Z 1 [ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 11
这个故障产生的原因是另外一个 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 完全是等价的,只不过后者的显示方式是一行一个参数 。
然后开始对可疑的参数进行调试 , 我个人喜欢加的参数和顺序如下:
1. 在 mysqld 后加上第一个参数 --no-defaults ,这个参数的作用是通知 mysqld 在启动的时候不要读任何参数文件;
2. 第二个参数是 --console,这个参数会把错误信息输出到屏幕上,这个参数带来的一个弊端是所有的信息都输出到屏幕上,让屏幕显得比较乱,但对于我们调试却是很方便的;
3. 第三个参数是 --log-error-verbosity=3,这个参数会显示详细的日志;
4. 然后再在后面加上有把握的参数,可以一次只加一个参数,然后启动 mysqld,采用排除法逐步找出错误的参数 。
面试官: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 CONCURRENTDDL.;当然这个代码的变更功能也在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开源数据库,喜好开源技术 。
原文链接:
解决k8s MysqlCluster 无故重启问题使用 bitpoke的mysql-operator 作为k8s的mysql服务mysql集群怎么重启 , 使用的版本v0.4.0,
github地址mysql集群怎么重启:
MysqlCluster operator主要支持如下功能
建立的mysql服务每隔一段时间就重启,事件的报错信息如下
为什么心跳不通过mysql集群怎么重启?
貌似心跳机制不通过,查看pod信息
心跳默认20秒不通过,就重启 , 看源码也没有心跳配置项 , 坑啊,不过这只是表象,到底是什么导致心跳不通过?
mysqlCluster启动时,会启动4个容器metrices-exporter, mysql, pt-heartbeat, sidecar 。看这4个容器的cpu, 内存使用情况,发现mysql内存超过,如下:
看最后状态 , OOMKilled,而且当前内存使用率3.9G 接近limit 4G的设置 。找到产生的问题原因了,是因为内存超了,被容器杀掉 , 导致心跳不通过报错重启
为什么内存使用这么高?
思考mysql使用内存高,可能跟mysql自身缓存有关系,查内存相关参数
看到 innodb_buffer_pool_size 设置得值特别大,这个参数设置只有主要缓存innodb表的索引,数据,插入数据时的缓冲 , 但默认是8M 。
为什么 innodb_buffer_pool_size 设置变得这么大?
翻翻mysqlCluster源码 , 跟innodb_buffer_pool_size 有关代码
default.go
问题就在这里,为了保证资源独占,mysql设置时是request = limit,因为自动计算导致 innodb-buffer-pool-size过大,最终导致oom,需要手动设置innodb-buffer-pool-size,就手动设置2G吧
设置 innodb-buffer-pool-size 不生效?
设置后,pod不重启? 参数没有生效设置 。设另一个512M就生效了 。尝试加入引号,作为字符串处理,配置开始生效 。难道跟类型有关系? 继续看相关源码
default.go
看这个类型定义cluster.Spec.MysqlConf
MysqlClusterSpec
intstr
如果设置成数字,则整数是int32位
看int32位的长度
int32 the set of all signed 32-bit integers (-2147483648 to 2147483647)
至此内存使用过大的问题,解决了 , 内存使用也降下来了
mysql 5.1 多实例 怎么重启 其中一个实例用MySQL实例管理器来启动服务器 。
在这种情况下,Instance Manager的行为取决于MySQL配置文件中的选项 。如果没有配置文件,MySQL实例管理器创建mysqld实例并试图用默认(编译嵌入的)配置来启动 。这说明如果mysqld没有安装到 默认位置,IM不能猜出它的位置 。如果你已经在非标准位置安装了MySQL服务器,你应使用配置文件 。参见2.1.5节,“安装布局” 。
如果有配置文件,IM将分析配置文件搜索[mysqld]部分(例如[mysqld]、[mysqld1]、[mysqld2]等) 。每个部分指定一个实例 。启动时IM将启动所有找到的实例 。IM关闭时默认停止所有实例 。
请注意有一个特殊选项mysqld-path(mysqld-path = path-to-mysqld- binary),只能用IM识别 。使用该变量让IM知道mysqld二进制驻留在哪儿 。你还应该为服务器设置basedir和datadir选项 。
启用MySQL实例管理器的典型MySQL服务器启动/关闭循环为:
·用/etc/init.d/mysql脚本启动MySQL实例管理器 。
·MySQL实例管理器启动所有实例并监视它们 。
·如果某个服务器实例失败 , MySQL实例管理器重启它 。
·如果MySQL实例管理器被关闭(例如用/etc/init.d/mysql stop命令),所有实例被MySQL实例管理器关闭 。
如何解决:mysql集群它们是按SMP、NUMA、MPP、集群、分布处理从最紧密到最松散的排列 。
SMP(多处理系统):这种系统是在一台计算机里有多个CPU,CPU之间的地位是平等的 , 它们共享内存空间和I/O设备 。其工作方法是由操作系统负责将任务分解成多个并发进程 , 然后让其在不同的CPU上运行 。
NUMA(非统一内存存取):这种系统可以让多处理计算机的CPU比SMP更高效地共享本地内存,CPU可以更快速地存取单一的内存区域,不过如需要也可以用间接方式存取其他区域的内存,这种方法是让某些CPU在给定范围的物理内存中有更大的优先使用权 。
MPP(巨型并行处理):这种系统的节点都有自己的CPU,并有自己的专有资源 。此种结构相对独立 , 但各个节点一般没有完全存取I/O的能力 。
集群:集群系统是由独立的计算机组成,但有控制管理工具统一管理 。
分布处理:它是比我们要构筑的集群系统更松散的连接,一般是任务在不同的地方完成,没有可以作为整体管理的单一实体 。
以上的聚合方式有紧有疏,它们都有自己的适用范围,这里就不多说了,有兴趣可自己找些资料看,这里只是想让大家了解它所处的位置 。
实现负载均衡的方法
集群的目的是共享和高效地利用资源,提供大型运算,提供负载均衡分配请求压力以及出现故障时能够进行切换实现高可用性 。
限于篇幅,本文只对负载均衡的实现做些介绍(针对TurboLinux Cluster Server) 。通过对相关软件的分析 , 实现集群负载的功能是通过流量管理实现的,具体有这样几种实现方法:直接路由(Direct forwarding)、网络地址转换(NAT)、隧道技术(Tunneling) 。
直接路由(Direct forwarding)
当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此法,控制管理的计算机接收到请求包时直接送到参与集群的节点 。优点是返回给客户的流量不经过控制主机,速度快开销少 。
网络地址转换(NAT)
这种方法可能大家较熟悉,地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址,外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点 。优点是节省IP地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的流量经过转换器 。
隧道技术(Tunneling)
这种方式是在集群的节点不在同一个网段时可用的转发机制,是将IP包封装在其他网络流量中的方法,为了安全的考虑 , 应该使用隧道技术中的VPN,也可使用租用专线 。
集群所能提供的服务是基于TCP/IP的Web服务、Mail服务、News服务、DNS服务、Proxy服务器等等,下面我们将就具体的产品TurboLinux Cluster Server 来实现一个进行负载均衡集群系统,用于提供Web和FTP的服务 。四台服务器的负载均衡实例
所提供的服务:Web、FTP 。
系统的实现目的:做一个较完善负载均衡的系统,以便能用到其中的较多的功能 。
采用设备状况:使用四台服务器,其中3台装TurboLinux Cluster Server,1台安装Windows 2000 Sever 。系统安装1.在两台服务器上安装TurboLinux,apache和wu-ftpd也要安装,因为集群要提供这种服务,安装完后重启 , 挂接光驱在目录/mnt/cdrom下,执 行./TLCS-install,然后按提示完全安装 。
【mysql集群怎么重启 mysql集群三种方式】关于mysql集群怎么重启和mysql集群三种方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读