这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 扣丁学堂为你揭秘如何在Linux下解决MySQL的两个基本问题

共3条 1/1 1 跳转至

扣丁学堂为你揭秘如何在Linux下解决MySQL的两个基本问题

助工
2020-09-24 17:07:43     打赏

在我们学习linux运维时,时常会遇到各种各样的问题,那么在使用mysql基本基本上会遇到主要的两个问题,那到底是什么问题?今天就让我们扣丁学堂为大家揭开神秘的面纱,为大家归纳整理了一下我们在学习的过程中会遇到的基本的问题,并且做以详细的说明。

  

1.第一次起动mysql是没有问题的.对mysql做了一些操作,特别是删除mysql中一些不要的帐号后,重新起动mysql会遇到这样的问题  

#/etc/init.d/mysqldrestart  

stoppingmysql[ok]  

TimeouterroroccurredtryingtostartMySQLDaemon.[failure]  

但是这个时候mysql实际上已经起动了,因为用netstat-ln命令去看3306端口已经起动.使用mysql-uroot-ppassword也能连接到数据库.  

这实际上是mysql-3.x的一个bug(具体可以去看mysql的bugzilla和redhat的bugzilla).  

是什么原因导致连接超时呢?  

我们不妨先看看/etc/init.d/mysqld起动脚本是如何工作的,注意下面的一段  

#Ifyou'veremovedanonymoususers,thislinemustbechangedto  

#useauserthatisallowedtopingmysqld.  

ping="/usr/bin/mysqladmin-uUNKNOWN_MYSQL_USERping"  

#Spinforamaximumoftensecondswaitingfortheservertocomeup  

if[$ret-eq0];then  

forxin12345678910;do  

if[-n"`$ping2>/dev/null`"];then  

break;  

else  

sleep1;  

fi  

done  

if!([-n"`$ping2>/dev/null`"]);then  

echo"TimeouterroroccurredtryingtostartMySQL  

Daemon."action$"Starting$prog:"/bin/false  

else  

action$"Starting$prog:"/bin/true  

fi  

else  

action$"Starting$prog:"/bin/false  

fi  

[$ret-eq0]&&touch/var/lock/subsys/mysqld  

return$ret  

我们看到,脚本判断mysql是否起动,使用的是mysqladminping命令.  

而这个命令想要正确执行是需要能够登录mysql的.现在一些默认帐号已经删除,而且其它帐号已经设置了密码(默认没有设置密码).于是它没有办法连接到mysql.  

不妨使用下面的命令测试一下  

#mysqladmin-uroot-ppasswordping  

mysqlalive  

当你提供了帐号和密码时,它的ping命令就可以正确执行了.  

这个bug在mysql新出的mysql4.x可以解决.  

但是RH9到FC3一直使用的是mysql3.x(不过mysql官方好象才推出mysql4.1,FC需要考虑问题性).  

于是我用了下面的办法临时解决.  

a)建立一个帐号,不设置密码,不给任何权限.  

b)修改/etc/init.d/mysqld  

下面我给出具体操作  

#mysql-uroot-ppasswd  

mysql>GRANTselectONtest.*TOdaemon@localhost  

mysql>revokeselectontest.*fromdaemon@localhost  

打开/etc/init.d/mysqld  

把下面这行  

ping="/usr/bin/mysqladmin-uUNKNOWN_MYSQL_USERping"  

修改为  

ping="/usr/bin/mysqladmin-udaemonping"  

保存,退出.  

重新起动mysql  

#/etc/init.d/mysqldrestart  

StoppingMySQL:[OK]  

StartingMySQL:[OK]  

如果你的第二行仍然是failure的话.再执行下面的命令  

#/etc/init.d/mysqldstart  

这时应该式ok了.  

如果这样可以ok的话.  

那么你需要修改/etc/init.d/mysqld,  

在restart函数的start后面再加一个start就可了.  

2.即使刚安装的mysql再起动后,去看日志,给给出下面的这些信息  

CannotinitializeInnoDBas'innodb_data_file_path'isnotset.  

IfyoudonotwanttousetransactionalInnoDBtables,addaline  

skip-innodb  

tothe[mysqld]sectionofinitparametersinyourmy.cnf  

ormy.ini.IfyouwanttouseInnoDBtables,addtothe[mysqld]  

section,forexample,  

innodb_data_file_path=ibdata1:10M:autoextend  

Buttogetgoodperformanceyoushouldadjustforyourhardware  

theInnoDBstartupoptionslistedinsection2at  

这是因为默认的数据库起动脚本需要加载innodb数据库,但是mysql在做初始话时并没有初始化时,并没有加载这样的数据库.  

因此这里有两种解决办法:使用和不使用innodb.  

我们先看不使用innodb的办法.  

其实这个方法就是跳过innodb的方法.  

在/etc/my.cnf文件的mysqld区域增加一行  

skip-innodb就可以了.  

如果我们需要使用innodb呢?  

那么可在/etc/my.cnf文件的mysqld区域增加下面几行  

innodb_data_home_dir=/var/lib/mysql/  

innodb_data_file_path=ibdata1:10M:autoextend  

innodb_log_group_home_dir=/var/lib/mysql/  

innodb_log_arch_dir=/var/lib/mysql/  

set-variable=innodb_buffer_pool_size=16M  

set-variable=innodb_additional_mem_pool_size=2M  

set-variable=innodb_log_file_size=5M  

set-variable=innodb_log_buffer_size=8M  

innodb_flush_log_at_trx_commit=1  

set-variable=innodb_lock_wait_timeout=50  

保存,退出.重启起动mysql,再去看日志,应该不会再提示有关innodb的问题了.  

上面就是我们扣丁学堂关于linux运维在MySQL方面遇到的问题做出的详细的举例说明,我们扣丁学堂不仅在linux方面拥有独特的教学方法和方式,更是在JAVA、Python等十几种语言方面都有杰出的老师以及配套的学习资料,具备了这么多丰厚的资源,你是否心动了,心动不如行动,赶紧行动起来,在我们扣丁学堂保证你会有不一样的收获,首先第一步就是加入我们的学习交流群吧!扣丁学堂Linux技术交流群:659974587。



工程师
2020-09-24 23:43:05     打赏
2楼

学到了


工程师
2020-09-27 23:28:47     打赏
3楼

讲解的不错 


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]