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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#!/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 fileecho "$(date +"%Y%m%d %H:%M:%S") start to check mysql related file...."# check if there is mysql install binary package or notcnt1=`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 1elif [ $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 1fi# check if there is my.cnf in current directory or notcnt2=`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 1fi# check if there is my.cnf in /etc or notcnt3=`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 1fi# check if there is /opt/mydata in system or notcnt4=`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 fifiecho "$(date +"%Y%m%d %H:%M:%S") mysql related file is ok...."# check mysql userid mysql &> /dev/nullif [ $? -eq 0 ]; then echo "mysql user is alreay exist, please delete it first!" exit 1fi# prepare install mysqlecho "$(date +"%Y%m%d %H:%M:%S") start prepare install mysql...."# clear old versionrpm -qa | grep -i mysql | xargs rpm -ev --nodeps &> /dev/null# install required packageyum 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 1fi # adjust some parameter in /etc/security/limits.confecho "mysql soft nproc 16384" >> /etc/security/limits.confecho "mysql hard nproc 16384" >> /etc/security/limits.confecho "mysql soft nofile 65536" >> /etc/security/limits.confecho "mysql hard nofile 65536" >> /etc/security/limits.confecho "mysql soft stack 1024000" >> /etc/security/limits.confecho "mysql hard stack 1024000" >> /etc/security/limits.conf# adjust some parameter in /etc/sysctl.confecho "vm.swappiness = 10" >> /etc/sysctl.conf sysctl -p &> /etc/null # turn off firewall/etc/init.d/iptables stop &> /etc/nullchkconfig iptables off sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config# move my.cnf to /etcmv my.cnf /etc/# add user mysqlgroupadd -g 600 mysqluseradd -u 600 -g mysql mysqlecho "mysql" | passwd --stdin mysql &> /etc/null# prepare directory mkdir -p /opt/mydata/datamkdir -p /opt/mydata/log/binlogmkdir -p /opt/mydata/log/redomkdir -p /opt/mydata/log/undomkdir -p /opt/mydata/log/relaybinmkdir -p /opt/mydata/tmpchown -R mysql:mysql /opt/mydata# add path to profileecho 'export PATH=$PATH:/usr/local/mysql/bin' >> /root/.bash_profileecho 'export PATH=$PATH:/usr/local/mysql/bin' >> /home/mysql/.bash_profile# unpackage mysqlrm -rf /usr/local/mysql-*-linux-glibc2.12-x86_64 mysqltar -zxvf mysql-*-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ &> /etc/nullcd /usr/local/ln -s mysql-*-linux-glibc2.12-x86_64 mysqlecho "$(date +"%Y%m%d %H:%M:%S") prepare install mysql is ok...."# start install mysqlecho "$(date +"%Y%m%d %H:%M:%S") start install mysql...."cd mysql./bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestampif [ $? -ne 0 ]; then echo "mysql initialize failed, please check the error log!" exit 1fi./bin/mysql_ssl_rsa_setup &> /dev/nullchmod +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 1ficp support-files/mysql.server /etc/init.d/mysql# wait mysql startupcnt7=`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 passwordsleep 10pass=`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
3. 准备my.cnf文件
由于我这个是测试环境,所以内存值调的比较小,生产上面可以将下面两个参数进行调整
innodb_buffer_pool_size = 物理内存 * 60%innodb_buffer_pool_instances = innodb_buffer_pool_size/128m,个人觉得不需要设太大,16即可![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
[client]port = 3306socket = /opt/mydata/data/mysql.sock[mysql]prompt="(\\u@\\h)[\\d]> "[mysqld]# basic settings #port = 3306basedir = /usr/local/mysqldatadir = /opt/mydata/datatmpdir = /opt/mydata/tmppid-file = /opt/mydata/data/mysql.pidsocket = /opt/mydata/data/mysql.sockuser = mysqlcharacter_set_server = utf8mb4transaction_isolation = READ-COMMITTEDexplicit_defaults_for_timestamp = 1max_allowed_packet = 1024Mevent_scheduler = 1lower_case_table_names = 1max_heap_table_size = 256Mthread_cache_size = 512secure_file_priv = ''# connection #skip_name_resolve = 1max_connections = 1000max_user_connections = 1000 max_connect_errors = 1000000# session memory setting #read_buffer_size = 8Mread_rnd_buffer_size = 4Msort_buffer_size = 4Mtmp_table_size = 128Mjoin_buffer_size = 8M# log settings #log_error = /opt/mydata/log/error.logslow_query_log = 1long_query_time = 10slow_query_log_file = /opt/mydata/log/slowquery.loglog_queries_not_using_indexes = 1log_throttle_queries_not_using_indexes = 10min_examined_row_limit = 100log_slow_admin_statements = 1expire_logs_days = 30binlog_rows_query_log_events = 1binlog_row_image = minimalbinlog_cache_size = 4Mmax_binlog_cache_size = 4Gmax_binlog_size = 2Glog_bin_trust_function_creators = 1log_timestamps = SYSTEM# innodb settings #innodb_data_file_path = ibdata1:1024M:autoextendinnodb_buffer_pool_size = 300Minnodb_buffer_pool_instances = 2innodb_lock_wait_timeout = 10innodb_io_capacity = 4000innodb_io_capacity_max = 8000innodb_flush_method = O_DIRECTinnodb_undo_directory = /opt/mydata/log/undoinnodb_undo_tablespaces = 3innodb_flush_neighbors = 0innodb_undo_log_truncate = 1innodb_max_undo_log_size = 2Ginnodb_log_group_home_dir = /opt/mydata/log/redoinnodb_log_file_size = 1Ginnodb_log_files_in_group = 4innodb_log_buffer_size = 8Minnodb_thread_concurrency = 16innodb_print_all_deadlocks = 1innodb_sort_buffer_size = 4Minnodb_write_io_threads = 4 innodb_read_io_threads = 8 innodb_rollback_on_timeout = 1innodb_file_per_table = 1innodb_stats_persistent_sample_pages = 64innodb_autoinc_lock_mode = 2# MyISAM #key_buffer_size = 64Mbulk_insert_buffer_size = 16Mmyisam_sort_buffer_size = 64Mmyisam_max_sort_file_size = 6Gmyisam_recover_options = DEFAULT# Master #server-id = 128log-bin = /opt/mydata/log/binlog/mysql-binbinlog_format = ROW# Slave #relay-log = /opt/mydata/log/relaybin/slave-relay-binreplicate_wild_ignore_table = mysql.%log_slave_updates = 1relay_log_purge = 1relay_log_space_limit = 30Grelay_log_recovery = 1relay_log_info_repository = TABLE[mysqld_safe]user = mysqlopen_files_limit = 8192[mysqldump]default_character_set = utf8mb4
4. 执行脚本,并查看输出
[root@mysqltest ~]# pwd/root[root@mysqltest ~]# lltotal 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 -prootmysql: [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 5Server 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 itsaffiliates. Other names may be trademarks of their respectiveowners.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' failederror: '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的帮助