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,图中我用红色圈出来的部分
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 | grep -v libs | 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 = 5" >> /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 mysql useradd -r -g mysql -s /bin/false mysql # 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 # 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 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 "mysql db user root initial password is 'root'" echo "$(date +"%Y%m%d %H:%M:%S") install mysql complete...." exit 0
3. 准备my.cnf文件
由于我这个是测试环境,所以内存值调的比较小,生产上面可以将下面几个个参数进行调整
innodb_buffer_pool_size # buffer pool大小,一般设置成物理内存 * 60%
innodb_max_undo_log_size # undo表空间大小
innodb_log_file_size # redo日志大小
[client] port = 3306 socket = /opt/mydata/data/mysql.sock [mysql] prompt="(\\u@\\h)[\\d]> " [mysqld] # basic settings # server-id = 128 user = mysql 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 character_set_server = utf8mb4 transaction_isolation = READ-COMMITTED explicit_defaults_for_timestamp = 1 max_allowed_packet = 1024M lower_case_table_names = 1 secure_file_priv = '' open_files_limit = 65535 # connection # skip_name_resolve = 1 max_connections = 1000 max_user_connections = 1000 max_connect_errors = 1000000 thread_cache_size = 512 # memory && myisam # max_heap_table_size = 128M tmp_table_size = 128M join_buffer_size = 16M key_buffer_size = 64M bulk_insert_buffer_size = 16M myisam_sort_buffer_size = 64M myisam_max_sort_file_size = 6G myisam_recover_options = DEFAULT # log settings # log_error = /opt/mydata/log/error.log log_timestamps = SYSTEM slow_query_log_file = /opt/mydata/log/slowquery.log slow_query_log = 1 long_query_time = 10 log_queries_not_using_indexes = 1 log_throttle_queries_not_using_indexes = 10 min_examined_row_limit = 100 log_slow_admin_statements = 1 log-bin = /opt/mydata/log/binlog/mysql-bin binlog_format = row expire_logs_days = 30 binlog_rows_query_log_events = 1 binlog_row_image = minimal binlog_cache_size = 8M max_binlog_cache_size = 4G max_binlog_size = 2G log_bin_trust_function_creators = 1 # innodb settings # innodb_data_file_path = ibdata1:1024M:autoextend innodb_buffer_pool_size = 300M innodb_lock_wait_timeout = 10 innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 innodb_flush_method = O_DIRECT innodb_flush_neighbors = 0 innodb_undo_directory = /opt/mydata/log/undo innodb_undo_tablespaces = 3 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 = 32M innodb_thread_concurrency = 16 innodb_print_all_deadlocks = 1 innodb_sort_buffer_size = 16M innodb_write_io_threads = 4 innodb_read_io_threads = 8 innodb_rollback_on_timeout = 1 innodb_file_per_table = 1 innodb_open_files = 65535 innodb_stats_persistent_sample_pages = 64 innodb_autoinc_lock_mode = 2 # Slave # relay-log = /opt/mydata/log/relaybin/slave-relay-bin log_slave_updates = 1 relay_log_purge = 1 relay_log_space_limit = 30G relay_log_recovery = 1 relay_log_info_repository = TABLE skip-slave-start [mysqldump] default_character_set = utf8mb4
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. 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的帮助。