在Linux 上安装MySQL单实例SHELL脚本

在CentOS 6.5环境测试通过

#!/bin/bash

user=mysql
group=mysql
port=3306
basedir=/usr/local/mysql
datadir=/data/mysql/mysql_${port}/data
sourcefile=$1
mysqlprofile=/etc/my.cnf
logfile=/tmp/mysqlinstall.log
nowtime=`date '+%Y-%m-%d %H:%M:%S'`
retval=0

Usage(){
  nowtime=`date '+%Y-%m-%d %H:%M:%S'`
  echo -e "\e[0;36m${nowtime}[INFO]:Usage: `basename $0` MySQL_Source_File\e[m"
}

if [ $# != 1 ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:INPUT ARGUMENTS ERROR!\e[m"
   Usage
   exit 1
fi

[ ! -d $basedir  ]&& mkdir -p $basedir
[ ! -d $datadir  ]&& mkdir -p $datadir

content=`ls $basedir`
if [ "x$content" != "x" ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:'$basedir' IS NOT NULL.\e[m"
   exit 1
fi

content1=`ls $datadir`
if [ "x$content1" != "x" ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:'$datadir' IS NOT NULL.\e[m"
   exit 1
fi

check_port=`netstat -na |grep ":${port}" |awk '{print $4}' |grep ":${port}"`
if [ "x$check_port" != "x" ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:'$port' PORT ALREADY USED!\e[m"
   exit 1
fi

if [ ! -f $sourcefile ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:'$sourcefile' IS NOT EXISTS.\e[m"
   Usage
   exit 1
else
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[INFO]:Extract MySQL Install File.\e[m"
   tar xzf $sourcefile --strip-components 1 -C $basedir
   retval=$?
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   [ $retval -eq 0 ] && echo -e "\e[0;36m${nowtime}[INFO]:Extract MySQL Install File Complete.\e[m"
fi

if [ $retval -ne 0  ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:Extract File ERROR,Please Check Your Package.\e[m"   
   echo 1
fi

#create group if not exists  
egrep "^$group" /etc/group >& /dev/null  
if [ $? -ne 0 ]  
then  
    groupadd $group  
    nowtime=`date '+%Y-%m-%d %H:%M:%S'`
    echo -e "\e[0;36m${nowtime}[INFO]:Add Group...\e[m"
fi  
  
#create user if not exists  
egrep "^$user" /etc/passwd >& /dev/null  
if [ $? -ne 0 ]  
then  
    useradd -g $group $user
    nowtime=`date '+%Y-%m-%d %H:%M:%S'`  
    echo -e "\e[0;36m${nowtime}[INFO]:Add User...\e[m"
fi

#Create my.cnf
datapath=${datadir%/*}
[ ! -d "${datapath}/tmp"  ] && mkdir -p ${datapath}/tmp
[ ! -d "${datapath}/logs"  ] && mkdir -p ${datapath}/logs



if [ ! -f $mysqlprofile ];then
nowtime=`date '+%Y-%m-%d %H:%M:%S'`
echo -e "\e[0;36m${nowtime}[INFO]:Starting Create my.cnf.\e[m"
cat > $mysqlprofile <<EOF
[client]
port            = 3306
socket          = /tmp/mysql.sock

# The MySQL server
[mysqld]
# Basic
port            = $port
user            = $user
basedir         = $basedir
datadir         = $datadir
tmpdir          = $datapath/tmp
socket          = /tmp/mysql.sock

log-bin     = $datapath/logs/mysql-bin
log-error   = $datapath/logs/error.log
slow-query-log-file = $datapath/logs/slow.log
skip-external-locking
skip-name-resolve
log-slave-updates


server-id =2163306
explicit_defaults_for_timestamp = 1
character-set-server = utf8
slow-query-log
binlog_format = mixed
max_binlog_size = 128M
binlog_cache_size = 1M
expire-logs-days = 5
back_log = 500
long_query_time=1
max_connections=1100
max_user_connections=1000
max_connect_errors=1000

wait_timeout=100
interactive_timeout=100

connect_timeout = 20
slave-net-timeout=30

max-relay-log-size = 256M
relay-log = relay-bin
transaction_isolation = READ-COMMITTED

performance_schema=0
#myisam_recover
key_buffer_size = 64M
max_allowed_packet = 16M
#table_cache = 3096
table_open_cache = 6144
table_definition_cache = 4096

sort_buffer_size = 128K
read_buffer_size = 1M
read_rnd_buffer_size = 1M
join_buffer_size = 128K

myisam_sort_buffer_size = 32M
tmp_table_size = 32M
max_heap_table_size = 64M
query_cache_type=0
query_cache_size = 0
bulk_insert_buffer_size = 32M

thread_cache_size = 64
#thread_concurrency = 32
thread_stack = 192K
skip-slave-start

# InnoDB
innodb_data_home_dir = $datadir
innodb_log_group_home_dir = $datapath/logs
innodb_data_file_path = ibdata1:1G:autoextend

innodb_buffer_pool_size = 500M
#48G
#innodb_buffer_pool_size = 33G

innodb_buffer_pool_instances    = 8
#innodb_additional_mem_pool_size = 16M
innodb_log_file_size = 1024M
innodb_log_buffer_size = 16M
innodb_log_files_in_group = 3
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 10
innodb_sync_spin_loops = 40
innodb_max_dirty_pages_pct = 90
innodb_support_xa = 0
innodb_thread_concurrency = 0
innodb_thread_sleep_delay = 500
innodb_file_io_threads    = 4
innodb_concurrency_tickets = 1000
log_bin_trust_function_creators = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 2000
innodb_file_format = Barracuda
innodb_purge_threads=1
innodb_purge_batch_size = 32
innodb_old_blocks_pct=75
innodb_change_buffering=all
innodb_stats_on_metadata=OFF

[mysqldump]
quick
max_allowed_packet = 128M
#myisam_max_sort_file_size = 10G

[mysql]
no-auto-rehash
max_allowed_packet = 128M
prompt = '(product)\u@\h [\d]> '
default_character_set = utf8
EOF
retval=$?
fi
nowtime=`date '+%Y-%m-%d %H:%M:%S'`
[ $retval -eq 0 ] && echo -e "\e[0;36m${nowtime}[INFO]:Create my.cnf SUCESS.\e[m"

#Initializing datadir
if [ -d $datapath  ];then
   chown -R mysql:mysql ${datapath%/*}
   cd $basedir
   chown -R mysql:mysql *
   ./scripts/mysql_install_db --user=$user --datadir=$datadir >  $logfile 2>&1
   retval=$?
fi

if [ $retval -ne 0  ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:MySQL Initializing FAIL!\e[m"
   exit 1
fi
#Add env variables
grep "$basedir/bin" /etc/profile > /dev/null 2>&1
if [ $? -ne 0 ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo  "export PATH=\$PATH:$basedir/bin">>/etc/profile
   source /etc/profile
fi
#start mysql
if [ ! -f "/etc/init.d/mysqld" ];then
    cp $basedir/support-files/mysql.server /etc/init.d/mysqld
    /etc/init.d/mysqld start >/dev/null 2>&1
    retval=$?
fi

if [ $retval -eq 0 ];then
   $basedir/bin/mysqladmin -u root password '123456' 2> $logfile
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[INFO]:Starting MySQL.. SUCCESS!\e[m"
   retval=0
else
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:Starting MySQL.. FAIL!\e[m"
   exit 1
fi

#setting account security
if [ $retval -eq 0 ];then
mysql -uroot -p123456 2>/dev/null <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
delete from mysql.user where password = '';
FLUSH PRIVILEGES;
EOF
retval=$?
fi
nowtime=`date '+%Y-%m-%d %H:%M:%S'`
[ $retval -eq 0 ] && echo -e "\e[0;36m${nowtime}[INFO]:MySQL INITIAL PASSWORD SUCCESS!\e[m"

if [ $retval -eq 0 ];then
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[INFO]:MySQL INITIAL PASSWORD: 123456 \e[m"
   echo -e "\e[0;36m${nowtime}[INFO]:MySQL Basedir: $basedir \e[m"
   echo -e "\e[0;36m${nowtime}[INFO]:MySQL Datadir: $datadir \e[m"
   echo -e "\e[0;36m${nowtime}[INFO]:MySQL Install Complete. \e[m"
else
   nowtime=`date '+%Y-%m-%d %H:%M:%S'`
   echo -e "\e[0;36m${nowtime}[ERROR]:Change MySQL Password FAIL!\e[m"
fi


测试结果:

wKiom1g-jYLCH1sKAACKHyEvJQI189.png-wh_50

wKioL1g-jYOgyys7AABq0qcMZBk040.png-wh_50

在MySQL配置文件参数部分还可以优化。