首页 > 代码库 > mysql启动故障(简写)

mysql启动故障(简写)

问题描述和思路

下午做svn钩子文档时,开发大哥跑来,说mysql启动报错,半个小时没找到解决的办法,报错内容为:StartingMySQL. ERROR! The server quit without updating PID file

根据大哥的描述,马上想到可能是mysql高速运行下,做大量数据查询时候,卡的时候,强制杀掉mysql数据库,由于主主模式不是很熟悉,判断是两边数据写入不一样,导致起不来,马上想到单个服务器启动,进入127服务器,打开my.cnf文件,server-id注销,启动还是报错,查看日志,也是提示找不到pid文件,进入相关目录/var/run/mysqld/mysqld.pid,发现根本没有,在数据库配置文件中指定mysql.pid文件还是报错,可能大致分析出强制杀掉进程导致数据结构出现问题,mysqld_safe --user=mysql &安全模式进入,但是还是报错,由于不熟悉公司整体架构,这时已经有点绝望,大哥过来说先找到备份问题,然后考虑重新初始化,但是mysqlyum安装,没有install_db初始化命令。这时候,沈哥找到了备份数据,上月的全备,根据相应的脚本也找到相应的增量备份。

 

 

问题事后回顾

启动mysql服务时出现如下错误,可查看错误日志找出错误原因。

ErrorStarting MySQL.The server quitwithout updating PID file (/data/mysql/failed184_sles10.pid).

Error:

13073010:15:37 [ERROR] COLLATION ‘utf8_general_ci‘ is not valid for CHARACTER SET‘latin1‘

13073010:15:37 [ERROR] Aborting

若错误日志中出现如上错误,则是在编译的时候字符集与校对集没有对应。校对集时utf8_general_ci而字符集是latin1

解决方法:在配置文件my.cnf 中的[mysqld]下面加上 -DDEFAULT_CHARSET=utf8-DDEFAULT_COLLATION=utf8_general_ci 这两条语句。“utf8”和“utf8_general_ci ”可改成相应的字符集合校对集。修改完后看能否启动成功,若是出现同样的问题,那没办法只能从头编译再装了。

 

Error:

13073014:46:20 [ERROR] Plugin ‘InnoDB‘ init function returned error.

13073014:46:20 [ERROR] Plugin ‘InnoDB‘ registration as a STORAGE ENGINE failed.

13073014:46:20 [ERROR] Unknown/unsupported storage engine: InnoDB

13073014:46:20 [ERROR] Aborting

出现如上错误可能是innodb在启动时出了问题。

解决方法:在配置文件里面写上 [mysqld]skip-innodb 或者在data目录下将文件ib_logfile0ib_logfile1删除即可

CMake Error: The source directory"/data/cheriegong" does not appear to contain CMakeLists.txt.

若编译时出现以上错误,需要把预编译里面的MYSQL_USER去掉,即可预编译成功!

 

mysql编译准备

 

综合评估后决定重新编译mysql,版本选择,想了很久,决定用已经稳定,相应网上有很多资料来源的5.5版本mysql,编译的过程如下

开始用cmake2.8.8.tar.gz,

# tar xfcmake-2.8.8.tar.gz

# cdcmake-2.8.8

# ./bootstrap

# make

# make install

 

cmake 官方说明

cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译。

编译mysql提示cmake安装不对,MD5校对mysql,发现不对,果断卸载,yum安装

yum –y install cmake

然后rz上传mysql-5.5.28.tar.gz到跳板机,然后scp推送到127数据库(考虑是现在一台数据库服务器上先重新编译,如果不对,至少还有一台mysql没有动过,可能恢复一些默认值,保险一些)。

cmake的编译不同于make编译方式,用cmake获取帮组

./configure         cmake .     编译方式

./configure --help    cmake . -LH or ccmake .   获取编译参数的帮组命令

 

编译安装mysql

mysql 5.5不同于5.6,需要在编译的时候指定默认是inodb数据库引擎,5.6之后就是默认的,但是5.1是不支持inodb,但是5.5.28修复了以前大量的bug,稳定而且资料好找。

编译帮组

指定安装文件的安装路径时常用的选项:

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql

-DMYSQL_DATADIR=/data/mysql

-DSYSCONFDIR=/etc

默认编译的存储引擎包括:csvmyisammyisammrgheap。若要安装其它存储引擎,可以使用类似如下编译选项:

-DWITH_INNOBASE_STORAGE_ENGINE=1

-DWITH_ARCHIVE_STORAGE_ENGINE=1

-DWITH_BLACKHOLE_STORAGE_ENGINE=1

-DWITH_FEDERATED_STORAGE_ENGINE=1

 

若要明确指定不编译某存储引擎,可以使用类似如下的选项:

-DWITHOUT_<ENGINE>_STORAGE_ENGINE=1

比如:

-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1

-DWITHOUT_FEDERATED_STORAGE_ENGINE=1

-DWITHOUT_PARTITION_STORAGE_ENGINE=1

 

如若要编译进其它功能,如SSL等,则可使用类似如下选项来实现编译时使用某库或不使用某库:

-DWITH_READLINE=1

-DWITH_SSL=system

-DWITH_ZLIB=system

-DWITH_LIBWRAP=0

 

其它常用的选项:

-DMYSQL_TCP_PORT=3306

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock

-DENABLED_LOCAL_INFILE=1

-DEXTRA_CHARSETS=all

-DDEFAULT_CHARSET=utf8

-DDEFAULT_COLLATION=utf8_general_ci

-DWITH_DEBUG=0

-DENABLE_PROFILING=1

 

 

编译安装

 

# groupadd -r mysql

# useradd -g mysql -r –s /sbin/nologinmysql

# tar xf mysql-5.5.28.tar.gz

# cd mysql-5.5.28

# cmake . -DCMAKE_INSTALL_PREFIX=/opt/mysql\      指定安装目录

       -DMYSQL_DATADIR=/data/mysqldb \        指定数据库存放目录

       -DSYSCONFDIR=/etc \       指定配置文件

                   -DWITH_INNOBASE_STORAGE_ENGINE=1\    编译indodb引擎进mysql,其实默认

       -DWITH_ARCHIVE_STORAGE_ENGINE=1 \  编译ARCHIVE引擎,其实默认编译也有

       -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ 编译黑洞引擎,做mysql结构可能用到

                   -DWITH_SSL=system\         支持ssl

                   -DWITH_ZLIB=system\         支持zlib

                   -DMYSQL_UNIX_ADDR=/tmp/mysql.sock\   指定mysql客户端sock文件

                   -DDEFAULT_CHARSET=utf8\               指定默认字符集为utf8

       -DDEFAULT_COLLATION=utf8_general_ci    指定默认数据库字符

 

报错:


 

Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)

CMake Error at cmake/readlineNaNake:82(MESSAGE):

Curses library not found.  Please install appropriate package,

-- Configuring incomplete, errors occurred!

yum -y install ncurses-devel

 

rm CMakeCache.txt  删除编译文件,再次编译再次报错

Warning:Bison executable not found in PATH

yum –y install bison

 

-- The C compiler identification is unknown

-- The CXX compiler identification is unknown

提示没有gcc编译

yum –y install gcc gcc-c++

 

再次编译提示OK

需要yum –yinstall bison gcc gcc-c++ ncurses-devel

 

make && makeinstall

 

配置mysql主从

原来备份的my.cnf用于新编译的,把/opt下面的mysql.server拷贝到/etc/init.d目录下面,启动mysql,配置my.cnf,作为主库

server_id = 1  主库的id值为1

log_bin = /data/mysql5.5binlog/mysql-binlog      开启binlog日志

max_binlog_size = 512M   binlog最大为多少后,就自动更新

read-only = 1   表示可写,0为只读

 

初始化mysql数据库

/opt/mysql/scripts/mysql_install_db--user=mysql --basedir=/opt/mysql --datadir=/data/mysqldb 

报错(心都凉了)

[ERROR] COLLATION ‘latin1_swedish_ci‘ isnot valid for CHARACTER SET

马上想到51cto一篇博文提到过类似

解决:

my.cnf文件中加入一行

character-set-server=latin1

重新初始化OK

启动mysql

登录设置相应的权限

创建mysql同步的用户slaveyimi,设置为只能从库ip权限

做好相应准备,开始配置主从同步

 

主库操作

主库,锁表备份所有所有库,备份完之后,就unlock tables;解锁表

一定不要--all-database (会备份数据库结构)mysqldump -uroot -p amc|gzip > /backup/mysql/$(date+%F)-amc.sql.gz

mysqldump -uroot -p adhulu|gzip >/backup/mysql/$(date +%F)-adhulu.sql.gz

sql.gz文件推送到从库那台服务器,从库的mysql编译安装略

注意:从库做完相应的配置,一定要重启,我捣鼓半天原来是没重启,主从老是不对

导入全备数据

mysql -uroot -p‘密码‘ <full.sql

登录数据库,执行下面命令

CHANGE MASTER TO

    MASTER_HOST=‘10.163.2.127‘,   主库ip地址

    MASTER_PORT=3306,           主库端口

    MASTER_USER=‘slaveyimi‘,     主从同步用户

    MASTER_PASSWORD=‘password‘,  用户密码

    MASTER_LOG_FILE=‘mysql-binlog.000004‘, binlog最新文件名称

    MASTER_LOG_POS=108502907;     偏移值(查看showmaster status\G;获取得到)

 

开启同步,slave start,不同版本不一样,也可能是start slave;

在从库上查看是否同步

show slave status\G;

下面表示同步成功

 Slave_IO_Running: Yes

 Slave_SQL_Running: Yes

 Seconds_Behind_Master: 0

 

限制从库写入方法

在从库的my.cnf的配置文件加入read-only

read-only = 1

而且在给从库的用户授权时候,一定不要给all权限,read-onlyall权限的用户没有用

授权主库只给insertupdatedeleteselect权限即可

grant select,insert,update,delete on‘adhulu‘.* to ‘adhulu‘@‘%‘ identified by ‘XXX‘;

授权主库只给select权限即可

grant select on adhulu.* to ‘adhulu‘@‘%‘identified by ‘XXX‘;

平时禁止任何人登录从库操作。


本文出自 “三人行,必有我师焉” 博客,请务必保留此出处http://lovers.blog.51cto.com/5850489/1575277

mysql启动故障(简写)