一 简介
作为mysql dba ,在维护数据库的过程中,偶尔会遇到服务器异常crash/重启情况,dba需要在机器重启之后将mysql数据库重启(当然也有可能其他的数据库本文重点介绍mysql)。如果是一台机器重启或者少数几个实例还好方便维护,当实例个数成百上千时,遇到硬件更换,需要批量重启服务器时,一个个人肉重启数据库实例未免太过麻烦。我们需要一种随服务器开机自动重启的机制。
二 linux 服务器启动 知识点
redhat的启动方式和执行次序是:
1 加载内核
2 执行init程序
3 /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
4 /etc/rc.d/rc $runlevel # $runlevel为缺省的运行模式,linux 共有7种运行模式,后续会介绍。
5 /etc/rc.d/rc.local # 相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
6 /sbin/mingetty # 等待用户登录
这里我们重点介绍/etc/rc.d/下的rcn.d目录(n是0~6的数字,其他请参考 文档资料) ,
rc.sysinit根据inittab中的配置顺序来执行rcn.d目录下的脚本,(注意rcn.d中放置的是init.d中脚本的软链接)其命名格式是:
s{number}{name}
k{number}{name}
s开始的文件向脚本传递start参数
k开始的文件向脚本传递stop参数
以k开头的脚本运行在以s开头的脚本之前,number决定相同字母开头的脚本执行的顺序,s18mysqlatuo 执行顺序在s19mysqlatuo之前。
假设缺省的运行模式是3,系统就会按上述方式调用/etc/rc.d/rc3.d/下的脚本。所以用户可以在这个文件中添加一些需要在系统完成初始化工作之后,用户登录之前执行的命令或者启动的服务 比如 mysql。
三 实践
根据上述介绍的规则,在rc3.d下面配置mysql自动启动的脚本。本文一开始强调处理单机多实例的开启自动重启,在编写脚本时注意针对多个实例的处理,考虑到生产环节下 ,数据库实例可能发生迁移/下线等操作,在脚本中将端口写死 的方式是不推荐的。
mysqlauto 脚本的内容如下:
#!/bin/bash
#获取 数据目录下的所有端口 mysql_ports
#author :yangyi
#date : 2016-02-15
mysql_admin=`which mysqladmin`
mysqld_safe=`which mysqld_safe`
mysql_ports=`ls /srv/ | grep -e "my[0-9][0-9]*" | sed 's#my# #g' | tr -d '\n' | sed 's#^ ##g'`
mysql_start()
{
ports_list=$1
for port in $ports_list;
do
socket_file=/srv/my${port}/run/mysql.sock
if [[ ! -f "$socket_file" ]]; then
$mysqld_safe --defaults-file=/srv/my${port}/my.cnf --read_only=1 &
sleep 2;
fi
done
}
mysql_stop()
socket_file=/srv/my${port}/run/mysql.sock
if [[ -e $socket_file ]]; then
$mysql_admin -uroot -s $socket_file shutdown
sleep 2;
fi
case "$1" in
start)
mysql_start $mysql_ports
;;
stop)
mysql_stop $mysql_ports
*) echo "usage: $0 {start|stop|help} "
esac