如何清除已完成的从属二进制日志,减去50?

时间:2016-08-29 14:35:23

标签: mysql bash

我正在使用bash清除Master上的二进制日志,只有Slave完成了它们。相反,我想在服务器上留下更多的日志。你能帮助我将mysql-bin.000345变成mysql-bin.000295(从345减去50)吗?

这是我的剧本:

# Fetch the current `Relay_Master_Log_File` from Slave
relay_master_log_file=$(ssh user@slave "mysql -hlocalhost -uroot -e 'SHOW SLAVE STATUS\G' | grep Relay_Master_Log_File | cut -f2- -d':' | sed -e 's/^[ \t]*//'")

# Purge binary logs on Master up to the current `Relay_Master_Log_File`
purge_cmd="PURGE BINARY LOGS TO '$relay_master_log_file';"
ssh user@master <<EOF
mysql -e "$purge_cmd"
EOF

但我想在Master上保留50(或n)个二进制日志。

2 个答案:

答案 0 :(得分:1)

假设变量中有mysql-bin.000345,您可以执行以下步骤:

  1. 使用尾随零删除开头部分,仅留下345
  2. 使用Bash算术$((...))从345
  3. 中减去n
  4. 使用printf格式化用零填充的结果
  5. 例如:

    oldname=mysql-bin.000345
    num=$(shopt -s extglob; echo ${filename##mysql-bin.+(0)})
    newname=mysql-bin.$(printf '%06d' $((num - n)))
    

答案 1 :(得分:1)

您可以使用awk作为奖励跳过使用grepcutsed的第一个命令。

# Fetch the current `Relay_Master_Log_File` from Slave
relay_master_log_file=$(ssh user@slave "mysql -hlocalhost -uroot -e 'SHOW SLAVE STATUS\G' |
awk -F':[[:blank:]]*' '$1~/Relay_Master_Log_File/{split($2, a, /\./); printf "%s.%06d", a[1], a[2]-50}'
)

根据以下评论使用:

ssh user@slave <<-'EOF'
mysql -hlocalhost -uroot -e 'SHOW SLAVE STATUS\G' |
awk -F':[[:blank:]]*' '$1~/Relay_Master_Log_File/{split($2, a, /\./);
     printf "%s.%06d\n", a[1], a[2]-50}'
EOF