単一のLinuxサーバーで2つ以上のMySQLインスタンスを実行する

1つのLinuxサーバーで複数のmysqlサーバーを実行するなどの問題を解決する別の方法を共有したいと思います。 皆さんの中には、たとえば次のように手を走らせてこれをやろうとしている人もいると思います。



mysqld_safe --defaults-file=...my2.cnf... &
      
      





そのような実行中のmysqlサーバーを正しく完了することが常に可能とは限らないという理由だけで、このアプローチは完全に正しいとは思いません。 もちろん、引き続きmysqld_multiを使用できますが、個人的には、インスタンスを相互に完全に「分離」することを好みます。 そのため、出版物で初期化システムを使用することをお勧めします。



指定:OS Linux CentOS 6.5。 MySQLサーバーまたはその派生物(Perconaなど)のインストール方法については説明しませんが、すぐに説明します。 配信、立ち上げ。



 [root@localhost /]# ps aux | grep sql
      
      





 root 8455 0.0 0.2 5064 1344 pts/0 S 01:36 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql mysql 8566 0.0 3.0 135476 15328 pts/0 Sl 01:36 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306
      
      





サーバーが起動し、すべてが機能します。 my.cnfで特に指定されていない限り、すべてのオプションはデフォルトです。



次に、2番目のインスタンスを開始しましょう。 2番目のベースの場所を作成します。



 mkdir /var/lib/mysql2 && chown -R mysql:mysql /var/lib/mysql2
      
      





ログを保存するには:



 mkdir /var/log/mysql2 && chown -R mysql:mysql /var/log/mysql2
      
      





2番目のインスタンスのデフォルト構成ファイルをコピーします。



 cp /etc/my.cnf /etc/my2.cnf
      
      





/ var / runの別のディレクトリを見てみましょう:

 mkdir /var/run/mysqld2 && chown -R mysql:mysql /var/run/mysqld2
      
      







my2.cnfを修正し、initスクリプトを/etc/init.d/に追加して、新しいインスタンスを適切に管理します



/etc/my2.cnfを編集します。



 [mysqld] bind-address=127.0.0.1 port=3307 datadir=/var/lib/mysql2 socket=/var/lib/mysql2/mysql2.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysql2/mysqld.log pid-file=/var/run/mysqld2/mysqld.pid
      
      





構成ファイルの違いは何ですか:



 [root@localhost mysqld2]# diff /etc/my.cnf /etc/my2.cnf 3,5c3,5 < port=3306 < datadir=/var/lib/mysql < socket=/var/lib/mysql/mysql.sock --- > port=3307 > datadir=/var/lib/mysql2 > socket=/var/lib/mysql2/mysql2.sock 11,12c11,12 < log-error=/var/log/mysqld.log < pid-file=/var/run/mysqld/mysqld.pid --- > log-error=/var/log/mysql2/mysqld.log > pid-file=/var/run/mysqld2/mysqld.pid
      
      





最後に、2番目のサーバーを起動するためのinitスクリプトを準備します。 ここから楽しみが始まります:



 cp /etc/init.d/mysqld /etc/init.d/mysqld2
      
      





/etc/init.d/mysqld2ファイルの個々の行を開いて編集します。

1)まず、 get_mysql_option()関数をコメントアウト(または削除)して、mysqld_safeのデフォルト値を無視しないようにする必要があります。



 #get_mysql_option(){ # result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1` # if [ -z "$result" ]; then # # not found, use default # result="$3" # fi #}
      
      







2)将来の使用についてもコメントし、新しいインスタンスの一意のパスとディレクトリを必要な変数に書き込みます。



 #get_mysql_option mysqld datadir "/var/lib/mysql2" datadir="/var/lib/mysql2" #get_mysql_option mysqld socket "$datadir/mysql2.sock" socketfile="$datadir/mysql2.sock" #get_mysql_option mysqld_safe log-error "/var/log/mysql2/mysqld.log" errlogfile="/var/log/mysql2/mysqld.log" #get_mysql_option mysqld_safe pid-file "/var/run/mysqld2/mysqld.pid" mypidfile="/var/run/mysqld2/mysqld.pid"
      
      







3)最後の仕上げ:start()関数で、mysqld_safeに個別の構成ファイルを使用してログを個別のフォルダーに書き込むように明示的に指示します。 これを行うには、次の行をほぼこのフォームに追加します。



 $exec --defaults-file=/etc/my2.cnf --datadir="$datadir" --socket="$socketfile" \ --pid-file="$mypidfile" --log-error=/var/log/mysql2/mysqld.log \ --basedir=/usr --user=mysql >/dev/null 2>&1 &
      
      





保存します。 /etc/init.d/mysql2 startを実行して開始します。 停止:/etc/init.d/mysql2 stop。 検証:



 [root@localhost run]# ps aux | grep sql2 root 9375 0.0 0.2 5064 1348 pts/1 S 02:44 0:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my2.cnf --datadir=/var/lib/mysql2 --socket=/var/lib/mysql2/mysql2.sock --pid-file=/var/run/mysqld2/mysqld.pid --log-error=/var/log/mysql2/mysqld.log --basedir=/usr --user=mysql mysql 9489 0.1 3.0 135476 15328 pts/1 Sl 02:44 0:00 /usr/libexec/mysqld --defaults-file=/etc/my2.cnf --basedir=/usr --datadir=/var/lib/mysql2 --user=mysql --log-error=/var/log/mysql2/mysqld.log --pid-file=/var/run/mysqld2/mysqld.pid --socket=/var/lib/mysql2/mysql2.sock --port=3307 root 9510 0.0 0.1 4356 732 pts/1 S+ 02:44 0:00 grep sql2
      
      





最後に、クライアントを使用して、ソケットファイルを明示的に指定して2番目のMySQLサーバーに接続します。



 mysql -S /var/lib/mysql2/mysql2.sock
      
      





...そして、すべてがうまくいったことがわかります。



ご清聴ありがとうございました。



PS 2番目のデータベースのディレクトリで、最初にデフォルトのデータベースを使用して/ var / lib / mysqlからコピーするか、 mysql_install_dbを使用して再作成するか、既存のデータベース(Percona XtraBackupによって作成されたバックアップなど)を使用できます 。 最も重要なことは、データベースファイルに対する正しいユーザー所有者( mysql )です。



All Articles