MySQL【付诸实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以
數(shù)據(jù)庫備份的重要性不言而喻,備份的方法主要分為兩大類,一是文件備份,二是數(shù)據(jù)庫本身的備份機(jī)制binlog日志,今天先說說文件備份,就是將數(shù)據(jù)庫【結(jié)構(gòu)和數(shù)據(jù)】導(dǎo)出為文件。
1.備份腳本
在 /data/backup 下編寫備份腳本 mysql_backup.sh 盡量不要在Windows環(huán)境下編寫 shell 腳本,會有編碼不對的問題,內(nèi)容如下【備注已很清晰】:
#!/bin/bash source /etc/profile# 以下配置信息需要根據(jù)自己情況進(jìn)行編輯 mysql_user="root" # 備份用戶 mysql_password="root@2021" # 備份用戶的密碼 mysql_port="3306" # 端口 mysql_charset="utf8" # 編碼 backup_db_arr=("xxxbase") # 要備份的數(shù)據(jù)庫名稱,多個用空格分開隔開 如("dba" "dbb" "dbc") backup_location=/data/backup # 備份數(shù)據(jù)存放位置,末尾請不要帶"/" expire_backup_delete="ON" # 是否開啟過期備份刪除 ON為開啟 OFF為關(guān)閉 expire_days=7 # 過期時間天數(shù) 默認(rèn)為三天,此項只有在expire_backup_delete開啟時有效# 本行開始以下不需要修改 backup_time=`date +%Y%m%d%H%M` #定義備份詳細(xì)時間 backup_Ymd=`date +%Y-%m-%d` #定義備份目錄中的年月日時間 backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期 backup_dir=$backup_location/$backup_Ymd #備份文件夾全路徑 welcome_msg="Welcome to use MySQL backup tools!" #歡迎語# 判斷MYSQL是否啟動 mysql沒有啟動則備份退出 【這里可以學(xué)到查詢某服務(wù)是否運行的命令】 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] ]; thenecho "ERROR:MySQL is not running! backup stop!"exit elseecho $welcome_msg fi# 連接到mysql數(shù)據(jù)庫 無法連接則備份退出 【使用的是數(shù)據(jù)步本身的工具】 mysql -P$mysql_port -u$mysql_user -p$mysql_password <<end use mysql; select host,user from user where user='root' and host='localhost'; exit endflag=`echo $?` if [ $flag != "0" ]; thenecho "ERROR:Can't connect mysql server! backup stop!"exit elseecho "MySQL connect ok! Please wait......"# 判斷有沒有定義備份的數(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[@]}doecho "database [ $dbname ] backup start..."`mkdir -p $backup_dir``mysqldump -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" ];thenecho "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"elseecho "database $dbname backup fail!"fidoneelseecho "ERROR:No database to backup! backup stop"exitfi# 如果開啟了刪除過期備份,則進(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!"fiecho "All database backup success! Thank you!"exit fi2.定時任務(wù)
給 mysql_backup.sh 文件賦予可執(zhí)行權(quán)限。
chmod -R 777 mysql_backup.shLinux的 cron 表達(dá)式跟Java的 cron 表達(dá)式不同,這里要注意。
# m h dom mon dow command # 分 時 日 月 周 要執(zhí)行的命令# 編輯定時任務(wù)列表 crontab -e# 添加以下文本(每天00:00執(zhí)行mysql_backup.sh腳本)00 00 * * * /data/backup/mysql_backup.sh # 重啟 cron 服務(wù) sudo service crond restart3.腳本測試
直接執(zhí)行備份腳本進(jìn)行測試,我備份了兩個數(shù)據(jù)庫 backup_db_arr=(“xxl_job” “jeecg-boot”) 這里看一下效果:
[root@aliyun backup]# ./mysql_back.shWelcome to use MySQL backup tools! mysql: [Warning] Using a password on the command line interface can be insecure. host user localhost root MySQL connect ok! Please wait...... database [ xxl_job ] backup start... mysqldump: [Warning] Using a password on the command line interface can be insecure. database xxl_job success backup to /data/backup/2021-07-24/xxl_job-202107241712.sql.gz database [ jeecg-boot ] backup start... mysqldump: [Warning] Using a password on the command line interface can be insecure. database jeecg-boot success backup to /data/backup/2021-07-24/jeecg-boot-202107241712.sql.gz Expired backup data delete complete! All database backup success! Thank you![root@aliyun backup]# ll total 4 drwxr-xr-x 2 root root 79 Jul 24 17:12 2021-07-24 -rwxrwxrwx 1 root root 3429 Jul 24 17:12 mysql_back.sh [root@aliyun backup]# cd ./2021-07-24/ [root@aliyun 2021-07-24]# ll total 88 -rw-r--r-- 1 root root 83689 Jul 24 17:12 jeecg-boot-202107241712.sql.gz -rw-r--r-- 1 root root 2757 Jul 24 17:12 xxl_job-202107241712.sql.gz執(zhí)行后生成了兩個SQL文件【jeecg-boot-202107241712.sql.gz】和【xxl_job-202107241712.sql.gz】
4.數(shù)據(jù)恢復(fù)
刪除數(shù)據(jù)庫 xxl_job、jeecg-boot 下的所有表和數(shù)據(jù),執(zhí)行導(dǎo)入命令,輸入密碼即可:
# 解壓 gunzip xxl_job-202107241712.sql.gz # 導(dǎo)入 mysql -u root -p xxl_job < xxl_job-202107241712.sql Enter password: xxx查看數(shù)據(jù)庫發(fā)現(xiàn)數(shù)據(jù)已經(jīng)恢復(fù),這種定時備份數(shù)據(jù)庫的方式是有缺陷的,隨后會寫一篇使用數(shù)據(jù)庫 binlog 文件恢復(fù)數(shù)據(jù)的方法。
總結(jié)
以上是生活随笔為你收集整理的MySQL【付诸实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hasor【付诸实践 02】Spring
- 下一篇: 【Java代码】Lamda表达式将Lis