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 &安全模式进入,但是还是报错,由于不熟悉公司整体架构,这时已经有点绝望,大哥过来说先找到备份问题,然后考虑重新初始化,但是mysql是yum安装,没有install_db初始化命令。这时候,沈哥找到了备份数据,上月的全备,根据相应的脚本也找到相应的增量备份。
问题事后回顾
启动mysql服务时出现如下错误,可查看错误日志找出错误原因。
Error:Starting 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_logfile0、ib_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
默认编译的存储引擎包括:csv、myisam、myisammrg和heap。若要安装其它存储引擎,可以使用类似如下编译选项:
-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-only对all权限的用户没有用
授权主库只给insert,update,delete,select权限即可
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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。