Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Skrypt wsadowy systemu Windows do tworzenia kopii zapasowych lokalnych baz danych MySQL i zachowywania tylko N najnowszych FOLDERÓW z plikami kopii zapasowej

Z pomocą @foxidrive powyżej udało mi się uzyskać datę folderów tak, jak chciałem, czyli RRRR-MM-DD HH-MIN-SEC.

W tych folderach przechowywane są spakowane gzipem bazy danych .sql dzięki skryptem wsadowym kopii zapasowej MySQL Adityasatrio .

Z pomocą @Magoo z tej odpowiedzi https://stackoverflow.com/a/17521693/1010918 Udało mi się usunąć wszystkie foldery (nameDir) przy zachowaniu najnowsze N ​​folderów (nameDir), a także nie dotykając wszelkich plików, które mogą znajdować się w katalogu (backupDir).

Oto kompletny skrypt roboczy.

Możesz usunąć każde wystąpienie pause i i echo nie zobacz, co się dzieje w wierszu poleceń.

Dodatkowo dodaj to do Harmonogramu zadań systemu Windows, a uzyskasz solidne rozwiązanie do tworzenia kopii zapasowych dla lokalnego środowiska programistycznego, które wykorzystuje bazy danych MySQL.

Proszę podziękuj ludziom, którzy pomogli mi to zrobić. Bez was musiałbym używać kosztownej aplikacji Windows tylko do lokalnego zapisywania baz danych MySQL.

(..a dla naszej następnej sztuczki wyślemy do siebie e-mailem dziennik błędów, jeśli wystąpią błędy podczas tworzenia kopii zapasowej plików .sql.. ale to już inne pytanie i historia na inny dzień..)

 @echo off

 set dbUser=root
 set dbPassword=root
 set "backupDir=D:\MySQLDumps"
 set "mysqldump=C:\wamp\bin\mysql\mysql5.6.17\bin\mysqldump.exe"
 set "mysqlDataDir=C:\wamp\bin\mysql\mysql5.6.17\data"
 set "zip=C:\Program Files\7-Zip\7z.exe"

 :: https://stackoverflow.com/a/31789045/1010918 foxidrive's answer helped me get the folder with the date and time I wanted

rem The four lines below will give you reliable YY DD MM YYYY HH Min Sec MS variables in XP Pro and higher.

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%"

 set "dirname=%YYYY%-%MM%-%DD% %HH%-%Min%-%Sec%"

 :: remove echo here if you like
 echo "dirName"="%dirName%"

 :: switch to the "data" folder
 pushd "%mysqlDataDir%"

 :: create backup folder if it doesn't exist
 if not exist "%backupDir%\%dirName%\" mkdir "%backupDir%\%dirName%"

 :: iterate over the folder structure in the "data" folder to get the databases

 for /d %%f in (*) do (
 :: remove echo here if you like
 echo processing folder "%%f"

 "%mysqldump%" --host="localhost" --user=%dbUser% --password=%dbPassword% --single-transaction --add-drop-table --databases %%f > "%backupDir%\%dirName%\%%~nxf.sql"

 "%zip%" a -tgzip "%backupDir%\%dirName%\%%~nxf.sql.gz" "%backupDir%\%dirName%\%%~nxf.sql"

  del "%backupDir%\%dirName%\%%~nxf.sql"

 )
 popd

 :: delete all folders but the latest 2


 :: https://stackoverflow.com/a/17521693/1010918 Magoo's answer helped me get what I wanted to do with the folders
 :: for /f "skip=2 delims=" %G in ('dir /B /ad-h /o-d') DO echo going to delete %G

 :: below following my version with rd (remove dir) command and /s and /q
 :: remove echo before rd to really delete the folders in question!!
 :: attention they will be deleted with content in them!!

 :: change the value after skip= to what you like, this is the amount of latest folders to keep in your backup directory
    for /f "skip=2 delims=" %%a in (' dir "%backupDir%\" /b /ad-h /o-d') do echo rd /s /q "%backupDir%\%%a"

:: remove pause here if you like and add the file to Windows Task Manager
 pause


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - wybierz wiersze, które mają tę samą wartość w dwóch kolumnach

  2. MONTHNAME() Przykłady – MySQL

  3. Wydajność Hibernate, JDBC i Java na średnim i dużym zestawie wyników

  4. Zapytanie dynamiczne wykorzystujące zmienną liczbę argumentów IN (p1, p2, p3)

  5. Mysql SELECT wewnątrz UPDATE