■ はじめに
「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=passwordhttps://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