数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Linux下解决MySQL服务的两个基本问题


发布日期:2018年05月21日
 
Linux下解决MySQL服务的两个基本问题

使用mysql基本基本上会遇到主要的两个问题

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

#/etc/initd/mysqld restart

stopping mysql [ok]

Timeout error occurred trying to start MySQL Daemon [failure]

但是这个时候mysql实际上已经起动了因为用netstat ln命令去看端口已经起动使用mysql u root p password也能连接到数据库

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

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

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

# If youve removed anonymous users this line must be changed to

# use a user that is allowed to ping mysqld

ping=/usr/bin/mysqladmin uUNKNOWN_MYSQL_USER ping

# Spin for a maximum of ten seconds waiting for the server to come up

if [ $ret eq ]; then

for x in ; do

if [ n `$ping > /dev/null` ]; then

break;

else

sleep ;

fi

done

if !([ n `$ping > /dev/null` ]); then

echo Timeout error occurred trying to start MySQL

Daemon action $Starting $prog: /bin/false

else

action $Starting $prog: /bin/true

fi

else

action $Starting $prog: /bin/false

fi

[ $ret eq ] && touch /var/lock/subsys/mysqld

return $ret

我们看到脚本判断mysql是否起动使用的是mysqladmin ping命令

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

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

#mysqladmin u root ppassword ping

mysql alive

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

这个bug在mysql新出的mysqlx可以解决

但是RH到FC一直使用的是mysqlx(不过mysql官方好象才推出mysqlFC需要考虑问题性)

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

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

b)修改/etc/initd/mysqld

下面我给出具体操作

#mysql u root p passwd

mysql>GRANT select ON test* TO daemon@localhost

mysql>revoke select on test* from daemon@localhost

打开/etc/initd/mysqld

把下面这行

ping=/usr/bin/mysqladmin uUNKNOWN_MYSQL_USER ping

修改为

ping=/usr/bin/mysqladmin udaemon ping

保存退出

重新起动mysql

#/etc/initd/mysqld restart

Stopping MySQL: [ OK ]

Starting MySQL: [ OK ]

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

#/etc/initd/mysqld start

这时应该式ok了

如果这样可以ok的话

那么你需要修改/etc/initd/mysqld

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

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

Cannot initialize InnoDB as innodb_data_file_path is not set

If you do not want to use transactional InnoDB tables add a line

skipinnodb

to the [mysqld] section of init parameters in your f

or myini If you want to use InnoDB tables add to the [mysqld]

section for example

innodb_data_file_path = ibdata:M:autoextend

But to get good performance you should adjust for your hardware

the InnoDB startup options listed in section at

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

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

我们先看不使用innodb的办法

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

在/etc/f文件的mysqld区域增加一行

skipinnodb就可以了

如果我们需要使用innodb呢?

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

innodb_data_home_dir = /var/lib/mysql/

innodb_data_file_path = ibdata:M:autoextend

innodb_log_group_home_dir = /var/lib/mysql/

innodb_log_arch_dir = /var/lib/mysql/

setvariable = innodb_buffer_pool_size=M

setvariable = innodb_additional_mem_pool_size=M

setvariable = innodb_log_file_size=M

setvariable = innodb_log_buffer_size=M

innodb_flush_log_at_trx_commit=

setvariable = innodb_lock_wait_timeout=

保存退出重启起动mysql再去看日志

应该不会再提示有关innodb的问题了

               

上一篇:mysqladmin命令的用法

下一篇:MYSQL的master/slave数据同步配置