標籤:pass switch my.cnf 自己 啟動 lease warning dir har
最近這段時間,在看mysql,安裝了,也應用過,對於生產環境中,一般都選擇使用source code安裝,在安裝的時候可以自訂相關路徑和內容,對於生產環境來說更有效。相對於mysql 5.5的安裝,mysql 5.7的安裝大同小異,唯一的區別是5.7在安裝的時候,需要一個組件,boost,而且必須是1.59,版本高了也不行,所以下載的時候要注意。
在mysql官網下載的時候,提供兩種source code,一種是帶boost的,直接編譯安裝即可,一種是不帶boost的,需要自己下載boost來安裝。我們選擇使用不帶boost的版本,下載boost之後,將boost拷貝到/usr/local/boost目錄下,然後對mysql源碼進行解壓編譯。編譯的代碼為:
cmake .. -DCMAKE_INSTALL_PREFIX=/app/mysql_5.7.22 -DMYSQL_DATADIR=/app/mysql_5.7.22/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
整個編譯的過程是很長的,預設情況下,編譯的時候有指定basedir和datadir,這兩個路徑是預設的,在後續資料庫初始化的過程中,可以對不同的情況再定義。編譯完成後,就可以make && make install了。
如果是帶boost的源碼,也要指定DWITH_BOOST=../boost,這個是相對路徑
安裝完成後,需要對資料庫進行初始化,這個時候,可以設定初始化的datadir,後期的資料庫就應用在這個目錄中。在初始化過程中,相比於5.5有點區別,5.5初始化完成後,預設登入資料庫是不要求輸入密碼的。而在5.7,--initialize-insecure 和--initialize有兩個option,這兩個屬性有一個區別,就是在initialize時候,會為[email protected]產生一個隨機密碼,該密碼會寫到資料庫日誌中,通過grep log就可以得到該密碼,然後在登入的時候使用該密碼,登入進去之後,通過update進行修改,而--initialize-insecure在初始化的時候,跟5.5一樣,不會用root使用者產生密碼,直接空密碼就可以登入。
./mysqld --initialize-insecure --user=mysql --basedir=/app/mysql --datadir=/data/mysql57/3307/data/ --pid-file=/data/mysql57/3307/tmp/3307_pid --socket=/data/mysql57/3307/tmp/3307_socket
初始化的時候,指定了pid、socket等檔案位置,預設直接會在data目錄下,產生一個以主機名稱命名的log檔案,在初始化的時候,直接在螢幕上輸出了一段話,表示沒有密碼。
2018-07-05T00:14:59.891294Z 1 [Warning] [email protected] is created with an empty password ! Please consider switching off the --initialize-insecure option.
還是要注意,在整個mysql的basedir和datadir下,檔案的屬主和數組都要是mysql啟動使用者,也就是mysql.mysql。
由於是自訂來源碼安裝,mysql的啟動指令碼就沒法直接用了,想著自己寫一個指令碼,來控制這個mysql5.7的啟動和停止。下面是代碼內容。
BASEDIR=/app/mysqlBINDIR=$BASEDIR/binMYSQL_BIN=$BINDIR/mysqld_safeMYSQLADMIN=/usr/local/mysql/bin/mysqladminDATADIR=/data/mysql57/3307/dataMYCNF=/data/mysql57/3307/my.cnfPORT=3307SOCKET=`grep socket $MYCNF|grep $PORT|awk ‘{print $3}‘`usage(){ echo "$0 usage: {start|stop|reload}"}mysqld_start(){ if [ `ps -ef|grep "port=$PORT"|grep -v grep|wc -l` -ge 1 ] then echo "The MYSQL SERVER is running" else if [ -x $MYSQL_BIN ] && [ -f $MYCNF ] then $MYSQL_BIN --defaults-file=$MYCNF & 1>>/tmp/mysql.log 2>&1 echo $? >> /tmp/mysql.log sleep 2 [ `ps -ef|grep "port=$PORT"|grep -v grep|wc -l` -ge 1 ] && action "THE MYSQL SERVER STARTING" /bin/true || action "THE MYSQL SERVER STARTING" /bin/false else echo " MISSING STARTUP_CONFIG,PLEASE CHECK THE CONFIG IN $MYCNF" fi fi}mysqld_stop(){ if [ `ps -ef|grep "port=$PORT"|grep -v grep|wc -l` -lt 1 ] then echo "The MYSQL SERVER is not running" else $MYSQLADMIN -S $SOCKET shutdown ps -ef|grep "port=$PORT"|grep -v grep|wc -l [ $? -eq 0 ] && action "THE MYSQL SERVER STOPPING" /bin/true || action "THE MYSQL SERVER STOPPING" /bin/false fi}main(){ if [ $# -ne 1 ] then usage else case "$1" in ‘start‘) mysqld_start ;; ‘stop‘) mysqld_stop ;; ‘reload‘) mysqld_stop mysqld_start ;; *) usage esac fi}main $*
在這段代碼中,基本上都是很普通的啟動和停止功能,判斷是否啟動,是根據進程來區分的,基於設定檔中的內容進行判斷,另外,由於mysql在啟動的時候有延時,不能啟動了立即判斷是否有進程,所以需要在啟動指令碼的時候進行sleep,一般2秒就足夠。下面測試一下指令碼的可用性。
[[email protected] bin]# sh mysql_server.sh stop2018-07-09T01:33:11.096443Z mysqld_safe mysqld from pid file /data/mysql57/3307/tmp/3307_pid ended0THE MYSQL SERVER STOPPING [ OK ][[email protected] bin]# sh mysql_server.sh stopThe MYSQL SERVER is not running[[email protected] bin]# sh mysql_server.sh reloadThe MYSQL SERVER is not running2018-07-09T01:33:22.379632Z mysqld_safe Logging to ‘/data/mysql57/3307/data/Server129.err‘.2018-07-09T01:33:22.411184Z mysqld_safe Starting mysqld daemon with databases from /data/mysql57/3307/dataTHE MYSQL SERVER STARTING [ OK ][[email protected] bin]# sh mysql_server.sh stop2018-07-09T01:33:30.241711Z mysqld_safe mysqld from pid file /data/mysql57/3307/tmp/3307_pid ended0THE MYSQL SERVER STOPPING [ OK ][[email protected] bin]# sh mysql_server.sh start2018-07-09T01:33:33.846842Z mysqld_safe Logging to ‘/data/mysql57/3307/data/Server129.err‘.2018-07-09T01:33:33.878461Z mysqld_safe Starting mysqld daemon with databases from /data/mysql57/3307/dataTHE MYSQL SERVER STARTING [ OK ][[email protected] bin]#
準系統貌似都很合理,但是有一些確定,比如在啟動的時候,這些指令碼輸出,如何不讓顯示。
mysql 5.7 啟動指令碼