Last Updated on 12월 29, 2023 by Jade(정현호)
안녕하세요
이번 포스팅은 1개 서버에서 여러 개의 MySQL 의 인스턴스를 구동을 하는 방법에 대해서 확인해 보려고 합니다.
1개 서버에서 다른 메이저 버전을 사용을 해야 하거나, 여러 이유로 동일 버전이지만 2개 혹은 그 다수의 MySQL DB 인스턴스의 구동이 필요한 경우가 있을 수 있습니다.
이럴 경우 2가지 방법으로 해서 다수의 인스턴스를 실행하는 방법에 대해서 확인해보도록 하겠습니다.
포스팅 환경
OS : CentOS 7.9
MySQL 버전 : 5.5.62 버전과 5.7.34 버전
User : root 유저로 진행하였습니다.
linux generic install 버전으로 진행하였습니다.
설치에 관한 자세한 사항은 아래 포스팅을 참조하시면 됩니다.
Contents
그룹 과 유저 생성
MySQL 에서 사용할 그룹과 유저를 먼저 생성하도록 하겠으며 유저 와 그룹명은 mysql 로 사용하였습니다.
-- 그룹 생성 ~]# groupadd mysql -- 유저 생성 ~]# useradd -M -s /sbin/nologin -g mysql mysql
참고
-M 옵션을 사용해서 홈 디렉토리를 생성하지 않고, -s /bin/false 혹은 /sbin/nologin 옵션은 유저의 로그인 쉘을 사용할 수 없게 하여 로그인을 할 수 없게 하는 것입니다.
패키지 설치 및 다운로드
선행 적으로 필요한 패키지 설치 및 설치 파일 다운로드를 진행하도록 하겠습니다.
패키지 설치
~]# yum -y install libaio libaio-devel \ numactl-devel numactl \ ncurses ncurses-devel ncurses-libs \ ncurses-static cmake bash sysstat \ openssl openssl-devel bison readline \ gcc gcc-c++ glibc
파일 다운로드
먼저 설치할 파일을 다운로드 받습니다 포스팅에서는 5.5 버전과 5.7 버전 2가지 버전을 사용하도록 하겠으며 서버에서 직접 받기 위해서 wget 을 사용하였습니다.
MySQL 엔진 파일이 위치할 디렉토리는 /usr/local 아래에 사용할 것입니다.
-- 작업 디렉토리 생성 및 이동 ~]# mkdir pkg ~]# cd pkg -- 파일 다운로드 -- 5.5 버전 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.5.62-linux-glibc2.12-x86_64.tar.gz -- 5.7 버전 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
압축 해체 및 추가 작업
압축을 해제하고 디렉토리 생성 등의 추가 작업을 수행하도록 하겠습니다.
-- 압축 해제 ~]# tar zxvf mysql-5.5.62-linux-glibc2.12-x86_64.tar.gz ~]# tar zxvf mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz -- 이름을 변경 하여 디렉토리를 이동 ~]# mv mysql-5.5.62-linux-glibc2.12-x86_64 /usr/local/mysql-5.5 ~]# mv mysql-5.7.34-linux-glibc2.12-x86_64 /usr/local/mysql-5.7 -- Data 공간과 Log 디렉토리 생성 ~]# mkdir -p /mysql_data/5.5 ~]# mkdir -p /mysql_data/5.7 ~]# mkdir -p /mysql_log/5.5 ~]# mkdir -p /mysql_log/5.7 -- 소유권 변경 ~]# chown -R mysql:mysql /usr/local/mysql-5.5 ~]# chown -R mysql:mysql /usr/local/mysql-5.7 ~]# chown -R mysql:mysql /mysql_data/ ~]# chown -R mysql:mysql /mysql_log/
위와 같이 엔진 영역 디렉토리 이동, 디렉토리 생성 및 소유권을 변경하였습니다.
각 버전별로 MySQL 엔진 파일이 위치한 경로는 아래와 같습니다.
• 5.5 버전
/usr/local/mysql-5.5
• 5.7 버전
/usr/local/mysql-5.7
예제에서의 디렉토리 구조는 아래와 같습니다.
• 5.5 버전에서 사용할 디렉토리
/mysql_data/5.5
/mysql_log/5.5
• 5.7 버전에서 사용할 디렉토리
/mysql_data/5.7
/mysql_log/5.7
기본적인 엔진 구성 및 디렉토리 생성 구성은 완료되었습니다.
다중 인스턴스를 실행하는 여러가지 방법 중에서 2가지를 기술하려고 하고 첫 번째는 MySQL의 엔진을 각각 사용하면서(또는 같이 사용) 별도의 파라미터 파일(.cnf) 파일을 사용하여 별도로 서비스를 등록하여 시작/중지를 하는 유형을 먼저 확인해 보도록 하겠습니다.
별도 서비스로 구성
다중 구성으로 방법 중에서 먼저 별도 서비스로 구성으로 진행하도록 하겠습니다.
my.cnf 파일 수정
DB 인스톨(initialize) 를 실행 및 다중 인스턴스 구성을 위해서 파라미터 파일을 수정하도록 하겠습니다.
• 5.5 버전 파일 수정
MySQL 5.5 버전에서는 기본 템플릿으로 제공되는 cnf 파일이 있으며, my-medium.cnf 파일을 참조하여 생성 및 수정하도록 하겠습니다.
-- my_55.cnf 파일 생성 ~]# cd /usr/local/mysql-5.5/support-files ~]# cat my-medium.cnf | grep -v "#" > /etc/my_55.cnf -- my_55.cnf 파일 수정 ~]# vi /etc/my_55.cnf [client] port = 3305 socket = /tmp/mysql_55.sock [mysqld] user = mysql port = 3305 socket = /tmp/mysql_55.sock pid-file = /mysql_data/5.5/mysql_55.pid basedir = /usr/local/mysql-5.5 datadir = /mysql_data/5.5 log-error = /mysql_log/5.5/mysql-5.5.err innodb_data_home_dir = /mysql_data/5.5 innodb_log_group_home_dir = /mysql_log/5.5 log-bin = /mysql_log/5.5/mysql-55-bin <... 중략 - 더 많은 파라미터는 존재 ...>
my_55.cnf 파일명으로 생성하였으며 포스팅에서 필요한 부분만 위에서는 기술되어 있으며 추가적인 파라미터는 더 존재합니다.
MySQL 5.5 버전에서 사용할 Port는 3305 이고 디렉토리는 위에서 보시는 것 과 같이 버전으로 네이밍을 하였습니다.
• 5.7 버전 파일 수정
참고로 5.7.18 부터는 my-default.cnf(ini) 를 제공하지 않습니다.
The my-default.cnf.sh file (used to produce a default my-default.cnf or my-default.ini file) is no longer included in source distributions and my-default.cnf and my-default.ini are no longer included in or installed by distribution packages. (Bug #22525354)
Reference
oracle.com/news-5-7-18.html [L]
mysql.com/doc/mysqld-5-7-18 [L]
그래서 포스팅에서는 위에서 생성한 파일을 이용하여 my_55.cnf 파일을 이용하여 5.7 버전용을 생성하도록 하겠습니다.
-- 파일 복사 ~]# cp /etc/my_55.cnf /etc/my_57.cnf -- 5.5 에서 5.7 로 문자 치환 ~]# sed -i s/5.5/5.7/g /etc/my_57.cnf ~]# sed -i s/55/57/g /etc/my_57.cnf ~]# sed -i s/3305/3307/g /etc/my_57.cnf -- 치환 돤 내역 확인 ~]# cat /etc/my_57.cnf
install DB(initialize) 수행
MySQL 5.5 버전 부터 DB를 생성하도록 하겠습니다.
• MySQL 5.5
-- 환경 변수 설정 ~]# export PATH=$PATH:/usr/local/mysql-5.5/bin -- 디렉토리 이동 ~]# cd /usr/local/mysql-5.5/scripts -- DB 생성 ~]# ./mysql_install_db \ --defaults-file=/etc/my_55.cnf \ --user=mysql \ --basedir=/usr/local/mysql-5.5 \ --datadir=/mysql_data/5.5 \ --lc-messages-dir=/usr/local/mysql-5.5/share/ -- 파일 생성 확인 ~]# ls -al /mysql_data/5.5/ total 8 drwxr-xr-x 5 mysql mysql 57 Jul 23 00:06 . drwxr-xr-x 4 root root 28 Jul 22 23:24 .. drwx------ 2 mysql root 4096 Jul 23 00:06 mysql drwx------ 2 mysql mysql 4096 Jul 23 00:06 performance_schema drwx------ 2 mysql root 6 Jul 23 00:06 test
root 패스워드 변경을 위한 초기 실행 및 접속 확인을 해보도록 하겠습니다.
-- MySQL초기 실행 ~]# cd /usr/local/mysql-5.5/bin ~]# ./mysqld_safe --defaults-file=/etc/my_55.cnf & -- root 패스워드 변경, root 로 지정하였음 ~]# cd /usr/local/mysql-5.5/bin ~]# ./mysqladmin --defaults-file=/etc/my_55.cnf \ -u root password 'root' -- MySQL 접속 확인 ~]# ./mysql \ --defaults-file=/etc/my_55.cnf \ -uroot -proot Welcome to the MySQL monitor. Commands end with ; or \g. < ... 중략 ... > mysql> use mysql; Database changed mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> exit -- MySQL 종료 ~]# ./mysqladmin --defaults-file=/etc/my_55.cnf \ -u root -p shutdown
정상적으로 접속 확인 및 root 유저 패스워드도 설정하였습니다. 이제 5.7 버전의 DB 생성을 진행하도록 하겠습니다.
• MySQL 5.7
-- 다른 세션에서 실행을 합니다. -- 환경 변수 지정 ~]# export PATH=/usr/local/mysql-5.7/bin:$PATH -- 디렉토리 이동 ~]# cd /usr/local/mysql-5.7/bin -- DB initialize 실행 ~]# ./mysqld --defaults-file=/etc/my_57.cnf \ --initialize --user=mysql \ --basedir=/usr/local/mysql-5.7 \ --datadir=/mysql_data/5.7
root 패스워드를 변경하기 위해서 초기 실행 및 패스워드 변경을 진행하도록 하겠습니다.
-- root 유저 임시 패스워드를 확인 ~]# cat /mysql_log/5.7/mysql-5.7.err |grep -i password [Note] A temporary password is generated for root@localhost: Br.9U;)AiH+g -- MySQL 초기 기동 ~]# cd /usr/local/mysql-5.7/bin ./mysqld_safe --defaults-file=/etc/my_57.cnf & -- MySQL 접속 ~]# ./mysql --defaults-file=/etc/my_57.cnf -u root -p Br.9U;)AiH+g <-- 위의 로그에서 확인된, 초기 패스워드 -- 패스워드 변경 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root'; mysql> flush privileges; mysql> exit -- MySQL 5.7 종료 ~]# ./mysqladmin --defaults-file=/etc/my_57.cnf \ -u root -p shutdown [root패스워드 입력]
서비스 등록
OS 의 서비스에 등록하도록 하겠습니다. 아래 작성된 service 파일은 파일을 작성하는 유형에 따라서 내용이 더 추가되거나 수정되어 작성할 수 있습니다.
[참고] OS에서 MariaDB 관련된 패키지가 설치되어 있다면 삭제 후 진행하도록 하겠습니다.
-- 패키지 목록 확인 ~]# rpm -qa | grep maria mariadb-libs-5.5.68-1.el7.x86_64 <-- 설치된 패키지 목록 중에 MariaDB 와 관련된 패키지가 확인됨 -- 패키지 삭제 ~]# yum remove mariadb-libs-5.5.68-1.el7.x86_64
mysql.server 파일 수정
기본적으로 제공되는 mysql.server 파일을 이용해서 서비스에서 사용하면 되며, mysql.server 파일에서 아래와 같이 일부 내용을 수정하도록 하겠습니다.
~]# cd /usr/local/mysql-5.5/support-files ~]# cp -rp mysql.server mysql.server.ori -- 파일 편집 ~]# vi mysql.server
위와 같이 파일을 복사(백업) 후 vi 나 편집기로 수정을 하면 되며 3부분을 수정하도록 하겠습니다.
basedir과 datadir 변수를 입력 합니다.
-- 2개 변수에 디렉토리 정보를 입력 합니다. basedir=/usr/local/mysql-5.5 datadir=/mysql_data/5.5
mysqld_pid_file_path 변수 입력 합니다.
mysqld_pid_file_path= to(아래 대로 변경) mysqld_pid_file_path=`grep pid /etc/my_55.cnf | awk '{print $3}'`
my.cnf 파일에서 pid-file 환경변수를 설정하지 않고 default 로 사용하려면 위의 과정은 제외하여도 됩니다.
pid-file = /mysql_data/5.5/mysql_55.pid
그 다음으로 266 라인 부근을 수정하면 되며 vi 에서는 /Give 로 찾으면 아래쪽에 있습니다.
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null & to(아래 대로 변경) $bindir/mysqld_safe --defaults-file=/etc/my_55.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
--default-file 파라미터가 추가되었습니다.
service 파일 작성
mysqld55.service 파일을 생성하여 아래와 같은 내용으로 파일을 작성합니다.
~]# vi /usr/lib/systemd/system/mysqld55.service -- 아래 내용으로 입력 합니다. [Unit] Description=MySQL Community Server After=network.target After=syslog.target [Service] User=mysql Group=mysql Type=forking LimitNOFILE=infinity ExecStart=/usr/local/mysql-5.5/support-files/mysql.server start ExecStop=/usr/local/mysql-5.5/support-files/mysql.server stop [Install] WantedBy=multi-user.target
서비스 등록 및 시작
systmemctl 명령어로 서비스 등록 MySQL을 시작합니다.
~]# systemctl daemon-reload ~]# systemctl enable mysqld55 ~]# systemctl start mysqld55
정상적으로 실행되었다면 mysql 에 접속이 되는지를 확인해 보도록 하겠습니다.
-- socket 을 지정하여 접속을 합니다. ~]# mysql -uroot -proot -S /tmp/mysql_55.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.62-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
정상적으로 접속까지 되는 것을 확인할 수 있습니다.
이제 MySQL5.7을 진행하면 되며 과정은 위에서 5.5 버전에서 진행한 것 과 동일 합니다.
새로운 세션에서 아래와 같이 .bash_profile 환경변수를 추가 후 진행하도록 하겠습니다.
-- .bash_profile 내용 확인 ~]# cat ~/.bash_profile -- .bash_profile 내용 수정 ~]# sed -i "s/\$HOME\/bin/\$HOME\/bin:\/usr\/local\/mysql-5.7\/bin/g" ~/.bash_profile -- .bash_profile 변경 내용 확인 ~]# cat ~/.bash_profile -- 적용 ~]# source ~/.bash_profile
mysql.server 파일 수정
위에서 설명한 것과 동일한 내용으로 수정하도록 하겠습니다.
-- 디렉토리 이동 ~]# cd /usr/local/mysql-5.7/support-files -- 파일 백업 ~]# cp -rp mysql.server mysql.server.ori -- 파일 수정 ~]# vi mysql.server basedir=/usr/local/mysql-5.7 datadir=/mysql_data/5.7 -- 63 라인 변경, /etc/my_57.cnf mysqld_pid_file_path= to mysqld_pid_file_path=`grep pid /etc/my_57.cnf | awk '{print $3}'` -- 266 라인 부근 수정, vi 에서 /Give 로 검색 $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null & to $bindir/mysqld_safe --defaults-file=/etc/my_57.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
service 파일 작성
mysqld57.service 파일을 생성하도록 하겠습니다.
[root]# vi /usr/lib/systemd/system/mysqld57.service -- 아래 내용으로 입력 합니다. [Unit] Description=MySQL Community Server After=network.target After=syslog.target [Service] User=mysql Group=mysql Type=forking LimitNOFILE=infinity ExecStart=/usr/local/mysql-5.7/support-files/mysql.server start ExecStop=/usr/local/mysql-5.7/support-files/mysql.server stop [Install] WantedBy=multi-user.target
서비스 등록 및 시작
systmemctl 명령어로 서비스 등록 MySQL을 시작합니다.
~]# systemctl daemon-reload ~]# systemctl enable mysqld57 ~]# systemctl start mysqld57
정상적으로 실행되었고 MySQL 에 접속이 되는지를 확인해 보도록 하겠습니다.
~]# mysql -uroot -proot -S /tmp/mysql_57.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.34-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
이와 같이 별도의 서비스로 분리하여 시작/중지되도록 사용할 수 있습니다.
mysqld_multi 를 이용
두번째 방법으로는 mysqld_multi 를 사용하는 방법입니다.
mysqld_multi 를 이용하면 해당 명령어로 시작, 중지를 컨트롤 할 수 있으며 my.cnf 파일도 단일 형태로 사용할 수 있습니다. 다른 버전도 사용할 수 있습니다.
위에서 테스트를 한 5.5 버전, 5.7 버전에서 추가로 1개 더 5.7 버전을 더 생성해서 3개로 구성하도록 하겠습니다.
위에서 설치 및 작성한 MySQL 엔진과 설정파일을 사용하도록 하겠으며 위에서 실행한 MySQL 2대를 중지 및 비할성화 하도록 하겠습니다.
~]# systemctl stop mysqld55 ~]# systemctl stop mysqld57 ~]# systemctl disable mysqld55 ~]# systemctl disable mysqld57
새로운 5.7 버전 생성
새로운 5.7 DB 인스턴스를 생성하도록 하겠으며 디렉토리 등은 모두 새로 생성하여 분리하여 진행하도록 하겠습니다.
• 디렉토리 생성
-- 디렉토리 생성 ~]# mkdir -p /mysql_data/5.7_2 ~]# mkdir -p /mysql_log/5.7_2 -- ownership 변경 ~]# chown -R mysql:mysql /mysql_data/5.7_2 ~]# chown -R mysql:mysql /mysql_log/5.7_2
• my.cnf 파일 작성
db 생성을 위해서 임시적인 mysql.cnf 파일을 생성하도록 하겠으며, 예제에서는 mysql_57_2.cnf 로 파일명을 사용하였습니다.
~]# cp /etc/my_57.cnf /etc/my_57_2.cnf -- 파일 내용 치환 ~]# sed -i s/3307/3308/g /etc/my_57_2.cnf ~]# sed -i s/57/57_2/g /etc/my_57_2.cnf ~]# sed -i s/5.7/5.7_2/g /etc/my_57_2.cnf ~]# sed -i "s/local\/mysql\-5\.7\_2/local\/mysql\-5\.7/g" /etc/my_57_2.cnf
새로 생성되는 DB는 3308 포트를 사용하도록 하겠습니다.
• db 인스턴스 생성
~]# cd /usr/local/mysql-5.7/bin ~]# ./mysqld --defaults-file=/etc/my_57_2.cnf \ --initialize --user=mysql \ --basedir=/usr/local/mysql-5.7_2 \ --datadir=/mysql_data/5.7_2
• root 패스워드 변경
생성된 db의 root의 패스워드를 변경하도록 하겠으며 위에서 진행한 절차와 동일 합니다.
-- 임시 비밀번호 확인 ~]# cat /mysql_log/5.7_2/mysql-5.7_2.err |grep -i password [Note] A temporary password is generated for root@localhost: <rC&Ohp6Lt=4 -- MySQL 시작 ~]# cd /usr/local/mysql-5.7/bin ~]# ./mysqld_safe --defaults-file=/etc/my_57_2.cnf & -- MySQL 접속 ~]# cd /usr/local/mysql-5.7/bin ~]# ./mysql --defaults-file=/etc/my_57_2.cnf -u root -p <rC&Ohp6Lt=4 -- root 비밀번호 변경 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root'; mysql> flush privileges; mysql> exit
유저 생성 - multi_admin
mysqld_multi 를 통해서 시작/중지 등의 제어를 할때 사용할 별도의 DB 유저를 생성하도록 하겠습니다. mysqld_multi 에서 사용할 모든 DB 서버에 유저는 존재해야 합니다.
지금 포스팅 예제에서는 MySQL 5.5 1개, MySQL5.7 2개의 DB 인스턴스가 동작 중입니다 3개 모두 계정을 생성하도록 하겠습니다.
-- socket 파일명 조회 ~]# ls -alrt /tmp | grep sock srwxrwxrwx 1 mysql mysql 0 Jul 23 21:01 mysql_55.sock -rw------- 1 mysql mysql 5 Jul 23 21:06 mysql_57.sock.lock srwxrwxrwx 1 mysql mysql 0 Jul 23 21:06 mysql_57.sock -rw------- 1 mysql mysql 5 Jul 23 21:10 mysql_57_2.sock.lock srwxrwxrwx 1 mysql mysql 0 Jul 23 21:10 mysql_57_2.sock -- MySQL 5.5 버전 ~]# mysql -uroot -proot -S /tmp/mysql_55.sock mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.62-log MySQL Community Server (GPL) < ... 중략 ... > mysql> use mysql; mysql> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost'; mysql> exit -- MySQL 5.7 첫번째 인스턴스 ~]# mysql -uroot -proot -S /tmp/mysql_57.sock mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.34-log MySQL Community Server (GPL) < ... 중략 ... > mysql> use mysql; mysql> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost'; mysql> exit -- MySQL 5.7 두번째 인스턴스 ~]# mysql -uroot -proot -S /tmp/mysql_57_2.sock mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.34-log MySQL Community Server (GPL) < ... 중략 ... > mysql> use mysql; mysql> CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost'; mysql> exit
계정이 생성이 완료되었으며, my.cnf 를 mysqld_multi 에 맞게 설정을 진행하면 됩니다.
DB 종료
my.cnf 수정전에 이미 시작되어 있는 MySQL 3개를 종료하도록 하겠습니다.
-- MySQL 5.5 종료 ~]# mysqladmin --defaults-file=/etc/my_55.cnf \ -uroot -proot shutdown -- MySQL MySQL 5.7 첫번째 DB 종료 ~]# mysqladmin --defaults-file=/etc/my_57.cnf \ -uroot -proot shutdown -- MySQL MySQL 5.7 두번째 DB 종료 ~]# mysqladmin --defaults-file=/etc/my_57_2.cnf \ -uroot -proot shutdown -- 모두 종료죔 ~]# ps -ef |grep mysql root 12255 4171 0 21:15 pts/0 00:00:00 grep --color=auto mysql
위에서 설정한 서비스에 대해서는 비활성화 하도록 하겠습니다.
~]# systemctl disable mysqld55 ~]# systemctl disable mysqld57
my.cnf 파일 수정
mysqld_multi 에서 사용할 my.cnf 파일을 작성하도록 하겠으며 기존에 사용하였던 /etc/my_57.cnf 파일을 복사해서 수정하여 사용하도록 하겠으며 my.cnf 파일의 각 항목은 아래와 같은 의미를 가지게 됩니다.
mysqld_multi 는 공통적으로 사용되는 커맨드 경로 및 유저의 ID/PW 정보
mysqld1 는 MySQL 5.5 버전 인스턴스 정보
mysqld2 는 MySQL 5.7 첫번째 인스턴스 정보
mysqld3 는 MySQL 5.7 두번째 인스턴스 정보
~]# cp /etc/my_57.cnf /etc/my.cnf ~]# vi /etc/my.cnf [mysqld_multi] mysqld = /usr/local/mysql-5.7/bin/mysqld_safe mysqladmin = /usr/local/mysql-5.7/bin/mysqladmin user = multi_admin password = multipass [mysqld1] #MySQL 5.5 user = mysql port = 3305 socket = /tmp/mysql_55.sock pid-file = /mysql_data/5.5/mysql_55.pid basedir = /usr/local/mysql-5.5 datadir = /mysql_data/5.5 log-error = /mysql_log/5.5/mysql-5.5.err innodb_data_home_dir = /mysql_data/5.5 innodb_log_group_home_dir = /mysql_log/5.5 log-bin = /mysql_log/5.5/mysql-55-bin server-id=1 <.. 파라미터는 더 있을수 있음 ..> [mysqld2] #MySQL 5.7-1 user = mysql port = 3307 socket = /tmp/mysql_57_1.sock pid-file = /mysql_data/5.7/mysql_57_1.pid basedir = /usr/local/mysql-5.7 datadir = /mysql_data/5.7 log-error = /mysql_log/5.7/mysql-5.7.err innodb_data_home_dir = /mysql_data/5.7 innodb_log_group_home_dir = /mysql_log/5.7 log-bin = /mysql_log/5.7/mysql-57-bin server-id=1 <.. 파라미터는 더 있을수 있음 ..> [mysqld3] #MySQL 5.7-2 user = mysql port = 3308 socket = /tmp/mysql_57_2.sock pid-file = /mysql_data/5.7/mysql_57_2.pid basedir = /usr/local/mysql-5.7 datadir = /mysql_data/5.7_2 log-error = /mysql_log/5.7_2/mysql-5.7_2.err innodb_data_home_dir = /mysql_data/5.7_2 innodb_log_group_home_dir = /mysql_log/5.7_2 log-bin = /mysql_log/5.7_2/mysql-57_2-bin server-id=1 <.. 파라미터는 더 있을수 있음 ..> [mysqld_safe] open-files-limit=65535
Multi DB 시작/종료
이제는 mysql_multi 명령어로 MYSQL을 시작(start)와 종료(stop) 할수 있으며 my.cnf 에 등록된 서버의 running 여부 등을 확인할 수 있습니다.
• report
먼저 report 옵션을 통해서 인스턴스의 running 상태를 조회할 수 있습니다.
~]# mysqld_multi report WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is not running MySQL server from group: mysqld3 is not running
위에서 설정한 내역처럼 인스턴스는 3개로 확인되며, 시작하지 않았기 때문에 모두 not running 으로 확인됩니다.
• start
시작은 start 옵션을 사용하면 되며 start 뒤에 숫자 값을 사용하지 않으면 모든 인스턴스가 시작됩니다.
~]# mysqld_multi start WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16 Starting MySQL servers ~]# 2021-07-23 mysqld_safe Logging to '/mysql_log/5.5/mysql-5.5.err'. 2021-07-23 mysqld_safe Starting mysqld daemon with databases from /mysql_data/5.5 2021-07-23 mysqld_safe Logging to '/mysql_log/5.7_2/mysql-5.7_2.err'. 2021-07-23 mysqld_safe Logging to '/mysql_log/5.7/mysql-5.7.err'. 2021-07-23 mysqld_safe Starting mysqld daemon with databases from /mysql_data/5.7 2021-07-23 mysqld_safe Starting mysqld daemon with databases from /mysql_data/5.7_2 ~]# mysqld_multi report WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16 Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running
• stop
종료는 stop 옵션을 사용하면 되며 stop 뒤에 숫자 값을 사용하지 않으면 모든 인스턴스가 종료됩니다.
stop 뒤에 입력하는 숫자 인자 값은 my.cnf 의 [mysqld1], [mysqld2],[mysqld3] 에서 맨 뒤에 숫자를 의미합니다.
1 번을 개별적으로 종료해보겠습니다.
~]# mysqld_multi stop 1 WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Stopping MySQL servers ~]# mysqladmin: [Warning] Using a password on the command line interface can be insecure. mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'multi_admin'@'localhost' (using password: YES)' 계정 관련 Access denied 에러가 발생됩니다.
[참고] Bug #77227
해당 내용은 수년 전에 동일한 Bug NO 로 등록된 건으로 계정 등에는 문제는 없으나 종료시 위와 같이 Access denied 가 발생되는 현상입니다.
2015년 6월에 보고가 되었고 MySQL Team 에서도 확인이 된 사안이지만 WorkAround에 대해서만 언급되어 있으며 Fix는 아직 되지 않은 상태입니다.
포스팅 시점의 MySQL 5.7 버전의 가장 마지막 버전은 5.7.34 에서도 발생되고 있으며, Bug에서도 2017년도에 5.7.20 버전에서도 여전히 발생된다고 기록이 되어 있습니다.
[19 Dec 2017 14:33] Jim Graf
Still present in version 5.7.20. Workaround with configuring pass instead of password works.
WorkAround 는 2가지가 있습니다.
첫번째로 mysqld_multi 파일을 수정 하는 것입니다.
~]# cd cd /usr/local/mysql-5.7/bin ~]# vi mysqld_multi -- 222 라인 부근, 아래와 같이 my_print_defaults 를 수정 my $com= join ' ', 'my_print_defaults', @defaults_options, $group; to my $com= join ' ', 'my_print_defaults -s', @defaults_options, $group;
두번째로는 my.cnf 에서 [mysqld_multi] 항목에 있는 password 를 pass 로 글자를 수정 하는 것 입니다.
~]# vi /etc/my.cnf [mysqld_multi] mysqld = /usr/local/mysql-5.7/bin/mysqld_safe mysqladmin = /usr/local/mysql-5.7/bin/mysqladmin user = multi_admin #password = multipass pass = multipass
두 W/A 적용하게 되면 Access denied 현상이 발생되지 않고 정상 종료가 되는 것을 확인하였습니다. 둘 중 하나를 선택해서 적용하시면 되며, 포스팅에서는 my.cnf 를 수정하였습니다.
W/A 를 적용하였으니 다시 1번(MySQL 5.5) 인스턴스만 종료해보도록 하겠습니다.
~]# mysqld_multi stop 1 WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Stopping MySQL servers ~]# mysqladmin: [Warning] Using a password on the command line interface can be insecure. 2021-07-23 mysqld_safe mysqld from pid file /mysql_data/5.5/docker1.pid ended ~]# mysqld_multi report WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running
이제는 정상 종료가 되는 것을 확인할 수 있습니다.
서비스 로 등록
부팅 시 자동으로 시작되게 하려면 여러가지 방법이 있을 수 있으며 /etc/rc.local 에 "mysqld_multi start" 명령어를 추가하는 등의 방법이 있을 것 같습니다.
또 다른 방법으로 service 에 등록하는 것도 방법이 될 수 있을 것 같습니다.
service 에 등록하기 위해서는 아래와 같이 service 파일을 작성을 하시면 되며 서비스 명은 mysqld_multi 으로 하도록 하겠습니다.
~]# vi /usr/lib/systemd/system/mysqld_multi.service -- 아래 내용으로 입력 합니다. [Unit] Description=MySQL Community Server Multi DB Server After=network.target After=syslog.target [Service] User=mysql Group=mysql Type=forking LimitNOFILE=infinity Environment="PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.7/bin" ExecStart=/usr/local/mysql-5.7/bin/mysqld_multi start ExecStop=/usr/local/mysql-5.7/bin/mysqld_multi stop [Install] WantedBy=multi-user.target
테스트를 위해서 시작되어 있는 MySQL 인스턴스를 모두 종료하도록 하겠습니다.
~]# mysqld_multi stop ~]# mysqld_multi report WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is not running MySQL server from group: mysqld3 is not running
서비스 enable 및 시작을 하도록 하겠습니다.
~]# systemctl daemon-reload ~]# systemctl enable mysqld_multi ~]# systemctl start mysqld_multi
MySQL이 시작되었는지 조회해보겠습니다.
~]# ps -e | grep mysql 22279 ? 00:00:00 mysqld_safe 22285 ? 00:00:00 mysqld_safe 22304 ? 00:00:00 mysqld_safe 23315 ? 00:00:00 mysqld 23414 ? 00:00:00 mysqld 23418 ? 00:00:00 mysqld ~]# mysqld_multi report WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running
3개 인스턴스 모두 정상 시작되었습니다
그러면 재부팅 시에도 정상적으로 시작되는지도 확인해보겠습니다. 먼저 시작 되어있는 MySQL 인스턴스를 모두 종료하도록 하겠습니다.
~]# systemctl stop mysqld_multi ~]# mysqld_multi report WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is not running MySQL server from group: mysqld3 is not running
이제 재부팅 후 MySQL이 시작되는지 확인해보겠습니다.
~]# sync;sync;reboot ~]# ps -e | grep mysql 1088 ? 00:00:00 mysqld_safe 1101 ? 00:00:00 mysqld_safe 1122 ? 00:00:00 mysqld_safe 2650 ? 00:00:00 mysqld 2689 ? 00:00:00 mysqld 2778 ? 00:00:00 mysqld ~]# mysqld_multi report WARNING: Log file disabled. Maybe directory or file isn't writable? mysqld_multi log file version 2.16; Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running
테스트 결과 정상적으로 잘 동작 하는 것을 확인할 수 있었습니다.
Conclusion
MySQL 을 사용하면서 1개 서버에 여러 개의 인스턴스를 같이 실행하는 경우가 많지는 않으나 개발환경에서 1개 물리 서버에 다수의 버전을 실행해야 하는 요구사항이 있을 수도 있고, 데이터 마이그레이션을 위해 다른 업무의 인스턴스가 같이 실행되는 등의 요건도 있을 수도 있습니다.
Multi 인스턴스를 구성하는 방법은 이외 여러가지가 있을수 있으며, 구성의 편의성이나 운영/관리 편의성 등을 고려해서 방법이나 구성안을 선택하시면 될 것 같습니다
DB 인스톨(initialize) 를 실행 및 다중 인스턴스 구성을 위해서 파라미터 파일을 수정하도록 하겠습니다.
Reference
Reference Link
dev.mysql.com/mysqld-multi [L]
bugs.mysql.com/77227 [L]
연관된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io