mysql - Bash 脚本将新的 MySql 服务器实例启动到内存中

标签 mysql linux bash shell scripting

如果我在 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 如果有的话,这可能会产生打印监听命令的理想副作用。 nc/lsof 相对于解析 netstat 的优势在于您不会错误地解析它(例如,如果应用程序监听 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 在第一行添加注释,这样别人就不会修改了并覆盖他们的更改。

关于mysql - Bash 脚本将新的 MySql 服务器实例启动到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13814247/

相关文章:

bash - 从终端将目录中的文件列表打印到文本文件(但不是文本文件本身)

php - 提取唯一订单

php - 尝试按 ASC 顺序获取结果但收到错误

php - Codeigniter 创建准备好的语句或使用事件记录通过 concat 进行搜索

linux - 使用 tee 命令打印垃圾字符

c - 如何在 C 中获取与寄存器宽度无关的无符号整数变量?

mysql - 将两个表与一个表中的多个结果连接在一起

linux - 使用 Linux 将特定数量的文件从一个目录复制到另一个目录

linux - 查找包含关键字和提取编号的所有行

bash "map"相当于 : run command on each file