先放一個(gè)批處理的dos
命令入門教程,沒有dos
命令基礎(chǔ)的可以先看一看,否則下面的腳本直接看懵逼:傳送門
開始正文圣絮,最近客戶有個(gè)需求就是每個(gè)月都要將mysql
數(shù)據(jù)庫(kù)的數(shù)據(jù)備份一份出來戚揭,由他們交給當(dāng)?shù)豨ong安部門處理柒瓣。正好公司有一臺(tái)阿里云的windows server 2012R2
服務(wù)器的資源比較空閑儒搭,就打算利用windows的BAT批處理腳本來完成這個(gè)任務(wù)。
這里將程序分解為以下幾個(gè)步驟:
- 從數(shù)據(jù)庫(kù)讀取需要備份數(shù)據(jù)的客戶id到服務(wù)器的txt文件芙贫,取名為
tenant.txt
(項(xiàng)目是一個(gè)多租戶ERP系統(tǒng)搂鲫,主要面向公用事業(yè),一個(gè)企業(yè)客戶有一個(gè)客戶id) - 從數(shù)據(jù)庫(kù)讀取需要備份數(shù)據(jù)的表到服務(wù)器的txt文件,取名為
table_name.txt
(里面包含了需要備份的表的名稱) - 讀取
tenant.txt
磺平,循環(huán)處理每一個(gè)客戶id魂仍,每一個(gè)客戶id都需要備份table_name.txt
中所有表的數(shù)據(jù) - 數(shù)據(jù)備份完成后,調(diào)用
7z.exe
壓縮數(shù)據(jù)文件拣挪,壓縮完成后刪除源數(shù)據(jù)文件
下面直接上bat腳本代碼:
1.先調(diào)用備份腳本backup.bat
('::'兩個(gè)冒號(hào)表示注釋)
@echo off
:: 進(jìn)入mysql的bin目錄
cd ..\mysql-5.7.28-winx64\bin
:: windows server的日期格式包含斜杠和中文擦酌,這里做一下處理
set temp=%date:~0,10%
set day=%temp:/=-%
:: 通用的路徑
set "prefix=G:\backup\"
:: 日志路徑
set "logpath=%prefix%log\%day%baklog.log"
:: 抽取一下mysql命令的共用內(nèi)容
set "uap=-uroot -p123456 -hlocalhost -P3306"
:: 導(dǎo)出需要備份的客戶id信息
echo %time%-導(dǎo)出需要備份的客戶id信息 >> %logpath%
mysql %uap% -e "select kid from xxx " database_name > %prefix%tenant.txt
:: 導(dǎo)出需要備份的表信息
echo %time%-導(dǎo)出需要備份的表信息 >> %logpath%
mysql %uap% -e "SELECT table_name FROM columns WHERE column_name='kid' and table_Schema = 'xxxx' " information_schema >%prefix%table_name.txt
:: 讀取客戶id文件,做循環(huán)處理
echo %time%-開始讀取客戶id >> %logpath%
for /f "skip=1" %%i in (%prefix%tenant.txt) do (
:: 在臨時(shí)目錄下創(chuàng)建以該客戶id命名的文件夾
md %prefix%tmp\%%i
echo =====%time%-租戶%%i開始轉(zhuǎn)儲(chǔ) >> %logpath%
:: 讀取需要轉(zhuǎn)儲(chǔ)的表信息
for /f "skip=1" %%j in (%prefix%table_name.txt) do (
echo %time%-%%j開始轉(zhuǎn)儲(chǔ) >> %logpath%
:: 通過mysqldump命令備份數(shù)據(jù)庫(kù)數(shù)據(jù)文件到臨時(shí)目錄下的客戶id文件夾中
mysqldump %uap% --skip-opt --set-gtid-purged=OFF database_name %%j --where=" kid='%%i'" > %prefix%tmp\%%i\%%j.sql
)
echo =====%time%-租戶%%i結(jié)束轉(zhuǎn)儲(chǔ) >> %logpath%
:: 通過start命令調(diào)用壓縮腳本并傳遞參數(shù)菠劝。start命令會(huì)另起一個(gè)進(jìn)程赊舶,因此當(dāng)前腳本不會(huì)被阻塞
start %prefix%compresse.bat %%i
)
2.被調(diào)用的壓縮腳本compresse.bat
@echo off
:: windows server的日期格式包含斜杠和中文,這里做一下處理
set temp=%date:~0,10%
set day=%temp:/=-%
:: 通用路徑
set prefix=G:\backup\
:: 日志路徑
set "logpath=%prefix%log\%day%baklog.log"
:: 設(shè)置7z.exe路徑
set "zip=C:\Program Files\7-Zip\7z.exe"
:: 這是上面?zhèn)浞菽_本里傳過來的參數(shù)
set des=%1
::設(shè)置源文件夾所在目錄
set SourDir=%prefix%tmp\%des%
echo %time%-開始?jí)嚎s客戶%des%數(shù)據(jù) >> %logpath%
"%zip%" a -mx7 "%prefix%data\%des%(%day%).7z" "%SourDir%"
:: 壓縮完成后刪除源文件夾
rd /s /q %prefix%tmp\%des%
echo %time%-完成壓縮客戶%des%數(shù)據(jù) >> %logpath%
通過以上兩個(gè)腳本就能完成批處理程序備份mysql
數(shù)據(jù)庫(kù)文件并壓縮為7z的任務(wù)了~
至于如何定時(shí)執(zhí)行上述bat腳本赶诊,則可以通過window
的定時(shí)任務(wù)來解決笼平,網(wǎng)上文章一大把,隨便一篇就能搞定了舔痪。
還有幾個(gè)注意點(diǎn):
-
window server
記得安裝一個(gè)mysql
寓调,我的windows server 2012R2
無法啟動(dòng)mysql
,報(bào)錯(cuò)少了msvcp120.dll
文件辙喂,解決辦法網(wǎng)上一搜就有 - 記得配置一下
mysql
的環(huán)境變量捶牢,否則定時(shí)任務(wù)調(diào)用bat腳本的時(shí)候鸠珠,mysql
命令會(huì)執(zhí)行失敗 -
mysqldump
命令的參數(shù)建議根據(jù)個(gè)人需要做一下調(diào)整巍耗,我這里的命令是直接跳過各種參數(shù)設(shè)置的
以上就是全部?jī)?nèi)容了,本人也是bat腳本新手渐排,此文僅僅是記錄并分享一下自己搞定任務(wù)的過程炬太,如有不妥之處,還請(qǐng)指出~
轉(zhuǎn)載請(qǐng)注明出處.