【シェル】【MySQL】MySQLの全DBをエクスポート/インポートするスクリプト

■ はじめに

 「mysqldump --all-databases」の場合、
MySQL自体のシステムに関わるDB「information_schema」「performance_schema」「mysql」「sys」も含んだ形で
エクスポートしてしまうので、そのことを考慮したシェルスクリプトを書いてみる
mysqldump については、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/36680883.html

■ 補足:ストアドプロシージャ/ストアドファンクション/イベントのダンプ

https://blogs.yahoo.co.jp/dk521123/36680883.html
より抜粋
 * 「ストアドプロシージャ」「ストアドファンクション」「イベント」は、
    デフォルトで出力しない場合があるので、ダンプしたい場合は、
    オプション「--routines」「--events」を明示的に付加する

# 新しいバージョンだと、デフォルトできるらしいが、、、

■ バックアップ用のシェルスクリプト

mysql-export.sh
#!/bin/sh

if [ $# -ne 1 ]; then
   echo "$(basename $0) </path/to/dump/dir>"
   exit 1
fi

dump_dir=$1
mkdir -p ${dump_dir}

now=$(date "+%Y%m%d_%H%M%S")
target_name="mysql_backup_${now}"
temp_root_path="/tmp/$(date '+%Y%m%d%H%M%S%3N')"
temp_path="${temp_root_path}/${target_name}"
mkdir -p ${temp_path}

. ./.db_info

echo "Starting DB dump! $(date '+%Y-%m-%d %H:%M:%S')"
export MYSQL_PWD=${MYSQL_PASSWORD};

databases=$(mysql -u${MYSQL_USER} -e 'SHOW DATABASES;' --silent)

for database in $databases
do
   if [ "$database" == "information_schema" -o "$database" == "performance_schema" -o "$database" == "mysql" -o "$database" == "sys" ]; then
      echo "Skip $database."
   else
      echo "Dumping $database..."
      filename="${temp_path}/${database}.sql.gz"

      mysqldump -u${MYSQL_USER} --single-transaction --routines --events --hex-blob $database | gzip > $filename
      echo $filename
   fi
done

backup_file="${temp_root_path}/${target_name}.tar.gz"
tar -zcvf ${backup_file} -C ${temp_root_path} ${target_name}

mv ${backup_file} "${dump_dir}/."

rm -r ${temp_root_path}

echo "Done! $(date '+%Y-%m-%d %H:%M:%S')"
DB情報が格納されている外部ファイル「.db_info」
MYSQL_USER=root
MYSQL_PASSWORD=password

使用例

mkdir -p /home/admin/backup
sudo mysql-export.sh /home/admin/backup

■ インポート用のシェルスクリプト

mysql-import.sh
#!/bin/sh

if [ $# -ne 3 ]; then
   echo "$(basename $0) </path/from/dump/dir> <DB user> <DB password>"
   exit 1
fi

input_dump_file=$1
db_user=$2
db_password=$3

if [ ! -f $input_dump_file ]; then
   echo "$input_dump_file is not a file."
   exit 1
fi

echo "Importing DB dump! $(date '+%Y-%m-%d %H:%M:%S')"

temp_path="/tmp/$(date '+%Y%m%d%H%M%S')"
mkdir -p ${temp_path}
dump_file_name=`basename ${input_dump_file}`
temp_file_fullpath="${temp_path}/${dump_file_name}"
cp -r ${input_dump_file} ${temp_file_fullpath}

tar xvzf ${temp_file_fullpath} -C ${temp_path}

dump_dir_name=${dump_file_name%%.*}

dump_files=`ls ${temp_path}/${dump_dir_name}/*.gz`

for dump_file in ${dump_files}
do
   # Step1 : unzip
   gzip -d ${dump_file}
        
   # Step2 : Create DB, if not exists
   db_name=`basename ${dump_file%%.*}`
   echo "Create DB [${db_name}], if not exists"
   MYSQL_PWD=${db_password} mysql -u${db_user} -e "begin; CREATE DATABASE IF NOT EXISTS ${db_name}; commit;"

   # Step3 : Import
   sql_dump_file_fullpath="${dump_file%.*}"
   echo "Import [${sql_dump_file_fullpath}]"
   MYSQL_PWD=${db_password} mysql -u${db_user} ${db_name} < ${sql_dump_file_fullpath}
done

rm -r ${temp_path}

echo "Done! $(date '+%Y-%m-%d %H:%M:%S')"

使用例

# sudo mysql-import.sh [エクスポートしたファイル] [DB user] [DB password]
sudo mysql-import.sh mysql_backup_20180820_224600.tar.gz root password

■ 使用するTips

外部ファイル取り込み

. ./.db_info

echo "${MYSQL_USER} / ${MYSQL_PASSWORD}"
.db_info
MYSQL_USER=root
MYSQL_PASSWORD=password
https://orebibou.com/2014/11/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E5%A4%96%E9%83%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E8%A8%98%E8%BF%B0%E3%81%95%E3%82%8C%E3%81%9F%E5%A4%89/

引数

# 引数が3つない場合
if [ $# -ne 3 ]; then
   echo "ERROR MESSAGE"
   exit 1
fi

# 引数を変数に設定
input_dump_file=$1
db_user=$2
db_password=$3


関連記事

MySQL】 データのエクスポート / バックアップを行うには... ~ mysqldump ~

https://blogs.yahoo.co.jp/dk521123/36680883.html

MySQL での データ移行 を考える

https://blogs.yahoo.co.jp/dk521123/36589352.html

シェルで、複数の mysqldumpファイル を実行する

https://blogs.yahoo.co.jp/dk521123/36920590.html

PostgreSQLのDBをエクスポート/インポートするスクリプト

https://blogs.yahoo.co.jp/dk521123/37421399.html

cronデーモン / crontabコマンド

https://blogs.yahoo.co.jp/dk521123/36463384.html