| Server IP : 172.67.187.206 / Your IP : 172.71.28.156 Web Server : Apache/2.4.25 (Win32) OpenSSL/1.0.2j PHP/5.6.30 System : Windows NT WIN-ECQAAA40806 6.2 build 9200 (Windows Server 2012 Standard Edition) i586 User : SYSTEM ( 0) PHP Version : 5.6.30 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : E:/ |
Upload File : |
@echo off
setlocal enabledelayedexpansion
:: ==============================================================================
:: การตั้งค่า (กรุณาแก้ไขข้อมูลให้ถูกต้อง)
:: ==============================================================================
:: ข้อมูลการเชื่อมต่อ MySQL
set MYSQL_USER=root
set MYSQL_PASSWORD=P@ssw0rdMySQL0
set MYSQL_HOST=localhost
set MYSQL_PORT=3306
:: Path ไปยังโฟลเดอร์ bin ของ MySQL (กรุณาแก้ไขให้ตรงกับ Path ของคุณ)
set MYSQL_BIN_PATH=E:\Inetpub\MySQL\bin
:: โฟลเดอร์หลักสำหรับเก็บไฟล์ Backup
set BASE_BACKUP_DIR=E:\dumbDB
:: จำนวนวันที่ต้องการเก็บ Backup (ไฟล์ที่เก่ากว่านี้จะถูกลบ)
set RETAIN_DAYS=3
:: ==============================================================================
:: ไม่จำเป็นต้องแก้ไขโค้ดด้านล่างนี้
:: ==============================================================================
:: เพิ่มการตรวจสอบ: ตรวจสอบว่า Path ของ MySQL Tools ถูกต้องหรือไม่
if not exist "%MYSQL_BIN_PATH%\mysql.exe" (
echo ERROR: mysql.exe not found at "%MYSQL_BIN_PATH%". Please check MYSQL_BIN_PATH setting.
exit /b 1
)
if not exist "%MYSQL_BIN_PATH%\mysqldump.exe" (
echo ERROR: mysqldump.exe not found at "%MYSQL_BIN_PATH%". Please check MYSQL_BIN_PATH setting.
exit /b 1
)
:: สร้างชื่อโฟลเดอร์สำหรับ Backup ปัจจุบัน (YYYY-MM-DD_HH-MM-SS)
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set CURRENT_DATE=%%c-%%a-%%b)
for /f "tokens=1-3 delims=:." %%a in ('time /t') do (set CURRENT_TIME=%%a-%%b-%%c)
set BACKUP_DIR_NAME=%CURRENT_DATE%_%CURRENT_TIME%
set FULL_BACKUP_PATH=%BASE_BACKUP_DIR%\%BACKUP_DIR_NAME%
echo.
echo ======================================================
echo Starting MySQL Backup & Cleanup Script
echo Timestamp: %CURRENT_DATE% %CURRENT_TIME%
echo ======================================================
echo.
:: ตรวจสอบและสร้างโฟลเดอร์ Backup ปัจจุบัน ถ้ายังไม่มี
if not exist "%FULL_BACKUP_PATH%" (
mkdir "%FULL_BACKUP_PATH%"
echo Created current backup directory: "%FULL_BACKUP_PATH%"
) else (
echo Backup directory already exists: "%FULL_BACKUP_PATH%"
)
echo.
:: ==============================================================================
:: ดึงรายชื่อฐานข้อมูลและทำการ Backup
:: ==============================================================================
echo Backing up databases...
echo.
:: *** แก้ไขตรงนี้: เขียนรายชื่อฐานข้อมูลลงไฟล์ชั่วคราวก่อน ***
set TEMP_DB_LIST_FILE=%TEMP%\mysql_db_list.tmp
:: รัน mysql command และส่ง output ไปยังไฟล์ชั่วคราว
"%MYSQL_BIN_PATH%\mysql.exe" -u%MYSQL_USER% -p%MYSQL_PASSWORD% -h%MYSQL_HOST% -P%MYSQL_PORT% -e "SHOW DATABASES;" > "%TEMP_DB_LIST_FILE%" 2>&1
:: ตรวจสอบว่าคำสั่ง mysql รันสำเร็จหรือไม่
if !ERRORLEVEL! NEQ 0 (
echo ERROR: Failed to get database list from MySQL. Check password or connection.
type "%TEMP_DB_LIST_FILE%" :: แสดงข้อความ error จาก mysql command
del "%TEMP_DB_LIST_FILE%"
exit /b 1
)
:: อ่านรายชื่อฐานข้อมูลจากไฟล์ชั่วคราวและทำการ Backup
:: ใช้ "usebackq" และ double quotes เพื่ออ่านไฟล์อย่างปลอดภัย
for /f "usebackq skip=1 delims=" %%d in ("%TEMP_DB_LIST_FILE%") do (
set "DB_NAME=%%d"
:: กรองฐานข้อมูลระบบและบรรทัดว่างเปล่าอีกครั้ง
echo !DB_NAME! | findstr /v /i "information_schema performance_schema mysql sys" >nul
if !ERRORLEVEL! EQU 0 (
if not "!DB_NAME!"=="" (
echo - Backing up: !DB_NAME!
"%MYSQL_BIN_PATH%\mysqldump.exe" -u%MYSQL_USER% -p%MYSQL_PASSWORD% -h%MYSQL_HOST% -P%MYSQL_PORT% --single-transaction --routines --triggers --events !DB_NAME! > "%FULL_BACKUP_PATH%\!DB_NAME!.sql"
if !ERRORLEVEL! NEQ 0 (
echo ERROR: Failed to backup !DB_NAME!
) else (
echo Successfully backed up !DB_NAME!
)
)
)
)
:: ลบไฟล์ชั่วคราว
if exist "%TEMP_DB_LIST_FILE%" del "%TEMP_DB_LIST_FILE%"
echo.
echo All database backups for this run completed.
echo.
:: ==============================================================================
:: การลบไฟล์ Backup เก่า (Old Backup Cleanup)
:: ==============================================================================
echo Starting old backup cleanup...
echo Retaining backups for the last %RETAIN_DAYS% days.
echo.
for /d %%i in ("%BASE_BACKUP_DIR%\*") do (
set "FOLDER_DATE_TIME=%%~ni"
echo !FOLDER_DATE_TIME! | findstr /r /c:"^[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]_[0-2][0-9]-[0-5][0-9]-[0-5][0-9]$" >nul
if not errorlevel 1 (
set "FOLDER_DATE=!FOLDER_DATE_TIME:~0,10!"
set "folderPath=%%i"
set "folderName=%%~ni"
echo Checking folder for cleanup: !folderName!
powershell -command "$folderPath = '%folderPath%'; $folderName = '%folderName%'; $retainDays = %RETAIN_DAYS%; " ^
"$folderDateTime = [datetime]::ParseExact($folderName, 'yyyy-MM-dd_HH-mm-ss', [System.Globalization.CultureInfo]::InvariantCulture);" ^
"$cutoffDate = (Get-Date).AddDays(-$retainDays);" ^
"if ($folderDateTime -lt $cutoffDate) {" ^
" Write-Host ' - Deleting old backup folder: ' $folderPath;" ^
" Remove-Item -Path $folderPath -Recurse -Force -ErrorAction SilentlyContinue;" ^
"}"
if !ERRORLEVEL! NEQ 0 (
echo ERROR during cleanup of !folderName!
)
)
)
echo.
echo Cleanup process completed.
echo.
echo Script finished.
endlocal