使用批處理進行mysql數據統計並上傳

需求如下:

  1. 對指定數據庫進行統計,輸出結果爲文本格式,TAB進行分割,不帶列標題,文件名爲“日期_統計名.dat"
  2. 對統計結果計算md5,並寫入“日期_統計名.dat.md5"
  3. 對統計結果進行壓縮,並寫入“日期_統計名.dat.7z"
  4. 上傳md5,和7z文件
  5. 上述統計有多個,每個統計可能在分佈在多個db

思路:每個統計涉及多個DB,需要把多個查詢拼在一起,合成一次查詢輸出才能把結果放入一個文件。所以我們提前合併查詢語句。
如果多個DB的查詢分開在多次子處理中,好像更麻煩

涉及批處理的關鍵字:用日期作爲文件名,分析數據列表,子函數,切換工作目錄到當前文件路徑

下面是批處理內容:

@echo off
echo ===============================================================
::每日統計腳本
::每天零點開始統計前一天的數據,並打包上傳到指定服務器


:: 添加計劃任務腳本
:: schtasks /create /tn q1_oss /tr "D:\dbstat\stat.bat >> stat_%date:~0,10%.log 2>&1" /sc daily /mo 1 /st 00:30:00 /ru SYSTEM


::[運維修改] 上傳的統計庫信息
set server_ip=192.168.0.1
set server_port=21
set server_user=ftpUser
set server_password=ftpPassword




::[運維修改] 要統計的數據庫用戶信息
set mysqlIp=192.168.0.2
set mysqlPort=3306
set user=Dbuser
set password=dbPassword


::[運維修改] 統計參數
:: 因爲區ID和Db名字不匹配,所以全部要列出了
:: 格式: "區ID,gamedb,logdb" 空格 "區ID,gamedb,logdb"      雙引號不能刪
set list="2,qq_game0001,qq_log0001" "4,qq_game0001,qq_log0004"




:: 切換到批處理所在的工作目錄
set myworkdir=%~dp0
echo 工作目錄: %myworkdir%
%~d0
cd %myworkdir%


:: 建立本次處理的臨時目錄
set today=%date:~0,10%
set endDay=0
set startDay=-1
echo today=%today%, startDay=%startDay%, endDay=%endDay%


set ctime=%TIME: =0%
set tname=%today%T%ctime:~0,2%%ctime:~3,2%%ctime:~6,2%.000
echo target dir : %tname%
mkdir %tname%
::cd %tname%


::@set path=%path%;"C:\Program Files\MySQL\MySQL Server 5.5\bin"
@set mysql="C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe"
@set zip=%myworkdir%7za.exe
@set md5=%myworkdir%md5.exe
@set ftp=%myworkdir%ncftpput.exe


setlocal EnableDelayedExpansion


:: 拼總的查詢語句
set getUserInfo_sql=
set getActorInfo_sql=
set getChargeStat_sql=
set getLoginLog_sql=
set getOnlineStat_sql=
set getUserTicketHis_sql=
for %%i in (%list%) do (
    echo server config = %%i 
    for /f "tokens=1-3 delims=," %%a in (%%i) do (
        echo wrold=%%a gamedb=%%b logdb=%%c
        set getUserInfo_sql=!getUserInfo_sql!"select  %%a as 'WrolDID', Account , RegIP,  from  %%b.AccountInfo Time >= UNIX_TIMESTAMP(ADDDATE('%today%', %startDay%))  and Time < UNIX_TIMESTAMP('%today%');"
        set getActorInfo_sql=!getLoginLog_sql!"select  %%a as 'WrolDID', UserId , Name , ActorID, Level  from  %%b.RoleInfo where Zone=%%a ;"
        set getChargeStat_sql=!getActorInfo_sql!"select  %%a as 'WrolDID', UserID, 'ActorID', Point 0 as 'Type' from  %%b.GameChargeLog where   Zone=%%a and (ChargeTime >= UNIX_TIMESTAMP(ADDDATE('%today%', %startDay%)) and ChargeTime < UNIX_TIMESTAMP('%today%'));"
        set getLoginLog_sql=!getOnlineStat_sql!"select  %%a as 'WrolDID', UserId, 'ActorID' from  %%c.UserLoginLog where (TimeLogin < UNIX_TIMESTAMP('%today%') and TimeLogout = 0) or (TimeLogout >= UNIX_TIMESTAMP(ADDDATE('%today%', %startDay%)) and TimeLogout < UNIX_TIMESTAMP('%today%'));"
    )
)


:: 開始處理
@cd %tname%
@echo cur dir: %cd%


::初始化FTP命令
set tempFtpCmdFile=ftp_cmd.txt
echo open  %server_ip% %server_port% >> %tempFtpCmdFile%
echo %server_user% >> %tempFtpCmdFile%
echo %server_password% >> %tempFtpCmdFile%
echo prompt >> %tempFtpCmdFile%
echo passive >> %tempFtpCmdFile%
echo bin >> %tempFtpCmdFile%
::echo mkdir WBGmae_Receive >> %tempFtpCmdFile%
::echo mkdir WBGmae_Receive/%mysqlIp% >> %tempFtpCmdFile%


:: 統計部分
echo start get mysql stat 開始統計
call :__stat__ "%getUserInfo_sql:"=%"      WGAccountInfo_Tmp
call :__stat__ "%getLoginLog_sql:"=%"      WGUserLoginLog_Tmp
call :__stat__ "%getActorInfo_sql:"=%"     WGGameActor_Tmp
call :__stat__ "%getOnlineStat_sql:"=%"    WGUserOnlineNum_New_Tmp


:: FTP 上傳
echo bye>> %tempFtpCmdFile%


::echo start upload ftp: %server_ip%:%server_port% 上傳
:: type %tempFtpCmdFile%
rem ftp -s %tempFtpCmdFile%
::rm %tempFtpCmdFile%


@cd ..
echo ===============================================================
goto :eof


:__stat__
:: 處理子函數
::function __stat__ () {
::參數 要執行的SQL文件,保存的文件名
:: 下面都不需要把結果重定向到錯誤日誌,由外部調用者自己處理
::set dbname=%1
set sqlfile=%1
set uploadfile=%2




@echo on
@echo ----------------------------------------------------------
@echo ---- [%uploadfile% run            ] ---- %time%
@set curFilename=%tname%_%uploadfile%.dat
@echo 當前文件名:%curFilename%


::執行SQL統計
@echo ---- [%uploadfile%  sql select ...] ---- %time%
%mysql% -u%user% -p%password% -h %mysqlIp% -P %mysqlPort% --default-character-set=gbk --skip-column-names --execute=%sqlfile% 1>%curFilename%




:: 壓縮
@echo ---- [%uploadfile%  compress ...  ] ---- %time%
:: 必須進入這個目錄,才能得到zip文件只包含這個文件,而沒有目錄
%zip% a %curFilename%.7z %curFilename%


:: 生成MD5
@echo ---- [%uploadfile%  md5 ...       ] ---- %time%
%md5% %curFilename%.7z > %curFilename%.md5




:: 上傳FTP
@echo ---- [%uploadfile% upload ...     ] ---- %time%
@echo  %ftp%  -u %server_user% -p %server_password% -P %server_port% -m %server_ip% \WGStatCenterSource\%uploadfile%\%mysqlIp% %curFilename%.7z
@echo  %ftp%  -u %server_user% -p %server_password% -P %server_port% -m %server_ip% \WGStatCenterSource\%uploadfile%\%mysqlIp% %curFilename%.md5
@echo ---- [%uploadfile% upload finish..] ---- %time%


::生成FTP命令
@echo ---- [%uploadfile%  ftp cmd ...   ] ---- %time%
@echo mkdir -p /WGStatCenterSource/%uploadfile%/%mysqlIp% >> %tempFtpCmdFile%
@echo #mput  %myworkdir%%curFilename%.7z -O /WGStatCenterSource/%uploadfile%/%mysqlIp% >> %tempFtpCmdFile%
@echo #mput  %myworkdir%%curFilename%.md5 -O /WGStatCenterSource/%uploadfile%/%mysqlIp% >> %tempFtpCmdFile%
@echo #delete  /WGStatCenterSource/%uploadfile%/%mysqlIp%/%curFilename%.7z   >> %tempFtpCmdFile%
@echo #delete  /WGStatCenterSource/%uploadfile%/%mysqlIp%/%curFilename%.md5  >> %tempFtpCmdFile%




@echo ---- [%uploadfile%  end ...       ] ---- %time%
@echo ----------------------------------------------------------
@echo off
goto :eof
::}


:eof




============ 結束 ============
這裏沒有使用DOS的ftp命令是因爲路由那邊被限制,不能用被動模式的FTP,只有使用第三方工具“ncftpput.exe”,一次一個文件傳,效率很低。

============ 結束 ============
與批處理不同的是,lftp只需要一次登錄就可以把文件全部上傳,效率高很多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章