bat脚本安装MySQL,注册Windows服务,设置root密码,新增用户,并执行脚本。此处用的MySQL5.7的压缩包版本。将MySQL移动到C:\ProgramData目录下,进行安装。
@echo off
setlocal enabledelayedexpansion
REM ====== 可配置参数 ======
set TARGET_PARENT=C:\ProgramData
set BASE_DIR=%TARGET_PARENT%\mysql_57
set INSTALL_DIR=%BASE_DIR%\mysql-5.7.44-winx64
set DATA_DIR=%INSTALL_DIR%\data
set MYSQL_SERVICE_NAME=MySQL57
set MYSQL_PORT=3306
set ROOT_PASSWORD=root
set APP_USER=user1
set APP_PASSWORD=userpwd
REM =========================
echo =====================================================
echo MySQL 5.7 Auto Install Script
echo =====================================================
REM ====== 1. 检测服务是否已存在 ======
echo Checking existing MySQL service...
sc query %MYSQL_SERVICE_NAME% >nul 2>&1
if %errorlevel% EQU 0 (
echo MySQL service "%MYSQL_SERVICE_NAME%" already exists.
echo Installation aborted to prevent overwrite.
exit /b 0
)
REM ====== 2. 检测系统中是否已有其他 MySQL 服务 ======
set "OTHER_MYSQL_FOUND="
REM 使用 tokens=2 抓取冒号后的实际名称,并过滤掉我们自己定义的服务名
for /f "tokens=2" %%s in ('sc query state^= all ^| findstr /I "SERVICE_NAME" ^| findstr /I "MySQL"') do (
set "TEMP_SERVICE=%%s"
if /I "!TEMP_SERVICE!" NEQ "%MYSQL_SERVICE_NAME%" (
set "OTHER_MYSQL_FOUND=!TEMP_SERVICE!"
)
)
if defined OTHER_MYSQL_FOUND (
echo [ERROR] Another MySQL service detected: !OTHER_MYSQL_FOUND!
echo Installation aborted.
pause
exit /b 0
)
REM ====== 3. 检测端口是否被占用 ======
echo Checking port %MYSQL_PORT%...
netstat -ano | findstr ":%MYSQL_PORT% " >nul
if %errorlevel% EQU 0 (
echo Port %MYSQL_PORT% is already in use.
echo Installation aborted.
exit /b 0
)
REM ====== 4. 目录迁移逻辑 (处理路径中的括号问题) ======
REM 使用引号包裹路径,防止 (x86) 导致脚本崩溃
set "CURRENT_DIR=%~dp0"
if /I "%CURRENT_DIR%" NEQ "%BASE_DIR%\" (
echo Moving files to %BASE_DIR%...
if not exist "%TARGET_PARENT%" mkdir "%TARGET_PARENT%"
REM 复制当前目录到 ProgramData
xcopy "%~dp0*" "%BASE_DIR%\" /E /I /Y /Q >nul
if !errorlevel! EQU 0 (
echo Files moved successfully. Relaunching...
REM 关键:使用 pushd 切换环境,避免旧路径括号干扰
pushd "%BASE_DIR%"
start "" /D "%BASE_DIR%" "%BASE_DIR%\%~nx0"
exit /b 0
) else (
echo [ERROR] Failed to move files. Please run as Administrator.
pause & exit /b 1
)
)
echo ==== Creating my.ini ====
(
echo [mysqld]
echo basedir="%INSTALL_DIR%"
echo datadir="%DATA_DIR%"
echo port=%MYSQL_PORT%
echo character-set-server=utf8
echo default-storage-engine=INNODB
echo sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
echo max_connections=200
echo ssl=0
echo.
echo [client]
echo default-character-set=utf8
) > "%INSTALL_DIR%\my.ini"
echo ==== Initializing database ====
"%INSTALL_DIR%\bin\mysqld.exe" ^
--initialize-insecure ^
--basedir="%INSTALL_DIR%" ^
--datadir="%DATA_DIR%"
if errorlevel 1 (
echo MySQL initialize FAILED
exit /b 1
)
echo ==== Installing Windows Service ====
"%INSTALL_DIR%\bin\mysqld.exe" ^
--install %MYSQL_SERVICE_NAME% ^
--defaults-file="%INSTALL_DIR%\my.ini"
sc config %MYSQL_SERVICE_NAME% start= auto >nul
echo ==== Starting Service ====
net start %MYSQL_SERVICE_NAME%
timeout /t 5 >nul
echo ==== Configuring Firewall ====
netsh advfirewall firewall show rule name="MySQL57 3306" >nul 2>&1
if %errorlevel% NEQ 0 (
netsh advfirewall firewall add rule name="MySQL57 3306" dir=in action=allow protocol=TCP localport=%MYSQL_PORT%
echo Firewall rule added
) else (
echo Firewall rule already exists
)
echo ==== Setting root password ====
"%INSTALL_DIR%\bin\mysqladmin.exe" ^
-u root password "%ROOT_PASSWORD%"
echo ==== Creating user and privileges ====
"%INSTALL_DIR%\bin\mysql.exe" ^
-u root -p%ROOT_PASSWORD% ^
-e "CREATE USER '%APP_USER%'@'%%' IDENTIFIED BY '%APP_PASSWORD%';"
"%INSTALL_DIR%\bin\mysql.exe" ^
-u root -p%ROOT_PASSWORD% ^
-e "GRANT ALL PRIVILEGES ON *.* TO '%APP_USER%'@'%%' WITH GRANT OPTION; FLUSH PRIVILEGES;"
echo ==== Executing SQL scripts ====
"%INSTALL_DIR%\bin\mysql.exe" -u root -p%ROOT_PASSWORD% < "%BASE_DIR%\sql\init1.sql"
"%INSTALL_DIR%\bin\mysql.exe" -u root -p%ROOT_PASSWORD% < "%BASE_DIR%\sql\init2.sql"
echo ==== MySQL 5.7 Installed Successfully ====
exit /b 0
