mysql_auto_install.sh

# 说明:
# 1.所有变量值都要用双引号引起来,且引号两边不能有空白符
# 2.安装过程会关闭防火墙,安装完毕可打开

# 定义变量
mysqlBinaryPackage=mysql-8.0.22-linux-glibc2.12-x86_64.tar.xz  # 定义MySQL二进制安装包,只支持二进制包,rpm包对此脚本不适用
mysqlIp=10.10.10.62                # 本机IP          
mysqlPort=3306                     # 定义MySQL的端口号
osMysqlIdGroupid=3801              # 定义MySQL用户和用户组的ID
mysqlDirData=datamysqldbdata    # 定义MySQL 数据目录
mysqlDirLog=datamysqllog        # 定义MySQL 日志目录
mysqlDirTmp=datamysqltmp        # 定义MySQL 临时目录
mysqlLnsDir=usrlocalmysql       # 定义MySQL 链接目录
mysqlInstallDir=optmysql         # 定义MySQL 软件文件目录
mysqlVersion=8.0                   # 定义MySQL软件的大版本,只支持: 5.65.78.0
mysqlInnoDBCluster=0               # 定义my.cnf参数,是否是InnoDB Cluster   参数说明:1代表是,0代表否
mysqlReplication=1                 # 定义my.cnf参数,是否是主从复制环境     参数说明:1代表是,0代表否
mysqlOsOnly=1                      # 定义my.cnf参数,是否是MySQL专用服务器  参数说明:1代表是,0代表否

# 操作系统环境检查
# 检查过程一旦不符合要求,就会退出程序,不会执行任何的操作
function check_os_environment()
{
echo ########## 操作系统环境检查 ##########
echo # 检查用户 
if [[ $(id -u) != 0 ]]; then
    echo !!!!!! ERROR, 请使用root用户安装!
    echo !!!!!! ERROR, 程序退出!
    exit 1
else
    echo OK.
fi

echo # 检查操作系统版本 
osVersion=`uname -rcut -d . -f 4`
if [[ ${osVersion} = el5 ${osVersion}=el6 ]]  [[ ${osVersion}=el7  ${osVersion} = el8 ]]; then
   echo ${osVersion}, OK.
else
   echo !!!!!! ERROR, 只支持CentOS 5678!
   echo !!!!!! ERROR, 程序退出!
   exit 1
fi

echo # 检查安装目录 
if [[ -d ${mysqlDirData} ]]; then
   echo !!!!!! ERROR, 安装目录 ${mysqlDirData} 已存在!
   echo !!!!!! ERROR, 程序退出!
   exit 1
else
   echo OK.
fi

if [[ -d ${mysqlDirLog} ]]; then
   echo !!!!!! ERROR, 安装目录 ${mysqlDirLog} 已存在!
   echo !!!!!! ERROR, 程序退出!
   exit 1
else
   echo OK.
fi

if [[ -d ${mysqlDirTmp} ]]; then
   echo !!!!!! ERROR, 安装目录 ${mysqlDirTmp} 已存在!
   echo !!!!!! ERROR, 程序退出!
   exit 1
else
   echo OK.
fi

echo # 检查MySQL端口号 
checkPort=$(netstat -ntl awk '{ print $4}' grep ${mysqlPort} awk  -F  '{ print $4}')
echo checkPort 
echo ${checkPort}
for portList in ${checkPort[]}
  do
  if [[ ${portList} = ${mysqlPort} ]] && [[ ${#portList} = ${#mysqlPort} ]]; then
    echo !!!!!! ERROR, 端口号${portList} 已经在使用!  
    echo !!!!!! ERROR, 程序退出!    
    exit 1
  else
    echo OK.
  fi
done

echo # 检查操作系统MySQL 用户ID和组ID 
mysqlUser=$(awk -F  '{print $1}' etcpasswd)
osUser=mysql

for userList in ${mysqlUser[]}
  do
  if [[ ${userList} = ${osUser} ]] && [[ ${#userList} = ${#osUser} ]]; then
    echo !!!!!! ERROR, 用户 ${userList} 已经在使用!  
    echo !!!!!! ERROR, 程序退出!
    exit 1
  else
    echo OK.
  fi
done

osId=$(awk -F  '{print $3}' etcpasswd)

echo 用户ID
echo ${osId}

for idList in ${osId[]}
  do
  if [[ ${idList} = ${osMysqlIdGroupid} ]] && [[ ${#idList} = ${#osMysqlIdGroupid} ]]; then
    echo !!!!!! ERROR, 用户ID ${idList} 已经在使用!  
    echo !!!!!! ERROR, 程序退出!
    exit 1
  else
    echo OK.
  fi
done

osGroupid=$(awk -F  '{print $4}' etcpasswd)
echo 组ID
echo ${osGroupid}
for groupidList in ${osGroupid[]}
  do
  if [[ ${groupidList} = ${osMysqlIdGroupid} ]] && [[ ${#groupidList} = ${#osMysqlIdGroupid} ]]; then
    echo !!!!!! ERROR, 用户ID ${groupidList} 已经在使用! 
    echo !!!!!! ERROR, 程序退出!     
    exit 1
  else
    echo OK.
  fi
done

echo # 检查二进制包是否在同目录下 
if [[ ! -f ${mysqlBinaryPackage} ]]; then 
  echo !!!!!! ERROR, 二进制包 ${mysqlBinaryPackage} 不在此目录下,请和脚本放在同目录! 
  echo !!!!!! ERROR, 程序退出!     
  exit 1
else
  echo OK.     
fi

echo ########## 检查结束, 符合安装要求 ##########
}

# 开始安装
function install_MySQL()
{
echo ########## 开始安装 ##########
echo ########## 卸载旧版rpm包 ##########
rpmSoftwareMysql=$(rpm -qagrep mysql -i)
rpmSoftwareMariadb=$(rpm -qagrep mariadb -i)
for softwareList in ${rpmSoftwareMysql[]}
  do 
  if  [[ ! -n ${softwareList} ]] ;then
    echo 没有安装MySQL相关软件.
  else
    rpm -e --nodeps ${softwareList}
    echo ${softwareList} mysql软件已经卸载.
  fi
done

for softwareList in ${rpmSoftwareMariadb[]}
  do 
  if  [[ ! -n ${softwareList} ]] ;then
    echo 没有安装mariadb相关软件.
  else
    rpm -e --nodeps ${softwareList}
    echo ${softwareList} mariadb软件已经卸载.
  fi
done

echo ########## 安装依赖包 ##########
yum install -y libaio
libaioStatusSuccess=$(echo $)
if  [[ ${libaioStatusSuccess} = 0 ]] ;then
  echo yum install -y libaio 安装成功.
else
  echo !!!!!! ERROR, yum install -y libaio 安装失败成功!
fi
  
yum install -y perl 
perlStatusSuccess=$(echo $)
if  [[ ${perlStatusSuccess} = 0 ]] ;then
  echo yum install -y perl 安装成功.
else
  echo !!!!!! ERROR, yum install -y perl 安装失败成功!
fi

yum install -y perl-devel
perldevelStatusSuccess=$(echo $)
if  [[ ${perldevelStatusSuccess} = 0 ]] ;then
  echo yum install -y perl-devel 安装成功.
else
  echo !!!!!! ERROR, yum install -y perl-devel 安装失败成功!
fi

echo ########## 创建运行的用户 ##########
groupadd mysql -g ${osMysqlIdGroupid} 
useradd -g mysql -m -p mysql -u ${osMysqlIdGroupid} mysql

echo ########## 解压二进制包 ##########
# 二进制包存放目录,所以先检查此目录是否存在,不存在就创建
if [[ -d ${mysqlInstallDir} ]]; then
  echo ${mysqlInstallDir} 目录已存在.
else
  mkdir ${mysqlInstallDir} -p
  echo ${mysqlInstallDir} 目录不存在, 已创建. 
fi

# 二进制包移动到optmysql目录下
if [[ ! -f ${mysqlInstallDir}${mysqlBinaryPackage} ]]; then 
  echo ${mysqlInstallDir}${mysqlBinaryPackage} 文件不存在, 正在复制. 
else
  nowDate=`date +%Y%m%d-%H%M-%S`
  mv ${mysqlInstallDir}${mysqlBinaryPackage} ${mysqlInstallDir}${mysqlBinaryPackage}-${nowDate}
  echo ${mysqlInstallDir}${mysqlBinaryPackage} 文件已存在,已重命名为 ${mysqlBinaryPackage}-${nowDate}.    
fi

cp .${mysqlBinaryPackage}  ${mysqlInstallDir}
tar -xf ${mysqlInstallDir}${mysqlBinaryPackage} -C ${mysqlInstallDir}

if [[ ! -d ${mysqlLnsDir} ]]; then 
  echo 目录 ${mysqlLnsDir} 不存在, 已创建.
else
  nowDate=$(date +%Y%m%d-%H%M-%S) 
  mv ${mysqlLnsDir} ${mysqlLnsDir}-${nowDate}
  echo 目录 ${mysqlLnsDir} 已存在, 重命名为 ${mysqlLnsDir}-${nowDate}.
fi

mysqlBinaryPackagePrefix=${mysqlBinaryPackage%.tar.}
ln -s ${mysqlInstallDir}${mysqlBinaryPackagePrefix} ${mysqlLnsDir}  

# 创建所需要的目录及修改权限
echo ########## 创建所需要的目录及修改权限 ##########
mkdir -p ${mysqlDirData} -p
mkdir -p ${mysqlDirLog}  -p
mkdir -p ${mysqlDirTmp}  -p
chown -R mysqlmysql ${mysqlDirData} 
chown -R mysqlmysql ${mysqlDirLog}
chown -R mysqlmysql ${mysqlDirTmp} 
chown -R mysqlmysql  ${mysqlLnsDir}

# 修改OS用户mysql资源限制
echo ########## 修改OS用户mysql资源限制 ##########
nowDate=`date +%Y%m%d-%H%M-%S`
cp etcsecuritylimits.conf etcsecuritylimits.conf-${nowDate}
mysqlSoftNofile65535=$(grep -E mysql.soft.nofile.65535 etcsecuritylimits.conf)
if [[ -n ${mysqlSoftNofile65535} ]]; then
  echo 文件 etcsecuritylimits.conf 已存在 mysql soft nofile 65535 内容.
else
  echo mysql soft nofile 65535  etcsecuritylimits.conf
  echo 文件 etcsecuritylimits.conf 不存在 mysql soft nofile 65535 内容, 已写入.
fi 
  
mysqlHardNofile65535=$(grep -E mysql.hard.nofile.65535 etcsecuritylimits.conf)
if [[ -n ${mysqlHardNofile65535} ]]; then
  echo 文件 etcsecuritylimits.conf 已存在 mysql hard nofile 65535 内容.
else
  echo mysql hard nofile 65535  etcsecuritylimits.conf
  echo 文件 etcsecuritylimits.conf 不存在 mysql hard nofile 65535 内容, 已写入.
fi 

mysqlSoftNproc65535=$(grep -E mysql.soft.nproc.65535 etcsecuritylimits.conf)
if [[ -n ${mysqlSoftNproc65535} ]]; then
  echo 文件 etcsecuritylimits.conf 已存在 mysql soft nproc 65535 内容.
else
  echo mysql soft nproc 65535  etcsecuritylimits.conf
  echo 文件 etcsecuritylimits.conf 不存在 mysql soft nproc 65535 内容, 已写入.
fi

mysqlHardNproc65535=$(grep -E mysql.hard.nproc.65535 etcsecuritylimits.conf)
if [[ -n ${mysqlHardNproc65535} ]]; then
  echo 文件 etcsecuritylimits.conf 已存在 mysql hard nproc 65535 内容.
else
  echo mysql hard nproc 65535  etcsecuritylimits.conf
  echo 文件 etcsecuritylimits.conf 不存在 mysql hard nproc 65535 内容, 已写入.
fi

# 关闭SELinux
echo ########## 关闭SELinux ##########
setenforce 0 
sed -i 's^SELINUX=.$SELINUX=disabledg' etcselinuxconfig

# 关闭防火墙
echo ########## 关闭防火墙 ##########
osVersion=`uname -rcut -d . -f 4`
if [[ ${osVersion} = el5  ${osVersion} = el6 ]] ; then
  chkconfig iptables off
  etcinit.diptables stop
elif [[ ${osVersion} = el7  ${osVersion} = el8 ]] ; then
  systemctl stop firewalld.service
  systemctl disable firewalld.service
else
  echo !!!!!! ERROR, 只支持CentOS 5678!
fi

# 关闭透明大页
echo ########## 关闭透明大页 ##########
echo never  syskernelmmtransparent_hugepageenabled
echo never  syskernelmmtransparent_hugepagedefrag
grubby --update-kernel=ALL --args=transparent_hugepage=never

# 关闭 numa
echo ########## 关闭 numa ##########  
if [[ ! -f etcdefaultgrub ]]; then 
  echo etcdefaultgrub文件不存在.     
else
  echo etcdefaultgrub文件存在.
  existNumaOff=$(grep numa=off etcdefaultgrub)
  if [[ -n ${existNumaOff} ]]; then
    echo etcdefaultgrub文件, GRUB_CMDLINE_LINUX 行中numa=off 内容已存在.
  else
    echo etcdefaultgrub文件, GRUB_CMDLINE_LINUX 行中numa=off 内容不存在, 正在添加.
    sed -i '^GRUB_CMDLINE_LINUXs$ numa=off&g'  etcdefaultgrub 
  fi  
  grubby --update-kernel=ALL --args=numa=off  
fi

# 创建配置my.cnf 配置文件
echo ########## 创建配置my.cnf 配置文件 ##########
if [[ ! -f etcmy.cnf ]]; then 
  echo 文件 etcmy.cnf不存在,正在创建
else
  nowDate=$(date +%Y%m%d-%H%M-%S) 
  mv etcmy.cnf etcmy.cnf-${nowDate}
  echo 文件 etcmy.cnf已存在,重命名为 etcmy.cnf-${nowDate}.
fi
    
cat etcmy.cnfEOF
[client]
port                                        = 3306
socket                                      = datamysqltmpmysql.sock

[mysql]
prompt                                      = u@hpd   
no-auto-rehash  
tee                                         = datamysqltmpmysql_operation.log
default_character_set                       = utf8mb4

[mysqld]
## 需要根据实际情况修改的参数
port                                        = 3306
server_id                                   = 623306 
basedir                                     = usrlocalmysql
datadir                                     = datamysqldbdata
pid_file                                    = datamysqltmpmysqld.pid
socket                                      = datamysqltmpmysql.sock
tmpdir                                      = datamysqltmp
secure_file_priv                            = datamysqltmp
log_bin                                     = datamysqllogmysql-bin
log_bin_index                               = datamysqllogmysql-bin-index
slow_query_log_file                         = datamysqllogslow.log
log-error                                   = datamysqllogerror.log
relay_log                                   = datamysqllogmysql-relay
relay_log_index                             = datamysqllogmysql-relay-index
innodb_buffer_pool_size                     = 2G  
expire_logs_days                            = 7  #注意:MySQL 8.0开始, binlog_expire_logs_seconds 选项也存在的话,会忽略expire_logs_days选项
default_time_zone                           = +800   #若MySQL数据库主要运行在境外,请务必根据实际情况调整本参数
report_host                                 = 127.0.0.1    #填写本IP

## 下面的参数适用于 5.7
innodb_checksums                           = 1
innodb_file_format                         = Barracuda
innodb_file_format_max                     = Barracuda
query_cache_size                           = 0  
query_cache_type                           = 0  
innodb_undo_logs                           = 128

## 下面的参数适用于 8.0
#log_error_verbosity                        = 3
#innodb_print_ddl_logs                      = 1
#binlog_expire_logs_seconds                 = 604800
#innodb_dedicated_server                    = 0

## Semi sync Config   #如果后续是安装InnoDB Cluster,就注释这一部分参数
loose_plugin_load                                 = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
loose_rpl_semi_sync_master_enabled                = 0
loose_rpl_semi_sync_slave_enabled                 = 0
loose_rpl_semi_sync_master_timeout                = 30000
loose_rpl_semi_sync_master_wait_for_slave_count   = 1
loose_rpl_semi_sync_master_wait_no_slave          = 0

## group replication  ##如果后续是安装主从复制,就注释这一部分参数
#loose_plugin_load_add                       = group_replication.so
#binlog_checksum                             = NONE
#transaction_write_set_extraction            = XXHASH64
#loose_group_replication_start_on_boot       = OFF
#loose_group_replication_bootstrap_group     = OFF
#loose_group_replication_consistency         = BEFORE_ON_PRIMARY_FAILOVER
#loose_group_replication_flow_control_applier_threshold     = 250000
#loose_group_replication_flow_control_certifier_threshold   = 250000

## general
user                                        = mysql
character_set_server                        = utf8mb4
collation_server                            = utf8mb4_bin
transaction_isolation                       = READ-COMMITTED
lower_case_table_names                      = 1  
skip_name_resolve                           = 1
log_timestamps                              = SYSTEM
slow_query_log                              = 1
long_query_time                             = 0.1
log_queries_not_using_indexes               = 1
log_throttle_queries_not_using_indexes      = 60
min_examined_row_limit                      = 100
log_slow_admin_statements                   = 1
log_slow_slave_statements                   = 1
table_open_cache_instances                  = 64
external-locking                            = FALSE
explicit_defaults_for_timestamp             = 1
skip_external_locking                       = 1
default_authentication_plugin               = mysql_native_password
local_infile                                = 1

## GTID
gtid_mode                                   = on
enforce_gtid_consistency                    = 1
master_info_repository                      = TABLE
relay_log_info_repository                   = TABLE

# replication
#read_only                                  = 1 #从库必须开启
skip_slave_start                            = 1 #如果作为中级节点必须开启否则不用开启
slave-skip-errors                           = 1032 #跳过1032错误
log_slave_updates                           = 1
slave-rows-search-algorithms                = 'INDEX_SCAN,HASH_SCAN'

## relay log
#slave_parallel_workers                     = 8  并行的复制,多个数据库就要开启并行
max-relay-log-size                          = 256M    
relay_log_purge                             = 1
relay_log_recovery                          = 1

## binary logging
binlog_format                               = row
sync_binlog                                 = 1
binlog_cache_size                           = 4M
max_binlog_cache_size                       = 2G
max_binlog_size                             = 1G
binlog_rows_query_log_events                = 1
log_bin_trust_function_creators             = 1

## myisam
key_buffer_size                             = 64M  
myisam_sort_buffer_size                     = 128M
myisam_max_sort_file_size                   = 10G
myisam_repair_threads                       = 1

## buffers & cache
table_open_cache                            = 4000
table_definition_cache                      = 4000
max_heap_table_size                         = 64M
tmp_table_size                              = 64M
sort_buffer_size                            = 4M
join_buffer_size                            = 4M
thread_cache_size                           = 768
thread_stack                                = 512K
read_buffer_size                            = 8M
read_rnd_buffer_size                        = 8M
bulk_insert_buffer_size                     = 64M
max_allowed_packet                          = 2G

## connect
max_connections                             = 3000
max_user_connections                        = 1000  
max_connect_errors                          = 1000000
open_files_limit                            = 65535  
back_log                                    = 1024  

## timeout
wait_timeout                                = 600
lock_wait_timeout                           = 1800
innodb_lock_wait_timeout                    = 30
max_connect_errors                          = 1000000
interactive_timeout                         = 600
connect_timeout                             = 20
slave-net-timeout                           = 20
innodb_lock_wait_timeout                    = 10

## innodb
innodb_adaptive_flushing                    = 1  
innodb_adaptive_hash_index                  = ON  
innodb_buffer_pool_instances                = 4
innodb_buffer_pool_load_at_startup          = 1
innodb_buffer_pool_dump_at_shutdown         = 1
innodb_buffer_pool_dump_pct                  = 25
innodb_data_file_path                       = ibdata11Gautoextend
innodb_temp_data_file_path                  = ibtmp112Mautoextendmax50G
innodb_flush_log_at_trx_commit              = 1
innodb_log_buffer_size                      = 64M
innodb_log_file_size                        = 2G
innodb_log_files_in_group                   = 2
innodb_max_undo_log_size                    = 4G
innodb_undo_tablespaces                     = 95
innodb_thread_concurrency                   = 0
innodb_sync_spin_loops                      = 100
innodb_spin_wait_delay                      = 30
innodb_io_capacity                          = 4000
innodb_io_capacity_max                      = 8000
innodb_flush_sync                           = 0
innodb_flush_neighbors                      = 0
innodb_write_io_threads                     = 8
innodb_read_io_threads                      = 8
innodb_purge_threads                        = 4
innodb_page_cleaners                        = 4
innodb_open_files                           = 65535
innodb_max_dirty_pages_pct                  = 60
innodb_flush_method                         = O_DIRECT
innodb_lru_scan_depth                       = 4000
innodb_checksum_algorithm                   = crc32
innodb_rollback_on_timeout                  = 1
innodb_print_all_deadlocks                  = 1
innodb_file_per_table                       = 1
innodb_online_alter_log_max_size            = 4G
innodb_stats_on_metadata                    = 0
innodb_undo_log_truncate                    = 1
innodb_status_file                          = 1
binlog_checksum                             = 1
innodb_status_output                        = 0 #注意 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log-error文件增长较快
innodb_status_output_locks                  = 0
innodb_strict_mode                          = 1
innodb_sort_buffer_size                     = 8M

## performance_schema
performance_schema                          = 1
performance_schema_instrument               = '%memory%=on'
performance_schema_instrument               = '%lock%=on'

## innodb monitor
innodb_monitor_enable                       = module_innodb
innodb_monitor_enable                       = module_server
innodb_monitor_enable                       = module_dml
innodb_monitor_enable                       = module_ddl
innodb_monitor_enable                       = module_trx
innodb_monitor_enable                       = module_os
innodb_monitor_enable                       = module_purge
innodb_monitor_enable                       = module_log
innodb_monitor_enable                       = module_lock
innodb_monitor_enable                       = module_buffer
innodb_monitor_enable                       = module_index
innodb_monitor_enable                       = module_ibuf_system
innodb_monitor_enable                       = module_buffer_page
innodb_monitor_enable                       = module_adaptive_hash

## MTS Config
slave-parallel-type                         = LOGICAL_CLOCK
slave_parallel_workers                      = 16
slave_preserve_commit_order                 = ON

## Performance Schema Config
performance-schema-instrument               = 'waitlockmetadatasqlmdl=ON'
performance-schema-instrument               = 'memory%=COUNTED'

## Other
innodb_numa_interleave                      = 1

[mysqldump]
quick
max_allowed_packet                          = 2G
EOF

# 修改etcmy.cnf 的参数,改成开始时自定义的
# 修改 port
sed -i ^port[[space]]s3306${mysqlPort}g  etcmy.cnf 
echo port is ${mysqlPort}.
# 修改目录相关参数
sed -i ^basedir[[space]]s@usrlocalmysql@${mysqlLnsDir}@g  etcmy.cnf 

mysqlDirDataMyCnf=datamysqldbdata  
mysqlDirLogMyCnf=datamysqllog      
mysqlDirTmpMyCnf=datamysqltmp     
sed -i ^tee[[space]]s@${mysqlDirTmpMyCnf}@${mysqlDirTmp}@g                  etcmy.cnf
sed -i ^datadir[[space]]s@${mysqlDirDataMyCnf}@${mysqlDirData}@g            etcmy.cnf
sed -i ^pid_file[[space]]s@${mysqlDirTmpMyCnf}@${mysqlDirTmp}@g             etcmy.cnf
sed -i ^socket[[space]]s@${mysqlDirTmpMyCnf}@${mysqlDirTmp}@g               etcmy.cnf
sed -i ^tmpdir[[space]]s@${mysqlDirTmpMyCnf}@${mysqlDirTmp}@g               etcmy.cnf
sed -i ^secure_file_priv[[space]]s@${mysqlDirTmpMyCnf}@${mysqlDirTmp}@g     etcmy.cnf
sed -i ^log_bin[[space]]s@${mysqlDirLogMyCnf}@${mysqlDirLog}@g              etcmy.cnf
sed -i ^log_bin_index[[space]]s@${mysqlDirLogMyCnf}@${mysqlDirLog}@g        etcmy.cnf
sed -i ^slow_query_log_file[[space]]s@${mysqlDirLogMyCnf}@${mysqlDirLog}@g  etcmy.cnf   
sed -i ^log-error[[space]]s@${mysqlDirLogMyCnf}@${mysqlDirLog}@g            etcmy.cnf
sed -i ^relay_log[[space]]s@${mysqlDirLogMyCnf}@${mysqlDirLog}@g            etcmy.cnf
sed -i ^relay_log_index[[space]]s@${mysqlDirLogMyCnf}@${mysqlDirLog}@g      etcmy.cnf 

# 修改 server_id
ipLast1Num=$(echo ${mysqlIp}awk -F . '{print $4}')    # IP地址倒数第一位
ipLast2Num=$(echo ${mysqlIp}awk -F . '{print $3}')    # IP地址倒数第二位
serverId=${ipLast2Num}${ipLast1Num}${mysqlPort}          # server_id= IP地址倒数第二位 + IP地址倒数第一位 + MySQL端口号
sed -i ^server_id[[space]]s623306${serverId}g  etcmy.cnf 
echo server_id is ${serverId}.

# 修改 report_host
sed -i ^report_host[[space]]s127.0.0.1${mysqlIp}g  etcmy.cnf 

# 修改 innodb_buffer_pool_size 
memoryBuffSize=$(free -m  grep -i mem  awk '{print $2}')

if [[ ${mysqlOsOnly} = 1 ]] ; then
  innodbBufferPoolSize=$((${memoryBuffSize}610))
  sed -i ^innodb_buffer_pool_size[[space]]s2G${innodbBufferPoolSize}Mg  etcmy.cnf
  echo innodb_buffer_pool_size is ${innodbBufferPoolSize}M.
elif [[ ${mysqlOsOnly} = 0 ]] ; then
  innodbBufferPoolSize=$((${memoryBuffSize}4))
  sed -i ^innodb_buffer_pool_size[[space]]s2G${innodbBufferPoolSize}Mg  etcmy.cnf
  echo innodb_buffer_pool_size is ${innodbBufferPoolSize}M.
else
  echo !!!!!! ERROR, mysqlOsOnly 参数错误!
  echo !!!!!! ERROR, 程序退出!
  exit 1
fi

# 修改 下面的参数适用于 5.7 及 下面的参数适用于 8.0 部分
if [[ ${mysqlVersion} = 5.6 ]] ; then
  sed -i ^innodb_checksums[[space]]sinnodb_checksums#innodb_checksumsg                    etcmy.cnf 
  sed -i ^innodb_file_format[[space]]sinnodb_file_format#innodb_file_formatg              etcmy.cnf
  sed -i ^innodb_file_format_max[[space]]sinnodb_file_format_max#innodb_file_format_maxg  etcmy.cnf
  sed -i ^query_cache_size[[space]]squery_cache_size#query_cache_sizeg                    etcmy.cnf
  sed -i ^query_cache_type[[space]]squery_cache_type#query_cache_typeg                    etcmy.cnf
  sed -i ^innodb_undo_logs[[space]]sinnodb_undo_logs#innodb_undo_logsg                    etcmy.cnf
  echo mysqlVersion is 5.6.  
elif [[ ${mysqlVersion} = 5.7 ]] ; then
  echo mysqlVersion is 5.7.
elif [[ ${mysqlVersion} = 8.0 ]] ; then
  sed -i ^innodb_checksums[[space]]sinnodb_checksums#innodb_checksumsg                                 etcmy.cnf 
  sed -i ^innodb_file_format[[space]]sinnodb_file_format#innodb_file_formatg                           etcmy.cnf
  sed -i ^innodb_file_format_max[[space]]sinnodb_file_format_max#innodb_file_format_maxg               etcmy.cnf
  sed -i ^query_cache_size[[space]]squery_cache_size#query_cache_sizeg                                 etcmy.cnf
  sed -i ^query_cache_type[[space]]squery_cache_type#query_cache_typeg                                 etcmy.cnf
  sed -i ^innodb_undo_logs[[space]]sinnodb_undo_logs#innodb_undo_logsg                                 etcmy.cnf
  sed -i ^#log_error_verbosity[[space]]s#log_error_verbositylog_error_verbosityg                       etcmy.cnf
  sed -i ^#innodb_print_ddl_logs[[space]]s#innodb_print_ddl_logsinnodb_print_ddl_logsg                 etcmy.cnf
  sed -i ^#binlog_expire_logs_seconds[[space]]s#binlog_expire_logs_secondsbinlog_expire_logs_secondsg  etcmy.cnf
  sed -i ^#innodb_dedicated_server[[space]]s#innodb_dedicated_serverinnodb_dedicated_serverg           etcmy.cnf
  echo mysqlVersion is 8.0.  
else
  echo !!!!!! ERROR, mysqlVersion 参数错误!
  echo !!!!!! ERROR, 程序退出!
  exit 1
fi

# 修改 Semi sync Config 部分
if [[ ${mysqlInnoDBCluster} = 1 ]] ; then
  sed -i ^loose_plugin_load[[space]]sloose_plugin_load#loose_plugin_loadg                                                                                            etcmy.cnf
  sed -i ^loose_rpl_semi_sync_master_enabled[[space]]sloose_rpl_semi_sync_master_enabled#loose_rpl_semi_sync_master_enabledg                                         etcmy.cnf
  sed -i ^loose_rpl_semi_sync_slave_enabled[[space]]sloose_rpl_semi_sync_slave_enabled#loose_rpl_semi_sync_slave_enabledg                                            etcmy.cnf
  sed -i ^loose_rpl_semi_sync_master_timeout[[space]]sloose_rpl_semi_sync_master_timeout#loose_rpl_semi_sync_master_timeoutg                                         etcmy.cnf
  sed -i ^loose_rpl_semi_sync_master_wait_for_slave_count[[space]]sloose_rpl_semi_sync_master_wait_for_slave_count#loose_rpl_semi_sync_master_wait_for_slave_countg  etcmy.cnf
  sed -i ^loose_rpl_semi_sync_master_wait_no_slave[[space]]sloose_rpl_semi_sync_master_wait_no_slave#loose_rpl_semi_sync_master_wait_no_slaveg                       etcmy.cnf
  echo mysqlInnoDBCluster is 1.
elif [[ ${mysqlInnoDBCluster} = 0 ]] ; then
  echo mysqlInnoDBCluster is 0.
else
  echo !!!!!! ERROR, mysqlInnoDBCluster 参数错误!
  echo !!!!!! ERROR, 程序退出!
  exit 1
fi
 
# 修改 group replication 部分
if [[ ${mysqlReplication} = 1 ]] ; then
  echo mysqlReplication is 1.
elif [[ ${mysqlReplication} = 0 ]] ; then
  sed -i ^#loose_plugin_load_add[[space]]s#loose_plugin_load_add#loose_plugin_load_addg                                                                                                           etcmy.cnf
  sed -i ^#binlog_checksum[[space]]s#binlog_checksum#binlog_checksumg                                                                                                                             etcmy.cnf
  sed -i ^#transaction_write_set_extraction[[space]]s#transaction_write_set_extraction#transaction_write_set_extractiong                                                                          etcmy.cnf
  sed -i ^#loose_group_replication_start_on_boot[[space]]s#loose_group_replication_start_on_boot#loose_group_replication_start_on_bootg                                                           etcmy.cnf
  sed -i ^#loose_group_replication_bootstrap_group[[space]]s#loose_group_replication_bootstrap_group#loose_group_replication_bootstrap_groupg                                                     etcmy.cnf
  sed -i ^#loose_group_replication_consistency[[space]]s#loose_group_replication_consistency#loose_group_replication_consistencyg                                                                 etcmy.cnf
  sed -i ^#loose_group_replication_flow_control_applier_threshold[[space]]s#loose_group_replication_flow_control_applier_threshold#loose_group_replication_flow_control_applier_thresholdg        etcmy.cnf
  sed -i ^#loose_group_replication_flow_control_certifier_threshold[[space]]s#loose_group_replication_flow_control_certifier_threshold#loose_group_replication_flow_control_certifier_thresholdg  etcmy.cnf
  echo mysqlReplication is 0.
else
  echo !!!!!! ERROR, mysqlReplication 参数错误!
  echo !!!!!! ERROR, 程序退出!
  exit 1
fi

# 修改my.cnf权限
chown mysqlmysql etcmy.cnf

# 添加到环境变量
mysqlPath=$(echo PATH=$PATH${mysqlLnsDir}bin)
mysqlProfilePath=$(grep ${mysqlPath} etcprofile)

if [[ -n ${mysqlProfilePath} ]]; then
  echo etcprofile 已存在 echo PATH=$PATH${mysqlLnsDir}bin 内容.
else
  echo export PATH=$PATH${mysqlLnsDir}binetcprofile
  echo etcprofile 不已存在 echo PATH=$PATH${mysqlLnsDir}bin 内容, 已写入.
fi 

source etcprofile

# 初始化
${mysqlLnsDir}binmysqld --defaults-file=etcmy.cnf --initialize --user=mysql --initialize-insecure

# MySQL加到开机自启动并启动数据库
echo ########## MySQL加到开机自启动并启动数据库 ##########  

if [[ ! -f etcinit.dmysqld ]]; then 
  echo 文件 etcinit.dmysqld 不存在, 正在创建
else
  nowDate=$(date +%Y%m%d-%H%M-%S) 
  mv etcinit.dmysqld etcinit.dmysqld-${nowDate}
  echo 文件 etcinit.dmysqld已存在, 重命名为 etcinit.dmysqld-${nowDate}
fi 

osVersion=`uname -rcut -d . -f 4`
mysqlBinaryPackagePrefix=${mysqlBinaryPackage%.tar.}
cp ${mysqlInstallDir}${mysqlBinaryPackagePrefix}support-filesmysql.server etcinit.dmysqld
chmod +x etcinit.dmysqld

if [[ ${osVersion} = el5  ${osVersion} = el6 ]] ; then
  echo CentOS 6 系统
  echo 使用 etcinit.dmysqld start 启动 
  chkconfig add mysqld
  etcinit.dmysqld start  
elif [[ ${osVersion} = el7  ${osVersion} = el8 ]] ; then

echo CentOS 7 系统
echo 使用 systemctl start mysqld 启动
# 配置systemd
cat etcsystemdsystemmysqld.serviceEOF 
[Unit]
Description=MySQL Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
TimeoutSec=0
PermissionsStartOnly=true
ExecStart=usrlocalmysqlbinmysqld --defaults-file=etcmy.cnf --daemonize
LimitNOFILE = 65535
Restart=on-failure
RestartSec=10
RestartPreventExitStatus=1
PrivateTmp=false
EOF

sed -i ^ExecStarts@usrlocalmysql@${mysqlLnsDir}@g  etcsystemdsystemmysqld.service
chmod +x etcsystemdsystemmysqld.service

# 重载 systemctl units
systemctl daemon-reload

# 设置开机自启动
systemctl enable mysqld.service

# 启动mysqld
systemctl start mysqld

else
  echo !!!!!! ERROR, 只支持CentOS 5/6/7/8 !
  echo !!!!!! ERROR, 程序退出!
  exit 1
fi

}

# 操作系统环境检查
check_os_environment

# 开始安装
install_MySQL

echo 安装完毕.

 

posted @ 2021-02-01 10:31  屠魔的少年  阅读(6)  评论(0)    收藏  举报