mysql_safe和mysql_multi
1 mysql_safe
原理
mysqld_safe其實為一個shell指令碼(封裝mysqld),啟動時需要呼叫server和database(即/bin和/data目錄),因此需要滿足下述條件之一:
1 /bin和/data和mysql_safe指令碼位於同一目錄;
2 如果本地目錄找不到找到/bin和/data,mysqld_safe試圖透過絕對路徑定位(/usr/local);
shell> cd mysql_installation_directory
shell> bin/mysqld_safe &
如果從MySQL安裝目錄呼叫仍然失敗,需要--ledir和--datadir選項來指示伺服器和資料庫的安裝目錄。
注:service mysql start , /etc/init.d/mysql 最終調的也是mysqld_safe
引數
路徑
--basedir=path
The path to the MySQL installation directory.
--ledir=path
If mysqld_safe cannot find the server, use this option to indicate the path name to the directory where the server is located.
--datadir=path
The path to the data directory.
選項檔案
--defaults-extra-file=path
The name of an option file to be read in addition to the usual option files. This must be the first option on the command line if it is used. If the file does not exist or is otherwise inaccessible, the server will exit with an error.
--defaults-file=file_name
The name of an option file to be read instead of the usual option files. This must be the first option on the command line if it is used
輸出日誌
--log-error=file_name
Write the error log to the given file
--syslog, --skip-syslog
syslog causes error messages to be sent to syslog on systems that support the logger program. --skip-syslog suppresses the use of syslog; messages are written to an error log file.
注:如果上述3個選項都不指定,預設為—skip-syslog;如果同時指定log-error和syslog則以前者為準;
其他
--malloc-lib=[lib_name]
The name of the library to use for memory allocation instead of the systemmalloc()library.
The --malloc-lib option works by modifying the LD_PRELOAD environment value to affect dynamic linking to enable the loader to find the memory-allocation library when mysqld runs:
--mysqld=prog_name
The name of the server program (in the ledir directory) that you want to start. This option is needed if you use the MySQL binary distribution but have the data directory outside of the binary distribution. If mysqld_safe cannot find the server, use the --ledir option to indicate the path name to the directory where the server is located.
執行流程
mysqld_safe指令碼執行的基本流程:
1、查詢basedir和ledir。
2、查詢datadir和my.cnf。
3、解析my.cnf中的組[mysqld]和[mysqld_safe]並和終端裡輸入的命令合併。
4、對系統日誌和錯誤日誌的判斷和相應處理,及選項--err-log引數的賦值。
5、對選項--user,--pid-file,--socket及--port進行處理及賦值,保證啟動時如果不給出這些引數它也會有值。
6、啟動mysqld.
a)啟動時會判斷一個程式號是否存在,如果存在那麼就在錯誤日誌中記錄"A mysqld process already exists"並且退出。
b)如不存在就刪除程式檔案,如果刪除不了,那麼就在錯誤日誌中記錄"Fatal error: Can't remove the pid file"並退出。
注:
1、mysqld_safe增加了一些安全特性,例如當出現錯誤時重啟伺服器並向錯誤日誌檔案寫入執行時間資訊。
2、如果有的選項是mysqld_safe 啟動時特有的,那麼可以終端指定,如果在配置檔案中指定需要放在[mysqld_safe]組裡面,放在其他組不能被正確解析。
3、mysqld_safe啟動能夠指定核心檔案大小 ulimit -c $core_file_size以及開啟的檔案的數量ulimit -n $size。
4、MySQL程式首先檢查環境變數,然後檢查配置檔案,最後檢查終端的選項,說明終端指定選項優先順序最高。
程式碼
在一個死迴圈裡呼叫mysqld啟動資料庫,接下來檢查pid-file,如果不存在說明mysqld被正常關閉則退出迴圈;接下來判斷程式是否hang,如果是則kill -9;
注:mysql_safe會反覆嘗試啟動資料庫,如果mysqld無法啟動則會消耗大量CPU,為此5.6加入一個判斷條件,若一秒內啟動了5次則sleep 1;
while true
do
rm -f $safe_mysql_unix_port "$pid_file" # Some extra safety
if test -z "$args"
then
$NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file="$pid_file" >> "$err_log" 2>&1
else
eval "$NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file="$pid_file" $args >> "$err_log" 2>&1"
fi
if test ! -f "$pid_file" # This is removed if normal shutdown
then
echo "STOPPING server from pid file $pid_file"
break
fi
if false && test $KILL_MYSQLD -eq 1
…..
done
非正常關閉資料庫時應先殺死mysqld_safe,而後是mysqld,否則mysqld會被再次啟動
http://blog.csdn.net/thinke365/article/details/5016411
2 單機安裝多個資料庫
單機可以安裝多個版本的mysql binary;
非共享引數
每個mysql binary必須擁有獨自的資料目錄,日誌檔案和pid檔案,以及socket和port;
如果mysql安裝在不同路徑,則可為每個安裝路徑指定—basedir,這樣每個安裝路徑都自動使用各自的資料目錄,日誌檔案和pid檔案;
此時只需為每個mysql單獨指定—socket和—port即可;
指定非預設埠和socket檔案
shell> cmake . -DMYSQL_TCP_PORT=port_number -DMYSQL_UNIX_ADDR=file_name -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.23
檢視已安裝資料庫使用的引數,比如base directory和unix socket,避免新安裝的資料庫使用同樣引數從而產生衝突;
shell> mysqladmin --host=host_name --port=port_number variables
注:如果host為localhost,則mysqladmin預設使用unix socket,可通--protocol=tcp顯示宣告
建立data directory;
有兩種建立方式:
1 新建資料目錄 ,mysql_install_db;
2 複製已有的資料目錄,關閉現有mysqld;複製資料目錄;修改my.cof;啟動mysqld;
如何啟動特定的mysql
1
shell> mysqld_safe --defaults-file=/usr/local/mysql/my.cnf
shell> mysqld_safe --defaults-file=/usr/local/mysql/my.cnf2
2
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> mysql_install_db --user=mysql
shell> mysqld_safe --datadir=/path/to/datadir &
3
shell> mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...]
讀取my.cnf中對應的[mysqldN]
# This file should probably be in your home dir (~/.my.cnf)
# or /etc/my.cnf
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/share/mysql/japanese
user = jani
注:每個資料庫用於關閉mysqld的帳號和密碼最好保持一致
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-1412269/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ../和./和/的區別
- 路徑中./和../和/
- !=和<>
- #和&
- linux中/bin和/sbin和/usr/bin和/usr/sbinLinux
- redis的安裝和啟動和檢測和停止Redis
- 深度解析 Delegate 和 Notification 和 KVO
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- xftp和xshell,xftp和xshell的下載和安裝FTP
- 找工作學習筆記1------=和==、&和&&、|和||的區別筆記
- workman 和swoole 區別 和異同
- @NotEmpty和@NotBlank和@NotNull小結Null
- 檔案路徑問題( ./ 和 ../ 和 @/ )
- csv和excel讀取和下載Excel
- Cookie 和 Session 關係和區別CookieSession
- 堆和棧的概念和區別
- js中的typeof和instanceof和===JS
- hbase和zookeeper的安裝和部署
- JSF和Struts、Tiles Portlets和TapestryJS
- oracle中關於in和exists,not in 和 not existsOracle
- js == 和 ===JS
- 字首和
- XML基本操作-建立(DOM和LOINQ)和LINQ查詢和儲存XML
- 函式fgets和fputs、fread和fwrite、fscanf和fprintf用法小結函式
- DOORS和Reqtify — 需求管理和需求追溯工具QT
- Golang 陣列和切片 Slice 和 Map 使用Golang陣列
- count (*) 和 count (1) 和 count (列名) 區別
- DOORS 和Reqtify — 需求管理和需求追溯工具QT
- MySQL 裡的 find_in_set () 和 in () 和 likeMySql
- 淺談mouseenter和mouseover,mouseout和mouseleave
- 和AI談倫理、道德和謊言AI
- count(*) 和 count(1)和count(列名)區別
- ssr、ss和vpn介紹和區別
- Redis RDB和AOF取捨和選擇Redis
- 堆和棧的解釋和區別
- DOORS和Reqtify—需求管理和需求追溯工具QT
- lodsb、stosb(和lodsw、stosw和lodsd、stosd指令)
- asmcmd lsdsk和lsdg檢視asmdisk和asmdiskgroupASM