#!/bin/sh
MYSQL_TAB_FILE=""
MYSQL_REAL_DIR=""
INSTALL_DIR="/usr/local"
BASEDIR="$INSTALL_DIR"/mysql
DATADIR="$BASEDIR"/data
DEFAULT_STORAGE_ENGINE=""
ROOT_PWD=".mysql.$$"
trap "interrupt" 1 2 3 6 15
usage()
{
cat <<EOF
sh install.sh <MYSQL_TAB_FILE> <DEFAULT_STORAGE_ENGINE> <ROOT_PWD>
EOF
exit 1
}
cleanup(){
echo "Cleaning up..."
rm -f $command
}
clean_and_exit(){
cleanup
exit 1
}
interrupt(){
echo
echo "Aborting!"
echo
cleanup
stty echo
exit 1
}
check()
{
status=`whoami |awk '{print $1}'`
if [ $status == "root" ]
then
echo "the current logined user is root! "
else
echo "the current logined user is not root! please install with root. "
fi
if [ $# -ne 3 ];then
usage
fi
if [ ! -f $MYSQL_TAB_FILE ];then
echo "The file $MYSQL_TAB_FILE does not exists!"
exit 1
fi
if [ 0 -eq $(echo $MYSQL_TAB_FILE|grep "\.tar\.gz$"|wc -l) ];then
echo "The file $MYSQL_TAR_FILE does not format *.tar.gz!"
exit 1
fi
if [ ! -d $INSTALL_DIR ];then
echo "The directory $INSTALL_DIR does not exists!"
exit 1
fi
if [ $DEFAULT_STORAGE_ENGINE != 'INNODB' -a $DEFAULT_STORAGE_ENGINE != 'MYISAM' ]
then
usgae
fi
if [ -d $INSTALL_DIR/$MYSQL_REAL_DIR ];then
echo "The directory $INSTALL_DIR/$MYSQL_REAL_DIR exists! Mysql has been installed!"
exit 1
fi
if [ -d $INSTALL_DIR/mysql ];then
echo "The directory $INSTALL_DIR/mysql exists! Mysql has been installed!"
exit 1
fi
if [ -d $DATADIR ];then
echo "Create directory datadir $DATADIR..."
fi
}
init()
{
MYSQL_TAB_FILE=$1
MYSQL_REAL_DIR=`echo $MYSQL_TAB_FILE|sed 's/\.tar\.gz//g'`
DEFAULT_STORAGE_ENGINE=`echo $2|tr 'a-z' 'A-Z'`
ROOT_PWD=$3
}
install()
{
groupadd mysql
useradd -g mysql mysql
tar -zxvf $MYSQL_TAB_FILE -C $INSTALL_DIR
cd $INSTALL_DIR
ln -s $MYSQL_REAL_DIR mysql
cd mysql
script/mysql_install_db --user=mysql --datadir=$DATADIR --basedir=$BASEDIR
chown -R root:mysql .
chown -R mysql:mysql data
rm -f /etc/init.d/mysqld
cp support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on
if [ $DEFAULT_STORAGE_ENGINE = 'INNODB' ]
then
eval sed '/^#skip-networking$/a\basedir=$BASEDIR\\ndatadir=$DATADIR\\ncharacter-set-server=utf8\\ncollation-server=utf8_general_ci\\ninit_connect="SET NAMES 'utf8'"\\ndefault_storage_engine=InnoDB' ./support-files/my-large.cnf >/etc/my.cnf
elif [ $DEFAULT_STORAGE_ENGINE = 'MYISAM' ]
then
eval sed '/^#skip-networking$/a\basedir=$BASEDIR\\ndatadir=$DATADIR\\ncharacter-set-server=utf8\\ncollation-server=utf8_general_ci\\ninit_connect="SET NAMES 'utf8'"\\ndefault_storage_engine=InnoDB' ./support-files/my-large.cnf >/etc/my.cnf
fi
echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile
export PATH=$PATH:/usr/local/mysql/bin
/etc/init.d/mysqld start
}
prepare_product_env(){
echo "UPDATE mysql.user SET Password=PASSWORD('$ROOT_PWD') WHERE User='root';" >$command
echo "DELETE FROM mysql.user WHERE User='';" >>$command
echo "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');" >>$command
echo "DROP DATABASE test;" >>$command
echo "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';" >>$command
echo "FLUSH PRIVILEGES;" >>$command
mysql -uroot <$command
if [ $? -eq 0 ];then
echo "prepare product environment successfully!"
else
echo "prepare product environment failed!"
clean_and_exit
fi
}
init $@
check $@
install
prepare_product_env
cleanup
这个脚本有很多需要改的地方,会继续改进,主要是my.cnf这块(这个应该根据os的内存,动态调整), 欢迎拍砖