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 toinstallmysql 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 relatedfile
echo "$(date +"%Y%m%d %H:%M:%S") start to check mysql related file...."# checkif there is mysql installbinary 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!"exit1
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# checkif there is my.cnf incurrent 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!"exit1
fi# checkif 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!"exit1
fi# checkif there is /opt/mydata insystem or not
cnt4=`find / -maxdepth 1 -name 'opt' -type d | wc -l`if [ $cnt4 -eq 1 ]; thencnt5=`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!"exit1
fi
fi
echo "$(date +"%Y%m%d %H:%M:%S") mysql related file is ok...."# check mysql userid mysql &> /dev/null
if [ $? -eq 0 ]; then
echo "mysql user is alreay exist, please delete it first!"exit1
fi# prepareinstallmysqlecho "$(date +"%Y%m%d %H:%M:%S") start prepare install mysql...."#clearold version
rpm-qa | grep -i mysql | grep -v libs | xargs rpm -ev --nodeps &> /dev/null#installrequired packageyum install -y libaio &> /dev/null#if the package is not installcorrectly, terminate the script.
cnt6=`rpm -qa | grep libaio | wc -l`if [ $cnt6 -lt 1 ]; then
echo "libaio package is not install, please check!"exit1
fi# adjust some parameterin /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 parameterin /etc/sysctl.confecho "vm.swappiness = 5" >> /etc/sysctl.conf
sysctl-p &> /etc/null# turn off firewall/etc/init.d/iptables stop &> /etc/nullchkconfig iptables offsed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# move my.cnf to/etcmv my.cnf /etc/# add user mysql
groupadd mysql
useradd-r -g mysql -s /bin/falsemysql
# prepare directorymkdir -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_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...."# startinstallmysqlecho "$(date +"%Y%m%d %H:%M:%S") start install mysql...."cd mysql
bin/mysqld --initialize --user=mysqlif [ $? -ne 0 ]; then
echo "mysql initialize failed, please check the error log!"exit1
fibin/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!"exit1
fi
cp support-files/mysql.server /etc/init.d/mysql
#waitmysql startup
cnt7=`ps -ef | grep mysqld | grep -v grep | wc -l`while [ $cnt7 -lt 2]do
sleep 3cnt7=`ps -ef | grep mysqld | grep -v grep | wc -l`done#wait 10s for mysql startup completly and thenchange 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 "mysql db user root initial password is 'root'"
echo "$(date +"%Y%m%d %H:%M:%S") install mysql complete...."exit0
View Code
3. 准备my.cnf文件
由于我这个是测试环境,所以内存值调的比较小,生产上面可以将下面几个个参数进行调整
innodb_buffer_pool_size # buffer pool大小,一般设置成物理内存 * 60%
innodb_max_undo_log_size # undo表空间大小
innodb_log_file_size # redo日志大小
[client]
port= 3306socket= /opt/mydata/data/mysql.sock
[mysql]
prompt="(\\u@\\h)[\\d]>"[mysqld]
# basic settings #
server-id = 128user=mysql
port= 3306basedir= /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= 1max_allowed_packet=1024M
lower_case_table_names= 1secure_file_priv= ''open_files_limit= 65535# connection #
skip_name_resolve= 1max_connections= 1000max_user_connections= 1000max_connect_errors= 1000000thread_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= 1long_query_time= 10log_queries_not_using_indexes= 1log_throttle_queries_not_using_indexes= 10min_examined_row_limit= 100log_slow_admin_statements= 1log-bin = /opt/mydata/log/binlog/mysql-bin
binlog_format=row
expire_logs_days= 30binlog_rows_query_log_events= 1binlog_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= 10innodb_io_capacity= 4000innodb_io_capacity_max= 8000innodb_flush_method=O_DIRECT
innodb_flush_neighbors= 0innodb_undo_directory= /opt/mydata/log/undo
innodb_undo_tablespaces= 3innodb_undo_log_truncate= 1innodb_max_undo_log_size=2G
innodb_log_group_home_dir= /opt/mydata/log/redo
innodb_log_file_size=1G
innodb_log_files_in_group= 4innodb_log_buffer_size=32M
innodb_thread_concurrency= 16innodb_print_all_deadlocks= 1innodb_sort_buffer_size=16M
innodb_write_io_threads= 4innodb_read_io_threads= 8innodb_rollback_on_timeout= 1innodb_file_per_table= 1innodb_open_files= 65535innodb_stats_persistent_sample_pages= 64innodb_autoinc_lock_mode= 2# Slave #
relay-log = /opt/mydata/log/relaybin/slave-relay-bin
log_slave_updates= 1relay_log_purge= 1relay_log_space_limit=30G
relay_log_recovery= 1relay_log_info_repository=TABLE
skip-slave-start
[mysqldump]
default_character_set= utf8mb4
View Code
4. 执行脚本,并查看输出
[root@mysqltest ~]# pwd
/root
[root@mysqltest~]# ll
total629768
-rw-r--r--. 1 root root 2693 Apr 8 16:19my.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 fileis ok....20190408 16:22:32 start prepare installmysql....20190408 16:24:22 prepare installmysql is ok....20190408 16:24:22 start installmysql....
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 serverinplain 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 connectionid 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 its
affiliates. Other names may be trademarks of their respective
owners.
Type'help;' or '\h' for help. Type '\c' to clearthe 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的帮助。