LoginSignup
3
0

More than 1 year has passed since last update.

シェルスクリプト(bash)でデータベース、テーブルをバックアップ、削除、作成、データインポート

Last updated at Posted at 2022-05-27

シェルスクリプト(bash)でデータベース、テーブルをバックアップ、削除、作成、データインポートする際に使った処理の備忘録です。

データベース操作系

データベース参照できない場合

echo "SHOW DATABASES" | mysql $DB_USER $DB_PASS -D $DB_NAME -h $DB_HOST
if [ $? -gt 0 ]; then
    echo "[ERROR]データベース参照不可。シェルスクリプトを強制終了する。";
    exit 1;
fi
# $DB_USER:-uroot等
# $DB_PASS:-proot等
# $DB_NAME:test_db等
# $DB_HOST:localhost等

条件に合うレコードの件数を取得

CNT_REC=(`echo "SELECT COUNT(*) FROM test_table WHERE test_cd==\"$TEST_CD\"" | mysql $DB_USER $DB_PASS -D $DB_NAME -h $DB_HOST`);
if [ $? -gt 0 ]; then
    echo "[ERROR]test_table参照失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
if [ ${CNT_REC[1]} -eq 0 ]; then
    echo "[ERROR]test_tableにデータなし。シェルスクリプトを強制終了する。";
    exit 1;
fi

データベースのバックアップを取得

DATE=`date "+%Y%m%d%H%M%S"`;
mysqldump --add-locks --disable-keys --extended-insert --lock-all-tables --quick --quote-names $DB_USER $DB_PASS -h $DB_HOST -B $DB_NAME > $BACKUP_BASE_DIR$DB_NAME"_"$DATE".dump"
if [ $? -gt 0 ]; then
    echo "[ERROR]バックアップ失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi

データベース削除

echo "DROP DATABASE IF EXISTS "$DB_NAME | mysql $DB_USER $DB_PASS -h $DB_HOST
if [ $? -gt 0 ]; then
    echo "[ERROR]データベース削除失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi

データベース作成

echo "CREATE DATABASE IF NOT EXISTS "$DB_NAME | mysql $DB_USER $DB_PASS -h $DB_HOST
if [ $? -gt 0 ]; then
    echo "[ERROR]データベース作成失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi

SQLファイルをインポートする。

cat $IMPORT_FILE | mysql $DB_USER $DB_PASS -h $DB_HOST -D $DB_NAME
if [ $? -gt 0 ]; then
    echo "[ERROR]インポート失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi

viewテンプレートファイルをインポートする。

mysql  $DB_USER $DB_PASS -h $DB_HOST -D $DB_NAME < $IMPORT_VIEW_FILE
if [ $? -gt 0 ]; then
    echo "[ERROR]viewテンプレートファイルのインポート失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi

ファイル操作系

パーミッションを変更する

chmod 777 $TEST
if [ $? -gt 0 ]; then
    echo "[ERROR]パーミッション変更失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi

世代管理(※バックアップファイルが3つ以上ある場合は古いものを削除する)

DATE_YEAR=`date "+%Y"`;
while :
do
    BACKUP_CNT=`ls -1r $BACKUP_BASE_DIR$DB_NAME"_"$DATE_YEAR*".dump" | wc -l`;
    if [ $BACKUP_CNT -le $BACKUP_MAX ]; then
        break;
    fi

    rm `ls -1r $BACKUP_BASE_DIR$DB_NAME"_"$DATE_YEAR*".dump" | tail -1`;
    if [ $? -gt 0 ]; then
        echo "[ERROR]旧バックアップファイル削除失敗。シェルスクリプトを強制終了する。";
        exit 1;
    fi
done

時刻制御系

現在時刻取得

DATE_NOW=`date "+%Y/%m/%d %H:%M:%S"`;

1ヵ月前の年月日を取得

DATE_1MAGO=`date -d "1 month ago" "+%Y-%m-%d"`;

平日かどうか判定

if [ `date -d $DATE_TARGET "+%u"` -lt 6 ]; then
    # 平日
else
    # 休日
fi

その他

シェルスクリプト実行時に付けたパラメータ数(=引数)が1つでない場合。

if [ $# -ne 1 ]; then
    echo "[ERROR]パラメータ数不正。シェルスクリプトを強制終了する。";
    exit 1;
fi

ファイルが存在しない場合。

if [ ! -e $FILE_PATH ]; then
    echo "[ERROR]ファイルが存在しない場合。シェルスクリプトを強制終了する。";
    exit 1;
fi

ディレクトリが存在しない場合。

if [ ! -d $FILE_PATH ]; then
    echo "[ERROR]ディレクトリが存在しない場合。シェルスクリプトを強制終了する。";
    exit 1;
fi

シェルスクリプト内で別のシェルスクリプトを実行する場合。

source $SHELL_PATH

数値演算

TEST2=`expr $TEST1 + 1`;
TEST3=`expr $RANDOM % 500 + 51`;
TEST4=`expr $TEST3 \* \( $RANDOM % 2 + 1 \)`;

(指定した書式での)文字列生成

TEST2=`printf "%06d" $TEST1`;

case文(CやPHPでいうところのswitch文)

case $MODE in
    0 )
        echo -e $MODE0;;
    1 )
        echo -e $MODE1;;
    2 )
        echo -e $MODE2;;
    * )
        echo "[ERROR]モード不正。シェルスクリプトを強制終了する。";
        exit 1;;
esac

特定のファイルの文字列一括置換

sed -i "s!"$BEFORE"!"$AFTER"!g" $TARGET_FILE
# あるあるミス:「-」を使う場合はエスケープして「\-」とすること。

特定のディレクトリにあるファイル群を一括で文字列置換

find $DIR -type f | xargs sed -i -e "s!"$BEFORE"!"$AFTER"!g"
# あるあるミス:「-」を使う場合はエスケープして「\-」とすること。

特定のディレクトリにあるディレクトリ群を一括で処理

RESULT_WORK=0;
DIRS=`find $DIR"/test/"* -type d`;
for DIR in $DIRS;
do
    # 何かしらの処理
    if [ $? -gt 0 ]; then
        RESULT_WORK=2;
    fi
done
if [ $RESULT_WORK -eq 0 ]; then
    echo "正常";
else
    echo "失敗";
fi

どちらか一方でも空である場合

if [ -z $ADMIN_ID -o -z $ADMIN_PASS ]; then
    echo "[ERROR]どちらか一方でも空である場合。シェルスクリプトを強制終了する。";
    exit 1;
fi

ランダムパスワード作成、htpasswd作成

FRONT_ID="test";
FRONT_PASS=`cat /dev/urandom | tr -dc "[:alnum:]" | fold -w 16 | grep -v "[gqoO09bhIl]" | head -1`;
rm -rf $AUTH_DIR$FRONT_TOP"/.htpasswd";
htpasswd -n -b $FRONT_ID $FRONT_PASS > $AUTH_DIR$FRONT_TOP"/.htpasswd"
chmod 777 $AUTH_DIR$FRONT_TOP"/.htpasswd";
echo $FRONT_ID":"$FRONT_PASS > "front_auth.txt"
chmod 777 "front_auth.txt"

# front_auth.txtからIDとPASSを取得する方法の一例
array=(`cat "front_auth.txt" | tr -s ":" "\n"`);
FRONT_ID=`echo ${array[0]}`;
FRONT_PASS=`echo ${array[1]}`;
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0