使用PowerShell批量导出MySQL数据库的新手教程

好的,没问题!这是一份专为新手设计的 PowerShell 批量导出 MySQL 数据库的图文教程。我们将使用 MySQL 自带的命令行工具 mysqldump,并通过 PowerShell 脚本来自动化这个过程。

图片[1]_使用PowerShell批量导出MySQL数据库的新手教程_知途无界

核心思路

  1. 连接到 MySQL​:使用 mysql.exe 获取所有数据库的列表。
  2. 筛选数据库​:排除系统数据库(如 information_schema, mysql 等),只备份我们需要的业务数据库。
  3. 循环导出​:遍历每一个需要备份的数据库,使用 mysqldump.exe 执行导出命令。
  4. 保存文件​:将每个数据库的导出内容保存为一个独立的 .sql 文件。

准备工作

在开始之前,请确保你已完成以下准备工作:

  1. 安装 MySQL​:确保你的电脑上已经安装了 MySQL 服务器或客户端工具。
  2. 找到 MySQL 的安装路径​:我们需要知道 mysql.exemysqldump.exe 在哪里。
    • 默认情况下,它们通常在 C:\Program Files\MySQL\MySQL Server 8.0\bin\ 这样的目录下(版本号可能不同)。
    • 你可以去这个目录找一下,或者在 PowerShell 中尝试运行 where.exe mysqldump 来查找(如果它在系统环境变量 PATH 里的话)。
  3. 记下你的数据库连接信息​:
    • 服务器地址​ (-h):通常是 localhost127.0.0.1
    • 端口​ (-P):默认是 3306
    • 用户名​ (-u):一个有足够权限(如 SELECT, LOCK TABLES, SHOW VIEW 等)的 MySQL 用户。
    • 密码​ (-p):​为了安全,不建议直接在命令中写密码,我们让系统在执行时提示输入。

第一步:创建一个安全的密码提示(推荐方法)

直接在脚本里写密码是不安全的。PowerShell 可以安全地弹出一个对话框让你输入密码,而不会显示在屏幕上。我们先创建一个函数来做到这一点。

打开 ​PowerShell ISE​ 或一个文本编辑器(如 VS Code、记事本),创建一个新的脚本文件,命名为 MySQL_Backup.ps1

将以下代码复制到文件中,这是整个脚本的“安全基础”:

# 这是一个函数,用于安全地获取密码
function Get-MysqlPassword {
    Add-Type -AssemblyName Microsoft.VisualBasic
    $password = [Microsoft.VisualBasic.Interaction]::InputBox("请输入 MySQL 用户的密码", "MySQL 备份", "")
    return $password
}

# 调用函数获取密码
$MySqlPassword = Get-MysqlPassword

# 检查用户是否点击了取消(密码为空)
if ([string]::IsNullOrEmpty($MySqlPassword)) {
    Write-Host "密码不能为空,脚本已取消。" -ForegroundColor Red
    exit # 退出脚本
}

Write-Host "密码已获取,开始备份..." -ForegroundColor Green

代码解释​:

  • Add-Type -AssemblyName Microsoft.VisualBasic:加载一个能创建输入框的程序集。
  • InputBox(...):创建一个弹出窗口,让用户输入密码。
  • if ([string]::IsNullOrEmpty(...)):检查用户是否什么都没输入就点了“确定”或点了“取消”。

第二步:编写批量导出的核心脚本

现在,我们在刚才的脚本后面继续添加核心的备份逻辑。

2.1 设置基本变量

首先,定义我们的连接信息和路径。请将 YourUsername 替换为你的实际 MySQL 用户名,并根据你的 MySQL 安装路径修改 $mysqlPath

# ... (接上面的代码)

# --- 配置区域 ---
$mysqlPath = "C:\Program Files\MySQL\MySQL Server 8.0\bin\" # 修改为你的 MySQL bin 目录路径
$mysqlUser = "YourUsername"                                 # 替换为你的 MySQL 用户名
$serverHost = "localhost"
$serverPort = "3306"
$backupFolder = ".\MySQL_Backups"                            # 备份文件存放的文件夹,当前目录下的 MySQL_Backups 文件夹

# --- 创建备份文件夹 ---
if (-not (Test-Path -Path $backupFolder)) {
    New-Item -ItemType Directory -Path $backupFolder | Out-Null
    Write-Host "已创建备份文件夹: $backupFolder"
}

# --- 获取密码 ---
# ... (接上面的 Get-MysqlPassword 函数和调用代码)

注意​:如果 mysqldumpmysql 命令已经添加到系统的 PATH 环境变量中,你可以将 $mysqlPath 设置为空字符串 ""

2.2 获取数据库列表并筛选

接下来,我们连接 MySQL 并获取所有数据库名称,然后排除掉不需要备份的系统库。

# ... (接上面的代码)

# --- 获取数据库列表 ---
Write-Host "正在获取数据库列表..."
$databases = & "$mysqlPath\mysql" -h $serverHost -P $serverPort -u $mysqlUser -p$MySqlPassword -e "SHOW DATABASES;" 2>$null | Select-Object -Skip 1

# 筛选数据库:排除系统数据库
$systemDatabases = @('Database', 'information_schema', 'mysql', 'performance_schema', 'sys')
$dbsToBackup = $databases | Where-Object { $_ -notin $systemDatabases }

Write-Host "找到以下需要备份的数据库:"
$dbsToBackup | ForEach-Object { Write-Host "- $_" }

代码解释​:

  • & "$mysqlPath\mysql" ... -e "SHOW DATABASES;":执行 MySQL 命令 SHOW DATABASES 来获取所有库名。
  • Select-Object -Skip 1SHOW DATABASES 的结果第一行是标题 “Database”,我们把它去掉。
  • Where-Object { $_ -notin $systemDatabases }:过滤掉在 $systemDatabases 列表里的系统库。

2.3 循环导出每个数据库

最后,我们遍历筛选后的数据库列表,对每个数据库执行 mysqldump 命令。

# ... (接上面的代码)

# --- 循环导出数据库 ---
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
Write-Host "`n开始备份,时间戳: $timestamp"

foreach ($db in $dbsToBackup) {
    Write-Host "正在备份数据库: $db ..."

    # 为每个数据库生成一个带时间戳的文件名
    $fileName = "$($db)_backup_$timestamp.sql"
    $filePath = Join-Path -Path $backupFolder -ChildPath $fileName

    # 执行 mysqldump
    & "$mysqlPath\mysqldump" -h $serverHost -P $serverPort -u $mysqlUser -p$MySqlPassword --single-transaction --routines --triggers $db > $filePath

    # 检查上一条命令是否成功
    if ($LASTEXITCODE -eq 0) {
        Write-Host "数据库 $db 备份成功!文件保存至: $filePath" -ForegroundColor Green
    } else {
        Write-Host "错误:数据库 $db 备份失败!" -ForegroundColor Red
    }
}

Write-Host "`n所有数据库备份完成!" -ForegroundColor Cyan

代码解释​:

  • foreach ($db in $dbsToBackup):开始循环,每次处理一个数据库。
  • $fileName = ...:创建一个唯一的文件名,包含数据库名和时间戳,防止覆盖旧备份。
  • Join-Path:智能地拼接路径和文件名。
  • & "$mysqlPath\mysqldump" ... > $filePath:这是核心的导出命令。
    • --single-transaction:为了保证数据一致性,特别是在 InnoDB 引擎的数据库上,非常重要!
    • --routines:同时导出存储过程和函数。
    • --triggers:同时导出触发器。
    • > $filePath:将 mysqldump 的输出重定向(保存)到指定的 SQL 文件中。
  • $LASTEXITCODEmysqldump 成功执行后会返回 0,失败则返回非 0 值。我们用它来判断备份是否成功。

第三步:完整的脚本与执行

将以上所有代码片段按顺序组合起来,你就得到了完整的脚本。

完整脚本示例

# MySQL_Backup.ps1

# 函数:安全获取密码
function Get-MysqlPassword {
    Add-Type -AssemblyName Microsoft.VisualBasic
    $password = [Microsoft.VisualBasic.Interaction]::InputBox("请输入 MySQL 用户的密码", "MySQL 备份", "")
    return $password
}

# --- 配置区域 ---
$mysqlPath = "C:\Program Files\MySQL\MySQL Server 8.0\bin\" # 修改为你的 MySQL bin 目录路径
$mysqlUser = "YourUsername"                                 # 替换为你的 MySQL 用户名
$serverHost = "localhost"
$serverPort = "3306"
$backupFolder = ".\MySQL_Backups"                            # 备份文件存放的文件夹

# --- 创建备份文件夹 ---
if (-not (Test-Path -Path $backupFolder)) {
    New-Item -ItemType Directory -Path $backupFolder | Out-Null
    Write-Host "已创建备份文件夹: $backupFolder"
}

# --- 获取密码 ---
$MySqlPassword = Get-MysqlPassword
if ([string]::IsNullOrEmpty($MySqlPassword)) {
    Write-Host "密码不能为空,脚本已取消。" -ForegroundColor Red
    exit
}
Write-Host "密码已获取,开始备份..." -ForegroundColor Green

# --- 获取数据库列表 ---
Write-Host "正在获取数据库列表..."
$databases = & "$mysqlPath\mysql" -h $serverHost -P $serverPort -u $mysqlUser -p$MySqlPassword -e "SHOW DATABASES;" 2>$null | Select-Object -Skip 1
$systemDatabases = @('Database', 'information_schema', 'mysql', 'performance_schema', 'sys')
$dbsToBackup = $databases | Where-Object { $_ -notin $systemDatabases }

Write-Host "找到以下需要备份的数据库:"
$dbsToBackup | ForEach-Object { Write-Host "- $_" }

# --- 循环导出数据库 ---
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
Write-Host "`n开始备份,时间戳: $timestamp"

foreach ($db in $dbsToBackup) {
    Write-Host "正在备份数据库: $db ..."

    $fileName = "$($db)_backup_$timestamp.sql"
    $filePath = Join-Path -Path $backupFolder -ChildPath $fileName

    & "$mysqlPath\mysqldump" -h $serverHost -P $serverPort -u $mysqlUser -p$MySqlPassword --single-transaction --routines --triggers $db > $filePath

    if ($LASTEXITCODE -eq 0) {
        Write-Host "数据库 $db 备份成功!文件保存至: $filePath" -ForegroundColor Green
    } else {
        Write-Host "错误:数据库 $db 备份失败!" -ForegroundColor Red
    }
}

Write-Host "`n所有数据库备份完成!" -ForegroundColor Cyan

如何运行脚本

  1. 保存文件​:将上面的完整代码保存为 MySQL_Backup.ps1
  2. 修改配置​:务必修改脚本中 $mysqlPath$mysqlUser 这两个变量的值。
  3. 设置执行策略​:PowerShell 默认不允许运行脚本。以管理员身份打开 PowerShell,然后运行以下命令来更改执行策略(选择 Y 确认): Set-ExecutionPolicy RemoteSigned 这个策略允许你运行自己创建的脚本。
  4. 执行脚本​:在 PowerShell 中,导航到你的脚本所在的目录,然后运行: .\MySQL_Backup.ps1
  5. 输入密码​:此时会弹出一个对话框,请输入你的 MySQL 用户密码,然后点击“确定”。
  6. 查看结果​:脚本会自动开始工作,并在控制台输出进度。备份好的 .sql 文件会出现在你脚本同级的 MySQL_Backups 文件夹里。

恭喜你!你已经成功创建了一个可以批量备份 MySQL 数据库的 PowerShell 脚本。你可以将其设置为 Windows 定时任务,实现定期自动备份。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞45 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容