rockylinux8.6のmariadbで データベースインスタンスを複数立てる.

ここでのデータベースとは「create database」の類の事ではなく、mysqldデーモンが複数あがるイメージかな.
ただしそれぞれは同じmariadbバージョンです

そのためそれぞれに違ったport番号で動きます

利点としては同一マシン、同じmariadbバージョン内で、それぞれ仕様の異なったインスタンスが運用できます(/etc/my.cnfがそれぞれ別ですから)

複数のデータベースインスタンスを取りまとめするコマンドは「mysqld_multi」といいます

現状確認

[root@slurmdbd ~]# lsof -i -P | grep mysqld
mysqld    17601  mysql   21u  IPv6  46585      0t0  TCP *:3306 (LISTEN)
 
[root@slurmdbd ~]# systemctl stop mariadb.service
[root@slurmdbd ~]# ls -l /var/lib/mysql
total 110624
-rw-rw----. 1 mysql mysql    16384 Dec 30 22:49 aria_log.00000001
-rw-rw----. 1 mysql mysql       52 Dec 30 22:49 aria_log_control
-rw-rw----. 1 mysql mysql      976 Dec 30 22:49 ib_buffer_pool
-rw-rw----. 1 mysql mysql 12582912 Dec 30 22:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 Dec 30 22:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 Dec 30 21:53 ib_logfile1
-rw-rw----. 1 mysql mysql        0 Dec 30 21:53 multi-master.info
drwx------. 2 mysql mysql     4096 Dec 30 21:53 mysql
-rw-rw----. 1 mysql mysql       16 Dec 30 21:53 mysql_upgrade_info
drwx------. 2 mysql mysql       20 Dec 30 21:53 performance_schema
 
[root@slurmdbd ~]# 

インスタンスは1つで 3306 で動いていました. 停止させた後のデータベースファイルはこんな感じです

インスタンス追加

一つ目のインスタンスは既存で「/var/lib/mysql」にデータが収まっていて portは3306
二つ目はXDMoD向けとして「/var/lib/mysql.XDMoD」として portは13306
三つ目はテスト目的な感じで「/var/lib/mysql.sample」として portは23306 フォルダ名称はなんでもいいです. ただDBなんでアンダースコアは避けた方がいいのかも. 未実証ですが

[root@slurmdbd ~]# mkdir /var/lib/mysql.XDMoD                  <-- 追加の XDMoD インスタンス
 
[root@slurmdbd ~]# mkdir /var/lib/mysql.sample                 <-- 追加の sample インスタンス
 
[root@slurmdbd ~]# chown mysql. /var/lib/mysql.XDMoD /var/lib/mysql.sample   <-- 所有者をmysqlにします
 
[root@slurmdbd ~]# mysql_install_db --user=mysql --datadir=/var/lib/mysql.XDMoD   <-- 初期化
 
[root@slurmdbd ~]# mysql_install_db --user=mysql --datadir=/var/lib/mysql.sample  <-- 初期化
 
(中を見てみると)
[root@slurmdbd ~]# ls -l /var/lib/mysql.XDMoD
total 110624
-rw-rw----. 1 mysql mysql    16384 Dec 30 22:58 aria_log.00000001
-rw-rw----. 1 mysql mysql       52 Dec 30 22:58 aria_log_control
-rw-rw----. 1 mysql mysql      972 Dec 30 22:58 ib_buffer_pool
-rw-rw----. 1 mysql mysql 12582912 Dec 30 22:58 ibdata1
-rw-rw----. 1 mysql mysql 50331648 Dec 30 22:58 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 Dec 30 22:58 ib_logfile1
drwx------. 2 mysql mysql     4096 Dec 30 22:58 mysql
-rw-r--r--. 1 root  root        15 Dec 30 22:58 mysql_upgrade_info
drwx------. 2 mysql mysql       20 Dec 30 22:58 performance_schema
drwx------. 2 mysql mysql       20 Dec 30 22:58 test
[root@slurmdbd ~]#
 
(ただし...)
[root@slurmdbd ~]# ls -lZ /var/lib/mysql.XDMoD/aria_log.00000001
-rw-rw----. 1 mysql mysql unconfined_u:object_r:var_lib_t:s0 16384 Dec 30 22:58 /var/lib/mysql.XDMoD/aria_log.00000001
[root@slurmdbd ~]#

っとSELinuxを有効にしているとこの「unconfined_u:object_r:var_lib_t:s0」で動かない. なので修正を行います

[root@slurmdbd ~]# dnf install -y policycoreutils-python-utils
[root@slurmdbd ~]# semanage fcontext -a -t mysqld_db_t  "/var/lib/mysql.XDMoD(/.*)?"
[root@slurmdbd ~]# restorecon -R /var/lib/mysql.XDMoD
[root@slurmdbd ~]# semanage fcontext -a -t mysqld_var_run_t "/var/lib/mysql.XDMoD/mysql\.sock"
 
[root@slurmdbd ~]# semanage fcontext -a -t mysqld_db_t  "/var/lib/mysql.sample(/.*)?"
[root@slurmdbd ~]# restorecon -R /var/lib/mysql.sample
[root@slurmdbd ~]# semanage fcontext -a -t mysqld_var_run_t "/var/lib/mysql.sample/mysql\.sock"
 
(設定の確認)
[root@slurmdbd ~]# semanage fcontext -l | grep -i mysql
 
(portの追加)
[root@slurmdbd ~]# semanage port -a -t mysqld_port_t -p tcp 13306
[root@slurmdbd ~]# semanage port -a -t mysqld_port_t -p tcp 23306
[root@slurmdbd ~]# semanage port -l | grep mysqld
mysqld_port_t                  tcp      23306, 13306, 1186, 3306, 63132-63164
[root@slurmdbd ~]#

設定ファイル(/etc/my.cnf)を修正します
どのように修正するかは「mysqld_multi --example」で指針とサンプルが出てきます.

それによると

  • 既存のインスタンスで使っていた[mysqld]は[mysqld1]へと変更して、
  • 追加のインスタンス[mysqld2]、[mysqld3]と設定枠を設けます.
  • マルチインスタンスであることを示す[mysqld_multi]を設けます.
  • [mysqld]は[mysqld1]、[mysqld2]、[mysqld3]の共通項目を入れる

っで修正. 「/usr/lib/systemd/system/mariadb@.service」を読むと別に数字じゃなくてもいい気がしますが...

[root@slurmdbd ~]# vi /etc/my.cnf.d/mariadb-server.cnf
[server]
 
[mysqld1]
port = 3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
innodb_buffer_pool_size=4096M
innodb_log_file_size=64M
innodb_lock_wait_timeout=900
 
[mysqld2]
port = 13306
datadir=/var/lib/mysql.XDMoD
socket=/var/lib/mysql.XDMoD/mysql.sock
log-error=/var/log/mariadb/mariadb.XDMoD.log
pid-file=/run/mariadb/mariadb.XDMoD.pid
sql_mode = ''
max_allowed_packet = 1G
group_concat_max_len = 16M
innodb_stats_on_metadata = off
innodb_file_per_table = On
 
[mysqld3]
port = 23306
datadir=/var/lib/mysql.sample
socket=/var/lib/mysql.sample/mysql.sock
log-error=/var/log/mariadb/mariadb.sample.log
pid-file=/run/mariadb/mariadb.sample.pid
 
[galera]
[embedded]
[mariadb]
[mariadb-10.3]
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user       = multi_admin
password   = multipass
[root@slurmdbd ~]#

次に「mysqld_multi」コマンドを使って3つのインスタンスを起動してみます

[root@slurmdbd ~]# mysqld_multi start
 
(確認)
[root@slurmdbd ~]# mysqld_multi report
Reporting MariaDB servers
MariaDB server from group: mysqld1 is running
MariaDB server from group: mysqld2 is running
MariaDB server from group: mysqld3 is running
[root@slurmdbd ~]#
 
(確認)
[root@slurmdbd ~]# lsof  -i -P | grep mysqld
mysqld    19789  mysql   23u  IPv6  65031      0t0  TCP *:3306 (LISTEN)
mysqld    19791  mysql   23u  IPv6  65013      0t0  TCP *:23306 (LISTEN)
mysqld    19823  mysql   23u  IPv6  65021      0t0  TCP *:13306 (LISTEN)
[root@slurmdbd ~]#

っでここで各インスタンスを停止させるデータベース内アカウント「multi_admin」をパスワード「multipass」で作ります
各インスタンスへの接続は soket を使います

[root@slurmdbd ~]# mysql -u root -S /var/lib/mysql/mysql.sock -p
MariaDB [(none)]> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
MariaDB [(none)]> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';
MariaDB [(none)]> \q
Bye
[root@slurmdbd ~]# 
[root@slurmdbd ~]# mysql -u root -S /var/lib/mysql.XDMoD/mysql.sock
MariaDB [(none)]> status
 :
UNIX socket:            /var/lib/mysql.XDMoD/mysql.sock
 :
MariaDB [(none)]> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
MariaDB [(none)]> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';
MariaDB [(none)]> \q
Bye
[root@slurmdbd ~]#
[root@slurmdbd ~]# mysql -u root -S /var/lib/mysql.sample/mysql.sock
MariaDB [(none)]> status
 :
UNIX socket:            /var/lib/mysql.sample/mysql.sock
 :
MariaDB [(none)]> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
MariaDB [(none)]> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';
MariaDB [(none)]> \q
Bye
[root@slurmdbd ~]#

これで初めて「mysqld_multi stop」が使える

[root@slurmdbd ~]# mysqld_multi stop
[root@slurmdbd ~]# mysqld_multi report
Reporting MariaDB servers
MariaDB server from group: mysqld1 is not running
MariaDB server from group: mysqld2 is not running
MariaDB server from group: mysqld3 is not running
[root@slurmdbd ~]#

自動起動のための処置. その前にserviceファイルがちょいと間違っている気がするので修正

--- /tmp/mariadb@.service       2022-12-30 11:40:55.938203278 +0900
+++ /usr/lib/systemd/system/mariadb@.service    2022-12-30 11:41:15.627371444 +0900
@@ -47,13 +47,13 @@
 User=mysql
 Group=mysql
 
-ExecStartPre=/usr/libexec/mysql-check-socket --defaults-group-suffix=.%I
-ExecStartPre=/usr/libexec/mysql-prepare-db-dir --defaults-group-suffix=.%I %n
+ExecStartPre=/usr/libexec/mysql-check-socket --defaults-group-suffix=%I
+ExecStartPre=/usr/libexec/mysql-prepare-db-dir --defaults-group-suffix=%I %n
 # MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb@.service.d/MY_SPECIAL.conf
 # Note: we set --basedir to prevent probes that might trigger SELinux alarms,
 # per bug #547485
-ExecStart=/usr/libexec/mysqld --defaults-group-suffix=.%I --basedir=/usr $MYSQLD_OPTS $_WSREP_NEW_CLUSTER
-ExecStartPost=/usr/libexec/mysql-check-upgrade --defaults-group-suffix=.%I
+ExecStart=/usr/libexec/mysqld --defaults-group-suffix=%I --basedir=/usr $MYSQLD_OPTS $_WSREP_NEW_CLUSTER
+ExecStartPost=/usr/libexec/mysql-check-upgrade --defaults-group-suffix=%I
 
 # Setting this to true can break replication and the Type=notify settings
 # See also bind-address mysqld option.

そうした上で、まず既存の「mariadb.service」を無効化します

[root@slurmdbd ~]# systemctl daemon-reload
 
[root@slurmdbd ~]# systemctl disable mariadb.service
Removed /etc/systemd/system/multi-user.target.wants/mariadb.service.
Removed /etc/systemd/system/mysql.service.
Removed /etc/systemd/system/mysqld.service.
[root@slurmdbd ~]#

次にインスタンス毎にserviceを作成します

[root@slurmdbd ~]# systemctl enable mariadb@1
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb@.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb@.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb@1.service → /usr/lib/systemd/system/mariadb@.service.
 
[root@slurmdbd ~]# systemctl enable mariadb@2
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb@2.service → /usr/lib/systemd/system/mariadb@.service.
 
[root@slurmdbd ~]# systemctl enable mariadb@3
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb@3.service → /usr/lib/systemd/system/mariadb@.service.
[root@slurmdbd ~]#

それで起動してみます

[root@slurmdbd ~]# systemctl start "mariadb@1"
[root@slurmdbd ~]# systemctl start "mariadb@2"
[root@slurmdbd ~]# mysqld_multi report
Reporting MariaDB servers
MariaDB server from group: mysqld1 is running
MariaDB server from group: mysqld2 is running
[root@slurmdbd ~]# systemctl stop "mariadb@2"
[root@slurmdbd ~]# mysqld_multi report
Reporting MariaDB servers
MariaDB server from group: mysqld1 is running
MariaDB server from group: mysqld2 is not running
[root@slurmdbd ~]# systemctl stop "mariadb@1"
[root@slurmdbd ~]# mysqld_multi report
Reporting MariaDB servers
MariaDB server from group: mysqld1 is not running
MariaDB server from group: mysqld2 is not running
[root@slurmdbd ~]#

上手く行ったみたい.

追加したインスタンスにmysql_secure_installation

なんか動かない. なので中身を見て実行されるSQLを調べてみた

([MariaDB]内rootアカウントにパスワード付与)
UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';
 
(匿名ユーザの削除)
DELETE FROM mysql.user WHERE User='';
 
([MariaDB]内rootアカウントのリモートアクセスを不許可)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
 
(testデータベースの削除)
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
 
(権限関係の再読み込み)
FLUSH PRIVILEGES;

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2022-12-31 (土) 12:54:25 (82d)