Mysql5.7 - 一键安装脚本

0. 概述

最近鼓捣出了一个mysql安装脚本,将该脚本,mysql的my.cnf文件,mysql的安装包这三个文件放在同一个目录下面,执行sh mysql-auto-install.sh就可以完成mysql的一键安装,是不是很方便呢。

 

1. 准备mysql的安装包

mysql的安装包下载地址:https://dev.mysql.com/downloads/mysql/
注意需要下载的是linux GA版本 64bit,图中我用红色圈出来的部分

Mysql5.7 - 一键安装脚本_第1张图片

 

2. 准备mysql-auto-install.sh

#!/bin/sh
# author: yang bao
# time: 2019-04-08 
# note: this script is used to install mysql on a new machine.
# 1. at first, you should prepare mysql install binary package like 'mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz' 
# and mysql-auto-install.sh and my.cnf under same directory such as /root.
# 2. then exec 'sh mysql-auto-install.sh' and see the output.

# prepare mysql related file
echo "$(date +"%Y%m%d %H:%M:%S") start to check mysql related file...."
# check if there is mysql install binary package or not
cnt1=`find . -maxdepth 1 -name 'mysql-*-linux-glibc2.12-x86_64.tar.gz' -type f | wc -l`
if [ $cnt1 -lt 1 ]; then
    echo "It seems there isn't mysql install binary package in current directory!"
    exit 1
elif [ $cnt1 -gt 1 ]; then
    echo "It seems there are too many mysql install binary packages in current directory,\
    please just keep one, rename or move the others!"
    exit 1
fi

# check if there is my.cnf in current directory or not
cnt2=`find . -maxdepth 1 -name 'my.cnf' -type f | wc -l`
if [ $cnt2 -lt 1 ]; then
    echo "It seems there isn't my.cnf in current directory!"
    exit 1
fi

# check if there is my.cnf in /etc or not
cnt3=`find /etc -maxdepth 1 -name 'my.cnf' -type f | wc -l`
if [ $cnt3 -eq 1 ]; then
    echo "It seems there is my.cnf in /etc already, please delete it first!"
    exit 1
fi

# check if there is /opt/mydata in system or not
cnt4=`find / -maxdepth 1 -name 'opt' -type d | wc -l`
if [ $cnt4 -eq 1 ]; then
    cnt5=`find /opt -maxdepth 1 -name 'mydata' -type d | wc -l`
    if [ $cnt5 -eq 1 ]; then
        echo "It seems there is /opt/mydata already, please delete it first!"
        exit 1
    fi
fi
echo "$(date +"%Y%m%d %H:%M:%S") mysql related file is ok...."

# check mysql user
id mysql &> /dev/null
if [ $? -eq 0 ]; then
    echo "mysql user is alreay exist, please delete it first!"
    exit 1
fi

# prepare install mysql
echo "$(date +"%Y%m%d %H:%M:%S") start prepare install mysql...."
# clear old version
rpm -qa | grep -i mysql | xargs rpm -ev --nodeps &> /dev/null

# install required package
yum install -y libaio &> /dev/null

# if the package is not install correctly, terminate the script.
cnt6=`rpm -qa | grep libaio | wc -l`
if [ $cnt6 -lt 1 ]; then
    echo "libaio package is not install, please check!"
    exit 1
fi
    
# adjust some parameter in /etc/security/limits.conf
echo "mysql    soft    nproc    16384" >> /etc/security/limits.conf
echo "mysql    hard    nproc    16384" >> /etc/security/limits.conf
echo "mysql    soft    nofile    65536" >> /etc/security/limits.conf
echo "mysql    hard    nofile    65536" >> /etc/security/limits.conf
echo "mysql    soft    stack    1024000" >> /etc/security/limits.conf
echo "mysql    hard    stack    1024000" >> /etc/security/limits.conf

# adjust some parameter in /etc/sysctl.conf
echo "vm.swappiness = 10" >> /etc/sysctl.conf 
sysctl -p &> /etc/null
    
# turn off firewall
/etc/init.d/iptables stop &> /etc/null
chkconfig iptables off 
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# move my.cnf to /etc
mv my.cnf /etc/

# add user mysql
groupadd -g 600 mysql
useradd -u 600 -g mysql mysql
echo "mysql" | passwd --stdin mysql &> /etc/null

# prepare directory 
mkdir -p /opt/mydata/data
mkdir -p /opt/mydata/log/binlog
mkdir -p /opt/mydata/log/redo
mkdir -p /opt/mydata/log/undo
mkdir -p /opt/mydata/log/relaybin
mkdir -p /opt/mydata/tmp
chown -R mysql:mysql /opt/mydata

# add path to profile
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /root/.bash_profile
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /home/mysql/.bash_profile

# unpackage mysql
rm -rf /usr/local/mysql-*-linux-glibc2.12-x86_64 mysql
tar -zxvf mysql-*-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ &> /etc/null
cd /usr/local/
ln -s mysql-*-linux-glibc2.12-x86_64 mysql

echo "$(date +"%Y%m%d %H:%M:%S") prepare install mysql is ok...."

# start install mysql
echo "$(date +"%Y%m%d %H:%M:%S") start install mysql...."
cd mysql
./bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp
if [ $? -ne 0 ]; then
    echo "mysql initialize failed, please check the error log!"
    exit 1
fi
./bin/mysql_ssl_rsa_setup &> /dev/null
chmod +r /opt/mydata/data/server-key.pem 
nohup bin/mysqld_safe --user=mysql &
if [ $? -ne 0 ]; then
    echo "mysql start failed, please check the error log!"
    exit 1
fi
cp support-files/mysql.server /etc/init.d/mysql

# wait mysql startup
cnt7=`ps -ef | grep mysqld | grep -v grep | wc -l`
while [ $cnt7 -lt 2 ]
    do
        sleep 3
        cnt7=`ps -ef | grep mysqld | grep -v grep | wc -l`
    done

# wait 10s for mysql startup completly and then change root password
sleep 10
pass=`grep "temporary password" /opt/mydata/log/error.log |awk -F " " '{print $11}'`
/usr/local/mysql/bin/mysqladmin -uroot -p$pass password 'root' 

echo "system user mysql initial password is 'mysql', mysql db user root initial password is 'root'"
echo "$(date +"%Y%m%d %H:%M:%S") install mysql complete...."
exit 0
View Code

 

3. 准备my.cnf文件

由于我这个是测试环境,所以内存值调的比较小,生产上面可以将下面两个参数进行调整
innodb_buffer_pool_size = 物理内存 * 60%
innodb_buffer_pool_instances = innodb_buffer_pool_size/128m,个人觉得不需要设太大,16即可

[client]
port = 3306
socket = /opt/mydata/data/mysql.sock

[mysql]
prompt="(\\u@\\h)[\\d]> "

[mysqld]
# basic settings #
port = 3306
basedir = /usr/local/mysql
datadir = /opt/mydata/data
tmpdir = /opt/mydata/tmp
pid-file = /opt/mydata/data/mysql.pid
socket = /opt/mydata/data/mysql.sock
user = mysql
character_set_server = utf8mb4
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
max_allowed_packet = 1024M
event_scheduler = 1
lower_case_table_names = 1
max_heap_table_size = 256M
thread_cache_size = 512
secure_file_priv = ''

# connection #
skip_name_resolve = 1
max_connections = 1000
max_user_connections = 1000 
max_connect_errors = 1000000

# session memory setting #
read_buffer_size = 8M
read_rnd_buffer_size = 4M
sort_buffer_size = 4M
tmp_table_size = 128M
join_buffer_size = 8M

# log settings #
log_error = /opt/mydata/log/error.log
slow_query_log = 1
long_query_time = 10
slow_query_log_file = /opt/mydata/log/slowquery.log
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 10
min_examined_row_limit = 100
log_slow_admin_statements = 1
expire_logs_days = 30
binlog_rows_query_log_events = 1
binlog_row_image = minimal
binlog_cache_size = 4M
max_binlog_cache_size = 4G
max_binlog_size = 2G
log_bin_trust_function_creators = 1
log_timestamps = SYSTEM

# innodb settings #
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_buffer_pool_size = 300M
innodb_buffer_pool_instances = 2
innodb_lock_wait_timeout = 10
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_undo_directory = /opt/mydata/log/undo
innodb_undo_tablespaces = 3
innodb_flush_neighbors = 0
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_log_group_home_dir = /opt/mydata/log/redo
innodb_log_file_size = 1G
innodb_log_files_in_group = 4
innodb_log_buffer_size = 8M
innodb_thread_concurrency = 16
innodb_print_all_deadlocks = 1
innodb_sort_buffer_size = 4M
innodb_write_io_threads = 4             
innodb_read_io_threads = 8 
innodb_rollback_on_timeout = 1
innodb_file_per_table = 1
innodb_stats_persistent_sample_pages = 64
innodb_autoinc_lock_mode = 2

# MyISAM #
key_buffer_size = 64M
bulk_insert_buffer_size = 16M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 6G
myisam_recover_options = DEFAULT

# Master #
server-id = 128
log-bin = /opt/mydata/log/binlog/mysql-bin
binlog_format = ROW

# Slave #
relay-log = /opt/mydata/log/relaybin/slave-relay-bin
replicate_wild_ignore_table = mysql.%
log_slave_updates = 1
relay_log_purge = 1
relay_log_space_limit = 30G
relay_log_recovery = 1
relay_log_info_repository = TABLE

[mysqld_safe]
user = mysql
open_files_limit = 8192

[mysqldump]
default_character_set = utf8mb4
View Code

 

4. 执行脚本,并查看输出

[root@mysqltest ~]# pwd
/root
[root@mysqltest ~]# ll
total 629768
-rw-r--r--. 1 root root      2693 Apr  8 16:19 my.cnf
-rw-r--r--. 1 root root 644862820 Mar 12 10:47 mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
-rw-r--r--. 1 root root      4859 Apr  8 16:21 mysql-auto-install.sh
[root@mysqltest ~]# sh mysql-auto-install.sh 
20190408 16:22:32 start to check mysql related file....
20190408 16:22:32 mysql related file is ok....
20190408 16:22:32 start prepare install mysql....
20190408 16:24:22 prepare install mysql is ok....
20190408 16:24:22 start install mysql....
nohup: appending output to `nohup.out'
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
system user mysql initial password is 'mysql', mysql db user root initial password is 'root'
20190408 16:25:06 install mysql complete....

 

5. 新开一个窗口登陆mysql

[root@mysqltest ~]# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.25-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

(root@localhost)[(none)]> 

登陆成功,表示mysql安装以及启动,密码修改都已经成功。

 

6. 总结

在写这个脚本的时候,开始都很顺利,到后面执行mysqladmin修改root密码的时候老报错
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/opt/mydata/data/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/opt/mydata/data/mysql.sock' exists!
询问了博客园大神ivictor[https://www.cnblogs.com/ivictor/]后,是因为我的mysql还没有起来,所以会报以上错误。因此我在脚本里面添加了sleep,等一段时间再修改密码。十分感谢ivictor的帮助

Mysql5.7 - 一键安装脚本_第2张图片

 

转载于:https://www.cnblogs.com/ddzj01/p/10678296.html

你可能感兴趣的:(Mysql5.7 - 一键安装脚本)