MySQL5.5 數據熱備份


       mysqlhotcopy使用lock tables、flush tables和cp或scp來快速備份數據庫.它是備份數據庫或單個表最快的途徑,完全屬於物理備份,但只能運行在數據庫目錄所在的機器上.與mysqldump備份不同,mysqldump屬於邏輯備份,備份時是執行的sql。

mysql5.7已經沒有這個命令了,多用於mysql5.5之前。mysqlhotcopy使用lock tables、flush tables和cp或scp來快速備份數據庫或單個表,屬於裸文件備份(物理備份),只能用於MyISAM引擎的數據庫。本質是使用鎖表語句,然后cp或scp。

 

一、CentOs 7 mysqlhotcopy 安裝

[root@localhost ~]# yum install perl-DBD* -y

或者編譯安裝

yum install -y gcc
yum install -y perl-ExtUtils-MakeMaker perl-Devel-CheckLib perl-CPAN

wget -i -c https://cpan.metacpan.org/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.047.tar.gz
tar zxvf DBD-mysql-4.047.tar.gz
cd DBD-mysql-4.047
perl Makefile.PL
make && make install

 

二、備份

[root@localhost ~]# /bin/mysqlhotcopy -u root -p '' --addtodest mysqlname /opt/sql_back/

 

三、還原

[root@localhost~]# cp -arp /opt/sql_back/mysqlname /var/lib/mysql/        --將備份的數據移到mysql數據根目錄

 

四、備份腳本

1.添加定時執行。

#每一小時進行mysql的備份
0 * * * *  /data/shell/mysql_hotbackup.sh

 

2. 備份腳本

#!/bin/bash

HOST="192.168.1.128"
USER="root"
PASSWORD="root"
BACKUP_PARENT_DIR="/data/backup/";
BACKUP_DIR_NAME="mysql_data"


CURRENT_DIR=$(pwd)
CURRENT_DAY=$(date +%Y%m%d%H)
DELETE_DAY=$(date -d "2 days ago" +%Y%m%d)



#這里面有兩個參數,-A、-N,-A的含義是不去預讀全部數據表信息,這樣可以解決在數據表很多的時候卡死的問題
#-N,很簡單,Don't write column names in results,獲取的數據信息省去列名稱
SHOW_DATABASES_CMD="mysql -h${HOST} -u${USER} -p${PASSWORD} --default-character-set=utf8 -N -e \"SHOW DATABASES\""
db_result=$(eval "$SHOW_DATABASES_CMD")

#dump_data=./data.user.txt
#>$dump_data
#echo -e "$result" > $dump_data
##這里要額外注意,echo -e "$result" > $dump_data的時候一定要加上雙引號,不讓導出的數據會擠在一行


db_name_str=$(echo ${db_result} | sed 's/ /,/g' | sed 's/\n//g' | sed 's/-/@002d/g')


OLD_IFS="$IFS"
IFS=","
db_name_array=($db_name_str)
IFS="$OLD_IFS"


echo "Start MySql Hot Backup......";
echo ""
echo ""

#進入備份目錄
echo "cd ${BACKUP_PARENT_DIR}";
cd ${BACKUP_PARENT_DIR}


#創建myql備份目錄
echo ""
echo "mkdir MySql backup dir: ${BACKUP_DIR_NAME}"
mkdir -p ${BACKUP_DIR_NAME}



#備份數據
echo ""
echo ""
backup_dir=$(cd "${BACKUP_PARENT_DIR}/${BACKUP_DIR_NAME}/"; pwd)
for db_name in ${db_name_array[@]}
do
    ###跳過熱備份
    if [ "$db_name"x = "information_schema"x ] || [ "$db_name"x = "mysql"x ] || [ "$db_name"x = "performance_schema"x ]; then
        continue
    fi
    
    echo "mysqlhotcopy -h ${HOST} -u ${USER} -p ${PASSWORD} --addtodest ${db_name} ${backup_dir}";
    mysqlhotcopy -h ${HOST} -u ${USER} -p ${PASSWORD} --addtodest ${db_name} ${backup_dir}
done


#壓縮備份
echo ""
echo ""
echo "Current dir:$(pwd)"
echo ""
echo "Compress MySql backup data......"
echo "tar zcf ./mysql_data_${CURRENT_DAY}.tar.gz ${BACKUP_DIR_NAME}"
tar zcf "./mysql_data_${CURRENT_DAY}.tar.gz" ${BACKUP_DIR_NAME}
echo ""


#刪除之前的備份
delete_file="./mysql_data_${DELETE_DAY}*.tar.gz"
echo "Delete MySql backup data of two days ago: ${delete_file}"
if [ -d "$delete_file" ]; 
then
    echo "不允許刪除目錄"
else
    echo "rm -rf ${delete_file}"
    rm -rf ${delete_file}
fi


#回到當前目錄
echo ""
echo "Return to source directory:${CURRENT_DIR}";
cd ${CURRENT_DIR}

echo ""
echo ""
echo "MySql Hot Backup is Successfully !";



#https://blog.csdn.net/xfcy1990/article/details/52120581
#https://www.cnblogs.com/kissdodog/p/4174421.html
#https://www.cnblogs.com/fire909090/p/7202584.html
#https://blog.51cto.com/853056088/1952430
#https://www.cnblogs.com/jiayy/p/3766286.html

 

PS:

https://blog.csdn.net/xfcy1990/article/details/52120581
https://www.cnblogs.com/kissdodog/p/4174421.html
https://www.cnblogs.com/fire909090/p/7202584.html
https://blog.51cto.com/853056088/1952430
https://www.cnblogs.com/jiayy/p/3766286.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM