将启动新MySql服务器实例的脚本放入内存



如果我在RAM内存中设置mysql实例,单元测试的运行速度会快几倍,但因为这是手动过程,所以我需要一些时间才能完成,而且我需要在少数服务器上完成。新的mysql实例应该在3307端口上运行,如果它是空闲的,否则返回错误。

所以,我需要做的第一件事是检查是否有服务已经在这个端口上侦听,我为此添加了代码,但在一些服务器上,它不会显示在3307端口上运行的进程,即使有这样的进程。我需要帮助来改进这个脚本。我对shell编程没有太多经验。

#!/bin/bash
STAT=`netstat -na | grep 3308 | awk '{print $6}'`
if [ "$STAT" = "LISTEN" ];
then
echo "There is already process that listen on port 3307"
fi
# Create ramdisk
mkdir -p /mnt/ramdisk
mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk
chown mysql:mysql /mnt/ramdisk
port=3307
distribution=$(lsb_release -i | cut -f2)

if [ $distribution == 'Debian' ]
then
mkdir /var/lib/mysql2
chown -R mysql.mysql /var/lib/mysql2/
mkdir /var/log/mysql2
chown -R mysql.mysql /var/log/mysql2
cp -R /etc/mysql/ /etc/mysql2
cd /etc/mysql2/
sed -i "s/3306/$port/g" my.cnf
sed -i "s/mysqld.sock/mysqld2.sock/g" my.cnf
sed -i "s/mysqld.pid/mysqld2.pid/g" my.cnf
sed -i "s/var/lib/mysql/var/lib/mysql2/g" my.cnf
sed -i "s/var/log/mysql/var/log/mysql2/g" my.cnf
mysql_install_db --user=mysql --datadir=/mnt/ramdisk
mysqld_safe --defaults-file=/etc/mysql2/my.cnf &
elif [ $distribution == 'CentOS' ]
then
cp /etc/my.cnf /etc/my2.cnf
cd /etc
sed -i "s/3306/$port/g" my2.cnf
sed -i "s/mysqld.sock/mysqld2.sock/g" my2.cnf
sed -i "s/mysqld.pid/mysqld2.pid/g" my2.cnf
sed -i "s/var/lib/mysql/var/lib/mysql2/g" my2.cnf
sed -i "s/var/log/mysql/var/log/mysql2/g" my2.cnf
mysql_install_db --user=mysql --datadir=/mnt/ramdisk
mysqld_safe --defaults-file=/etc/my2.cnf &
else
exit 13
fi

忽略您在测试中使用3308的事实,以检查端口上是否有东西在侦听,您可能需要使用netcat,它只是尝试连接:

if nc -z localhost "$port"
then
echo "Port $port is in use"
exit 1
fi

您可以类似地使用lsof -i TCP:"$port" -s TCP:LISTEN,如果有,它可能会产生打印侦听命令的副作用。与解析netstat相比,nc/lsof的优势在于,你不会错误地解析它(例如,如果应用程序监听UDP端口13307,你的情况就会崩溃)。

您可能希望添加set -e作为第二行。如果其中一个命令失败(例如,由于缺少文件或权限),这将使bash中止,而不是毫无意义地继续执行下一个命令并可能破坏某些东西。

您也可以在一个sed命令中使用多个表达式,并对s使用不同的分隔符以避免过度转义:

sed -i -e 's/mysqld.pid/mysqld2.pid/g' 
-e 's:/var/lib/mysql:/var/lib/mysql2/:g' 
file

一般来说,您可能还希望sed -i '1i# Autogenerated file, do not edit' my.cnf在第一行添加注释,这样人们就不会修改它并覆盖他们的更改。

相关内容

  • 没有找到相关文章

最新更新