MySQL系列之一鍵安裝腳本—-單實例/多實例

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1440414

      最近在搞MySQL,由于經常測試一些東西。因此,就寫了一個一鍵安裝腳本。


腳本用途:

用于在CentOS/RHEL 6.x系統上快速部署出Mysql的單實例或者多實例環境

腳本說明:

該腳本運行情況良好
針對腳本中,每一步命令執行的正誤判斷以及提醒非常醒目,可協助執行者快速定位錯誤源
腳本諸多內容都以聲明變量,增加了腳本的靈活性和擴展性
腳本以做模塊化處理,對應功能對應函數,方便SA快速更改和了解該腳本

該腳本使用注意事項:

1、能夠通公網或者mysql源碼包已經放置到/usr/local/src目錄下
2、本腳本運行環境要求yum源已經配好
3、注意使用的mysql版本,為了穩定期間,本腳本暫穩定支持5.5以后的mysql源碼包。本腳本默認使用5.6.16版本的源碼包。如果你需要使用其它版本,請更改MYSQL_SOFT變量以及源碼包的下載路徑
4、mysql安裝默認位置為/usr/local/mysql,如需更改請自行修改INSTALL_PATH變量
5、由于我基本每條命令都有做注釋,因此其它一些參數的修改,請自己研究,此處不再啰嗦
6、系統環境要求CentOS/RHEL 6.x版本

以下為腳本內容:

#!/bin/bash
#
# The script used in CentOS/RHEL 6. X system automatically deploy mysql single instance and multiple instances of the environment
# Written by sunsky
# Mail : nolinux@126.com
# QQ   : 274546888
# Date : 2014-7-19 14:23:00
#
. /etc/init.d/functions
 
tac () {
if [ $? == 0 ];then
action '' /bin/true
else
action '' /bin/false
fi
}
 
pre_instance () {
echo '  -- Add MySQL User<1>'
useradd -r -u 306 mysql;tac
echo '  -- Install Some Packages<1>'
yum install wget make cmake gcc gcc-c++ ncurses ncurses-devel perl -y &> /dev/null;tac
echo '  -- Downloading MySQL<2>' 
cd /usr/local/src;tac
#wget http://cdn.mysql.com/Downloads/MySQL-5.6/${MYSQL_SOFT}.tar.gz;tac
echo '  -- Unpack the source code package<2>'
tar -zxf /usr/local/src/${MYSQL_SOFT}.tar.gz -C /usr/local/src/;tac
cd /usr/local/src/${MYSQL_SOFT};tac
echo '  -- Install MySQL<3>'
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PATH -DINSTALL_DATADIR=$DATA_DIR -DDEFAULT_CHARSET=utf8 -DWITH_EXTRA_CHARSETS=all -DMYSQL_USER=mysql -DDEFAULT_COLLATION=utf8_general_ci &> /dev/null;tac
make &>/dev/null;tac
make install &> /dev/null;tac
echo '  -- Change the directory owner and group<1>'
chown -R mysql.mysql /usr/local/mysql;tac
echo '  -- Create my.cnf<1>'
echo |cp /usr/local/src/${MYSQL_SOFT}/support-files/my-default.cnf /etc/my.cnf ;tac
echo '  -- Create Mysqld Scripts<2>'
echo |cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld;tac
chmod +x /etc/init.d/mysqld;tac
#echo '  -- Start Mysqld Service Test<1>'
#sleep 3
#/etc/init.d/mysqld start > /dev/null;tac
#echo '  -- View MySQL Database Status<1>'
#/etc/init.d/mysqld status | grep "SUCCESS" > /dev/null;tac
#if [ $? == 0 ];then action '  -- MySQL Install Done!' /bin/true;else action '  -- MySQL Install Failed!' false;fi
#action '  -- MySQL Command Global Path<2>'
#echo 'export PATH=/usr/local/mysql/bin/:$PATH' >> /etc/profile;tac
#sleep 1
#source /etc/profile;tac
}
 
single_instance () {
echo '   -- Initialized MySQL database, the default port 3306<1>'
$INIT_DB --datadir=$DATA_DIR &> /dev/null;tac 
echo '   -- Start Mysqld Service Test<1>'
/etc/init.d/mysqld start > /dev/null;tac
echo '   -- View MySQL Database Status<1>'
/etc/init.d/mysqld status | grep "SUCCESS" > /dev/null;tac
if [ $? == 0 ];then action '   -- MySQL Install Done!' /bin/true;else action '   -- MySQL Install Failed!' false;fi
action '   -- MySQL Command Global Path<2>'
echo 'export PATH=/usr/local/mysql/bin/:$PATH' >> /etc/profile;tac
sleep 1
source /etc/profile;tac
}
 
single_of_multiple () {
action '    -- Add Mysqld_Multi User<2>'
user="mysql";tac
password="sunsky";tac
action '    -- Stop MySQL Database<1>'
/etc/init.d/mysqld stop &> /dev/null;tac
action "    -- Mysqld_multi Configure<2>"
sed -i 's/^[^#]/#/g' /etc/my.cnf;tac
cat > /etc/my.cnf << EOF
[mysqld_multi] 
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = $user 
password = $password 
 
[mysqld3306]
server-id = 1
port = 3306
socket = /tmp/mysql3306.sock
pid-file = /tmp/mysql3306.pid
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
key_buffer_size = 16k
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
 
EOF
tac
echo '    -- prepare my_default_print<1>'
echo | cp /usr/local/mysql/bin/my_print_defaults /usr/bin/;tac
sleep 1
action "    -- Initialize multiple instance of the 3306 instance<1>"
echo '    -- Start multiple instances of the 3306 instance<1>'
$MULTI_DB 3306;tac
sleep 5
action "    -- Examples of 3306 authorized users<1>"
$MYSQL_DB -S /tmp/mysql3306.sock -e "grant shutdown on *.* to '$user'@'%' identified by '$password';";tac
action "    -- Instance 3306 has user and password to shutdown<1>"
}
 
multiple_instances () {
user="mysql"
password="sunsky"
for port in $*;do
 netstat -lntp | grep $port &> /dev/null
 if [ $? -eq 0 ];then
  action "    -- Instance $port is running<1>" 
 else
  cat /etc/my.cnf | grep mysqld${port} > /dev/null
  if [ $? -eq 0 ];then
   echo "    -- $port instance is already exists,please input other port number!"
   $MULTI_DB $port && action "   -- Instance $port open to complete" /bin/true || action "   -- Instance $port open failed" /bin/false
  else
cat >> /etc/my.cnf << EOF
[mysqld${port}]
server-id = $[${port}%3305]
port = ${port}
socket = /tmp/mysql${port}.sock
pid-file = /tmp/mysql${port}.pid
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data${port}
key_buffer_size = 16k
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
EOF
echo "    -- Create $port Instance Datadir<2>"
  mkdir -p ${DATA_DIR}${port};tac
  chown -R mysql.mysql ${DATA_DIR}${port};tac
echo "    -- Initialize multiple instance of the $port instance<1>"
  $INIT_DB --datadir=${DATA_DIR}${port} &> /dev/null ;tac 
echo "    -- Start multiple instances of the $port instance<1>"
  $MULTI_DB $port && action "    -- Instance $port open to complete" || action "    -- Instance $port open failed";tac
echo "    -- Examples of $port authorized users"
  sleep 3
  $MYSQL_DB -S /tmp/mysql${port}.sock -e "grant shutdown on *.* to '$user'@'localhost' identified by '$password';"&& action "    -- Instance $port has user and password to shutdown" /bin/true|| action "    -- Instance $port has user and password to shutdown" /bin/false
 fi
fi
done
}
  
# MySQL Install Path 
INSTALL_PATH='/usr/local/mysql'
# MySQL DATA_DR
DATA_DIR="$INSTALL_PATH/data"
# MySQL Command Path
INSTALL_DB="$INSTALL_PATH/scripts/mysql_install_db"
MYSQL_DB="$INSTALL_PATH/bin/mysql"
MYSQL_MULTI="$INSTALL_PATH/bin/mysqld_multi"
INIT_DB="$INSTALL_DB --user=mysql --basedir=$INSTALL_PATH --defaults-file=/etc/my.cnf"
MULTI_DB="$MYSQL_MULTI --defaults-file=/etc/my.cnf start"
MYSQL_SOFT='mysql-5.6.16'
  
case $# in
0)
cat << EOF
The system administrator, hello!
 
This is a key to install mysql single instance and multiple instances of the script
You can use the name in the script with the upper slogans, to define several instances installed!
 
Example:
[root@sunsky ~]# bash auto_install_mysql_instance.Sh 3306 3307
Install two mysql instance, port Numbers 3306 and 3307 respectively.
 
If you are familiar with shell, are free to change the script!If you are not familiar with, please do not change!
EOF
;;
1)
echo '> Now begin to single instance database initialization'
echo '>> STEP ONE : Prepare the MySQL Environment'
pre_instance
echo '>>> STEP TWO : Install the MySQL single instance'
single_instance
echo '>>>> SETP THREE : MySQL single instance installation is complete!';;
*)
echo '> Now start multi-instance database initialization'
echo '>> STEP ONE : Prepare the MySQL Environment'
pre_instance
single_instance
echo '>>> STEP TWO : Install the MySQL single of multiple instance'
single_of_multiple
echo '>>>> STEP THREE : Install the MySQL others of multiple instance'
multiple_instances $*
echo '>>>>> SETP FOUR : MySQL multiple instance installation is complete'
;;
esac

以上就是腳本的內容,該腳本主體為5個函數組,分別是tac、pre_instance、single_instance、single_of_multiple和multiple_instances。

tac負責做腳本中命令執行的正誤判斷,方便定位錯誤源
pre_instance負責準備mysql安裝的環境,比如用戶創建、相關工具安裝、mysql源碼包準備、mysql軟件安裝等
single_instance負責初始化單實例數據庫
single_of_multiple負責多實例環境下,對純單實例的實例做修改
multiple_instances負責創建多實例環境

腳本中間聲明了若干變量,這里不做介紹!

下面一個case語句用來調度執行我們整個腳本。如果你直接執行腳本,什么都不跟的話,默認會顯示出幫助信息。

幫助信息如下:

1.jpg

下面我列舉,正常安裝單實例

2.jpg

正常多實例安裝

3.jpg

4.jpg

希望該腳本能對大家有所幫助!

如果發現腳本里面有什么欠妥當的地方,請及時告知我!謝謝!

轉自:http://nolinux.blog.51cto.com/4824967/1440414

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/1956

(1)
s19930811s19930811
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • 數據結構-棧和隊列

    1.棧 1.1 棧的定義 棧是一種特殊的線性表。其特殊性在于限定插入和刪除數據元素的操作只能在線性表的一端進行。如下所示: 結論:后進先出(Last In First Out),簡稱為LIFO線性表。 棧的基本運算有六種: 構造空棧:InitStack(S)、 判??? StackEmpty(S)、 判棧滿: StackFull(S)、 …

    Linux干貨 2015-04-07
  • 第5周

    第5周 1.顯示當前系統上root,fedora或user1用戶的默認shell。 [root@node1 ~]# grep -E “^(root|fedora|user1)\>” /etc/passwd | cut -d: -f 7 /bin/bash /bin/bash /bin/bash [root@node1 ~]# grep “^\(root…

    Linux干貨 2017-07-27
  • locate,find文件查找

    locate | find *** locate 路徑中包含字符串 即匹配;      -n#     指定顯示結果前幾個      -b      只匹配路徑名中的基名      &nbs…

    Linux干貨 2016-08-15
  • Linux下如何使用sendEmail來發送郵件

    1)什么是sendEmail sendEmail是一個輕量級,命令行的SMTP郵件客戶端(注意,不要跟sendmail混淆了)。如果你需要使用命令行發送郵件,那么sendEmail是非常完美的選擇:使用簡單并且功能強大,從此以后你就愛上了它。 2)安裝sendEmail [root@zabbix ~]# wget http://…

    系統運維 2016-07-29
  • M20-1 8月5日 文本查看工具以及文本處理工

    一、文本查看工具:  cat,tac,rev cat用法:cat [option]..[FILE]..   cat選項:    -E:顯示行結束符$    -n:對顯示出的每一行進行編號    -A:顯示所有控制符    -b:非空行編號   &nb…

    Linux干貨 2016-08-08
  • 學習宣言

    我的人生宣言:做人要學到老,活到老,最重要的玩到老啊。人的一生真的太短了,要做我們喜歡的事情,趁自己年輕的時候吧!行動吧!加油?。?/p>

    Linux干貨 2016-12-26
欧美性久久久久