シェル スクリプトから、MySQL データベース内のテーブルが存在するかどうかを確認するにはどうすればよいですか?

シェル スクリプトから、MySQL データベース内のテーブルが存在するかどうかを確認するにはどうすればよいですか?

ユーザーがテーブルに対して行う必要のある操作を選択できるようにするスクリプトを作成しようとしています。テーブルが存在するかどうかを確認したいです。存在する場合は他の処理を続行し、存在しない場合はテーブルが存在しないというメッセージで終了します。どうすればこれを実現できるでしょうか。

答え1

if [ $(mysql -N -s -u root -p -e \
    "select count(*) from information_schema.tables where \
        table_schema='db_name' and table_name='table_name';") -eq 1 ]; then
    do something
else
    echo "table <table_name> does not exist"
    exit 1
fi
  • -N列名をスキップする
  • -s非表形式の出力の場合

答え2

MySQLではシェルから-eを使用できる

mysql -e "desc main_db.clients" > /dev/null 2>&1
echo $?

答え3

MySQL クライアントを実行して MySQL サーバーにログインする必要のない方法が必要な場合は、次の操作を実行できます。

if ls -l /var/lib/mysql/database/table.frm 2> /dev/null > /dev/null
then
  echo Table exists
else
  echo Table does not exist
fi

最初の行のデータ ディレクトリへのパス、データベース名、テーブル名を置き換える必要があります。

注意:

  1. InnoDBを使用している場合は、これは機能しません。ないinnodb-file-per-table を使用します。つまり、スクリプトはテーブルが実際に存在しているにもかかわらず、テーブルが存在しないと表示する可能性があります。
  2. ファイルシステムを使用してテーブルをコピーしたり、MyISAM から InnoDB に切り替えたりするなど、さまざまな理由でそのファイルが存在する可能性があります。つまり、スクリプトではテーブルが存在しないにもかかわらず、存在すると表示される可能性があります。

上記の理由により、すでに紹介した他の方法ほど信頼性は高くありませんが、mysql クライアントを回避できるため、それでも価値があるかもしれません。

ここで紹介するすべての方法は、自分の権限 (ファイルシステムまたは MySQL) を正しく取得していることを前提としていることに注意してください。権限を間違えると、偽陰性の結果になる可能性が高くなります。

関連情報