MySQL數(shù)據(jù)庫定時(shí)備份的幾種實(shí)現(xiàn)方法
1、查看 MySQL 是否安裝了 crontab
yum -y install vixie-cron yum -y install crontabs
2、crontab 常用命令
# 查看進(jìn)程是否正在進(jìn)行 ps aux | grep crond # 查看運(yùn)行狀態(tài) systemctl status crond 或者 service crond status # 啟動(dòng)服務(wù) systemctl start crond 或者 service crond status # 關(guān)閉服務(wù) systemctl stop crond 或者 service crond status # 重啟服務(wù) systemctl restart crond 或者 service crond restart # 重新載入配置 systemctl reload crond # 加入開機(jī)啟動(dòng) systemctl enable crond # 查看定時(shí)任務(wù) crontab -l # 編輯 crontab -e
3、編寫 dump_mysql.sh 腳本
方式一:簡(jiǎn)單版
# 設(shè)置mysql的登錄用戶名和密碼(根據(jù)實(shí)際情況填寫) mysql_user="root" mysql_password="123456" mysql_host="101.133.170.222" mysql_port="3306" mysql_charset="utf8" # 備份文件存放地址(根據(jù)實(shí)際情況填寫) backup_location=/data/mysql/bakup # 是否刪除過期數(shù)據(jù) expire_backup_delete="ON" expire_days=7 backup_time=`date +%Y%m%d%H%M` backup_dir=$backup_location welcome_msg="Welcome to use MySQL backup tools!" # 備份指定數(shù)據(jù)庫中數(shù)據(jù)(此處假設(shè)數(shù)據(jù)庫是ruoyi )mysql容器里面找到mysqldump我的路徑是/usr/bin/mysqldump docker exec mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B ruoyi > $backup_dir/mysql-$backup_time.sql # 刪除過期數(shù)據(jù) if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then `find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf` echo "Expired backup data delete complete!" fi
方式二:復(fù)雜版
mysql_user="root" #MySQL備份用戶 mysql_password="123456" #MySQL備份用戶的密碼 mysql_host="101.133.170.222" mysql_port="3306" mysql_charset="utf8" #MySQL編碼0 2 * * * docker exec -i mysql sh /root/mysql8.0.20/mysqlbfplus/run.sh backup_db_arr=("ruoyi") #要備份的數(shù)據(jù)庫名稱,多個(gè)用空格分開隔開 如("db1" "db2" "db3") backup_location=/data/mysql/bakup #備份數(shù)據(jù)存放位置,末尾請(qǐng)不要帶"/",此項(xiàng)可以保持默認(rèn),程序會(huì)自動(dòng)創(chuàng)建文件夾 expire_backup_delete="ON" #是否開啟過期備份刪除 ON為開啟 OFF為關(guān)閉 expire_days=7 #過期時(shí)間天數(shù) 默認(rèn)為三天,此項(xiàng)只有在expire_backup_delete開啟時(shí)有效 backup_time=`date +%Y%m%d%H%M` #定義備份詳細(xì)時(shí)間 backup_Ymd=`date +%Y-%m-%d` #定義備份目錄中的年月日時(shí)間 #backup_day_ago=`date -d 'expire_days days ago' +%Y-%m-%d` #備份之前的日期 backup_dir=$backup_location/$backup_Ymd #備份文件夾全路徑 welcome_msg="Welcome to use MySQL backup tools!" #歡迎語 mysql_ps=`ps -ef |grep mysql |wc -l` mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l` if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then echo "ERROR:MySQL is not running! backup stop!" exit else echo $welcome_msg echo "MySQL connect ok! Please wait......" fi # 判斷有沒有定義備份的數(shù)據(jù)庫,如果有定義則開始備份,否則退出備份 if [ "$backup_db_arr" != "" ];then #dbnames=$(cut -d ',' -f1-5 $backup_database) #echo "arr is (${backup_db_arr[@]})" for dbname in ${backup_db_arr[@]} do echo "database $dbname backup start..." `mkdir -p $backup_dir` docker exec mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz flag=`echo $?` if [ $flag == "0" ];then echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz" else echo "database $dbname backup fail!" fi done else echo "ERROR:No database to backup! backup stop" exit fi # 如果開啟了刪除過期備份,則進(jìn)行刪除操作 if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;` `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf` echo "Expired backup data delete complete!" fi
方式三:docker定時(shí)備份,根據(jù)備份數(shù)量刪除
#用戶名 mysql_user="root" #密碼 mysql_password="root" mysql_host="101.133.170.222" #端口號(hào) mysql_port="3306" #將要備份的數(shù)據(jù)庫 database_name="ruoyi" #編碼格式 mysql_charset="utf8" #保存?zhèn)浞菸募疃鄠€(gè)數(shù) count=3 #備份保存路徑 backup_path=/data/mysql/bakup #日期 date_time=`date +%Y-%m-%d-%H-%M` #如果文件夾不存在則創(chuàng)建 if [ ! -d $backup_path ]; then mkdir -p $backup_path; fi #查看MySQL是否在運(yùn)行 mysql_ps=`ps -ef |grep mysql |wc -l` echo "查看MySQL是否在運(yùn)行:$mysql_ps" >> $backup_path/dump.log mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l` if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then echo "ERROR:MySQL is not running! backup stop!" >> $backup_path/dump.log exit else echo "Welcome to use MySQL backup tools!" >> $backup_path/dump.log echo "MySQL connect ok! Please wait......" >> $backup_path/dump.log fi #開始備份 echo "開始備份..." >> $backup_path/dump.log docker exec h3_mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $database_name --default-character-set=$mysql_charset > $backup_path/$database_name-$date_time.sql #開始?jí)嚎s cd $backup_path tar -zcvf $database_name-$date_time.tar.gz $database_name-$date_time.sql #更新備份日志 echo "壓縮原文件 create $backup_path/$database_name-$date_time.tar.gz" >> $backup_path/dump.log #刪除源文件 rm -rf $backup_path/$database_name-$date_time.sql echo "壓縮后刪除原文件 delete $backup_path/$database_name-$date_time.sql" >> $backup_path/dump.log #找出需要?jiǎng)h除的備份 delfile=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | head -1` #判斷現(xiàn)在的備份數(shù)量是否大于閾值 number=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | wc -l` if [ $number -gt $count ] then #刪除最早生成的備份,只保留count數(shù)量的備份 rm $delfile #更新刪除文件日志 echo "$date 刪除 $count 前的文件 delete $delfile" >> $backup_path/dump.log fi
方式四:不是 docker 安裝備份
#用戶名 mysql_user="root" #密碼 mysql_password="root" mysql_host="101.133.170.222" #端口號(hào) mysql_port="3306" #將要備份的數(shù)據(jù)庫 database_name="ruoyi" #編碼格式 mysql_charset="utf8" #保存?zhèn)浞菸募疃鄠€(gè)數(shù) count=3 #備份保存路徑 backup_path=/data/mysql/bakup #日期 date_time=`date +%Y-%m-%d-%H-%M` #如果文件夾不存在則創(chuàng)建 if [ ! -d $backup_path ]; then mkdir -p $backup_path; fi #查看MySQL是否在運(yùn)行 mysql_ps=`ps -ef |grep mysql |wc -l` echo "$date_time 查看MySQL是否在運(yùn)行:$mysql_ps" >> $backup_path/dump.log mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l` if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then echo "$date_time ERROR:MySQL is not running! backup stop!" >> $backup_path/dump.log exit else echo "$date_time Welcome to use MySQL backup tools!" >> $backup_path/dump.log echo "$date_time MySQL connect ok! Please wait......" >> $backup_path/dump.log fi #開始備份 echo "$date_time 開始備份...$backup_path" >> $backup_path/dump.log docker exec h3_mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $database_name --default-character-set=$mysql_charset > $backup_path/$database_name-$date_time.sql echo "$date_time 備份完成...$backup_path" >> $backup_path/dump.log #開始?jí)嚎s cd $backup_path tar -zcvf $database_name-$date_time.tar.gz $database_name-$date_time.sql #更新備份日志 echo "$date_time 壓縮原文件 create $backup_path/$database_name-$date_time.tar.gz" >> $backup_path/dump.log #刪除源文件 rm -rf $backup_path/$database_name-$date_time.sql echo "$date_time 壓縮后刪除原文件 delete $backup_path/$database_name-$date_time.sql" >> $backup_path/dump.log #找出需要?jiǎng)h除的備份 delfile=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | head -1` #判斷現(xiàn)在的備份數(shù)量是否大于閾值 number=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | wc -l` if [ $number -gt $count ] then #刪除最早生成的備份,只保留count數(shù)量的備份 rm $delfile #更新刪除文件日志 echo "$date_time 刪除 $count 前的文件 delete $delfile" >> $backup_path/dump.log echo "$date_time 備份成功" >> $backup_path/dump.log fi
4、配置定時(shí)任務(wù)
時(shí)間格式:
# 常用時(shí)間格式 每五分鐘執(zhí)行 */5 * * * * 每小時(shí)執(zhí)行 0 * * * * 每天執(zhí)行 0 0 * * * 每周執(zhí)行 0 0 * * 0 每月執(zhí)行 0 0 1 * * 每年執(zhí)行 0 0 1 1 * # crontab 文件的格式 {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} minute: 區(qū)間為 0 – 59 hour: 區(qū)間為0 – 23 day-of-month: 區(qū)間為0 – 31 month: 區(qū)間為1 – 12. 1 是1月. 12是12月. Day-of-week: 區(qū)間為0 – 7. 周日可以是0或7.
常用時(shí)間:
# 執(zhí)行 crontab -e 命令,寫入以下命令保存,每 5 分鐘執(zhí)行一次 */5 * * * * sh /data/mysql/dump_mysql.sh # 每天凌晨 5 點(diǎn)執(zhí)行 0 5 * * * sh /data/mysql/dump_mysql.sh
保存如果 出現(xiàn)一下問題
進(jìn)入/var/spool下查看cron目錄是正常的,但是在cron里面沒有權(quán)限建立文件這個(gè)根源。
(1)可以嘗試先在/var/spool/cron目錄下用vim編輯一個(gè)測(cè)試文件,看是否可以保存在這個(gè)cron目錄下,如果無法保存提示權(quán)限問題。那么可能目錄有什么特殊的地方,root用戶也被約束了
# 查看是否有特殊的屬性 [root@izuf61151k3ad2dso6mo9oz cron]# lsattr /var/spool/cron/root # 去掉特殊的屬性 [root@izuf61151k3ad2dso6mo9oz cron]# chattr -ai /var/spool/cron/root # 再次編輯定時(shí)任務(wù) [root@izuf61151k3ad2dso6mo9oz cron]# crontab -e
執(zhí)行 lsattr /var/spool/cron/root
我們可以看到和常規(guī)的權(quán)限設(shè)置不一樣,所以清楚這些特殊的屬性
清除屬性我們可以看到正常的權(quán)限的問題
再次執(zhí)行 crontab -e
,編輯模式,添加 */5 * * * * sh /data/mysql/dump_mysql.sh
,保存即可
補(bǔ)充說明
crontab 時(shí)間格式說明
0 5 * * * /root/bin/backup.sh
到此這篇關(guān)于MySQL數(shù)據(jù)庫定時(shí)備份的幾種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)MySQL 定時(shí)備份內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)存儲(chǔ)路徑修改的超詳細(xì)教程
在生產(chǎn)環(huán)境下,mysql的數(shù)據(jù)、索引都會(huì)很大,而mysql的默認(rèn)存儲(chǔ)路徑是/val/lib/mysql,這就出現(xiàn)了問題,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)存儲(chǔ)路徑修改的超詳細(xì)教程,需要的朋友可以參考下2023-03-03

MySQL的從庫Seconds_Behind_Master延遲總結(jié)

MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫原理解析