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」で指針とサンプルが出てきます.
それによると
っで修正. 「/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ファイルがちょいと間違っている気がするので修正
|
そうした上で、まず既存の「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 ~]#
上手く行ったみたい.
なんか動かない. なので中身を見て実行される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;