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