sh mysql5.7_install.sh -p root密码 -b buffer_cahce大小 例如2048M
#!/bin/bash#
# root用户 ##
## 关闭iptables,NetworkManager,Selinux
## 环境为 rhel7.5+mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
## 安装包路径/soft/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
if [ $(id -u) != "0" ]; then
echo "please use root to install"
exit 1
fi
clear
echo "############################################################################"
echo "###########################Auto install MYSQL 5.7###########################"
echo "############################################################################"
usage() { echo "Usage: $0 [-p <rootpassword default root1234>] [-b <bufferpool default half of memory>]" 1>&2; exit 1; }
while getopts ":b:p:" o; do
case $o in
p)
p=${OPTARG}
;;
b)
b=${OPTARG}
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
if [ -z "${b}" ] || [ -z "${p}" ]; then
p='root1234'
# bufferpool默认内存一半
b=`awk '($1 == "MemTotal:"){print $2/1024/2}' /proc/meminfo`
# 取整
b=`printf "%1.f\n" $b`M
fi
echo "Buffer pool size is ${b}"
echo "Mysql root password is ${p}"
# echo "d = ${d}"
cur_dir=$(pwd)
function CheckUser()
{
echo "############create mysql user and directory############"
ProcMysql=`ps -ef|grep mysql|grep -v grep|wc -l`
# 可能存在mariadb的rpm,需要先自己删
CommMysql=`command -v mysql|wc -l`
if [[ `id mysql &>/dev/null` ]] || [[ -d /mysql ]] || [[ $ProcMysql -ge 1 ]] || [[ $CommMysql -ge 1 ]]; then
echo "mysql user exists or /mysql exsits or mysql process is running"
read -n 1 -s -r -p "Press any key to delete mysql user | mysql directory | mysql process... or Press Ctrl+c to cancel"
echo ""
systemctl stop mysqld.service
ps -ef|grep mysql |grep -v grep|awk '{print $2}'|xargs kill -s 9
/usr/sbin/userdel -r mysql
rm -rf /usr/local/mysql
rm -rf /mysql
fi
}
function ConfirmConfig()
{
systemctl disable firewalld
systemctl disable avahi-dnsconfd
systemctl disable avahi-daemon
systemctl disable cups
systemctl disable postfix
systemctl disable smartd
systemctl stop firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
echo "mysql root password is ${p}"
echo "mysql buffer pool size is ${b}"
get_char()
{
Stty=`stty -g`
stty -echo
stty cbreak
stty -raw
stty -echo
stty $Stty
}
echo ""
read -n 1 -s -r -p "Press any key to start... or Press Ctrl+c to cancel"
echo ""
char=`get_char`
}
function SetLimits()
{
cd $cur_dir
if [ -s /etc/security/limit.conf ]; then
cp /etc/security/limit.conf /etc/security/limit.conf.`date +%Y%m%d%H%M%S`.bak
fi
cat >> /etc/security/limits.conf<<EOF
* soft nofile 131072
* hard nofile 131072
* soft memlock unlimited
* hard memlock unlimited
* soft core unlimited
* hard core unlimited
* soft nproc unlimited
* hard nproc unlimited
* soft stack unlimited
* hard stack unlimited
EOF
echo "###########Complete setup limits.conf###########"
sleep 2
}
function SetSysctl()
{
cd $cur_dir
if [ -s /etc/sysctl.conf ]; then
cp /etc/sysctl.conf /etc/sysctl.conf.`date +%Y%m%d%H%M%S`.bak
fi
cat >/etc/sysctl.conf<<EOF
kernel.msgmni = 2878
kernel.msgmnb = 65536
kernel.sem = 250 32000 100 142
kernel.shmmni = 4096
kernel.shmmax = 4398046511104
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
net.ipv4.ip_local_port_range = 9000 65500
vm.overcommit_memory = 0
vm.swappiness = 10
EOF
/sbin/sysctl -p >> /dev/null
echo "###########Complete setup sysctl.conf###########"
sleep 3
}
function InstallMySQL57()
{
cd $cur_dir
if [ -s /etc/my.cnf ]; then
mv /etc/my.cnf /etc/my.cnf.`date +%Y%m%d%H%M%S`.bak
fi
/usr/sbin/groupadd mysql -g 207
/usr/sbin/useradd -u 207 -g mysql mysql
mkdir -p /usr/local/mysql
mkdir -p /mysql/data
mkdir -p /mysql/logs
mkdir -p /mysql/binlog
mkdir -p /mysql/tmp
chown -R mysql:mysql /mysql/
rm -rf /soft/mysql-5.7.26-linux-glibc2.12-x86_64
cd /soft
tar zxvf /soft/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz >/dev/dull
mv /soft/mysql-5.7.26-linux-glibc2.12-x86_64/* /usr/local/mysql/
chown -R mysql:mysql /usr/local/mysql/
cp /usr/local/mysql/bin/* /usr/bin/
ipaddr=`ip a | grep -w inet | grep -v 127| awk '{ print $2 }' |awk -F '/' '{print $1}'`
serverid=`echo $ipaddr | awk -F '.' '{print $3$4}'`
host=`hostname`
cat >> /etc/hosts<<EOF
$ipaddr $host
EOF
cat >/etc/my.cnf <<EOF
[mysqld]
read_only = 0
show_compatibility_56 = 1
port = 3306
server_id = $serverid
user = mysql
basedir = /usr/local/mysql
datadir = /mysql/data
socket = /mysql/tmp/mysql.sock
tmpdir = /mysql/tmp
character_set_server = utf8mb4
transaction_isolation = READ-COMMITTED
event_scheduler = 1
default-time-zone = "+8:00"
log_timestamps = SYSTEM
explicit_defaults_for_timestamp = 1
secure_file_priv = ""
skip_slave_start = 1
skip_name_resolve = 1
skip_external_locking = 1
lower_case_table_names = 1
default_storage_engine = InnoDB
disabled_storage_engines = ARCHIVE,BLACKHOLE,EXAMPLE,FEDERATED,MEMORY,MERGE,NDB
# connection #
lock_wait_timeout = 1800
max_connections = 3000
max_connect_errors = 1000000
interactive_timeout = 1800
wait_timeout = 1800
# session memory setting #
read_buffer_size = 8M
read_rnd_buffer_size = 8M
sort_buffer_size = 2M
tmp_table_size = 64M
join_buffer_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 64M
# cache config #
key_buffer_size = 16M
table_definition_cache = 2000
table_open_cache = 2000
table_open_cache_instances = 8
query_cache_type = 0
query_cache_size = 0
thread_cache_size = 200
open_files_limit = 65536
binlog_cache_size = 1M
max_binlog_cache_size = 512M
# log config #
log_bin = /mysql/binlog/mysql-bin
binlog_format = row
sync_binlog = 1
binlog_error_action = ABORT_SERVER
max_binlog_size = 250M
binlog_rows_query_log_events = 1
expire_logs_days = 7
log_bin_trust_function_creators = 1
log_slave_updates = 1
relay_log = /mysql/binlog/mysql-relay
relay_log_recovery = 1
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_error = /mysql/logs/error.log
slow_query_log = 1
slow_query_log_file = /mysql/logs/slow.log
long_query_time = 5
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
min_examined_row_limit = 100
# innodb settings #
innodb_data_home_dir = /mysql/data
innodb_log_group_home_dir = /mysql/data
innodb_file_per_table = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_buffer_pool_size = $b
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_buffer_pool_dump_pct = 25
innodb_lock_wait_timeout = 10
innodb_io_capacity = 10000
innodb_io_capacity_max = 20000
innodb_max_dirty_pages_pct = 60
innodb_flush_method = O_DIRECT
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_log_buffer_size = 64M
innodb_purge_threads = 2
innodb_write_io_threads = 16
innodb_read_io_threads = 16
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 32M
innodb_stats_persistent_sample_pages = 64
innodb_autoinc_lock_mode = 2
innodb_online_alter_log_max_size = 1G
innodb_open_files = 4096
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:20G
# undo config #
innodb_rollback_segments = 128
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 4G
# GTID #
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_gtid_simple_recovery = 1
# MTS #
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 16
slave_preserve_commit_order = ON
slave_rows_search_algorithms = 'INDEX_SCAN,HASH_SCAN'
# SEMISYNC #
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled = 1
rpl_semi_sync_master_timeout = 60000 #1min
rpl_semi_sync_master_wait_for_slave_count = 1
rpl_semi_sync_master_wait_no_slave = 0
# Performance Schema Config #
performance-schema-instrument = 'wait/lock/metadata/sql/mdl=ON'
performance-schema-instrument = 'memory/%=COUNTED'
# Other #
innodb_numa_interleave = 1
[mysqldump]
quick
max_allowed_packet = 2G
log-error = /mysql/logs/dump.log
net_buffer_length = 8K
[mysqladmin]
default-character-set = utf8mb4
socket = /mysql/tmp/mysql.sock
[client]
port = 3306
socket = /mysql/tmp/mysql.sock
[mysql]
prompt = [\\u@\\h][\\d]:\\_
default-character-set = utf8mb4
no-auto-rehash
EOF
echo "############Initialize MYSQL Database############"
# 初始化mysql_install_db自MySQL 5.7.6起已弃用
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql --datadir=/mysql/data --basedir=/usr/local/mysql --initialize-insecure
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 2345 mysqld on
cat >> /etc/ld.so.conf.d/mysql-x86_64.conf<<EOF
/usr/local/mysql/lib
EOF
ldconfig
if [ -d "/proc/vz" ]; then
ulimit -s unlimited
fi
echo "############Initialize MYSQL Completed...############"
systemctl start mysqld.service
/usr/local/mysql/bin/mysqladmin -u root password $p > /dev/dull
# 创建监控用户,只读用户,复制用户
cat >> /tmp/mysql_sec_scripts<<EOF
use mysql;
delete from mysql.user where user !='root' or host !='localhost';
grant select,process,replication client on *.* to 'zabbix'@'%' identified by 'abcd1234';
grant select,process,replication client on *.* to 'zabbix'@'localhost' identified by 'abcd1234';
grant select on *.* to 'rdouser'@'%' identified by 'abcd1234';
grant select on *.* to 'rdouser'@'localhost' identified by 'abcd1234';
grant replication slave on *.* to 'repluser'@'%' identified by 'abcd1234';
grant replication slave on *.* to 'repluser'@'localhost' identified by 'abcd1234';
flush privileges;
EOF
/usr/local/mysql/bin/mysql -u root -p$p -h localhost </tmp/mysql_sec_scripts
rm -rf /tmp/mysql_sec_scripts
echo "#############MYSQL Install Completed###########"
echo "#############ctrl+c 结束安装#############"
}
function CheckInstall()
{
clear
echo "#############Install checking#############"
if [ -s /usr/local/mysql/bin/mysql ] && [ -s /usr/local/mysql/bin/mysqld_safe ] && [ -s /etc/my.cnf ]; then
echo "MYSQL 5.7 install completed"
ss -anutlp | grep 3306
else
echo "Error: /usr/local/mysql not found! Install Failed!!"
echo "You can check /root/mysql-install.log "
fi
}
##########################Step to install########################
CheckUser 2>&1 | tee -a /tmp/CheckUser.log
ConfirmConfig 2>&1 | tee -a /tmp/ConfirmConfig.log
SetLimits 2>&1 | tee -a /tmp/SetLimits.log
SetSysctl 2>&1 | tee -a /tmp/SetSysctl.log
InstallMySQL57 2>&1 | tee -a /tmp/InstallMySQL57.log
CheckInstall 2>&1 | tee -a /tmp/CheckInstall.log
