mysql - Debian 8 上的 PowerShell - 从 mysqldump 到 gzip 的管道

标签 mysql powershell debian gzip

我的 NAS 上有一个非常小的、非必需的数据库,它将每周由一个小的 Bash 脚本备份 that is a modified version of this link's one :

outpath='/media/backupfiles/mysql_data'
dumpdate=$(date +"%Y-%m-%d")

mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 > ${outpath}/mysqldump_${dumpdate}.sql.gz

此脚本完美运行。但是,我对 Bash 不太熟练,而我喜欢使用 PowerShell 编写代码。自然地,我想创建一个模拟的 PowerShell 脚本:

param(
    [string]$OutPath = "/media/backupfiles/mysql_data",
    [string]$DumpBaseName = "mysqldump_$(Get-Date -Format "yyyy-MM-dd").sql"
)

mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 > $($OutPath)/$($DumpBaseName).gz

为了启动脚本,我首先以 root 启动控制台,然后启动 powershell,然后启动脚本 /home/mysqldump.ps1.

不幸的是,上面的脚本不起作用:

out-file : Access to the path '/media/backupfiles/mysql_data' is denied.

当我进入

mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 >/media/backupfiles/mysql_data/test.sql.gz

在控制台中手动生成文件,但它太大(大约是 Bash 版本大小的两倍),本身没有用户权限(这意味着我必须运行 chown 在我可以访问它之前),而且,当我尝试打开它时(使用 7-zip 或使用 gzip -d),两者都告诉我文件无法打开并且它不是 gzip 格式。

然后我尝试:

Start-Process mysqldump -ArgumentList " --user=xxx --password=xxx --events --all-databases | gzip -7 > /media/backupfiles/mysql_data/test.sql.gz"

这也失败了:

mysqldump: unknown option '-7'

对我来说,管道/重定向运算符似乎是问题所在。不幸的是,对于如何使这个脚本工作(没有中间文件或脚本),我没有更多的想法。这次互联网并没有太大帮助,但是,这可能是我搜索错误的东西造成的。

有什么我遗漏的吗?还是我只是想获得(尚未)在适用于 Linux 的 PowerShell 中实现的功能?

使用的软件:

  • 操作系统:openmediavault 3.0.88(即 Debian 4.9.30-2+deb9u2~bpo8+1 2017-06-27)x86_64 GNU/Linux)
  • PowerShell:v6.0.0-beta.6
  • gzip:1.6
  • mysqldump:Ver 10.13 Distrib 5.5.57

最佳答案

PowerShell 中的 > 重定向运算符与 | 的作用相同输出文件Out-File 的默认编码是 Unicode(准确地说是 UTF-16 LE),不能为重定向运算符更改。

替换

... > $($OutPath)/$($DumpBaseName).gz

无论是

... | Out-File "${OutPath}/${DumpBaseName}.gz" -Encoding Ascii

... | Set-Content "${OutPath}/${DumpBaseName}.gz"

Set-Content cmdlet 默认为 ASCII 输出。

不过,就我个人而言,我会坚持使用 bash 来完成这样的任务。您正在使用外部命令将文本转储写入(压缩的)输出文件,因此您没有在任何地方利用 PowerShell 功能。 bash 和 PowerShell 代码之间的唯一区别是 PowerShell 代码具有带默认值的参数。您可以通过参数扩展在 bash 中做类似的事情:

outpath="${1:-'/media/backupfiles/mysql_data'}"
dumpdate="${2:-$(date +"%Y-%m-%d")}"

上面的代码将第一个和第二个位置参数(如果缺少参数则指定默认值)分别分配给变量$outpath$dumpdate。不过,这里的订单很重要。如果您希望能够彼此独立地指定参数(例如,将日期作为参数传递,而不是路径),您需要这样的代码:

while getopts ':do' opt; do
  case "$opt" in
    d) dumpdate="$OPTARG";;
    o) outpath="$OPTARG";;
    \?) echo "Invalid option: -${OPTARG}"; exit 1;;  
  esac
done
shift $((OPTIND-1))

outpath="${outpath:-'/media/backupfiles/mysql_data'}"
dumpdate="${dumpdate:-$(date +"%Y-%m-%d")}"

关于mysql - Debian 8 上的 PowerShell - 从 mysqldump 到 gzip 的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46157211/

相关文章:

powershell - 如何比较文件中的两个顺序字符串

apache - 将包含服务器的不同容器放入同一服务器

php - MySQL - 将 0 添加到少于 9 位的数字

mysql - 一列中的 SQL 最大值

powershell - 将 PowerShell 输出字符串覆盖到同一行

powershell - 导入 Csv Powershell

linux - 为什么 Ansible 没有在变量中看到属性?

c - 由于缺少类型,构建 uclibc linux 3.10-2 (Debian jessie x86_64) 失败

mysql - 如何列出名称中包含子字符串的数据库列以及它们是否可为空

php - 如何通过单个ajax调用加载多个输入字段数据?