mysql_safe和mysql_multi

myownstars發表於2015-01-23

1 mysql_safe

原理

mysqld_safe其實為一個shell指令碼(封裝mysqld),啟動時需要呼叫serverdatabase(/bin/data目錄),因此需要滿足下述條件之一:

1 /bin/datamysql_safe指令碼位於同一目錄;

2 如果本地目錄找不到找到/bin/datamysqld_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-errorsyslog則以前者為準;

其他

--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、查詢basedirledir

2、查詢datadirmy.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"並退出。

注:

1mysqld_safe增加了一些安全特性,例如當出現錯誤時重啟伺服器並向錯誤日誌檔案寫入執行時間資訊。

2、如果有的選項是mysqld_safe 啟動時特有的,那麼可以終端指定,如果在配置檔案中指定需要放在[mysqld_safe]組裡面,放在其他組不能被正確解析。

3mysqld_safe啟動能夠指定核心檔案大小 ulimit -c $core_file_size以及開啟的檔案的數量ulimit -n $size

4MySQL程式首先檢查環境變數,然後檢查配置檔案,最後檢查終端的選項,說明終端指定選項優先順序最高。

 

程式碼

在一個死迴圈裡呼叫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檔案,以及socketport

如果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 directoryunix socket,避免新安裝的資料庫使用同樣引數從而產生衝突;

shell> mysqladmin --host=host_name --port=port_number variables

注:如果hostlocalhost,則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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章