最近,遇见一个需求,项目中需要在linux环境下一键部署。这其中涉及到mysql安装,设置密码,用户授权,数据初始化,启动服务。网上找了很多文档,发现写的都不是很全面,踩了不少坑,发现mysql版本5.6和5.7有一些区别,最后终于实现了该需求。
环境:centos7及以上,mysql5.7.14
mysql5.7安装需要依赖libaio包,也可能需要依赖其它包,这个根据安装时候的提示,具体情况具体对待。
项目目录
package下是mysql安装所需文件,web目录是项目文件
shell脚本
mysql.sh
#! /bin/bash
#mysql install shell
BASE_DIR=$(cd "$(dirname "$0")"; pwd)
PACKAGE_PATH=${BASE_DIR}
PARENT_PATH=$(dirname "${PACKAGE_PATH}")
#define uninstall mysql
function uninstallOldMysql {
for item in `rpm -qa | grep -i mysql`
do
rpm -e --nodeps ${item}
done
for item in `find / -name mysql`
do
rm -rf ${item}
done
}
#mysql is running,if running,return 1,else return 0
function judgeMysqlRunning() {
port=`netstat -nlt | grep 3306 | wc -l`
if [ $port -eq 1 ]; then
return 0
else
return 1
fi
}
#stop running mysql
function stopRunningMysql() {
service mysql stop
}
echo `date "+%Y-%m-%d %T"` "******start install mysql......"
service iptables stop
setenforce 0
echo `date "+%Y-%m-%d %T"` "---->>uninstall old mysql......"
judgeMysqlRunning
if [ $? -eq 0 ]; then
stopRunningMysql
fi
uninstallOldMysql
rm -rf /root/.mysql_secret
rm -rf /usr/my.cnf
rm -rf /var/lib/mysql*
rm -rf /var/log/mysqld.log
rm -rf /var/run/mysqld
sleep 2
echo `date "+%Y-%m-%d %T"` "---->>finish delete mysql"
cd $PACKAGE_PATH
echo `date "+%Y-%m-%d %T"` "---->>install mysql rpm......"
rpm -ivh libaio-0.3.109-13.el7.x86_64.rpm
rpm -ivh mysql-community-common-5.7.14-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.14-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.14-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.14-1.el7.x86_64.rpm
echo `date "+%Y-%m-%d %T"` "---->>mysql rpm finished"
chown -R mysql:mysql /var/log/mysqld.log
chown -R mysql:mysql /var/run/mysqld
mysqld --initialize
sleep 2
chown -R mysql:mysql /var/lib/mysql
service mysqld start
init_passwd=`sudo grep "A temporary password" /var/log/mysqld.log| awk '{ print $NF}'`
echo init password:${init_passwd}
initpass.sh
init_passwd=`sudo grep "A temporary password" /var/log/mysqld.log| awk '{ print $NF}'`
sleep 2
mysql --connect-expired-password -uroot -p${init_passwd} << EOF
set password=password('Ale_123');
exit
EOF
echo `date "+%Y-%m-%d %T"` "******install mysql finished"
sleep 2
mysql -uroot -p"Ale_123" << EOF
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Ale_123' WITH GRANT OPTION;
flush privileges;
exit
EOF
initdb.sh
mysql --connect-expired-password -uroot -p"Ale_123" <./init.sql
然后,集成到一键执行的文件中
install.sh
#! /bin/bash
BASE_DIR=$(cd "$(dirname "$0")"; pwd)
echo ${BASE_DIR}
cd ${BASE_DIR}/package
./mysql.sh
cd ${BASE_DIR}
./initpass.sh
./initdb.sh
cd ${BASE_DIR}/web
./stop.sh
./startup_mysql.sh
最后,提供一些有用的shell命令,仅供参考
install.conf文件内容
conf_file=/home/package/install.conf
user_mysql_passwd=`sed -e '/^[ ]*define_passwd[ ]*=/!d;s/.*=[ ]*//' ${conf_file}`
mysql_passwd=${user_mysql_passwd:-Ale_123}//获取自定义配置文件的密码,没有会默认Ale_123
mysqladmin -uroot -p${init_passwd} password \"${mysql_passwd}\" //mysqladmin在5.6版本的mysql可以使用修改密码
echo "skip-grant-tables" >> /etc/my.cnf //把字符放到my.cnf的最后