前言:本脚本目前实际上限制比较多,后面会慢慢加强健壮性,目前只能实现指定端口号及目录的端口号安装

标准化

  • 目录:/xxx/mysql+port/{data,logs,tmp}

  • 自动生成root密码并存放/tmp/rootpasswd,实例初始化完成以后请记录root密码后及时删除该文件

  • 参数文件模板根据自己需要再改一改

  • 本脚本只针对MySQL5.7,5.6或者其他版本的同学需要另外再改改

一键安装脚本

  1. #!/bin/bash
  2. #Time 2018-05-10
  3. #Author xucl
  4. PATH=/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
  5. PREFIX=/usr/local
  6. SYSTEM=`uname -a |awk '{print $13}'`
  7. USER=mysql
  8. BASEDIR=${PREFIX}/mysql
  9. SHELL=/sbin/nologin
  10. read -t 30 -p "请输入安装版本:" VERSION
  11. read -t 30 -p "请输入MySQL端口:" PORT
  12. read -t 30 -p "请输入数据最上层目录:" ROOTDIR
  13. read -t 30 -p "请输入innodb_buffer_pool_size:" POOLSIZE
  14. DATADIR=${ROOTDIR}/mysql${PORT}
  15. #echo ${DATADIR}
  16. function Confirm()
  17. {
  18. cat <<_ACEOF
  19. Version: ${VERSION}
  20. Prefix: ${PREFIX}
  21. User: ${USER}
  22. Datadir: ${DATADIR}
  23. _ACEOF
  24. }
  25. function IsAlready()
  26. {
  27. if [ -d "/usr/local/mysql" ];then
  28. echo "已安装"
  29. exit 2
  30. fi
  31. }
  32. function Avrg()
  33. {
  34. ARGS=`getopt -o yv:f:u:d: --long version:,prefix:,user:,datadir: -n 'mysql_install' -- "$@"`
  35. if [ ! $? -eq 0 ];then
  36. echo "参数错误"
  37. exit 2
  38. fi
  39. eval set -- "${ARGS}"
  40. while true
  41. do
  42. case "$1" in
  43. -v|--version)
  44. VERSION=$2
  45. shift 2
  46. ;;
  47. -f|--prefix)
  48. PREFIX=$2
  49. shift 2
  50. ;;
  51. -u|--user)
  52. USER=$2
  53. shift 2
  54. ;;
  55. -d|--datadir)
  56. DATADIR=$2
  57. shift 2
  58. ;;
  59. -y)
  60. YESFLAG="1"
  61. shift
  62. ;;
  63. --)
  64. shift
  65. break
  66. ;;
  67. *)
  68. echo "参数错误"
  69. exit 2
  70. ;;
  71. esac
  72. done
  73. }
  74. IsAlready
  75. Avrg $@
  76. FILENAME=mysql-${VERSION}-linux-glibc2.12-${SYSTEM}
  77. #解压MySQL文件
  78. function Unzipfile()
  79. {
  80. echo "正在解压文件"
  81. tar -xvzf ${FILENAME}.tar.gz -C ${PREFIX} &>/dev/null
  82. mv ${PREFIX}/${FILENAME}/ ${BASEDIR}
  83. }
  84. #创建用户
  85. function Adduser()
  86. {
  87. if [ `cat /etc/passwd |grep mysql|wc -l` == "0" ];then
  88. groupadd ${USER}
  89. useradd -s ${SHELL} -g ${USER} ${USER}
  90. fi
  91. }
  92. #创建目录
  93. function CreateDir()
  94. {
  95. mkdir -p ${DATADIR}/data
  96. if [ $? -eq 0 ];then
  97. echo "data 目录创建成功"
  98. else
  99. echo "data 目录创建失败"
  100. exit 2
  101. fi
  102. mkdir -p ${DATADIR}/logs
  103. if [ $? -eq 0 ];then
  104. echo "logs 目录创建成功"
  105. else
  106. echo "logs 目录创建失败"
  107. exit 2
  108. fi
  109. mkdir -p ${DATADIR}/tmp
  110. if [ $? -eq 0 ];then
  111. echo "tmp 目录创建成功"
  112. else
  113. echo "tmp 目录创建失败"
  114. exit 2
  115. fi
  116. }
  117. #生成my.cnf
  118. function genemycnf()
  119. {
  120. SERVERID=$RANDOM
  121. sed -i "s/POOLSIZE/${POOLSIZE}/g" my.cnf
  122. sed -i "s/PORT/${PORT}/g" my.cnf
  123. sed -i "s/SERVERID/${SERVERID}/g" my.cnf
  124. cp -r my.cnf ${DATADIR}
  125. echo "配置文件已生成"
  126. }
  127. #文件夹授权
  128. function grantpri()
  129. {
  130. chown -R ${USER}:${USER} ${BASEDIR}
  131. chown -R ${USER}:${USER} ${DATADIR}
  132. echo "授权成功"
  133. }
  134. #初始化MySQL
  135. function MySQLinit()
  136. {
  137. echo "数据库初始化中..."
  138. ${BASEDIR}/bin/mysqld --defaults-file=${DATADIR}/my.cnf --user=mysql --initialize &>/dev/null
  139. if [ $? -eq 0 ]; then
  140. echo "初始化成功"
  141. else
  142. echo "初始化失败"
  143. fi
  144. tempass=`cat ${DATADIR}/data/error.log | grep password | awk '{print $11}'`
  145. passwd=`tr -cd '[:alnum:]' < /dev/urandom | fold -w16 | head -n1`
  146. echo ${passwd}>/tmp/rootpasswd
  147. sql="alter user user() identified by '${passwd}'"
  148. if [ ! -e "/tmp/mysql${PORT}" ]; then
  149. printf "正在启动MySQL......\n"
  150. ${BASEDIR}/bin/mysqld --defaults-file=${DATADIR}/my.cnf --user=mysql &
  151. sleep 5
  152. else
  153. printf "MySQL已启动" && exit 1
  154. fi
  155. #更改密码
  156. /usr/local/mysql/bin/mysql -uroot -p"${tempass}" -S /tmp/mysql${PORT}.sock -e "${sql};flush privileges;" --connect-expired-password
  157. }
  158. Unzipfile
  159. Adduser
  160. CreateDir
  161. genemycnf
  162. grantpri
  163. MySQLinit

配置文件模板

  1. #my.cnf
  2. [client]
  3. port = PORT
  4. socket = /tmp/mysqlPORT.sock
  5. [mysql]
  6. prompt="\\u@\\h [\\d]>"
  7. #pager="less -i -n -S"
  8. #tee=/opt/mysql/query.log
  9. no-auto-rehash
  10. [mysqld]
  11. #misc
  12. user = mysql
  13. basedir = /usr/local/mysql
  14. datadir = /storage/mysqlPORT/data
  15. port = PORT
  16. socket = /tmp/mysqlPORT.sock
  17. event_scheduler = 0
  18. tmpdir = /storage/mysqlPORT/tmp
  19. #timeout
  20. interactive_timeout = 300
  21. wait_timeout = 300
  22. #character set
  23. character-set-server = utf8
  24. open_files_limit = 65535
  25. max_connections = 1000
  26. max_connect_errors = 100000
  27. lower_case_table_names =1
  28. #file
  29. #@secure-file-priv=/tmp
  30. #symi replication
  31. #rpl_semi_sync_master_enabled=1
  32. #rpl_semi_sync_master_timeout=1000
  33. #rpl_semi_sync_slave_enabled=1
  34. #logs
  35. log-output=file
  36. slow_query_log = 1
  37. slow_query_log_file = slow.log
  38. log-error = error.log
  39. log_warnings = 2
  40. pid-file = mysql.pid
  41. long_query_time = 1
  42. #log-slow-admin-statements = 1
  43. #log-queries-not-using-indexes = 1
  44. log-slow-slave-statements = 1
  45. #binlog
  46. #binlog_format = STATEMENT
  47. binlog_format = row
  48. server-id = SERVERID
  49. log-bin = /storage/mysqlPORT/logs/mysql-bin
  50. max_binlog_size = 256M
  51. sync_binlog = 0
  52. expire_logs_days = 10
  53. #procedure
  54. log_bin_trust_function_creators=1
  55. #file
  56. secure_file_priv="/tmp"
  57. #
  58. gtid-mode = on
  59. enforce-gtid-consistency=1
  60. #relay log
  61. skip_slave_start = 1
  62. max_relay_log_size = 128M
  63. relay_log_purge = 1
  64. relay_log_recovery = 1
  65. relay-log=relay-bin
  66. relay-log-index=relay-bin.index
  67. log_slave_updates
  68. #slave-skip-errors=1032,1053,1062
  69. #skip-grant-tables
  70. #buffers & cache
  71. table_open_cache = 2048
  72. table_definition_cache = 2048
  73. table_open_cache = 2048
  74. max_heap_table_size = 96M
  75. sort_buffer_size = 128K
  76. join_buffer_size = 128K
  77. thread_cache_size = 200
  78. query_cache_size = 0
  79. query_cache_type = 0
  80. query_cache_limit = 256K
  81. query_cache_min_res_unit = 512
  82. thread_stack = 192K
  83. tmp_table_size = 96M
  84. key_buffer_size = 8M
  85. read_buffer_size = 2M
  86. read_rnd_buffer_size = 16M
  87. bulk_insert_buffer_size = 32M
  88. #myisam
  89. myisam_sort_buffer_size = 128M
  90. myisam_max_sort_file_size = 10G
  91. myisam_repair_threads = 1
  92. #innodb
  93. innodb_buffer_pool_size = POOLSIZE
  94. innodb_buffer_pool_instances = 1
  95. innodb_data_file_path = ibdata1:128M:autoextend
  96. innodb_flush_log_at_trx_commit = 1
  97. innodb_log_buffer_size = 8M
  98. innodb_log_file_size = 100M
  99. innodb_log_files_in_group = 3
  100. innodb_max_dirty_pages_pct = 50
  101. innodb_file_per_table = 1
  102. innodb_rollback_on_timeout
  103. innodb_io_capacity = 2000
  104. transaction_isolation = READ-COMMITTED
  105. innodb_flush_method = O_DIRECT

文件准备

以下是我安装的全部准备,总共是三个文件,一个是二进制包,一个是配置文件模板,一个是安装启动脚本

  1. [root@localhost3 mysql57]# ll
  2. 总用量 626112
  3. -rw-r--r-- 1 root root 2506 5 10 15:10 my.cnf
  4. -rw-r--r-- 1 root root 641127384 1 15 03:57 mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
  5. -rwxr-xr-x 1 root root 3304 5 10 16:47 mysqlinstall.sh

安装过程

  1. [root@localhost3 mysql57]# sh mysqlinstall.sh
  2. 请输入安装版本:5.7.20
  3. 请输入MySQL端口:3309
  4. 请输入数据最上层目录:/storage
  5. 请输入innodb_buffer_pool_size:128M
  6. 正在解压文件
  7. data 目录创建成功
  8. logs 目录创建成功
  9. tmp 目录创建成功
  10. 配置文件已生成
  11. 授权成功
  12. 数据库初始化中...
  13. 初始化成功
  14. 正在启动MySQL......

安装过程也比较简单,按提示输入即可,安装完成以后,用/tmp/rootpasswd记录的密码登录即可