标签:tar 相同 搜索 echo ace environ 时间 file 暴力
多实例由于生产中随着数据库的版本更新或者其他要求,有可能需要在一台主机上装不同版本(或者相同版本)的多个数据库,(这里的数据库指的就是以数据库端口号分离开的一整个数据库,而并非指的是一个数据库里面的database,注意区分)。
这里就需要用到多个实例来实现,它的实现逻辑如下:
首先,如果是同一个版本的数据库,我们只需要一个数据库服务的应用程序和服务的主体(也就是上一篇中/usr/local/mysql下的各种文件)即可,多个示例其实就是多个数据库的存储位置(相当于多个不同的文件夹),以及它们分别各自的配置文件(比如说指定端口号,指定数据库存储位置,socket文件等等)
也就相当于一个mysql应用服务程序在内存中开启多个进程,每一个进程互不干扰都是一个数据库服务,都有自己的数据库存储目录以及自己的配置文件。只不过在这里因为是相同版本的数据库,这些多个实例只需要共用一套服务主体文件即可。
这些maysql服务载入内存后就独立开了,因为载入内存时会根据配置文件开启进程,载入之后服务主体中的各种文件都不会再影响这个进程了,这个数据库的进程只会修改数据库目录中的内容。(相当于windows中多开记事本,相互不干扰,相互独立修改和保存数据;开一个就开启一个新的进程和独立的内存以及数据空间,只不过mysql这里数据空间就是数据库的存储目录,也就是一个实例)
实现3各不同实例(3个数据库,3个监听端口,3个数据库服务同时启动),以二进制已经安装过的mysql为例,其他的类似。
注意下面多示例之前需安装好一个mysql服务,前面的安装过程按照上一章的过程一步一步进行,这里不赘述。
=======================================================默认的项目:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
=======================================================修改之后的项目:
[mysqld]
port=3306
datadir=/data/mysql/3306/data
socket=/data/mysql/3306/socket/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/data/mysql/3306/log/mariadb.log
pid-file=/data/mysql/3306/pid/mariadb.pid
[client]
#password = your_password
port = 3306
#socket = /data/mysql/mysql.sock
socket=/data/mysql/3306/socket/mysql.sock
!includedir /etc/my.cnf.d
改为服务启动要添加的项目:(启动顺序64,36可以都写成一样的,只要服务脚本文件名字改为不一致即可,它会自动排序的),添加之后便可以用service mysql330X start 方式启动了:
#!/bin/bash : 这里改为bash
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.
启动脚本:
#!/bin/bash
port=3306
# mysql_user="root" :此项包括下一项是为了mysqladmin关闭服务使用的,最好不要这种方式,因为写上了明文的用户名和密码
# mysql_pwd=""
cmd_path="/usr/local/mysql/bin" #:写上自己安装mysqld的bin的位置,yum的话就直接是/usr/bin:它用于多个实例共同利用mysql的主体程序脚本等,而无需多次安装相同版本的mysql
mysql_basedir="/data/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"
pid_file="${mysql_basedir}/${port}/pid/mariadb.pid"
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
#function_stop_mysql()
#{
# if [ ! -e "$mysql_sock" ];then
# printf "MySQL is stopped...\n"
# exit
# else
# printf "Stoping MySQL...\n"
# ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
# fi
#}
#:类似参考原装脚本关闭服务,不需要密码等
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit;
elif [ -e "$pid_file" ];then
read mysqld_pid < "$pid_file"
printf "Stoping MySQL...\n"
kill $mysqld_pid;
exit;
else
cd "${mysql_basedir}/${port}/data/"
read mysqld_pid < "${mysql_basedir}/${port}/data/`ls *.pid`"
printf "Stoping MySQL...\n"
kill $mysqld_pid;
exit;
fi
}
function_restart_mysql()
{
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
在yum的安装环境下,按照配置文件什么都不写的前提下(yum安装导致配置文件里面为空),则删除掉yum安装的数据库文件夹/var/lib/mysql下的所有文件之后,再次用mysql_install_db 命令生成的文件内容为:
==============================================================删除之前默认的:
23:24[root@centos7 /var/lib/mysql]# ls
aria_log.00000001 centos7.pid ibdata1 ib_logfile1 multi-master.info mysql.sock tc.log
aria_log_control ib_buffer_pool ib_logfile0 ibtmp1 mysql performance_schema test
==============================================================删除之后重新生成的:
23:34[root@centos7 /var/lib/mysql]# ls
aria_log.00000001 aria_log_control ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test
不过重启服务后systemctl restart mysql ,就恢复了之前的所有数据,包括sock文件:
结合下面部分的分析应该得知,利用yum和systemctl的mysql应该把这些配置文件写在了其他地方(可能在unit.service中)
00:05[root@centos7 /var/lib/mysql]# ls
aria_log.00000001 centos7.pid ibdata1 ib_logfile1 multi-master.info mysql.sock tc.log
aria_log_control ib_buffer_pool ib_logfile0 ibtmp1 mysql performance_schema test
# Start main service
# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
# Use the [Service] section and Environment="MYSQLD_OPTS=...".
# This isn‘t a replacement for my.cnf.
# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster
ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION
==============================================================================YUM的(systemd):
23:50[root@centos7 /var/lib/mysql]# systemctl status mysql
● mariadb.service - MariaDB 10.3.14 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since Tue 2019-04-16 23:15:16 CST; 36min ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Process: 23719 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 23675 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
Process: 23672 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Main PID: 23687 (mysqld)
Status: "Taking your SQL requests now..."
CGroup: /system.slice/mariadb.service
└─23687 /usr/sbin/mysqld
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] InnoDB: 10.3.14 started; log sequence number 1630815; transaction id 21
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] InnoDB: Buffer pool(s) load completed at 190416 23:15:16
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Plugin ‘FEEDBACK‘ is disabled.
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Server socket created on IP: ‘::‘.
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Reading of all Master_info entries succeded
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] Added new Master_info ‘‘ to hash table
Apr 16 23:15:16 centos7.6test mysqld[23687]: 2019-04-16 23:15:16 0 [Note] /usr/sbin/mysqld: ready for connections.
Apr 16 23:15:16 centos7.6test mysqld[23687]: Version: ‘10.3.14-MariaDB‘ socket: ‘/var/lib/mysql/mysql.sock‘ port: 3306 MariaDB Server
Apr 16 23:15:16 centos7.6test systemd[1]: Started MariaDB 10.3.14 database server.
========================================================================================二进制的(init.d下服务脚本的)
20:27[root@centos7 /usr/local/mariadb-10.2.23-linux-x86_64/support-files]# systemctl status mysqld.service
● mysqld.service - LSB: start and stop MariaDB
Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
Active: active (running) since Mon 2019-04-29 17:58:44 CST; 1 day 2h ago
Docs: man:systemd-sysv-generator(8)
Process: 8290 ExecStop=/etc/rc.d/init.d/mysqld stop (code=exited, status=0/SUCCESS)
Process: 8356 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/mysqld.service
├─8420 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/centos7.6test.pid
└─8556 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysq...
Apr 29 17:58:43 centos7.6test systemd[1]: Starting LSB: start and stop MariaDB...
Apr 29 17:58:43 centos7.6test mysqld[8356]: Starting MariaDB.190429 17:58:43 mysqld_safe Logging to ‘/var/log/mariadb/mariadb.log‘.
Apr 29 17:58:43 centos7.6test mysqld[8356]: 190429 17:58:43 mysqld_safe Starting mysqld daemon with databases from /data/mysql
Apr 29 17:58:44 centos7.6test mysqld[8356]: SUCCESS!
Apr 29 17:58:44 centos7.6test systemd[1]: Started LSB: start and stop MariaDB.
通过ps aux |grep mysql 可以看到这些变量的具体是什么,以及mysqld 服务的参数是啥
同样的yum安装的利用systemd服务的和自定义安装没有利用systemd服务而是service服务的是有区别的:
root 8420 0.0 0.0 115436 1748 ? S 17:58 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/centos7.6test.pid
mysql 8556 0.0 7.5 2008736 140732 ? Sl 17:58 0:10 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/data/mysql/centos7.6test.pid --socket=/tmp/mysql.sock --port=3306
root 14724 0.0 0.0 112708 976 pts/0 S+ 22:08 0:00 grep --color=auto mysql
同时查看init.d下的启动脚本可知:
mysqld服务启动的时候是先启动的bin目录下的$bindir/mysqld_safe(个人猜想要加密码)脚本,然后此脚本再启动mysqld主服务程序。
ase "$mode" in
‘start‘)
# Start daemon
# Safeguard (relative paths, core dumps..)
cd $basedir
echo $echo_n "Starting MariaDB"
if test -x $bindir/mysqld_safe
then
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" "$@" &
wait_for_ready; return_value=$?
# Make lock for RedHat / SuSE
if test -w "$lockdir"
then
touch "$lock_file_path"
fi
exit $return_value
else
log_failure_msg "Couldn‘t find MariaDB server ($bindir/mysqld_safe)"
fi
;;
23:51[root@centos7 /var/lib/mysql]# ps aux | grep mysql
mysql 23687 0.0 4.7 1764724 88244 ? Ssl Apr16 0:02 /usr/sbin/mysqld
root 25024 0.0 0.0 112708 980 pts/0 S+ 00:00 0:00 grep --color=auto mysql
00:48[root@centos7 ~]# cd -
/etc/init.d
00:48[root@centos7 /etc/init.d]# ./mysql start
Starting MariaDB.190417 00:48:17 mysqld_safe Logging to ‘/var/lib/mysql/centos7.6test.err‘.
190417 00:48:17 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
SUCCESS!
00:48[root@centos7 /etc/init.d]# ps aux | grep mysql
root 28345 0.1 0.0 113312 1656 pts/1 S 00:48 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/centos7.6test.pid
mysql 28414 2.4 4.3 1766812 81884 pts/1 Sl 00:48 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/centos7.6test.err --pid-file=/var/lib/mysql/centos7.6test.pid
root 28449 0.0 0.0 112708 980 pts/1 S+ 00:48 0:00 grep --color=auto mysql
00:48[root@centos7 /etc/init.d]#
此命令可删除数据库所有信息,然后就可以清除掉root密码(暴力方式),不过只有测试的时候会这样做
然后再用mysql_instal_db命令重新安装数据库,此时查看它的帮助可以看到更多的选项,可以对数据库进行部分设置
然后重启数据库服务,此时会生成mysql.sock文件(根据配置文件所写)
为了实现多实例的脚本,同时不在启动脚本中中输入passwd(利用mysqladmin关闭mysql服务这种方式不合理)
想要参考service自带的写法
错误出现:当修改了init.d/mysqld服务脚本之后,(此时mysqld服务仍然在启动中,就是因为它才导致后面的问题) 。centos7中 systemctl命令提示我mysqld.service on disk changed ,需要 daemon-reload到内存中。因此deamon-reload之后,无论如何都无法启动mysqld服务了。
附加知识点1:systemctl 在centos7中同样的用来控制了service命令,可以用systemctl show mysqld.service 查看它的启动参数,从这里可以查看到,systemctl命令最终生成了一个/run/systemd/generator.late/mysqld.service服务脚本用于命令的启动
错误信息提示的是在wait_for_ready函数中kill -0 查找不到后台运行的最后一个命令的pid(这里用的是$!这个参数,它代表当前shell后台运行的最后一个进程PID)。
而在/init.d/mysqld脚本的start项目中可以看到mysqld_safe命令这一行是为了后台运行的,下一步才是wait_for_ready函数。
为了检测错误原因,自己手动启动mysqld_safe命令时(不加&后台启动)发现它总是无法启动(它不会卡住,而不卡主就代表没有启动成功,因为没有加&)
此时因为配置文件中写的有log-error的文件位置,(注意了,log文件位置的父目录如果不存在,则它是无法创建的),创建了一个log-errot文件,从这里面查看得到它没有创建一个另外的pid文件位置(两种情况,一个是文件位置不对,父目录不存在无法创建;一个是服务没有启动,当然不会有pid)
进而通过查看这个文件得知了无法启动的原因是因为sock文件不干净导致的,因为上面改服务的时候这个sock还在启动中。此时只要在配置文件中修改socket的位置或者说把原来的sock删除掉。然后再重启服务就行了(前面说过sock是重启服务生成的)
附加知识2: 可以参看/init.d/mysqld中服务脚本wait_for_ready的逻辑,它就是为了等待这个mysqld_safe命令完全启动并且启动mysqld之后,等到允许连接状态(有一个时间的阈值,一直在这个里面循环),利用了$!参数而已。
附加知识3:加入配置文件不写log-error位置,则默认位置就在数据库目录下。如果写了则不是。(如果写了之后再次注释掉或者删掉,重启服务,又变成了默认的。看来的确如上一个博客前面分析的逻辑,所有的变量和参数都有默认的配置不知道写在哪了,只有自己在配置文件中写了才会改变它)
23:11[root@centos7 /data/mysql]# mysqladmin variable |grep error
| log_error | /data/mysql/centos7.6test.err
23:11[root@centos7 /data/mysql]# vim /etc/my.cnf :修改log文件位置,取消注释
23:12[root@centos7 /data/mysql]# service mysqld restart
Restarting mysqld (via systemctl): [ OK ]
23:12[root@centos7 /data/mysql]# mysqladmin variable |grep error
| log_error | /data/mariadb.log
标签:tar 相同 搜索 echo ace environ 时间 file 暴力
原文地址:https://blog.51cto.com/14228129/2388606