【问题标题】:PowerShell on Debian 8 - Pipe from mysqldump to gzipDebian 8 上的 PowerShell - 从 mysqldump 到 gzip 的管道
【发布时间】:2018-02-19 18:49:44
【问题描述】:

我的 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 : 访问路径 '/media/backupfiles/mysql_data' 是 拒绝。

当我进入时

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:未知选项'-7'

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

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

使用过的软件:

  • 操作系统: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:版本 10.13 Distrib 5.5.57

【问题讨论】:

    标签: mysql powershell debian gzip


    【解决方案1】:

    PowerShell 中的> 重定向运算符与| Out-File 的作用相同。 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")}"
    

    【讨论】:

    • 我明白我的 PowerShell-“实施”没有任何优势;这只是为了了解事物的运作方式。感谢 Bash 中参数的解释和 PowerShell 中> 的解释;但是,您对替换 > 的建议都失败了。 Out-File .. -Encoding ascii 将返回一个大小合适的文件,但它仍然不可读(gzip -d / 7zip GUI)。 Set-Content 将创建一个 .gz,它的大小再次是工作 Bash 脚本大小的两倍(尽管与使用 > 时的大小不同),但它仍然不可读。
    • 我不知道那里发生了什么,但对我来说这似乎是一个错误。
    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多