Skip to content

Instantly share code, notes, and snippets.

@josemmo
Created August 28, 2020 18:48
Show Gist options
  • Select an option

  • Save josemmo/24e35f2b4984a4370ce2c164f5956437 to your computer and use it in GitHub Desktop.

Select an option

Save josemmo/24e35f2b4984a4370ce2c164f5956437 to your computer and use it in GitHub Desktop.
Repair MySQL data directory (for XAMPP)
# Based on this answer: https://stackoverflow.com/a/61859561/1956278
# Backup old data
Rename-Item -Path "./data" -NewName "./data_old"
# Create new data directory
Copy-Item -Path "./backup" -Destination "./data" -Recurse
Remove-Item "./data/test" -Recurse
$dbPaths = Get-ChildItem -Path "./data_old" -Exclude ('mysql', 'performance_schema', 'phpmyadmin') -Recurse -Directory
Copy-Item -Path $dbPaths.FullName -Destination "./data" -Recurse
Copy-Item -Path "./data_old/ibdata1" -Destination "./data/ibdata1"
# Notify user
Write-Host "Finished repairing MySQL data"
Write-Host "Previous data is located at ./data_old"
@ItsSalman99

Copy link
Copy Markdown

Amazing ...

@Arman016

Arman016 commented Feb 7, 2024

Copy link
Copy Markdown

It's just awesome! Thanks very much!

@kipchirchirian

Copy link
Copy Markdown

Marvelous! Works beautifully.

@aagirre92

Copy link
Copy Markdown

thanks! as @Chanaka-J suggests adding that line helps in case you have to run it more than once

@bismark-joe

Copy link
Copy Markdown

Thank you a thousand times.

@toperrrrrrrr

Copy link
Copy Markdown

This is amazing. Thank you!

@giang61

giang61 commented Apr 9, 2024

Copy link
Copy Markdown

Kudos. You're the best !

@gordonstevens

Copy link
Copy Markdown

Golden!

Thank you guise, this has been such an annoying beast that comes around more than once. Interesting though this has been on the books for 4 years now and still going strong.

you can add a line at the beginning of the script to delete the existing "data_old" directory before creating a new backup.

# Delete existing data_old directory
Remove-Item -Path "./data_old" -Recurse -Force

@ResilientSpring

Copy link
Copy Markdown

Thank you all!

@vivekblaze

Copy link
Copy Markdown

Thanks

@JanRomero

Copy link
Copy Markdown

Thank you!

@DrexxBoban

Copy link
Copy Markdown

If you get error as I did about directories not existing, change the file to this, and if paths are different change the location of directories to your absolute path:

Based on this answer: https://stackoverflow.com/a/61859561/1956278

Backup old data

Rename-Item -Path "C:/xampp/mysql/data" -NewName "C:/xampp/mysql/data_old"

Create new data directory

Copy-Item -Path "C:/xampp/mysql/backup" -Destination "C:/xampp/mysql/data" -Recurse
Remove-Item "C:/xampp/mysql/data/test" -Recurse
$dbPaths = Get-ChildItem -Path "C:/xampp/mysql/data_old" -Exclude ('mysql', 'performance_schema', 'phpmyadmin') -Recurse -Directory
Copy-Item -Path $dbPaths.FullName -Destination "C:/xampp/mysql/data" -Recurse
Copy-Item -Path "C:/xampp/mysql/data_old/ibdata1" -Destination "C:/xampp/mysql/data/ibdata1"

Notify user

Write-Host "Finished repairing MySQL data"
Write-Host "Previous data is located at C:/xampp/mysql/data_old"

@VictorJoshuaC

Copy link
Copy Markdown

you are the best

@robilin

robilin commented Oct 13, 2024

Copy link
Copy Markdown

Equivalent bash scripts is

`@echo off
REM Backup old data
rename "data" "data_old"

REM Create new data directory
xcopy "backup" "data" /E /I
rmdir /S /Q "data\test"

REM Copy directories excluding specific ones (mysql, performance_schema, phpmyadmin)
for /d %%i in (data_old*) do (
if /i not "%%~nxi"=="mysql" (
if /i not "%%~nxi"=="performance_schema" (
if /i not "%%~nxi"=="phpmyadmin" (
xcopy "%%i" "data%%~nxi" /E /I
)
)
)
)

REM Copy ibdata1 file
copy "data_old\ibdata1" "data\ibdata1"

REM Notify user
echo Finished repairing MySQL data
echo Previous data is located at ./data_old
`
Run this inside mysql directory, save it like repair.bat , easier to save using notepad++, select bat for file type

@Hoyoll

Hoyoll commented Nov 16, 2024

Copy link
Copy Markdown

you saved my afternoon

@LaurensTOffringa

Copy link
Copy Markdown

Thank you!

@patelmm

patelmm commented Dec 23, 2024

Copy link
Copy Markdown

I realize existing Database was not able to access and getting error.

@Pyth3rEx

Copy link
Copy Markdown

Equivalent bash scripts is

`@echo off REM Backup old data rename "data" "data_old"

REM Create new data directory xcopy "backup" "data" /E /I rmdir /S /Q "data\test"

REM Copy directories excluding specific ones (mysql, performance_schema, phpmyadmin) for /d %%i in (data_old*) do ( if /i not "%%~nxi"=="mysql" ( if /i not "%%~nxi"=="performance_schema" ( if /i not "%%~nxi"=="phpmyadmin" ( xcopy "%%i" "data%%~nxi" /E /I ) ) ) )

REM Copy ibdata1 file copy "data_old\ibdata1" "data\ibdata1"

REM Notify user echo Finished repairing MySQL data echo Previous data is located at ./data_old ` Run this inside mysql directory, save it like repair.bat , easier to save using notepad++, select bat for file type

I've edited this code a bit to include PWD support as my install had issues jumping between disks. ^^

@echo off
REM Change directory to the MySQL directory
cd /d "D:\Path\To\XAMPP\mysql"

REM Backup old data
rename "data" "data_old"

REM Create new data directory
xcopy "backup" "data" /E /I
rmdir /S /Q "data\test"

REM Copy directories excluding specific ones (mysql, performance_schema, phpmyadmin)
for /d %%i in (data_old\*) do (
    if /i not "%%~nxi"=="mysql" (
        if /i not "%%~nxi"=="performance_schema" (
            if /i not "%%~nxi"=="phpmyadmin" (
                xcopy "%%i" "data\%%~nxi" /E /I
            )
        )
    )
)

REM Copy ibdata1 file
copy "data_old\ibdata1" "data\ibdata1"

REM Notify user
echo Finished repairing MySQL data
echo Previous data is located at .\data_old
pause

@shikhar-graycyn

Copy link
Copy Markdown

Thank you, Great work !

@h-behgam

h-behgam commented Jan 9, 2025

Copy link
Copy Markdown
@echo off
REM Change directory to the MySQL directory
cd /d "D:\Path\To\XAMPP\mysql"

REM Backup old data
rename "data" "data_old"

REM Create new data directory
xcopy "backup" "data" /E /I
rmdir /S /Q "data\test"

REM Copy directories excluding specific ones (mysql, performance_schema, phpmyadmin)
for /d %%i in (data_old\*) do (
    if /i not "%%~nxi"=="mysql" (
        if /i not "%%~nxi"=="performance_schema" (
            if /i not "%%~nxi"=="phpmyadmin" (
                xcopy "%%i" "data\%%~nxi" /E /I
            )
        )
    )
)

REM Copy ibdata1 file
copy "data_old\ibdata1" "data\ibdata1"

REM Notify user
echo Finished repairing MySQL data
echo Previous data is located at .\data_old
pause

Thanks, this code works correctly.

@mejares-jamesmichael

Copy link
Copy Markdown

thanks you, it saved me for this subject

@rizwanmtc

Copy link
Copy Markdown

If this keeps happening all the time, how can we ever get to Mars?

@Hezekiah-Elisha

Copy link
Copy Markdown

Still works perfectly

@ITSAAMI

ITSAAMI commented Apr 15, 2026

Copy link
Copy Markdown

GOAT

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment