前言:本脚本目前实际上限制比较多,后面会慢慢加强健壮性,目前只能实现指定端口号及目录的端口号安装
标准化
目录:/xxx/mysql+port/{data,logs,tmp}
自动生成root密码并存放/tmp/rootpasswd,实例初始化完成以后请记录root密码后及时删除该文件
参数文件模板根据自己需要再改一改
本脚本只针对MySQL5.7,5.6或者其他版本的同学需要另外再改改
一键安装脚本
#!/bin/bash
#Time 2018-05-10
#Author xucl
PATH=/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
PREFIX=/usr/local
SYSTEM=`uname -a |awk '{print $13}'`
USER=mysql
BASEDIR=${PREFIX}/mysql
SHELL=/sbin/nologin
read -t 30 -p "请输入安装版本:" VERSION
read -t 30 -p "请输入MySQL端口:" PORT
read -t 30 -p "请输入数据最上层目录:" ROOTDIR
read -t 30 -p "请输入innodb_buffer_pool_size:" POOLSIZE
DATADIR=${ROOTDIR}/mysql${PORT}
#echo ${DATADIR}
function Confirm()
{
cat <<_ACEOF
Version: ${VERSION}
Prefix: ${PREFIX}
User: ${USER}
Datadir: ${DATADIR}
_ACEOF
}
function IsAlready()
{
if [ -d "/usr/local/mysql" ];then
echo "已安装"
exit 2
fi
}
function Avrg()
{
ARGS=`getopt -o yv:f:u:d: --long version:,prefix:,user:,datadir: -n 'mysql_install' -- "$@"`
if [ ! $? -eq 0 ];then
echo "参数错误"
exit 2
fi
eval set -- "${ARGS}"
while true
do
case "$1" in
-v|--version)
VERSION=$2
shift 2
;;
-f|--prefix)
PREFIX=$2
shift 2
;;
-u|--user)
USER=$2
shift 2
;;
-d|--datadir)
DATADIR=$2
shift 2
;;
-y)
YESFLAG="1"
shift
;;
--)
shift
break
;;
*)
echo "参数错误"
exit 2
;;
esac
done
}
IsAlready
Avrg $@
FILENAME=mysql-${VERSION}-linux-glibc2.12-${SYSTEM}
#解压MySQL文件
function Unzipfile()
{
echo "正在解压文件"
tar -xvzf ${FILENAME}.tar.gz -C ${PREFIX} &>/dev/null
mv ${PREFIX}/${FILENAME}/ ${BASEDIR}
}
#创建用户
function Adduser()
{
if [ `cat /etc/passwd |grep mysql|wc -l` == "0" ];then
groupadd ${USER}
useradd -s ${SHELL} -g ${USER} ${USER}
fi
}
#创建目录
function CreateDir()
{
mkdir -p ${DATADIR}/data
if [ $? -eq 0 ];then
echo "data 目录创建成功"
else
echo "data 目录创建失败"
exit 2
fi
mkdir -p ${DATADIR}/logs
if [ $? -eq 0 ];then
echo "logs 目录创建成功"
else
echo "logs 目录创建失败"
exit 2
fi
mkdir -p ${DATADIR}/tmp
if [ $? -eq 0 ];then
echo "tmp 目录创建成功"
else
echo "tmp 目录创建失败"
exit 2
fi
}
#生成my.cnf
function genemycnf()
{
SERVERID=$RANDOM
sed -i "s/POOLSIZE/${POOLSIZE}/g" my.cnf
sed -i "s/PORT/${PORT}/g" my.cnf
sed -i "s/SERVERID/${SERVERID}/g" my.cnf
cp -r my.cnf ${DATADIR}
echo "配置文件已生成"
}
#文件夹授权
function grantpri()
{
chown -R ${USER}:${USER} ${BASEDIR}
chown -R ${USER}:${USER} ${DATADIR}
echo "授权成功"
}
#初始化MySQL
function MySQLinit()
{
echo "数据库初始化中..."
${BASEDIR}/bin/mysqld --defaults-file=${DATADIR}/my.cnf --user=mysql --initialize &>/dev/null
if [ $? -eq 0 ]; then
echo "初始化成功"
else
echo "初始化失败"
fi
tempass=`cat ${DATADIR}/data/error.log | grep password | awk '{print $11}'`
passwd=`tr -cd '[:alnum:]' < /dev/urandom | fold -w16 | head -n1`
echo ${passwd}>/tmp/rootpasswd
sql="alter user user() identified by '${passwd}'"
if [ ! -e "/tmp/mysql${PORT}" ]; then
printf "正在启动MySQL......\n"
${BASEDIR}/bin/mysqld --defaults-file=${DATADIR}/my.cnf --user=mysql &
sleep 5
else
printf "MySQL已启动" && exit 1
fi
#更改密码
/usr/local/mysql/bin/mysql -uroot -p"${tempass}" -S /tmp/mysql${PORT}.sock -e "${sql};flush privileges;" --connect-expired-password
}
Unzipfile
Adduser
CreateDir
genemycnf
grantpri
MySQLinit
配置文件模板
#my.cnf
[client]
port = PORT
socket = /tmp/mysqlPORT.sock
[mysql]
prompt="\\u@\\h [\\d]>"
#pager="less -i -n -S"
#tee=/opt/mysql/query.log
no-auto-rehash
[mysqld]
#misc
user = mysql
basedir = /usr/local/mysql
datadir = /storage/mysqlPORT/data
port = PORT
socket = /tmp/mysqlPORT.sock
event_scheduler = 0
tmpdir = /storage/mysqlPORT/tmp
#timeout
interactive_timeout = 300
wait_timeout = 300
#character set
character-set-server = utf8
open_files_limit = 65535
max_connections = 1000
max_connect_errors = 100000
lower_case_table_names =1
#file
#@secure-file-priv=/tmp
#symi replication
#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=1000
#rpl_semi_sync_slave_enabled=1
#logs
log-output=file
slow_query_log = 1
slow_query_log_file = slow.log
log-error = error.log
log_warnings = 2
pid-file = mysql.pid
long_query_time = 1
#log-slow-admin-statements = 1
#log-queries-not-using-indexes = 1
log-slow-slave-statements = 1
#binlog
#binlog_format = STATEMENT
binlog_format = row
server-id = SERVERID
log-bin = /storage/mysqlPORT/logs/mysql-bin
max_binlog_size = 256M
sync_binlog = 0
expire_logs_days = 10
#procedure
log_bin_trust_function_creators=1
#file
secure_file_priv="/tmp"
#
gtid-mode = on
enforce-gtid-consistency=1
#relay log
skip_slave_start = 1
max_relay_log_size = 128M
relay_log_purge = 1
relay_log_recovery = 1
relay-log=relay-bin
relay-log-index=relay-bin.index
log_slave_updates
#slave-skip-errors=1032,1053,1062
#skip-grant-tables
#buffers & cache
table_open_cache = 2048
table_definition_cache = 2048
table_open_cache = 2048
max_heap_table_size = 96M
sort_buffer_size = 128K
join_buffer_size = 128K
thread_cache_size = 200
query_cache_size = 0
query_cache_type = 0
query_cache_limit = 256K
query_cache_min_res_unit = 512
thread_stack = 192K
tmp_table_size = 96M
key_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 32M
#myisam
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
#innodb
innodb_buffer_pool_size = POOLSIZE
innodb_buffer_pool_instances = 1
innodb_data_file_path = ibdata1:128M:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_log_file_size = 100M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 50
innodb_file_per_table = 1
innodb_rollback_on_timeout
innodb_io_capacity = 2000
transaction_isolation = READ-COMMITTED
innodb_flush_method = O_DIRECT
文件准备
以下是我安装的全部准备,总共是三个文件,一个是二进制包,一个是配置文件模板,一个是安装启动脚本
[root@localhost3 mysql57]# ll
总用量 626112
-rw-r--r-- 1 root root 2506 5月 10 15:10 my.cnf
-rw-r--r-- 1 root root 641127384 1月 15 03:57 mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
-rwxr-xr-x 1 root root 3304 5月 10 16:47 mysqlinstall.sh
安装过程
[root@localhost3 mysql57]# sh mysqlinstall.sh
请输入安装版本:5.7.20
请输入MySQL端口:3309
请输入数据最上层目录:/storage
请输入innodb_buffer_pool_size:128M
正在解压文件
data 目录创建成功
logs 目录创建成功
tmp 目录创建成功
配置文件已生成
授权成功
数据库初始化中...
初始化成功
正在启动MySQL......
安装过程也比较简单,按提示输入即可,安装完成以后,用/tmp/rootpasswd记录的密码登录即可